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

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

Замена примитивов (отрезков) на блоки

Ответ
Поиск в этой теме
Непрочитано 31.03.2019, 23:55
Замена примитивов (отрезков) на блоки
Deutschland
 
Регистрация: 31.03.2019
Сообщений: 13

На схеме имеется большое количество примитивов (отрезков), которые необходимо заменить (преобразовать) на (в) блоки (вхождение блока). Каждый раз удаляю отрезок, вставляю тот же отрезок, но уже как блок (Вставка - Блок) и соединяю с остальными. И нужно, чтобы эти блоки (отрезки) были отделены друг от друга, поэтому я не могу сделать всю схему одним блоком. Вся работа занимает огромное количество времени, чтобы заменить всё. Существует ли способ заменить это всё разом?

Попробовал LISP. Замена набора примитивов на выбранный примитив. Но это не подошло под мой случай, так как замена производится именно на тот объект, который был выбран в качестве образца. То есть сохраняются все его свойства (угол, длина и т.п.) Необходимо чтобы всё встало на те же места, под теми же углами и длинами.

Миниатюры
Нажмите на изображение для увеличения
Название: AutoCAD.jpg
Просмотров: 277
Размер:	159.9 Кб
ID:	212489  Нажмите на изображение для увеличения
Название: AutoCAD1.jpg
Просмотров: 237
Размер:	185.7 Кб
ID:	212490  

Просмотров: 13753
 
Непрочитано 04.04.2019, 22:03
#41
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Цитата:
Сообщение от Deutschland Посмотреть сообщение
Но только после применения он эти блоки на схеме разворачивает в противоположную сторону.
проверьте - чтобы блок и отрезок при нулевом угле поворота показывали бы в одну сторону, а не в противоположные. Поэтому точку вставки и предлагал в середину перенести.
Сергей812 вне форума  
 
Непрочитано 05.04.2019, 08:24
#42
VitalyAF


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
2. Реально ли написать такой код, чтобы применять его не разово? Выделить все отрезки на схеме и сразу всё заменить на данный блок
... а иначе и смысла нет!
VitalyAF вне форума  
 
Непрочитано 05.04.2019, 08:53
#43
koMon


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
Но только после применения он эти блоки на схеме разворачивает в противоположную сторону.
блок оригинальный или с моей коррекцией?
Код:
[Выделить все]
 (vl-load-com)
