| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели

Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели

Ответ
Поиск в этой теме
Непрочитано 28.09.2015, 11:24
Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели
Акбар Доолосбеков
 
Регистрация: 28.09.2015
Сообщений: 28

Вопрос мой заключается в следующем: Есть задача и задача такова, нужно разместить объекты по порядку на определенном участке на рамке если быть точнее, это версия для печати. (Есть рамка таких рамок 388 и соотвественно новых чертежей 388) Но вот в чем беда неужели мне надо каждый чертеж перетаскивать в рамку? Я подумал если расстояние изменить между чертежами, и просто перенести внутрь рамки было бы просто шикарно, но при этом масштаб ни рамок ни чертежей должны оставаться не измененными. Помогите пожалуйста. Я в Автокаде только пару месяцев и поэтому такой хитрости пока не знаю, версия Автокада 2016.

Масштабы Рамок одинаковы и масштабы чертежей тоже, просто я не могу подгонять каждый чертеж к каждой рамке, с масштабами всех объектов отлично, но расстояние если поменять и потом уже перенести на рамку и выбрать все объекты было бы просто супер! Просто таких файлов 14 и в каждом файле по 388 - 420 Чертежей Без рамок.

Файл слишком большой я кусок отрежу и покажу,

Вот маленька я часть, того о чем здесь идет речь

Вложения
Тип файла: dwg
DWG 2013
Для Форума.dwg (493.3 Кб, 2496 просмотров)

Просмотров: 6828
 
Автор темы   Непрочитано 29.09.2015, 09:52
#21
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Цитата:
Сообщение от baksconstructor Посмотреть сообщение
А как Вы получаете профиля ? В какой зависимости их на чертеже расставляете ?
Я не понял вопроса можете объяснить по другому
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 09:54
#22
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


Цитата:
Сообщение от Акбар Доолосбеков Посмотреть сообщение
Я не понял вопроса можете объяснить по другому
Откуда профиля в чертеже ? Из какой программы ?
Больше интересует - они вставлены рядком, почему именно горизонтально и можно ли их вставить по другому?
baksconstructor вне форума  
 
Автор темы   Непрочитано 29.09.2015, 09:59
#23
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Автокад 2016 / 2015

Они радком стоят, но размер и масштаб нельзя менять! По другому не знаю как можно вставить, можно ручками, за 3 дня. Я же говорил что вчера в одном файле нашел 499, рамок и 499 чертежей. Теперь все это надо вставить в рамки, если размер чертежа больше чем рамка, придеться опять измерять на дороге, то есть где сделали ошибку но не проектировщики. Но большенство чертежей правильны, и их нужно в рамки вставить.
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 10:01
#24
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


я в лисп совершенно ничего не понимаю, потому
Цитата:
Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели
для меня непосильная задача.

на C# я скопипастил и скомбинировал несколько примеров из справки.
Выглядит это примерно так:
Выбрать рамки, у автора это полилиния длинной в диапазоне 1420-1430
Выбрать профиль, тут просто полилинии, текст попадающий в секущую рамку отсеиваю
Сортирую обе выборки по Х
для каждой пары профиль-формат считаю вектор смещения
Выбираю объекты внутри рамки профиля и смещаю по вычисленному вектору и так для каждой пары.

Просто как молоток
Цитата:
Сообщение от ssn Посмотреть сообщение
рутинных операций в процессе проектирования просто нет наверно
Я конструктором работаю, моя работа - думать и конструировать.
Boxa на форуме  
 
Автор темы   Непрочитано 29.09.2015, 10:04
#25
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


А я могу ли попробовать Вашу комбинацию на С#? Я толком и не программист, но видно же что у Вас получилось, чем это не ответ?
Акбар Доолосбеков вне форума  
 
Непрочитано 29.09.2015, 11:20
1 | #26
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Честно говоря это не самая хорошая идея. Между программой написанной на коленке для проверки идеи и программой которую можно дать пользователям - большая пропасть.
Доводить эту программу до годного к использованию уровня мне лень, а в том виде в котором она есть сейчас, малейшая неточность и фатал ерор. Это похоже на подростка с дробовиком, чуть что и отстрелил себе ногу...

Библиотека под 2016 автокад во вложении, используйте на свой страх и риск (AS IS), никакой ответственности с моей стороны.
команда: Sorted
Сначала выбрать рамки форматов, затем рамки вокруг профиля, после выбора отзумить, что бы был виден весь файл (Да, для проверки идеи использовал выбор рамкой, со всеми его ограничениями).
Вложения
Тип файла: zip AkbarDoolosbekov_2016.zip (3.9 Кб, 17 просмотров)
Boxa на форуме  
 
