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

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

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

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

День добрый!
А можно ли создать программу, которая бы меняла один динамический блок на другой с учетом уже всех выполненных трансформаций исходного блока? Например, есть два динамических блока, которые отличаются только цветом примитивов. Произведя изменение первого блока (например растянув его, повернув, и т.д.) нужно заменить его другим блоком, но так, чтобы все изменения в геометрии остались.
Спасибо
Просмотров: 29303
 
Непрочитано 17.08.2011, 18:21
#2
hwd

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


Цитата:
Сообщение от Serge_Y Посмотреть сообщение
есть два динамических блока, которые отличаются только цветом примитивов
цвет примитивам в составе определения блока назначай по слою. размещай вхождение блока на соответствующем слое - получишь примитивы нужного цвета и не придётся лепить предлагаемые тобою же костыли - достаточно одного определения грамотно продуманного блока.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 17.08.2011, 21:28
#3
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от hwd Посмотреть сообщение
цвет примитивам в составе определения блока назначай по слою
Или ПоБлоку? Андрей, единого рецепта я пока не нашел
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.08.2011, 21:40
#4
hwd

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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Или ПоБлоку?
Ну или так

- Иосиф Виссарионович, нашли вашего двойника!
- Расстрелять..
- А может просто усы сбрить?
- Ну, или так
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 18.08.2011, 10:33
#5
Serge_Y

инженер-конструктор
 
Регистрация: 29.05.2004
Минск
Сообщений: 381


Цитата:
Сообщение от hwd Посмотреть сообщение
цвет примитивам в составе определения блока назначай по слою. размещай вхождение блока на соответствующем слое - получишь примитивы нужного цвета и не придётся лепить предлагаемые тобою же костыли - достаточно одного определения грамотно продуманного блока.
Каюсь, неполно поставил задачу: примитивы кроме разного цвета имеют еще определенный набор расширенных свойств(использую Architectural Desktop). Эти свойства не являются постоянной величиной, а меняются в зависимости от трансформации динамического блока
Serge_Y вне форума  
 
Непрочитано 18.08.2011, 18:02
#6
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Serge_Y, может лучше выложить чертеж с блоками (исходный с уже заданными параметрами и новый, на который надо заменить) ну так для большей наглядности (желательно файл версии не старше ACAD2008)
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 19.08.2011, 11:52
#7
Serge_Y

инженер-конструктор
 
Регистрация: 29.05.2004
Минск
Сообщений: 381


Вот так примерно могут выглядеть блоки. Параметров может быть много.
Вложения
Тип файла: dwg
DWG 2007
Block_replace_1.dwg (105.9 Кб, 2880 просмотров)
Serge_Y вне форума  
 
Непрочитано 19.08.2011, 21:15
2 | #8
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Serge_Y, что-то я навертел походу, но вроде работает, попробуй так
Код:
[Выделить все]
 
