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

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

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

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

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

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

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

Просмотров: 13756
 
Непрочитано 01.04.2019, 01:22
#2
Сергей812


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


Поскольку смысл этого действия (замена отрезков на блоки) не раскрыт, то как вариант:
1. Сделать динамический блок в виде симметрично растягивающегося относительно центра отрезка (со скрытыми ручками) и с динпараметром поворота.
2. Получаете из отрезка его длину и угол поворота, а также координаты середины отрезка. Затем вставляете блок и задаете его динпараметры значениями из отрезка. И после удаляете отрезок.
Сергей812 вне форума  
 
Непрочитано 01.04.2019, 08:09
#3
Boxa

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


Дополню, можно выгрузить данные из линий в Excel, немного посчитать... и пакетно вставить дин блоки с соответствующими настройками (DynIn).
Boxa на форуме  
 
Непрочитано 01.04.2019, 08:34
#4
Oleg T


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
Попробовал LISP. Замена набора примитивов на выбранный примитив.
Не знаю, правильно ли понял, но набросал простенький лисп.
Код:
[Выделить все]
 (defun c:1 ()
	(setq nab(ssget))
	(setq kol (sslength nab))
	(setq n -1)
	(repeat kol
		(setq n (+ n 1))
		(setq pr (ssname nab n))
		(setq name_i (cdr (assoc '5 (entget pr))))
		(setq t_i (cdr (assoc '10 (entget pr))))
		(command "-block" name_i t_i pr "")
		(command "-insert" name_i t_i "1" "1" "0")
	)
)
У меня работает. Может, придется немного подправить.

PS
Возможен еще вариант, более правильный:
создать в файле блок из отрезка длиной 1 и пакетно заменить им отрезки, а то здесь слишком много блоков получается, это нерационально.
Может, лучше разместить тему в разделе программирования, там наверняка помогут.
Вложения
Тип файла: dwg
DWG 2013
Чертеж1.dwg (20.6 Кб, 32 просмотров)

Последний раз редактировалось Oleg T, 01.04.2019 в 08:42.
Oleg T вне форума  
 
Непрочитано 01.04.2019, 09:53
#5
Сергей812


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


Цитата:
Сообщение от Oleg T Посмотреть сообщение
Возможен еще вариант, более правильный:
создать в файле блок из отрезка длиной 1 и пакетно заменить им отрезки, а то здесь слишком много блоков получается, это нерационально.
а также еще сделать блоки - дольные доли единицы...
Сергей812 вне форума  
 
Непрочитано 01.04.2019, 13:33
#6
VitalyAF


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


...
А управлять как всеми этими блоками?
Например, выбрать дин. блоки с определёнными атрибутами, заменить на другие?
Вертикалку из палочек собрать...
VitalyAF на форуме  
 
Автор темы   Непрочитано 01.04.2019, 20:36
#7
Deutschland


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


Цитата:
Сообщение от Oleg T Посмотреть сообщение
Не знаю, правильно ли понял, но набросал простенький лисп.
Код:
[Выделить все]
 (defun c:1 ()
	(setq nab(ssget))
	(setq kol (sslength nab))
	(setq n -1)
	(repeat kol
		(setq n (+ n 1))
		(setq pr (ssname nab n))
		(setq name_i (cdr (assoc '5 (entget pr))))
		(setq t_i (cdr (assoc '10 (entget pr))))
		(command "-block" name_i t_i pr "")
		(command "-insert" name_i t_i "1" "1" "0")
	)
)
У меня работает. Может, придется немного подправить.

PS
Возможен еще вариант, более правильный:
создать в файле блок из отрезка длиной 1 и пакетно заменить им отрезки, а то здесь слишком много блоков получается, это нерационально.
Может, лучше разместить тему в разделе программирования, там наверняка помогут.
Разъясните пожалуйста. Не понимаю как с ним правильно работать. Здесь я прочитал. Активировал с помощью цифры '1'. В какой последовательности работать дальше?
Deutschland вне форума  
 
Автор темы   Непрочитано 01.04.2019, 20:38
#8
Deutschland


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


Забыл добавить один из важных моментов. Есть СТО Газпром газораспределение 2.7-2013. И все блоки должны быть вставлены именно в таком виде, в котором они были предоставлены организации. То есть в данном случае его нельзя изменять. Он только растяжимый. Файл блока прикрепил. l0.dwg

И спасибо всем, кто ответил. Буду пробовать все предложенные вами способы. Будут вопросы - напишу.

Последний раз редактировалось Deutschland, 01.04.2019 в 21:06.
Deutschland вне форума  
 
Непрочитано 01.04.2019, 21:22
#9
Сергей812


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


чудоблок - на динпараметр поворота уже сил не хватило, видимо) И точка вставки не в центре блока-отрезка. Ну все равно алгоритмом остается почти прежним - только цепляетесь к одной из конечных точек "входного" отрезка как точки вставки.

----- добавлено через ~2 ч. -----
и откуда берутся данные для двух атрибутов в блоке? вручную вводить - это сразу хороший минус в скорости...
Сергей812 вне форума  
 
Непрочитано 02.04.2019, 13:28
#10
Boxa

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


Какой хороший блок, человек делавший его явно мастер, так просто и так элегантно повысить сложность автоматизации, это надо уметь. То, что это получилось случайно, я ни в жисть не поверю. Я прямо таки в восторге.
Deutschland, спасибо Вам большое, за то, что поделились.
Boxa на форуме  
 
Непрочитано 02.04.2019, 13:50
#11
Сергей812


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


Ну какая то логика в этом есть: вроде в том же LT акаде можно работать с динблоком - в отличие от расширенных данных, присоединенных к отрезку.
Сергей812 вне форума  
 
Непрочитано 02.04.2019, 14:30
#12
Boxa

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


Сергей812, я не оспариваю саму идею использовать дин. блоки, хозяин барин... мне просто очень понравилось как сделан именно этот блок.
Boxa на форуме  
 
Непрочитано 02.04.2019, 14:33
#13
Сергей812


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


Offtop:
Цитата:
Сообщение от Boxa Посмотреть сообщение
мне просто очень понравилось как сделан именно этот блок.
есть большие сомнения - что создатель блока с ним реально сам работал)
Сергей812 вне форума  
 
Непрочитано 02.04.2019, 16:23
#14
VitalyAF


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


Boxa
Спробуйте маво колобку Element.dwg
из палитры КМ,КЖ... пришлось поработать с архитекторами...
VitalyAF на форуме  
 
Непрочитано 02.04.2019, 16:49
#15
koMon


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
Он только растяжимый. Файл блока прикрепил. l0.dwg
коряво растяжимый
я внёс коррекцию только в растяжение, Offtop: ну и как водится короткий лисп.
перед использованием нужно переопределить блок в чертеже на нижеприлагаемый.
атрибуты у вставленных блоков пустые.
Код:
[Выделить все]
 
(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 (setq block_rotation_angle (angle block_insert_point line_end_point)))
				  							(angle block_insert_point line_start_point)
											block_rotation_angle
								   )
			  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)
)
Вложения
Тип файла: dwg
DWG 2013
l0.dwg (31.3 Кб, 34 просмотров)
koMon вне форума  
 
Непрочитано 02.04.2019, 18:04
#16
Boxa

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


koMon, а ведь условия против изменения блока...
Цитата:
Сообщение от Deutschland Посмотреть сообщение
И все блоки должны быть вставлены именно в таком виде, в котором они были предоставлены организации. То есть в данном случае его нельзя изменять.
А по поводу лиспа, ИМХО доработать Ваш вариант до работы с исходным блоком не так уж и сложно, буквально несколько действий (внимательнее к блоку присмотритесь =) )...

VitalyAF, и зачем это?
Boxa на форуме  
 
Непрочитано 02.04.2019, 18:59
#17
VitalyAF


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
и зачем это?
Та же линия с атрибутами в виде дин. блока,
только более функциональная. Переименуй атрибы и пользуйся!

https://i.postimg.cc/4x7bT1zw/KM-Element.gif
VitalyAF на форуме  
 
Автор темы   Непрочитано 02.04.2019, 19:05
#18
Deutschland


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


Мне решили ещё усложнить задачу до поры до времени... Вы наверное задаётесь вопросом зачем ему это всё надо? У нас в организации прошла проверка, в ходе которой сделали замечание. Мол, вместо отрезков должны быть блоки. Заставили переделывать. Только над одним куском схемы я корпел чуть больше рабочей недели. Всё, чем я занимался - это вручную удалял эти отрезки и вставлял блоки. А переделывать схему придётся для целого города.

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

Но можно ли как-то и из этой ситуации выкрутиться, чтобы заменить отрезки на блоки (с такими же длинами, поворотами и т.д.) пакетно или ещё как-нибудь упростить работу?
Миниатюры
Нажмите на изображение для увеличения
Название: Схема.png
Просмотров: 110
Размер:	49.0 Кб
ID:	212589  
Вложения
Тип файла: dwg
DWG 2013
l0.dwg (21.6 Кб, 17 просмотров)
Deutschland вне форума  
 
Автор темы   Непрочитано 02.04.2019, 19:08
#19
Deutschland


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


Цитата:
Сообщение от koMon Посмотреть сообщение
Код:
[Выделить все]
 
(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 (setq block_rotation_angle (angle block_insert_point line_end_point)))
				  							(angle block_insert_point line_start_point)
											block_rotation_angle
								   )
			  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)
)
А что это за лисп такой, чем он поможет? Активировал, пробую что-то выделять - реакции ноль.
И в чём блок был корявый, скажите пожалуйста. Я с AutoCAD не так давно знаком, многих нюансов не знаю ещё.

Последний раз редактировалось Deutschland, 02.04.2019 в 19:14.
Deutschland вне форума  
 
Непрочитано 03.04.2019, 14:23
#20
Сергей812


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
И в чём блок был корявый, скажите пожалуйста.
точку вставки перенести в середину блока, там же сделать динамический поворот блока. И растяжение от центра блока. Тогда даже вручную было бы проще - вставляется блок с привязкой к середине отрезка, затем он ручкой разворачивается до совпадения с отрезком, другой ручкой растягивается до конца заменяемого отрезка. А то, что вам дали, это действительно:
Цитата:
Сообщение от Boxa Посмотреть сообщение
так просто и так элегантно повысить сложность автоматизации, это надо уметь.
причем даже не автоматизации, а просто работы.
Сергей812 вне форума  
Ответ
Вернуться   Форум 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