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

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

Замена нескольких динамических блоков с атрибутами на новый блок с сохранением размеров

Ответ
Поиск в этой теме
Непрочитано 14.05.2021, 13:27 #1
Замена нескольких динамических блоков с атрибутами на новый блок с сохранением размеров
танбраун
 
Регистрация: 28.02.2019
Сообщений: 53

Всем здравствуйте!

Проблема такая: нужно заменить динамические блоки (несколько сотен) по выбору на новый блок, но с разными условиями:
1. с сохранением размеров, атрибутов и точки вставки исходного блока.
2. с сохранением размеров и точки вставки исходного блока.

Есть очень хороший лисп "Замена" но он заменяет полностью блок.
Можно его как то подкорректировать под мои условия?

Вложения
Тип файла: dwg
DWG 2013
Чертеж1.dwg (240.1 Кб, 39 просмотров)
Тип файла: lsp ЗАМЕНА.lsp (2.6 Кб, 102 просмотров)


Последний раз редактировалось танбраун, 14.05.2021 в 13:53.
Просмотров: 8951
 
Непрочитано 14.05.2021, 14:25
#2
AMDen

Инженер-проектировщик
 
Регистрация: 07.07.2016
Санкт-Петербург
Сообщений: 723


Цитата:
Сообщение от танбраун Посмотреть сообщение
динамические блоки (несколько сотен)
Если это не блоки с разными именами, то достаточно переименовать блок и переопределить. И без лиспа.
AMDen вне форума  
 
Автор темы   Непрочитано 14.05.2021, 14:42
#3
танбраун


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


Как раз это блоки с разными именами. И блоков очень много и размеры у них разные.
танбраун вне форума  
 
Непрочитано 14.05.2021, 14:58
#4
AMDen

Инженер-проектировщик
 
Регистрация: 07.07.2016
Санкт-Петербург
Сообщений: 723


Цитата:
Сообщение от танбраун Посмотреть сообщение
Как раз это блоки с разными именами. И блоков очень много и размеры у них разные.
Т.е. множество блоков с разными именами, но одинаковым набором параметров и атрибутов?
AMDen вне форума  
 
Непрочитано 14.05.2021, 15:11
#5
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,326


Вроде как через DesignCenter все прекрасно переопределяется
AlexCondor вне форума  
 
Автор темы   Непрочитано 14.05.2021, 15:24
#6
танбраун


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


AMDen, много динамических блоков с одним именем, но разными размерами нужно заменить на другой блок
танбраун вне форума  
 
Непрочитано 14.05.2021, 15:25
#7
Boxa

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


Цитата:
Сообщение от AMDen Посмотреть сообщение
Т.е. множество блоков с разными именами, но одинаковым набором параметров и атрибутов?
я бы для этого использовал DynIn_DynOut...
Boxa вне форума  
 
Непрочитано 14.05.2021, 15:45
#8
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,326


Цитата:
Сообщение от Boxa Посмотреть сообщение
я бы для этого использовал DynIn_DynOut...
Наверное имеется в виду это. Предположим свойства она поменяет, а как на счет самих блоков...
AlexCondor вне форума  
 
Автор темы   Непрочитано 14.05.2021, 15:46
#9
танбраун


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


AlexCondor, нужно заменить не все блоки, а по выбору, а я так понимаю, что этим методом заменятся все блоки.


Цитата:
Сообщение от Boxa Посмотреть сообщение
я бы для этого использовал DynIn_DynOut...
а можно по подробнее.
танбраун вне форума  
 
Непрочитано 14.05.2021, 15:55
#10
Boxa

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


Цитата:
Сообщение от AlexCondor Посмотреть сообщение
Предположим свойства она поменяет, а как на счет самих блоков
Если я правильно помню, то вместо хендлов блоков, можно написать имя блока и если он есть в базе чертежа, то программа попытается вставить именно этот блок и применить к нему параметры и атрибуты... Давно не работал с программой...
Boxa вне форума  
 
Непрочитано 14.05.2021, 15:58
#11
AlexCondor

инженер
 
Регистрация: 03.08.2007
Сообщений: 1,326


Цитата:
Сообщение от танбраун Посмотреть сообщение
нужно заменить не все блоки, а по выбору, а я так понимаю, что этим методом заменятся все блоки.
Сделать WBLOCK для выбранных блоков в новый файл и переименовать их там. Потом вставить назад
AlexCondor вне форума  
 
Непрочитано 14.05.2021, 15:59
#12
AMDen

Инженер-проектировщик
 
Регистрация: 07.07.2016
Санкт-Петербург
Сообщений: 723