Непрочитано 29.09.2015, 17:02
#27
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,481
Отправить сообщение для maratovich с помощью Skype™


Акбар Доолосбеков результат есть ?
__________________
Вопрос : Где находится Тургай ? Ответ : Между Парагваем и Уругваем.....
maratovich вне форума  
 
Непрочитано 30.09.2015, 00:01
#28
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


1 сортируем форматки по х - это блоки
2. сортируем профиля по х - это блоки
3. вставляем последовательно один блок внутрь второго блока, получаем красивое видео с кучей латентных НО
gomer вне форума  
 
Непрочитано 30.09.2015, 08:35
#29
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


gomer, ну ты прям покровы сорвал и про латентные НО меня разоблачил
Boxa на форуме  
 
Непрочитано 30.09.2015, 09:45
#30
P_S


 
Регистрация: 09.10.2006
Санкт-Петербург
Сообщений: 99


Подумал я, что лисп для этого случая простенький, учитывая, что и профиля, и форматки окружены рамками в разных слоях. Ну, написал. В чертеже, где 2 - 3 десятка элементов, работает отлично. Но сделал я чертеж где-то с 600 элементами, и стала получаться ерунда: похоже, что при выполнении foreach при каждом переносе профиля в наборе выбора остается часть объектов прежнего набора и, соответственно, они перемещаются еще раз. Вот такая чертовщина.
Код:
[Выделить все]
 (vl-load-com)
;;;Создаем 2 списка полилиний по слоям
(setq ss1(ssget "_X" '((67 . 0)(8 . "KINDEX")))
      lst1 nil
      ss2(ssget "_X" '((67 . 0)(8 . "PRINT")))
      lst2 nil)
(repeat(sslength ss1)
	  (setq lst1(cons(vlax-ename->vla-object (ssname ss1 0))lst1))
	    (ssdel(ssname ss1 0)ss1))
(repeat(sslength ss2)
	  (setq lst2(cons(vlax-ename->vla-object (ssname ss2 0))lst2))
	    (ssdel(ssname ss2 0)ss2))

;;;Упорядочиваем списки по положению относительно оси Х
(defun s_pos (lst)
  (mapcar(function cadr)
 (vl-sort      
(mapcar '(lambda (x)(vla-GetBoundingBox x 'MinPt 'MaxPt)
	   (list (vlax-safearray->list MinPt) x))lst)
(function(lambda (e1 e2)(< (caar e1) (caar e2)))))))
(s_pos lst1)
(s_pos lst2)

;;;Выделяем внутри рамки и переносим от центра рамки к центру форматки
(foreach x lst1 (setq p_co1(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates x)))
                      ss3(ssget "_W" (list(car p_co1)(cadr p_co1))(list(nth 4 p_co1)(nth 5 p_co1)))
		      pt1(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbDouble '(0 . 2))
					     (list(/(+(car p_co1)(nth 4 p_co1))2)(/(+(cadr p_co1)(nth 5 p_co1))2)0)))
		      p_co2(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates(car lst2))))
		      pt2(vlax-make-variant(vlax-safearray-fill(vlax-make-safearray vlax-vbDouble '(0 . 2))
					     (list(/(+(car p_co2)(nth 4 p_co2))2)(+(/(+(cadr p_co2)(nth 5 p_co2))2)21.5)0))))
  (foreach y (vl-remove-if 'listp(mapcar 'cadr(ssnamex ss3)))
    (vla-Move(vlax-ename->vla-object y) pt1 pt2))

;;;Безуспешно пытаюсь заставить очиститься набор SS3  
  (repeat(sslength ss3)
    (ssdel(ssname ss3 0)ss3))
  (setq ss3 nil
	lst2(cdr lst2))
  (gc)
  );end of foreach
P_S вне форума  
 
Непрочитано 30.09.2015, 15:08
#31
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,095


сильно в код пока не вникал и не тестировал, но заметил, что используется режим выбора "_W" (обычная рамка). Если координаты углов рамки не попадают в видимую на экране область, его результаты бывают непредсказуемые. Поэтому предлагаю в начале программы добавить что-то типа
Код:
[Выделить все]
 (vl-cmdf "_zoom" "_e")

Последний раз редактировалось kp+, 30.09.2015 в 15:30.
kp+ вне форума  
 
Автор темы   Непрочитано 01.10.2015, 15:55
#32
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Цитата:
Сообщение от maratovich Посмотреть сообщение
Акбар Доолосбеков результат есть ?
Есть результат, но все равно делаю в ручную по 5 максимум 10, так как там 6 или 7 чертеж падает вниз на рамку и приходитья поднимать а когда по 5 то все нормально.

