dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Замена динамических блоков

Замена динамических блоков

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 17.08.2011, 17:56
Замена динамических блоков
Serge_Y
 
инженер-конструктор
 
Минск
Регистрация: 29.05.2004
Сообщений: 276

Serge_Y вне форума Вставить имя

День добрый!
А можно ли создать программу, которая бы меняла один динамический блок на другой с учетом уже всех выполненных трансформаций исходного блока? Например, есть два динамических блока, которые отличаются только цветом примитивов. Произведя изменение первого блока (например растянув его, повернув, и т.д.) нужно заменить его другим блоком, но так, чтобы все изменения в геометрии остались.
Спасибо
Просмотров: 17041
 
Непрочитано 17.01.2013, 02:05
#41
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Здравствуйте уважаемые форумчане. Очень нужна помощь по замене одного динамического блока другим. Необходимо заменить один динамический блок отопительного прибора на другой более "легкий" и грамотно сделанный. Блоков несколько сотен в ручную совсем не вариант, а лиспом я не владею. Коды приведенные в теме в моем случае не срабатывают или совсем удаляют заменяемый объект не заменяя его нужным. Помогите пожалуйста, проект горит сдавать надо , а у меня чертежи весят по 15 метров каждый из-за "неправильных" блоков. Чертеж с блоками прикрепляю(формат AutoCad 2010).
Спасибо.
Вложения
Тип файла: dwg
DWG 2010
Радиатор замена блоков.dwg (1.14 Мб, 2618 просмотров)
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 17.01.2013, 17:18
#42
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Попробуй, сделал по-быстрому вроде работает
(код копируй полностью будет работать на автозагрузке,
если неправильно, нажимай кнопку отменить)