; Вызов: ReplBl
(defun c:ReplBl()
  (vl-load-com)
  ((lambda(old_blk actdoc)
     (vla-startundomark actdoc)
     (if (/= old_blk 1)
       ((lambda(new_blk sf_old_blk name_old_blk)
          (if (/= new_blk 1)
            ((lambda(lst_dyn_value_old_blk sf_new_blk name_new_blk)
               ((lambda(lst_dyn_value_new_blk)
                  (if (or (apply 'or (mapcar '(lambda(x) (assoc (car x) lst_dyn_value_new_blk)) lst_dyn_value_old_blk)))
                    ((lambda(nbr)
                       (foreach item (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbr))))
                         (if (= (vla-get-EffectiveName item) name_old_blk)
                           (progn
                             ((lambda(blk lst_dyn_value_current_blk)
                                (foreach dyn_prop (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties blk)))
                                  ((lambda(dyn_rec)
                                     (if dyn_rec
                                       (vla-put-Value dyn_prop (cadr dyn_rec))
                                       )
                                     )
                                    (assoc (vla-get-PropertyName dyn_prop) lst_dyn_value_current_blk)
                                    )
                                  )
                                )
                               (vla-InsertBlock
				 (vla-get-ModelSpace actdoc)
				 (vla-get-InsertionPoint item)
				 name_new_blk
				 (vla-get-XEffectiveScaleFactor item)
				 (vla-get-YEffectiveScaleFactor item)
				 (vla-get-ZEffectiveScaleFactor item)
				 (vla-get-Rotation item)
				 )
			       (vl-remove-if '(lambda(x) (= (car x) "Origin"))
				 (mapcar '(lambda(x) (list (vla-get-PropertyName x) (vla-get-Value x)))
					 (vlax-safearray->list (vlax-variant-value (vla-GetDynamicBlockProperties item)))
					 )
				 )
                               )
                             (vla-Delete item)
                             )
                           )
                         )
                       )
                      (ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat name_old_blk ",`*U#*"))))
                      )
                    (prompt "\nВ указанных блоках нет ни одного одинакового атрибута!")
                    )
                  )
                 (if (> (vlax-safearray-get-u-bound sf_new_blk 1) -1)
                   (mapcar '(lambda(x) (list (vla-get-PropertyName x) (vla-get-Value x))) (vlax-safearray->list sf_new_blk))
                   )
                 )
               )
              (if (> (vlax-safearray-get-u-bound sf_old_blk 1) -1)
                (vl-remove-if '(lambda(x) (= (car x) "Origin"))
                              (mapcar '(lambda(x) (list (vla-get-PropertyName x) (vla-get-Value x)))
                                      (vlax-safearray->list sf_old_blk)
                                      )
                              )
                )
              (vlax-variant-value (vla-GetDynamicBlockProperties (vlax-ename->vla-object new_blk)))
              (vla-get-EffectiveName (vlax-ename->vla-object new_blk))
              )
            )
          )
         (_tdg-get-object-byselect "Укажите новый блок: " '("INSERT") T)
         (vlax-variant-value (vla-GetDynamicBlockProperties (vlax-ename->vla-object old_blk)))
         (vla-get-EffectiveName (vlax-ename->vla-object old_blk))
         )
       )
     (vla-endundomark actdoc)
     )
    (_tdg-get-object-byselect "Укажите блок для замены: " '("INSERT") T)
    (vla-get-activedocument (vlax-get-acad-object))
    )
  (princ)
  ); end c:ReplBl