----- добавлено через ~4 мин. -----
Что посоветуете люди добрые? Продолжать по 5 - 10 штук? Или можем что нибудь другое попробовать?
Акбар Доолосбеков вне форума  
 
Непрочитано 01.10.2015, 15:59
#33
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Вот ничего не понял, можно выложить файл с тем местом, где это случилось?
В ролике явно больше 10 форматок было и ошибок обработки не было.
Такое поведение может быть если Вы неправильную рамку форматки выбрали.

ЗЫ.
А вообще если не жалко, в личном сообщении скиньте файл с 400 листами...
Boxa на форуме  
 
Автор темы   Непрочитано 01.10.2015, 16:01
#34
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Нет я все сделал как на видео и рамки отмерил, все одинаково, но чертежи не все одинаковые, по моему из за этого.
Акбар Доолосбеков вне форума  
 
Непрочитано 01.10.2015, 16:01
#35
baksconstructor


 
Регистрация: 05.11.2014
Сообщений: 978


Цитата:
Сообщение от Акбар Доолосбеков Посмотреть сообщение
Или можем что нибудь другое попробовать?
Думаю если этим заинтересовался maratovich, то Вам лучше у него спросить...
baksconstructor вне форума  
 
Непрочитано 01.10.2015, 16:10
#36
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Акбар Доолосбеков Посмотреть сообщение
чертежи не все одинаковые, по моему из за этого.
см, нужен пример.
Boxa на форуме  
 
Непрочитано 01.10.2015, 16:53
#37
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


При условии расположения и форматок, и объектов только в горизонтальном положении. Тестировал только на файле из шапки. Честно говоря, результатом не сильно доволен, но допиливать некогда:
Код:
[Выделить все]
 (vl-load-com)