;************
(defun c:Line_DBlock ()
	(setq modelSpace_object (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
		  lines_ss (ssget '((0 . "LINE")))
		  lines_list (vl-remove-if '(lambda (list_member)
		  								(/= 'ename (type list_member))
		  							)
									(mapcar 'cadr (ssnamex lines_ss))
					 )
	)
	(foreach line_entity lines_list
		(setq line_object (vlax-ename->vla-object line_entity)
			  line_start_point (vlax-get line_object 'startpoint)
			  line_end_point (vlax-get line_object 'endpoint)
			  line_length (vlax-get line_object 'length)
			  block_insert_point (if (< (car line_start_point) (car line_end_point))
										line_start_point
										line_end_point
								 )
			  block_rotation_angle (if (zerop (distance block_insert_point line_end_point))
				  							(angle block_insert_point line_start_point)
				  							(angle block_insert_point line_end_point)
								   )
			  current_block (vla-InsertBlock modelSpace_object (vlax-3d-point 0 0 0) "l0" 1 1 1 block_rotation_angle)
			  current_block_dynamic_properties_list (vlax-safearray->list (vlax-variant-value (vla-getdynamicblockproperties current_block)))
		)
		(foreach dynamic_property current_block_dynamic_properties_list
			(cond
				(
					(= "Расстояние1" (vla-get-PropertyName dynamic_property))
						(vla-put-value dynamic_property (vlax-make-variant line_length))
				)
				(
					t
				)
			)
		)
		(vla-put-insertionpoint current_block (vlax-3d-point block_insert_point))
		(vla-delete line_object)
	)
	(princ)
)
Миниатюры
Нажмите на изображение для увеличения
Название: Capture.PNG
Просмотров: 46
Размер:	39.7 Кб
ID:	212696  

Последний раз редактировалось koMon, 05.04.2019 в 09:25.
koMon вне форума  
 
Автор темы   Непрочитано 05.04.2019, 20:54
#44
Deutschland


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


Цитата:
Сообщение от koMon Посмотреть сообщение
блок оригинальный или с моей коррекцией?
Блок с вашей коррекцией.
Deutschland вне форума  
 
Непрочитано 08.04.2019, 11:44
1 | #45
koMon


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
Блок с вашей коррекцией.
скачал свой блок отсюда, в новый документ втавил блок, нарисовал отрезки, работает
ниже лисп с комментариями и немного доработанной точкой вставки блока
Код:
[Выделить все]
 
(vl-load-com)                                                                                                           ;	загружаем поддержку расширенных
																														;	функций ActiveX
;************
(defun c:Line_DBlock ()                                                                                                	;	определяем команду
	(setq modelSpace_object (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))                        ;	запоминаем объект пространства модели
		  lines_ss (ssget '((0 . "LINE")))                                                                              ;	создаём набор отрезков
		  lines_list (vl-remove-if '(lambda (list_member)
		  								(/= 'ename (type list_member))                                                  ;	конвертируем набор отрезков
		  							)                                                                                   ;	в список отрезков
									(mapcar 'cadr (ssnamex lines_ss))
					 )
	)
	(foreach line_entity lines_list                                                                                     ;	для каждого отрезка
																														;	из списка  выполняем

		(setq line_object (vlax-ename->vla-object line_entity)                                                          ;	снимаем координаты начальной
			  line_start_point (vlax-get line_object 'startpoint)                                                       ;	точки отрезка

			  line_end_point (vlax-get line_object 'endpoint)                                                           ;	снимаем координаты конечной
																														;	точки отрезка

			  line_length (vlax-get line_object 'length)                                                                ;	снимаем длину отрезка
			  block_insert_point (cond
			  							(
											(or
												(< (car line_start_point) (car line_end_point))
												(and
													(equal (car line_start_point) (car line_end_point) 1e-6)    		;	назначаем точкой вставки
													(> (cadr line_end_point) (cadr line_start_point))           			;	блока, заменяющего отрезок
												)                                                               		;	левую току наклонного
											)                                                                   		;	или горизонтального отрезка
												line_start_point                                                		;	если отрезок вертикальный
										)                                                                       		;	назначаем точкой вставки
										(                                                                       		;	нижнюю точку отрезка
											t
												line_end_point
										)
								 )
			  block_rotation_angle (if (zerop (distance block_insert_point line_end_point))                     		;	назначаем угол поворота блока
				  							(angle block_insert_point line_start_point)                         		;	относительно его точки вставки
				  							(angle block_insert_point line_end_point)
								   )
			  current_block (vla-InsertBlock modelSpace_object (vlax-3d-point 0 0 0) "l0" 1 1 1 block_rotation_angle)	;	вставляем блок в начало координат
			  current_block_dynamic_properties_list (vlax-safearray->list
			  											(vlax-variant-value
															(vla-getdynamicblockproperties current_block)               ;	собираем в список динамические
														)                                                               ;	свойства вставленного блока
													)
		)
		(foreach dynamic_property current_block_dynamic_properties_list
			(cond
				(
					(= "Расстояние1" (vla-get-PropertyName dynamic_property))                                           ;	устанавливаем длину отрезка
						(vla-put-value dynamic_property (vlax-make-variant line_length))                                ;	в свойство "Расстояние1"
				)                                                                                                       ;	вставленного блока
				(
					t
				)
			)
		)
		(vla-put-insertionpoint current_block (vlax-3d-point block_insert_point))                                       ;	переносим блок из начала координат
																														;	в точку вставки
		(vla-delete line_object)                                                                                        ;	удаляем заменяемый отрезок
	)
	(princ)                                                                                                             ;	подавляем эхо последнй выполненной функции
)

koMon вне форума  
 
Автор темы   Непрочитано 08.04.2019, 22:50
#46
Deutschland


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


Цитата:
Сообщение от koMon Посмотреть сообщение
лисп с комментариями и немного доработанной точкой вставки блока
Благодарю Теперь всё работает корректно.
Deutschland вне форума  
 
Непрочитано 21.04.2019, 20:49
1 | #47
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Попалось такое приложение для создания схем сетей газораспределения в AutoCAD и BricsCAD. Не копал - поддерживают ли приложение, можно ли заменять линии на блоки и пр.
Просто в копилку ТС - вдруг пригодится.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 22.04.2019, 17:43
#48
Deutschland


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


Цитата:
Сообщение от koMon Посмотреть сообщение
ниже лисп с комментариями и немного доработанной точкой вставки блока
Код:
[Выделить все]
 
(vl-load-com)                                                                                                           ;	загружаем поддержку расширенных
																														;	функций ActiveX
;************
(defun c:Line_DBlock ()                                                                                                	;	определяем команду
	(setq modelSpace_object (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))                        ;	запоминаем объект пространства модели
		  lines_ss (ssget '((0 . "LINE")))                                                                              ;	создаём набор отрезков
		  lines_list (vl-remove-if '(lambda (list_member)
		  								(/= 'ename (type list_member))                                                  ;	конвертируем набор отрезков
		  							)                                                                                   ;	в список отрезков
									(mapcar 'cadr (ssnamex lines_ss))
					 )
	)
	(foreach line_entity lines_list                                                                                     ;	для каждого отрезка
																														;	из списка  выполняем

		(setq line_object (vlax-ename->vla-object line_entity)                                                          ;	снимаем координаты начальной
			  line_start_point (vlax-get line_object 'startpoint)                                                       ;	точки отрезка

			  line_end_point (vlax-get line_object 'endpoint)                                                           ;	снимаем координаты конечной
																														;	точки отрезка

			  line_length (vlax-get line_object 'length)                                                                ;	снимаем длину отрезка
			  block_insert_point (cond
			  							(
											(or
												(< (car line_start_point) (car line_end_point))
												(and
													(equal (car line_start_point) (car line_end_point) 1e-6)    		;	назначаем точкой вставки
													(> (cadr line_end_point) (cadr line_start_point))           			;	блока, заменяющего отрезок
												)                                                               		;	левую току наклонного
											)                                                                   		;	или горизонтального отрезка
												line_start_point                                                		;	если отрезок вертикальный
										)                                                                       		;	назначаем точкой вставки
										(                                                                       		;	нижнюю точку отрезка
											t
												line_end_point
										)
								 )
			  block_rotation_angle (if (zerop (distance block_insert_point line_end_point))                     		;	назначаем угол поворота блока
				  							(angle block_insert_point line_start_point)                         		;	относительно его точки вставки
				  							(angle block_insert_point line_end_point)
								   )
			  current_block (vla-InsertBlock modelSpace_object (vlax-3d-point 0 0 0) "l0" 1 1 1 block_rotation_angle)	;	вставляем блок в начало координат
			  current_block_dynamic_properties_list (vlax-safearray->list
			  											(vlax-variant-value
															(vla-getdynamicblockproperties current_block)               ;	собираем в список динамические
														)                                                               ;	свойства вставленного блока
													)
		)
		(foreach dynamic_property current_block_dynamic_properties_list
			(cond
				(
					(= "Расстояние1" (vla-get-PropertyName dynamic_property))                                           ;	устанавливаем длину отрезка
						(vla-put-value dynamic_property (vlax-make-variant line_length))                                ;	в свойство "Расстояние1"
				)                                                                                                       ;	вставленного блока
				(
					t
				)
			)
		)
		(vla-put-insertionpoint current_block (vlax-3d-point block_insert_point))                                       ;	переносим блок из начала координат
																														;	в точку вставки
		(vla-delete line_object)                                                                                        ;	удаляем заменяемый отрезок
	)
	(princ)                                                                                                             ;	подавляем эхо последнй выполненной функции
)

Ответьте пожалуйста, что необходимо изменить в коде, чтобы отрезки были заменены не на этот динамический блок, а на обычный (статический). Блок прикрепил.
Вложения
Тип файла: dwg
DWG 2013
l0.dwg (19.8 Кб, 13 просмотров)
Deutschland вне форума  
 
Непрочитано 26.04.2019, 15:34
1 | #49
koMon


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
что необходимо изменить в коде, чтобы отрезки были заменены не на этот динамический блок, а на обычный (статический). Блок прикрепил.
Код:
[Выделить все]
 
(vl-load-com)                                                                                                           ;	загружаем поддержку расширенных
																														;	функций ActiveX
;************
(defun c:Line_Block ()                                                                                                	;	определяем команду
	(setq modelSpace_object (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))                        ;	запоминаем объект пространства модели
		  lines_ss (ssget '((0 . "LINE")))                                                                              ;	создаём набор отрезков
		  lines_list (vl-remove-if '(lambda (list_member)
		  								(/= 'ename (type list_member))                                                  ;	создаём из набора отрезков
		  							)                                                                                   ;	список отрезков
									(mapcar 'cadr (ssnamex lines_ss))
					 )
	)
	(foreach line_entity lines_list                                                                                     ;	для каждого отрезка
																														;	из списка  выполняем

		(setq line_object (vlax-ename->vla-object line_entity)                                                          ;	конвертируем отрезок-примитив
																														;	в отрезок-объект
			  line_start_point (vlax-get line_object 'startpoint)                                                       ;	снимаем координаты начальной
																														;	точки отрезка
			  line_end_point (vlax-get line_object 'endpoint)                                                           ;	снимаем координаты конечной
																														;	точки отрезка

			  line_length (vlax-get line_object 'length)                                                                ;	снимаем длину отрезка
			  block_insert_point (cond
			  							(
											(or
												(< (car line_start_point) (car line_end_point))
												(and
													(equal (car line_start_point) (car line_end_point) 1e-6)    		;	назначаем точкой вставки
													(> (cadr line_end_point) (cadr line_start_point))           		;	блока, заменяющего отрезок
												)                                                               		;	левую точку наклонного
											)                                                                   		;	или горизонтального отрезка
												line_start_point                                                		;	если отрезок вертикальный
										)                                                                       		;	назначаем точкой вставки
										(                                                                       		;	нижнюю точку отрезка
											t
												line_end_point
										)
								 )
			  block_rotation_angle (if (zerop (distance block_insert_point line_end_point))                     		;	назначаем угол поворота блока
				  							(angle block_insert_point line_start_point)                         		;	относительно его точки вставки
				  							(angle block_insert_point line_end_point)
								   )
			  current_block (vla-InsertBlock modelSpace_object
			  								(vlax-3d-point 0 0 0)                                                       ;	вставляем блок "L0" в начало координат
											"L0"
											line_length 1 1 block_rotation_angle
							)
		)
		(vla-put-insertionpoint current_block (vlax-3d-point block_insert_point))                                       ;	переносим блок из начала координат
																														;	в точку вставки

		(vla-delete line_object)                                                                                        ;	удаляем заменяемый отрезок
	)
	(princ)                                                                                                             ;	подавляем эхо последнй выполненной функции
)

Последний раз редактировалось koMon, 26.04.2019 в 15:43.
koMon вне форума  
 
Непрочитано 26.04.2019, 21:47
#50
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Offtop: Общие соображения на эту тему: Дополнительные, описательные данные в атрибутах.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 26.04.2019, 22:58
#51
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,039


Offtop:
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Общие соображения на эту тему: Дополнительные, описательные данные в атрибутах.
И что это дает для ТС?) Как вы не поймете - кто хотел автоматизировать процесс, тот уже это сделал и продолжает над этим работать. А у многих фирм сейчас в штате зачастую нет людей - кто смог бы заняться организационными вопросами, предшествующими самому процессу автоматизации. А вы все пытаетесь реанимировать свою идею присоединенных данных, опоздав лет на 10 минимум для монетизации этого процесса)
Сергей812 вне форума  
 
Непрочитано 27.04.2019, 03:21
#52
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,031


Offtop: Дас ист фантастиш, но вдруг кто-нибудь образумится? Вдруг заказчики перестанут требовать кантовать круглое и катать квадратное?
Забыл еще написать. Из СТО:
Цитата:
Область применения
...
Положения настоящего стандарта обязательны для применения структурными подразделениями, филиалами, дочерними и зависимыми обществами ОАО «Газпром газораспределение» при создании и применении электронных схем сетей газораспределения.
Положения настоящего стандарта не распространяются на проектную и исполнительную документацию, планы территорий, схемы газификации.
Соответственно, требования стандарта не распространяются на любые иные организации и схемы. Если иное, то есть формальная причина не заниматься этими заменами.
__________________
количество моих сообщений не говорит о знании Автокада
АлексЮстасу вне форума  
 
Непрочитано 24.08.2021, 20:24
#53
Teyso


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


Цитата:
Сообщение от koMon Посмотреть сообщение
скачал свой блок отсюда, в новый документ втавил блок, нарисовал отрезки, работает
ниже лисп с комментариями и немного доработанной точкой вставки блока
Код:
[Выделить все]
 
(vl-load-com)                                                                                                           ;	загружаем поддержку расширенных
																														;	функций ActiveX
;************
(defun c:Line_DBlock ()                                                                                                	;	определяем команду
	(setq modelSpace_object (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))                        ;	запоминаем объект пространства модели
		  lines_ss (ssget '((0 . "LINE")))                                                                              ;	создаём набор отрезков
		  lines_list (vl-remove-if '(lambda (list_member)
		  								(/= 'ename (type list_member))                                                  ;	конвертируем набор отрезков
		  							)                                                                                   ;	в список отрезков
									(mapcar 'cadr (ssnamex lines_ss))
					 )
	)
	(foreach line_entity lines_list                                                                                     ;	для каждого отрезка
																														;	из списка  выполняем

		(setq line_object (vlax-ename->vla-object line_entity)                                                          ;	снимаем координаты начальной
			  line_start_point (vlax-get line_object 'startpoint)                                                       ;	точки отрезка

			  line_end_point (vlax-get line_object 'endpoint)                                                           ;	снимаем координаты конечной
																														;	точки отрезка

			  line_length (vlax-get line_object 'length)                                                                ;	снимаем длину отрезка
			  block_insert_point (cond
			  							(
											(or
												(< (car line_start_point) (car line_end_point))
												(and
													(equal (car line_start_point) (car line_end_point) 1e-6)    		;	назначаем точкой вставки
													(> (cadr line_end_point) (cadr line_start_point))           			;	блока, заменяющего отрезок
												)                                                               		;	левую току наклонного
											)                                                                   		;	или горизонтального отрезка
												line_start_point                                                		;	если отрезок вертикальный
										)                                                                       		;	назначаем точкой вставки
										(                                                                       		;	нижнюю точку отрезка
											t
												line_end_point
										)
								 )
			  block_rotation_angle (if (zerop (distance block_insert_point line_end_point))                     		;	назначаем угол поворота блока
				  							(angle block_insert_point line_start_point)                         		;	относительно его точки вставки
				  							(angle block_insert_point line_end_point)
								   )
			  current_block (vla-InsertBlock modelSpace_object (vlax-3d-point 0 0 0) "l0" 1 1 1 block_rotation_angle)	;	вставляем блок в начало координат
			  current_block_dynamic_properties_list (vlax-safearray->list
			  											(vlax-variant-value
															(vla-getdynamicblockproperties current_block)               ;	собираем в список динамические
														)                                                               ;	свойства вставленного блока
													)
		)
		(foreach dynamic_property current_block_dynamic_properties_list
			(cond
				(
					(= "Расстояние1" (vla-get-PropertyName dynamic_property))                                           ;	устанавливаем длину отрезка
						(vla-put-value dynamic_property (vlax-make-variant line_length))                                ;	в свойство "Расстояние1"
				)                                                                                                       ;	вставленного блока
				(
					t
				)
			)
		)
		(vla-put-insertionpoint current_block (vlax-3d-point block_insert_point))                                       ;	переносим блок из начала координат
																														;	в точку вставки
		(vla-delete line_object)                                                                                        ;	удаляем заменяемый отрезок
	)
	(princ)                                                                                                             ;	подавляем эхо последнй выполненной функции
)


Здравствуйте. Подскажите, а можно ли сделать так, что бы динамический блок, заменяя линию, принимал ту же длину, что и линия?
Teyso вне форума  
 
Непрочитано 30.06.2023, 11:41
#54
BRATYXA


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


Добрый день!
А может кто-нибуть пошагово объяснить как пользоваться через LISP произвести замену отрезков на блоки?
BRATYXA вне форума  
 
Непрочитано 30.06.2023, 11:52
#55
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от BRATYXA Посмотреть сообщение
Добрый день!
А может кто-нибуть пошагово объяснить как пользоваться через LISP произвести замену отрезков на блоки?
https://dwg.ru/pub/9
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Замена примитивов (отрезков) на блоки

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить цвет выбранных примитивов? Замена цвета объектов в autocad (с помощью autolisp). Halfback LISP 8 24.12.2018 20:52
Как изменить свойства примитивов в блоках стандартных размерных стрелок philja AutoCAD 6 05.02.2016 01:22
AutoCAD MEP 2014: Откуда возникли непонятные блоки и стили в новом блоке? Новичёк Вертикальные решения на базе AutoCAD 7 14.12.2015 11:09
Различие функции поиск и замена (команда _find) последних версий AutoCad WeMaN AutoCAD 18 30.05.2013 13:40