; Получить ссылку на указанный объект на чертеже
;	message - текст сообщения при запросе указать объект 
;	filter - список типов объктов для фильтрации (например: ("LINE" "INSERT") - значит будут восприниматься только объекты типа "LINE"  и "INSERT")
;	lock_enter - блокировка нажатия Enter (lock_enter - T при нажатии Enter будет снова запрос на указание объекта; lock_enter - nil выход из функции)
;	return - ссылка на указанный объект (например: <Имя объекта: 7e8ac738>) или 0 если нажали Enter при lock_enter - nil или 1 если нажали Esc
(defun _tdg-get-object-byselect(message filter lock_enter / return)
  ((lambda(errnovar)
     (setvar "errno" 0)
     (while (not (setq return ((lambda(obj)
                                 (if (not (vl-catch-all-error-p obj))
                                   (if obj
                                     (if filter
                                       (if (member (strcase (cdr (assoc 0 (entget (car obj))))) (mapcar 'strcase filter))
                                         (car obj)
                                         )
                                       (car obj)
                                       )
                                     (if (and (not lock_enter) (= (getvar "errno") 52))
                                       0
                                       )
                                     )
                                   1
                                   )
                                 )
                                (vl-catch-all-apply 'entsel
                                                    (list (strcat "\n" message))
                                                    )
                                )
                       )
                 )
       )
     (setvar "errno" errnovar)
     return
     )
    (getvar 'errno)
    )
  ); end _tdg-get-object-byselect
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 19.08.2011, 21:34
#9
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


Мне задача как-то проще казалась.
Код:
[Выделить все]
 ;Замена вхождений блоков с учетом динамических параметров
;Пример вызова (test1 "имя строго блока" "имя нового блока")
(defun test1 (old_name_blk new_name_blk / lst3 lst4 obj new_blk lst)
  (vl-load-com)
  (setq model_space (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  (mapcar
    (function
      (lambda (x)
	(if (equal
	      (strcase (vla-get-EffectiveName (setq obj (vlax-ename->vla-object (cadr x)))))
	      (strcase old_name_blk))
	  (setq lst (cons obj lst))
	  )
	)
      )
    (ssnamex (ssget "_X" '((0 . "INSERT"))))
    )
  (mapcar
    (function
      (lambda (old_blk)
	(setq new_blk (vla-Insertblock model_space (vla-get-InsertionPoint old_blk) new_name_blk  1 1 1 0))
	(setq lst3 (vlax-safearray->list
		     (vlax-variant-value
		       (vla-GetDynamicBlockProperties new_blk)
		       )
		     )
	      )
	(setq lst4 (vlax-safearray->list
		     (vlax-variant-value
		       (vla-GetDynamicBlockProperties old_blk)
		       )
		     )
	      )
	(mapcar
	  (function
	    (lambda (a b)
	      (if (equal (vla-get-ReadOnly a) :vlax-false)
		(vla-put-Value a (vla-get-Value b))
		)
	      )
	    )
	  lst3 lst4
	  )
	(vla-Update new_blk)
	(vla-Delete old_blk)
	)
      )
    lst
    )
  )
Oliver_88 вне форума  
 
Непрочитано 19.08.2011, 22:18
#10
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Oliver_88 Посмотреть сообщение
Мне задача как-то проще казалась.
Мой код больше потому что блоки указывает пользователь непосредственно на чертеже, а это и доп. функция (_tdg-get-object-byselect) и обработка корректности исходных данных.

(setq new_blk (vla-Insertblock model_space (vla-get-InsertionPoint old_blk) new_name_blk 1 1 1 0))
А если угол поворота текущего из заменяемых блоков будет отличаться от нуля?

(ssnamex (ssget "_X" '((0 . "INSERT"))))
Вы перебирает все блоки на чертеже

(ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat name_old_blk ",`*U#*"))))
у меня только указанный блоки и все динамические.

А если пользователь по ошибке укажет не динамический блок?

Когда кажется креститься надо
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 19.08.2011, 23:18
#11
Oliver_88

"ценный кадр"
 
Регистрация: 02.12.2010
Сообщений: 115
<phrase 1=


TararykovDG, спасибо за критику.
Oliver_88 вне форума  
 
Автор темы   Непрочитано 21.08.2011, 09:32
#12
Serge_Y

инженер-конструктор
 
Регистрация: 29.05.2004
Минск
Сообщений: 381


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Serge_Y, что-то я навертел походу, но вроде работает, попробуй так
Спасибо! А можно сделать так, чтобы в процессе работы лиспа заменялись не все блоки "2" в чертеже, а только конкретно мною выбранные?
И второй момент, после замены блоков, повторно вставленный в чертеж блок "1" странно модифицируется, т.е. попытка его стретчить в вертикальном направлении приводит к тому, что растягивается только первая линия.
Serge_Y вне форума  
 
Непрочитано 22.08.2011, 11:49
#13
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Serge_Y Посмотреть сообщение
А можно сделать так, чтобы в процессе работы лиспа заменялись не все блоки "2" в чертеже, а только конкретно мною выбранные?
Замени в коде
строку
Код:
[Выделить все]
 
(ssget "_X" (list (cons 0 "INSERT") (cons 2 (strcat name_old_blk ",`*U#*"))))
на строку
Код:
[Выделить все]
 
(ssget (list (cons 0 "INSERT") (cons 2 (strcat name_old_blk ",`*U#*"))))


Цитата:
Сообщение от Serge_Y Посмотреть сообщение
И второй момент, после замены блоков, повторно вставленный в чертеж блок "1" странно модифицируется, т.е. попытка его стретчить в вертикальном направлении приводит к тому, что растягивается только первая линия.
А вот это странно, и у меня такого не происходит на Твоем же чертеже (пост #7). Да и не должно такого происходить, код не изменяет описания блоков. а работает только с вхождениями блоков. Прикрепи файл где
Цитата:
Сообщение от Serge_Y Посмотреть сообщение
повторно вставленный в чертеж блок "1" странно модифицируется, т.е. попытка его стретчить в вертикальном направлении приводит к тому, что растягивается только первая линия
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 22.08.2011, 17:54
#14
Serge_Y

инженер-конструктор
 
Регистрация: 29.05.2004
Минск
Сообщений: 381


Замена строчек приводит к:
"Укажите блок для замены:
Укажите новый блок:
Select objects:
; error: bad argument type: lselsetp nil"
Serge_Y вне форума  
 
Непрочитано 22.08.2011, 18:20
1 | #15
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Serge_Y Посмотреть сообщение
Замена строчек приводит к:
"Укажите блок для замены:
Укажите новый блок:
Select objects:
; error: bad argument type: lselsetp nil"
Укажите блок для замены: - указываем одно вхождение блока который надо заменить
Укажите новый блок: - указываем одно вхождение нового блока
В ответ на запрос Select objects: нужно выбрать (рамкой или по одному или если надо все - то набрать _all) те блоки (несколько вхождений блоков), которые надо заменить на новый блок и нажать Enter
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 31.08.2011, 10:08
#16
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Делал для себя и сам давно пользуюсь такой программой. Работает по принципу matchprop - указываем образец и заменяем на него указываемые блоки. При этом копируются свойства заменяемого блока и значения и свойства атрибутов. Помню при такой программной замене был какой-то глюк, если не соблюсти определенный порядок передачи свойств, приходилось отлавливать и править.
Вложения
Тип файла: lsp bchange.LSP (10.6 Кб, 216 просмотров)

Последний раз редактировалось Do$, 26.09.2011 в 10:17.
Do$ вне форума  
 
Непрочитано 31.08.2011, 10:28
#17
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Сообщение от Do$ Посмотреть сообщение
Делал для себя и сам давно пользуюсь такой программой. Работает по принципу matchprop - указываем образец и заменяем на него указываемые блоки. При этом копируются свойства заменяемого блока и значения и свойства атрибутов. Помню при такой программной замене был какой-то глюк, если не соблюсти определенный порядок передачи свойств, приходилось отлавливать и править.
Do$, подправь код. *adoc* не инициализирован и (vla-StartUndoMark *adoc*) выдает ошибку
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 31.08.2011, 10:32
#18
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Выдрал из сборки, называется... Поправил, спасибо!
Do$ вне форума  
 
Непрочитано 25.09.2011, 14:30 сохранение всех атрибутов при замене динамических блоков
#19
GreyCard


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


Добрый день!
Я не программист, но с удовольствием стараюсь пользоваться возможностями Автокада, для того чтобы упростить себе жизнь при проектировании. Программку по замене динамических блоков от TararykovDG с удовольствием юзаю, но заметил некоторую необходимость в сохранении атрибутов (именно атрибутов, как это понимается в Акаде обычному пользователю не программисту). На данный момент данная программка хорошо меняет один динамический блок на другой с сохранением внутренних атрибутов блока, таких как "visible", но значения атрибутов введенных пользователем(к примеру "маркировка оборудования" или "мощность" или "место установки") после замены автоматически устанавливаются значения по умолчанию для данных атрибутов. Прошу вас не могли бы вы немного доработать эту программку ?
GreyCard вне форума  
 
Непрочитано 25.09.2011, 21:11
#20
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Программа из #16 не подойдет?
Do$ вне форума  
Ответ
Вернуться   Форум 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
Библиотека динамических блоков Коробейников Алексей Динамические блоки 2 05.04.2005 16:08