(defun c:test (/                  adoc               _kpblc-selset-msg  _kpblc-conv-selset-to-ename
               _kpblc-conv-vla-to-list               ss_format          ss_obj             minl
               ss_move            dist               i
               )

  (defun _kpblc-selset-msg (msg fun-ssget / sysvar res)
    (setq sysvar (mapcar (function (lambda (x / tmp)
                                     (setq tmp (getvar (car x)))
                                     (setvar (car x) (cdr x))
                                     (cons (car x) tmp)
                                     ) ;_ end of lambda
                                   ) ;_ end of function
                         '(("cmdecho" . 0) ("menuecho" . 0) ("nomutt" . 1))
                         ) ;_ end of mapcar
          ) ;_ end of setq
    (princ (strcat "\n" (vl-string-trim " \n\t:" msg) " <Отмена> : "))
    (setq res (vl-catch-all-apply fun-ssget))
    (foreach item sysvar
      (setvar (car item) (cdr item))
      ) ;_ end of foreach
    (if (= (type res) 'pickset)
      res
      ) ;_ end of if
    ) ;_ end of defun

  (defun _kpblc-conv-selset-to-ename (selset / tab item)
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((= (type selset) 'vla-object)
       (_kpblc-conv-vla-to-list selset)
       )
      ((listp selset) (mapcar (function _kpblc-conv-ent-to-ename) selset))
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-conv-vla-to-list (value / res)
    (cond
      ((listp value)
       (mapcar (function _kpblc-conv-vla-to-list) value)
       )
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (_kpblc-conv-vla-to-list (vlax-safearray->list value))
         ) ;_ end of if
       )
      ((and (= (type value) 'vla-object)
            (vlax-property-available-p value 'count)
            ) ;_ end of and
       (vlax-for sub value
         (setq res (cons sub res))
         ) ;_ end of vlax-for
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun fun_objbox (obj / minp maxp)
    (setq obj (if (= (type obj) 'ename)
                (vlax-ename->vla-object obj)
                obj
                ) ;_ end of if
          ) ;_ end of setq
    (vla-getboundingbox obj 'minp 'maxp)
    (list (cons "obj" obj)
          (cons "min" (setq minp (_kpblc-conv-vla-to-list minp)))
          (cons "max" (setq maxp (_kpblc-conv-vla-to-list maxp)))
          (cons "mid" (mapcar (function (lambda (a b) (* 0.5 (+ a b)))) minp maxp))
          ) ;_ end of list
    ) ;_ end of defun

  (if (and (setq ss_format (_kpblc-selset-msg "Выберите форматки" (function (lambda () (ssget)))))
           (setq ss_obj (_kpblc-selset-msg "Выберите перемещаемые объекты" (function (lambda () (ssget)))))
           ) ;_ end of and
    (progn
      (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
      (setq ss_format (mapcar
                        (function fun_objbox)
                        (vl-remove-if-not
                          (function
                            (lambda (x)
                              (and (= (cdr (assoc 0 (entget x))) "LWPOLYLINE")
                                   (= (strcase (cdr (assoc 8 (entget x)))) "ANTET")
                                   ) ;_ end of and
                              ) ;_ end of lambda
                            ) ;_ end of function
                          (_kpblc-conv-selset-to-ename ss_format)
                          ) ;_ end of vl-remove-if-not
                        ) ;_ end of mapcar
            minl      (apply (function max)
                             (mapcar
                               (function
                                 (lambda (x)
                                   (distance (cdr (assoc "min" x)) (cdr (assoc "max" x)))
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ss_format
                               ) ;_ end of mapcar
                             ) ;_ end of apply
            ss_format (vl-sort
                        (vl-remove-if-not
                          (function
                            (lambda (x)
                              (equal (distance (cdr (assoc "min" x)) (cdr (assoc "max" x))) minl 1e-3)
                              ) ;_ end of lambda
                            ) ;_ end of function
                          ss_format
                          ) ;_ end of vl-remove-if-not
                        (function
                          (lambda (a b)
                            (< (cadr (assoc "mid" a)) (cadr (assoc "mid" b)))
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-sort
            ss_obj    (vl-sort (mapcar (function fun_objbox)
                                       (_kpblc-conv-selset-to-ename ss_obj)
                                       ) ;_ end of mapcar
                               (function
                                 (lambda (a b)
                                   (< (cadr (assoc "mid" a)) (cadr (assoc "mid" b)))
                                   ) ;_ end of lambda
                                 ) ;_ end of function
                               ) ;_ end of vl-sort
            i         -1
            ) ;_ end of setq
      (foreach item (vl-remove-if-not
                      (function
                        (lambda (x)
                          (and (wcmatch (strcase (vla-get-objectname (cdr (assoc "obj" x)))) "*POLYLINE")
                               (= (strcase (vla-get-layer (cdr (assoc "obj" x)))) "KINDEX")
                               ) ;_ end of and
                          ) ;_ end of lambda
                        ) ;_ end of function
                      ss_obj
                      ) ;_ end of vl-remove-if-not
        (setq ss_move (vl-remove-if-not
                        (function
                          (lambda (x)
                            (and
                              (apply 'and (mapcar '<= (cdr (assoc "max" x)) (cdr (assoc "max" item))))
                              (apply 'and (mapcar '>= (cdr (assoc "min" x)) (cdr (assoc "min" item))))
                              ) ;_ end of and
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ss_obj
                        ) ;_ end of vl-remove-if
              i       (1+ i)
              dist    (mapcar
                        (function -)
                        (cdr (assoc "mid" item))
                        (cdr (assoc "mid" (nth i ss_format)))
                        ) ;_ end of mapcar
              ) ;_ end of setq
        (foreach ent ss_move
          (setq ss_obj (vl-remove ent ss_obj))
          (vla-move (cdr (assoc "obj" ent))
                    (vlax-3d-point (cdr (assoc "mid" ent)))
                    (vlax-3d-point (mapcar (function -)
                                           (cdr (assoc "mid" ent))
                                           dist
                                           ) ;_ end of mapcar
                                   ) ;_ end of vlax-3d-point
                    ) ;_ end of vla-move
          ) ;_ end of foreach
        ) ;_ end of foreach
      (vla-endundomark adoc)
      ) ;_ end of progn
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.10.2015, 17:32
1 | #38
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Попробуй библиотеку во вложении.
Выбирать можно как попало, наличие выбранных объектов на экране не обязательно...
Вложения
Тип файла: zip AkbarDoolosbekov_2014-2016.zip (4.1 Кб, 10 просмотров)
Boxa на форуме  
 
Автор темы   Непрочитано 01.10.2015, 17:36
#39
Акбар Доолосбеков


 
Регистрация: 28.09.2015
Сообщений: 28


Цитата:
Сообщение от Boxa Посмотреть сообщение
Попробуй библиотеку во вложении.
Выбирать можно как попало, наличие выбранных объектов на экране не обязательно...
Команда та же "Sorted"
Акбар Доолосбеков вне форума  
 
Непрочитано 01.10.2015, 17:42
#40
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


угу
Boxa на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите создать lisp по перемещению множества схем внутрь форматок в пространстве модели

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пакетная печать множества рамок (форматов) из пространства модели. maratovich AutoCAD 410 23.08.2023 16:17