Цитата:
Сообщение от танбраун Посмотреть сообщение
много динамических блоков с одним именем, но разными размерами нужно заменить на другой блок
Все-таки с одним именем...
Тогда
Цитата:
Сообщение от AMDen Посмотреть сообщение
Если это не блоки с разными именами, то достаточно переименовать блок и переопределить. И без лиспа.
AMDen вне форума  
 
Непрочитано 14.05.2021, 17:24
#13
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


поочерёдная замена выбранных блоков на указанный заменяющий блок с синхронизацией атрибутов и динамических свойств в случае их совпадений (из заготовок). возможно будет работать не со всеми динамичекими свойствами.

Код:
[Выделить все]
 
;************************************************************************************************* koMon 25.05.2021 ************
;
;			Пользовательская команда COMMON_BLOCK_REPLACING поочерёдно заменяет выбранные блоки на заменяющий блок,
;			с синхронизацией совпадающих динамических параметров и опциональной синхронизацией атрибутов.
;
			(vl-load-com)
;
;*******************************************************************************************************************************

(defun c:common_block_replacing ( /
									init_step initiating command_terminated attributes_syncing attribute_objects_list
									current_substituting_ref_block_object substituted_block_ref_prop_list
									current_substituted_block_ref_object substituting_block_data
									substituting_block_object substituted_inserts_sset
									dynamic_properties_list active_space_object
								)

	;***************************************************************************************************************************

	(defun get_prompted_value (initget_value get_function prompt_string var command_terminated / default_string var_saved)
		(if (null command_terminated)
			(progn
				(setq var_saved (read (strcat (vl-symbol-name var) "_saved")))
				(cond
					(
						(null (vl-symbol-value var_saved))
							(setq default_string "")
					)
					(
						(= 'str (type (vl-symbol-value var_saved)))
							(setq default_string (vl-symbol-value var_saved))
					)
					(
						t
							(setq default_string (rtos (vl-symbol-value var_saved)))
					)
				)
				(initget initget_value)
 				(set var (vl-catch-all-apply get_function (list (strcat "\n" prompt_string " <" default_string ">: "))))
 				(cond
 					(
 						(null (vl-symbol-value var))
 							(set var (vl-symbol-value var_saved))
 					)
 					(
 						(vl-catch-all-error-p (vl-symbol-value var))
 							(setq command_terminated t)
 					)
 					(
 						t
 							(set var_saved (vl-symbol-value var))
 					)
 				)
			)
		)
 		command_terminated
	)

	;***************************************************************************************************************************

		(defun collect_block_properties (block_ref_object / block_ref_prop_list attribute_objects_list dynamic_properties_list)
			(setq block_ref_prop_list (append block_ref_prop_list (list (cons "Layer" (vla-get-layer block_ref_object))))
				  block_ref_prop_list (append block_ref_prop_list (list (cons "Insertion_Point" (vla-get-insertionpoint block_ref_object))))
			)
			(if (and
					 (minusp (vlax-get block_ref_object 'hasattributes))
					 (setq attribute_objects_list (vlax-safearray->list (vlax-variant-value (vla-getattributes block_ref_object))))
				)
					(foreach attribute_object attribute_objects_list
						(setq block_ref_prop_list (append block_ref_prop_list (list (cons (vla-get-tagstring attribute_object) (vla-get-textstring attribute_object)))))
					)
			)
			(if (minusp (vlax-get block_ref_object 'isdynamicblock))
					(progn
						(setq dynamic_properties_list (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties block_ref_object))))
						(foreach dynamic_property dynamic_properties_list
							(if (/= "Origin" (vla-get-propertyname dynamic_property))
								(setq block_ref_prop_list (append block_ref_prop_list (list (cons (vla-get-propertyname dynamic_property) (vla-get-value dynamic_property)))))
							)
						)
					)
			)
			block_ref_prop_list
		)

	;***************************************************************************************************************************

	(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
	(setq init_step 1)
	(setq initiating t)
	(while initiating
			(cond
				(
					(= 1 init_step)
						(prompt "Выберите заменяемые блоки:")
						(setvar 'nomutt 1)
						(setq ignore_empty_sset (and
							   						(null command_terminated)
							   						(while (null (setq substituted_inserts_sset (vl-catch-all-apply 'ssget (list '((0 . "insert")))))))
						  						)
							  substituted_inserts_sset (cond
							  							(
															(vl-catch-all-error-p substituted_inserts_sset)
																(setq command_terminated t)
														)
														(
															t
																substituted_inserts_sset
														)
												   )
						)
						(setvar 'nomutt 0)
						(if command_terminated
								(setq initiating nil
									  substituted_inserts_sset (princ "\nОтмена команды")
									  substituted_inserts_sset (ssadd)
								)
								(setq init_step (1+ init_step)
									  active_space_object (vlax-ename->vla-object (cdr (assoc -1 (entget (cdr (assoc 330 (entget (ssname substituted_inserts_sset 0))))))))
								)
						)
				)
				(
					(= 2 init_step)
						(while (and
									(if (setq substituting_block_data (vl-catch-all-apply 'entsel (list "\nУкажите заменяющий блок: "))) t t)
									(cond
										  (
											 (vl-catch-all-error-p substituting_block_data)
												(not (setq command_terminated t))
										  )
										  (
										  	 (/= "AcDbBlockReference" (vla-get-objectname (setq substituting_block_object (vlax-ename->vla-object (car substituting_block_data)))))
												t
										  )
										  (
											 t
												nil
										  )
									)
							   )
						)
						(if command_terminated
								(setq init_step (1- init_step)
									  command_terminated nil
								)
								(setq init_step (1+ init_step)
									  initiating (if (zerop (vlax-get substituting_block_object 'hasattributes)) nil t)
								)
						)
				)
				(
					(= 3 init_step)
						(setq attributes_syncing_saved (if (null attributes_syncing_saved) "Да" attributes_syncing_saved)
		  					  command_terminated (get_prompted_value "Да Нет" 'getkword "Синхронизировать атрибуты (если применимо) [Да/Нет]" 'attributes_syncing command_terminated)
						)
						(if command_terminated
								(setq init_step (1- init_step)
									  command_terminated nil
								)
								(setq init_step (1+ init_step))
						)
				)
				(
					t
						(setq initiating nil)
				)
			)
	)
	(while (< 0 (sslength substituted_inserts_sset))
		(setq substituted_block_ref_prop_list (collect_block_properties (setq current_substituted_block_ref_object (vlax-ename->vla-object (ssname substituted_inserts_sset 0)))))

		;*******************************************
;		(setq current_substituting_ref_block_object (vla-copy substituting_block_object))
;		(vla-put-insertionpoint current_substituting_ref_block_object (cdr (assoc "Insertion_Point" substituted_block_ref_prop_list)))
		;*******************************************

		(cond
			(
				(= "Да" attributes_syncing)

					;*******************************************
					(setq current_substituting_ref_block_object (vla-insertblock
																	active_space_object
																	(cdr (assoc "Insertion_Point" substituted_block_ref_prop_list))
																	(vla-get-effectivename substituting_block_object)
																	1 1 1 0
																)
					)
					;*******************************************

					(if (and
							 (minusp (vlax-get current_substituting_ref_block_object 'hasattributes))
							 (setq attribute_objects_list (vlax-safearray->list (vlax-variant-value (vla-getattributes current_substituting_ref_block_object))))
						)
						(foreach attribute_object attribute_objects_list
							(setq this_attribute_list (member (assoc (vla-get-tagstring attribute_object) substituted_block_ref_prop_list) substituted_block_ref_prop_list))
							(if (and this_attribute_list
									 (cdr (assoc (vla-get-tagstring attribute_object) this_attribute_list))
								)
									(vla-put-textstring attribute_object (cdr (assoc (vla-get-tagstring attribute_object) this_attribute_list)))
							)
						)
					)
			)
			(
				t
					;*******************************************
					(setq current_substituting_ref_block_object (vla-copy substituting_block_object))
					(vla-put-insertionpoint current_substituting_ref_block_object (cdr (assoc "Insertion_Point" substituted_block_ref_prop_list)))
					;*******************************************
			)
		)
		(vla-put-layer current_substituting_ref_block_object (cdr (assoc "Layer" substituted_block_ref_prop_list)))
		(if (and
				 (minusp (vlax-get current_substituting_ref_block_object 'isdynamicblock))
				 (setq dynamic_properties_list (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties current_substituting_ref_block_object))))
			)
				(foreach dynamic_property dynamic_properties_list
					(if (and
							 (/= "Origin" (vla-get-propertyname dynamic_property))
							 (cdr (assoc (vla-get-propertyname dynamic_property) substituted_block_ref_prop_list))
						)
							(vla-put-value dynamic_property (cdr (assoc (vla-get-propertyname dynamic_property) substituted_block_ref_prop_list)))
					)
				)
		)

		;*******************************************
		(vla-update current_substituting_ref_block_object)
		;*******************************************

		(vla-erase current_substituted_block_ref_object)
		(setq substituted_inserts_sset (ssdel (ssname substituted_inserts_sset 0) substituted_inserts_sset))
	)

	;*******************************************
;    (if (not command_terminated) (vla-regen (vla-get-activedocument (vlax-get-acad-object)) acactiveviewport))
	;*******************************************

	(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
	(princ)
)

;*******************************************************************************************************************************

Последний раз редактировалось koMon, 25.05.2021 в 17:54.
koMon вне форума  
 
Автор темы   Непрочитано 17.05.2021, 09:35
#14
танбраун


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


AMDen, если я переименую блок, тогда переименуются все блоки с данным именем, мне же надо заменить часть блоков. Можно конечно скопировать блоки на новый чертеж, переименовать, перечертить (и скорее всего, когда я перечерчу, все изменения в динамических свойствах существующих блоков приведутся к свойствам перечерченного блока). Хотелось бы заменять блоки как то побыстрее, так как таких замен нужно делать несколько.


koMon, спасибо, отлично то что надо, только вот сообщения от автокада пишется какими то иероглифами, это конечно не так важно.
Еще такое пожелание, если можно, сделать чтобы был выбор:
1. с сохранением размеров, атрибутов и точки вставки исходного блока. (как реализовано в Вашем лиспе)
2. с сохранением размеров (без сохранения атрибутов) и точки вставки исходного блока.
танбраун вне форума  
 
Непрочитано 20.05.2021, 12:01
#15
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от танбраун Посмотреть сообщение
только вот сообщения от автокада пишется какими то иероглифами
как накопировали, так и читаете )
Цитата:
Сообщение от танбраун Посмотреть сообщение
с сохранением размеров
вообще у блока нет задаваемых размеров (если их определения не выполнены дин. параметрами), есть масштабы. вам что нужно?
Цитата:
Сообщение от танбраун Посмотреть сообщение
(без сохранения атрибутов)
то есть чтобы оставались значения атрибутов из определения блока?
koMon вне форума  
 
Автор темы   Непрочитано 20.05.2021, 14:26
#16
танбраун


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Сообщение от танбраун
только вот сообщения от автокада пишется какими то иероглифами
как накопировали, так и читаете )
С этим я разобрался (проблема была в редакторе LISP)

Цитата:
Сообщение от koMon Посмотреть сообщение
вообще у блока нет задаваемых размеров (если их определения не выполнены дин. параметрами), есть масштабы. вам что нужно?
это вы реализовали.

Цитата:
Сообщение от koMon Посмотреть сообщение
Сообщение от танбраун
(без сохранения атрибутов)
то есть чтобы оставались значения атрибутов из определения блока?
то что хотелось бы видеть нарисовал во вложении.
Миниатюры
Нажмите на изображение для увеличения
Название: Пример1.jpg
Просмотров: 108
Размер:	49.5 Кб
ID:	237381  
танбраун вне форума  
 
Непрочитано 25.05.2021, 17:55
#17
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


Цитата:
Сообщение от танбраун Посмотреть сообщение
то что хотелось бы видеть нарисовал во вложении.
обновил ЧД
koMon вне форума  
 
Автор темы   Непрочитано 04.06.2021, 13:34
#18
танбраун


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


koMon, спасибо за Вашу помощь.

Код загрузил, но при вводе common_block_replacing, автокад пишет неизвестная команда.
танбраун вне форума  
 
Непрочитано 04.06.2021, 17:37
#19
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,665


танбраун,
неизвестная команда какая? что в консоли пишется дословно?
koMon вне форума  
 
Автор темы   Непрочитано 07.06.2021, 08:48
#20
танбраун


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


koMon, извиняюсь, все заработало (хотя после установки приложения не работала, перезагружал пк, все равно не работала, удалил порядковые номера по левому полю, заработала).

Функция на 5 с большими плюсами, работает как надо. Огромное спасибо в помощи.
танбраун вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Динамические блоки > Замена нескольких динамических блоков с атрибутами на новый блок с сохранением размеров

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Помогите сделать блок с атрибутами в котором можно перемещать блок с атрибутами вместе и атрибуты отдельно и их поворачивать по отдельности otsva Динамические блоки 4 08.10.2019 21:35
VBA. dfx код для динамических блоков с атрибутами art_rrc Программирование 2 03.10.2014 14:26
Подсчет Блоков и Динамических блоков с учетом visibility (видимости) и сумму длин линий, полилиний по слоям и вывод результатов в Ecxel Andrey_nadym Программирование 18 07.01.2014 01:42
Подсчет простых и динамических блоков gizmo_zx Программирование 12 08.09.2010 16:04