Код:
[Выделить все]
(defun C:REBD(/ blkobj1 blkobj2 ent1 ent2 prop1 prop2 props1 props2 propval1 propval2)
  (vl-load-com)
   (setq acapp (vlax-get-Acad-Object)
     adoc (vla-get-ActiveDocument acapp))
(vla-startundomark adoc)
  (setq osm (getvar 'osmode))
  (setvar 'osmode 4))
  (if (and 
  (setq ent1 (entsel "\nВыбрать заменяемый блок:"))
  (setq p1 (getpoint "\nВыбери точку в центре правого синего круга на заменяемом:"))	
  (setq ent2 (entsel "\nВыбрать заменяющий блок:"))
  (setq p2 (getpoint "\nВыбери точку в центре правого синего круга на заменяющем:")))
    (progn
  (setq blkobj1 (vlax-ename->vla-object (car ent1))
	blkobj2 (vlax-ename->vla-object (car ent2)))
(setq props1 (vlax-invoke blkobj1 'getdynamicblockproperties))
 (setq prop1 (car (vl-remove-if-not (function (lambda(x)(eq "Видимость1"(vlax-get-property x 'PropertyName) ))) props1)))
 (setq propval1 (vlax-get prop1 'Value))
    (setq props2 (vlax-invoke blkobj2 'getdynamicblockproperties))
 (setq prop2 (car (vl-remove-if-not (function (lambda(x)(eq "Выбор1"(vlax-get-property x 'PropertyName) ))) props2)))
 (setq propval2 (vlax-get prop2 'Value))
    
     (vlax-put prop2 'value propval1)
  
(vla-move blkobj2 (vlax-3d-point p2)(vlax-3d-point p1))
    (vla-update blkobj2)
    (vla-delete blkobj1)
    (vlax-release-object blkobj1)))
  (setvar 'osmode osm)
  (vla-endundomark adoc)
  (princ)
  )
(C:REBD)
Олег (jr.) вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 17.01.2013, 18:27
#43
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Попробовал. Код работает Блоки заменяются. Большое спасибо за помощь. Было бы замечательно если бы замещающий блок принимал от заменяемого атрибут поворота, а то получается, что блок меняется, но становится горизонтально( в моем случае это очень неудобно, так как некоторые приборы у меня установлены под нестандартными углами и заново их настраивать очень не хочется). Ну и в идеале было бы очень удобно если бы было можно заменять сразу несколько блоков и запуск по команде в удобное время . Буду очень признателен, если поможете реализовать эти функции.
Спасибо.
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 17.01.2013, 20:00
#44
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813


Рад если уже легче, попозже вернусь

Единственное что удалось выжать,
не уверен что будет корректно работать,
поскольку нужно глубокоо влезать в геометрию

Код:
[Выделить все]
(defun C:REBD(/  acapp acsp adoc allprops axss b blkobj1 blkobj2 bname1 bname2 cp1 cp2 ent1 ent2 maxp
	      maxpt1 maxpt2 minp minpt1 minpt2 newblock prop1 prop2 props1 props2 propval1 rot1 sset)
  (vl-load-com)
   (setq acapp (vlax-get-acad-object)
     adoc (vla-get-activedocument acapp)
	 acsp (vla-get-block(vla-get-activelayout adoc)))
(vla-startundomark adoc)

  (if (setq ent1 (entsel "\nВыбрать заменяемый блок для образца:"))
    (progn
      (setq blkobj1 (vlax-ename->vla-object (car ent1))
	    bname1 (vla-get-effectivename blkobj1))
      (princ "\nВыбрать все заменяемые блоки: \n")
      (setq sset (ssget (list (cons 0 "insert")(cons 2 "`*U*,bname1"))))
      (if (> (sslength sset) 0)
	(progn
    (setq ent2 (entsel "\nВыбрать заменяющий блок для образца:")
 blkobj2 (vlax-ename->vla-object (car ent2))
	  bname2 (vla-get-effectivename blkobj2))
 
(setq axss (vla-get-activeselectionset adoc))
(vlax-for blkobj axss
  (if (eq (vla-get-effectivename blkobj1)bname1)
    (progn
(vla-getboundingbox blkobj 'minp 'maxp)
(setq minpt1 (vlax-safearray->list minp))
  (setq maxpt1 (vlax-safearray->list maxp))
  (setq cp1(mapcar '(lambda(a b)(/ (+ a b) 2))minpt1 maxpt1))

  (setq rot1 (vla-get-rotation blkobj))

(setq props1 (vlax-invoke blkobj 'getdynamicblockproperties))
(setq allprops(vl-remove-if-not (function (lambda(x)(eq "Видимость1"(vlax-get-property x 'PropertyName) ))) props1))
(if allprops
  (progn
 (setq prop1 (car allprops))
 (setq propval1 (vlax-get prop1 'Value))
 
(setq newblock (vla-insertblock acsp (vlax-3d-point cp1) ;|(vla-get-insertionpoint blkobj)|; bname2 1 1 1 0.0))
  (vla-getboundingbox newblock 'minp 'maxp)
(setq minpt2 (vlax-safearray->list minp))
  (setq maxpt2 (vlax-safearray->list maxp))
  (setq cp2(mapcar '(lambda(a b)(/ (+ a b) 2))minpt2 maxpt2))
  (vla-move newblock (vlax-3d-point cp2)(vlax-3d-point cp1))
  
 (setq props2 (vlax-invoke newblock 'getdynamicblockproperties))
 (setq prop2 (car (vl-remove-if-not (function (lambda(x)(wcmatch (vlax-get-property x 'PropertyName) "*Выбор*" ) )) props2)))
 
 (vlax-put prop2 'value propval1)
(vla-move newblock (vlax-3d-point cp2)(vlax-3d-point cp1))

    (vla-update newblock)
    (vla-delete blkobj)
    (vlax-release-object blkobj))))))))))
  
  (vla-endundomark adoc)
  (princ)
  )
(or (vl-load-com)(princ))
(C:REBD)

Последний раз редактировалось Олег (jr.), 17.01.2013 в 22:44. Причина: добавлен код
Олег (jr.) вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2013, 09:54
#45
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Попробовал обновленный код.Замена блоков происходит, но они не устанавливаются под нужным углом и код выдает ошибки.
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2013, 14:18
#46
crosandr

инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,730


Denis Ch, код из #40 пробовал?
__________________
a computer program does not make a good engineer, only a good engineer should use a computer program
crosandr вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2013, 14:43
#47
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 813



Скинул тебе еще вариант, посмотри в почте что как
Олег (jr.) вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2013, 18:17
#48
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Цитата:
Сообщение от crosandr Посмотреть сообщение
Denis Ch, код из #40 пробовал?
Пробовал, мне он не подходит. Он вообще просто удалил блок, либо перенес его в бесконечные пространства модели и искать я его не стал, так как при такой замене проще всё начертить заново.
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 18.01.2013, 19:50
#49
crosandr

инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,730


Цитата:
Сообщение от Denis Ch Посмотреть сообщение
перенес его в бесконечные пространства модели
это оттого, что в исходном блоке точка вставки находится черти-где. Попробуй в редакторе определить точку вставки исходного блока.
__________________
a computer program does not make a good engineer, only a good engineer should use a computer program
crosandr вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.01.2013, 12:24
#50
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Цитата:
Сообщение от crosandr Посмотреть сообщение
это оттого, что в исходном блоке точка вставки находится черти-где. Попробуй в редакторе определить точку вставки исходного блока.
Похоже как раз в точке вставки блока и проблема. После редактирования точки вставки исходного блока я обнаружил картину когда все блоки разлетелись по пространству модели причем довольно хаотично. Моя ошибка в том, что я из-за недостаточного опыта не создал точку вставки блока и теперь это создало кучу проблем.
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.01.2013, 15:58
#51
crosandr

инженер-строитель
 
Регистрация: 09.07.2010
Санкт-Петербург
Сообщений: 1,730


Цитата:
Сообщение от Denis Ch Посмотреть сообщение
Похоже как раз в точке вставки блока и проблема.
Уже обсуждалось тут. Для динамических блоков лиспа не знаю, есть лисп для изменения точки вставки статических блоков
__________________
a computer program does not make a good engineer, only a good engineer should use a computer program
crosandr вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.01.2013, 16:58
#52
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Цитата:
Сообщение от crosandr Посмотреть сообщение
Уже обсуждалось тут. Для динамических блоков лиспа не знаю, есть лисп для изменения точки вставки статических блоков
Для моего блока предложенные в той теме лиспы не подходят, после применения у меня блок перестал быть динамическим и сильно переместился по пространству модели А в ручную долго у меня таких блоков несколько сотен, хотя видно придется.
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 19.01.2013, 20:50
#53
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Как вариант решения проблемы с "разлётом" вхождений после переназначения базовой точки: Вычисли разности по осям X и Y между старым значением координат базовой точки и новым. После смены точки вставки, все вхождения перемести по осям X и Y на соответствующие дельты.

UPD
В коде из #44 имеется недостаток: не учтён такой момент, что на заменяемые вхождения блоков в чертеже могут уже иметься ссылки из полей (Fields), например в таблицах... По завершению операции все такие поля превратятся в значения вида #### (поскольку автор кода создаёт новые объекты, с новыми хэндлами и идентификаторами). Это как раз такой случай, когда следует пользоваться DBObject.HandOverTo().
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 19.01.2013 в 21:05.
hwd вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.01.2013, 08:56
#54
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Цитата:
Сообщение от hwd Посмотреть сообщение
Как вариант решения проблемы с "разлётом" вхождений после переназначения базовой точки: Вычисли разности по осям X и Y между старым значением координат базовой точки и новым. После смены точки вставки, все вхождения перемести по осям X и Y на соответствующие дельты.

UPD
В коде из #44 имеется недостаток: не учтён такой момент, что на заменяемые вхождения блоков в чертеже могут уже иметься ссылки из полей (Fields), например в таблицах... По завершению операции все такие поля превратятся в значения вида #### (поскольку автор кода создаёт новые объекты, с новыми хэндлами и идентификаторами). Это как раз такой случай, когда следует пользоваться DBObject.HandOverTo().
Возможно и подошел бы вариант с вычислением разности координат, но посмотрев на "разлет" блоков в моем случае, я не увидел какой-либо зависимости они "разлетелись" в абсолютно разные стороны. И по вхождению блоков тоже верно к каждому динамическому блоку привязана табличка отопительного прибора и поля после замены превращаются в значение вида #### .
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.01.2013, 09:10
#55
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Denis Ch Посмотреть сообщение
я не увидел какой-либо зависимости они "разлетелись" в абсолютно разные стороны.
Разные определения блоков (у тебя их там несколько), имеют разные "кривые" точки вставки, поэтому смещения у вхождений будут отличаться. Кроме того, возможно, что в своём чертеже к каким-то вхождениям блоков ты применял команду _.MIRROR.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.01.2013, 09:33
#56
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Цитата:
Сообщение от hwd Посмотреть сообщение
Разные определения блоков (у тебя их там несколько), имеют разные "кривые" точки вставки, поэтому смещения у вхождений будут отличаться. Кроме того, возможно, что в своём чертеже к каким-то вхождениям блоков ты применял команду _.MIRROR.
Именно так блок который мне нужно заменить сделан очень криво. Команда _.MIRROR так же применялась.
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.01.2013, 11:30
1 | #57
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Сама по себе задача по корректной замене определений блоков, как обычных, так и динамических - весьма интересная и полезная. Много нюансов, которые следует учитывать. Из того, что вижу на вскидку:
1. Одно из участвующих в замене определений блоков может быть аннотативным, в то время как другое - не аннотативным (соответственно возникнут проблемы корректного отображения в различных видовых экранах). Новые вхождения блоков, если они аннотативны как и старые, должны получать тот же список аннотативных масштабов.
2. На некоторые свойства "старых" вхождений блоков, в чертеже могут иметься ссылки в виде полей - банальная замена блоков разрушит все связи.
3. Точки вставки в обоих определениях блоков могут размещаться таким образом, что после замены определений блоков, потребуется выполнять программно некоторое смещение позиций вхождений уже имеющихся блоков (на соответствующие дельты) с учётом того, было ли отзеркалено это вхождение (проверяем направление векторов).
4. Исходные вхождения блоков могут иметь подписку (выполненную программным образом, как я показывал выше по ссылке) на различные события - это тоже следует учитывать и корректно "разруливать". Одни юзеры с этим пунктом могут не сталкиваться, в то время как у других может иметься софт, который активно использует эту возможность - поэтому данный момент так же стоит учитывать.
5. Следует учитывать коэффициенты масштабирования "старых" вхождений блоков.
6. Следует учитывать то, на каких слоях размещаются "старые" вхождения блоков
7. Следует учитывать углы поворота "старых" вхождений блоков
8. Следует учитывать текущие параметры видимости "старых" вхождений блоков.
9. Следует учитывать, что в "старых" вхождениях ранее были назначены некоторые значения различных параметров, выбранных либо из списка, либо полученных за счёт манипуляции с "ручками".
10. Возможно в новом определении блока имена параметров, обозначенных в п.8 и п.9 будут иными. Т.о. нужно предоставить юзеру возможность указать соответствия имён.

Учитывая все перечисленные выше пункты, GUI для взаимодействия с пользователем должен быть очень гибким.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.01.2013, 12:12
#58
Denis Ch

Сопровождение проектов, внутренний технадзор
 
Регистрация: 05.06.2012
Санкт-Петербург
Сообщений: 46


Сразу чувствуется подход профессионала.
Цитата:
Сама по себе задача по корректной замене определений блоков, как обычных, так и динамических - весьма интересная и полезная. Много нюансов, которые следует учитывать. Из того, что вижу на вскидку:
1. Одно из участвующих в замене определений блоков может быть аннотативным, в то время как другое - не аннотативным (соответственно возникнут проблемы корректного отображения в различных видовых экранах). Новые вхождения блоков, если они аннотативны как и старые, должны получать тот же список аннотативных масштабов.
Аннотативность я не применял, по крайней мере специально.

Цитата:
2. На некоторые свойства "старых" вхождений блоков, в чертеже могут иметься ссылки в виде полей - банальная замена блоков разрушит все связи.
Связи есть и они разрушаются при замене блоков и приходится всё заново выставлять в ручную.

Цитата:
3. Точки вставки в обоих определениях блоков могут размещаться таким образом, что после замены определений блоков, потребуется выполнять программно некоторое смещение позиций вхождений уже имеющихся блоков (на соответствующие дельты) с учётом того, было ли отзеркалено это вхождение (проверяем направление векторов).
Некоторые вхождения были отзеркалены, но вот какие-это уже сказать сложнее, так как старый блок сделан из множества объектов, которые просто скрываются или показываются в зависимости от видимости. И зеркальных отражений в старом блоке порядка 20 шт.

Цитата:
4. Исходные вхождения блоков могут иметь подписку (выполненную программным образом, как я показывал выше по ссылке) на различные события - это тоже следует учитывать и корректно "разруливать". Одни юзеры с этим пунктом могут не сталкиваться, в то время как у других может иметься софт, который активно использует эту возможность - поэтому данный момент так же стоит учитывать.
Есть такая проблема. В полях отображается значение видимости для старого блока, а после замены должен отображаться параметр выбора( у меня называется Выбор длины прибора).


Цитата:
6. Следует учитывать то, на каких слоях размещаются "старые" вхождения блоков
Слой один и тот же.

Цитата:
7. Следует учитывать углы поворота "старых" вхождений блоков
Углы поворота различные.

И после всего вами вышесказанного мне, как человеку не разбирающемуся в программировании на лисп, данная задача кажется очень сложной и трудоемкой.
Denis Ch вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.01.2013, 12:23
#59
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Denis Ch Посмотреть сообщение
мне, как человеку не разбирающемуся в программировании на лисп, данная задача кажется очень сложной и трудоемкой.
Так оно и есть, причём в ходе её решения наверняка вылезут и др. подводные камни, которые я упустил в перечисленном выше списке. В приципе задача решаема, но под это дело нужно выделить достаточно времени и сил. Поставлю себе в планах "зарубку" на её решение - моим пользователям может пригодиться. Если что - на результат дам ссылку. Предупреждаю сразу - это будет не AutoLISP\Visual LISP, а .NET. Т.е. для каждой версии AutoCAD будет своя, отдельная версия библиотеки. Я не компилирую код для AutoCAD, версий ниже чем 2009-й (нет необходимости/желания/возможности).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 21.01.2013, 12:45
#60
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,838


Цитата:
Сообщение от hwd Посмотреть сообщение
2. На некоторые свойства "старых" вхождений блоков, в чертеже могут иметься ссылки в виде полей - банальная замена блоков разрушит все связи.
...
4. Исходные вхождения блоков могут иметь подписку (выполненную программным образом, как я показывал выше по ссылке) на различные события - это тоже следует учитывать и корректно "разруливать". Одни юзеры с этим пунктом могут не сталкиваться, в то время как у других может иметься софт, который активно использует эту возможность - поэтому данный момент так же стоит учитывать.
Мне кажется эти пункты полностью решить никак не получится.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Замена динамических блоков

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчет динамических блоков AAI Программирование 37 25.06.2012 15:05
Тормозит команда расчленения набора блоков batmax Программирование 4 31.08.2010 17:37
Замена названий блоков, типов линий АлексЮстасу Программирование 9 04.06.2010 21:51
Замена текстовых блоков Sputnik-e AutoCAD 2 11.09.2009 09:22
Библиотека динамических блоков Коробейников Алексей AutoCAD 2 05.04.2005 16:08

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||