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

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

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

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

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

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

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

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


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


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

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


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


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


Цитата:
Сообщение от 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 Кб, 37 просмотров)

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


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


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


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


...
А управлять как всеми этими блоками?
Например, выбрать дин. блоки с определёнными атрибутами, заменить на другие?
Вертикалку из палочек собрать...
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,499


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

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

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


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


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


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

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


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


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


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


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


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


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


Цитата:
Сообщение от 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 Кб, 35 просмотров)
koMon вне форума  
 
Непрочитано 02.04.2019, 18:04
#16
Boxa

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


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

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


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


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

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


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


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

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

Но можно ли как-то и из этой ситуации выкрутиться, чтобы заменить отрезки на блоки (с такими же длинами, поворотами и т.д.) пакетно или ещё как-нибудь упростить работу?
Миниатюры
Нажмите на изображение для увеличения
Название: Схема.png
Просмотров: 117
Размер:	49.0 Кб
ID:	212589  
Вложения
Тип файла: dwg
DWG 2013
l0.dwg (21.6 Кб, 19 просмотров)
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,499


Цитата:
Сообщение от Deutschland Посмотреть сообщение
И в чём блок был корявый, скажите пожалуйста.
точку вставки перенести в середину блока, там же сделать динамический поворот блока. И растяжение от центра блока. Тогда даже вручную было бы проще - вставляется блок с привязкой к середине отрезка, затем он ручкой разворачивается до совпадения с отрезком, другой ручкой растягивается до конца заменяемого отрезка. А то, что вам дали, это действительно:
Цитата:
Сообщение от Boxa Посмотреть сообщение
так просто и так элегантно повысить сложность автоматизации, это надо уметь.
причем даже не автоматизации, а просто работы.
Сергей812 вне форума  
 
Непрочитано 03.04.2019, 17:46
1 | #21
Семёныч


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


Для Deutschland.
В приведенном файле-блоке используется полилиния, а не отрезок (LINE).
Вот заготовка для однократной замены отрезка блоком.
Скопировать текст в буфер, вставить в командную строку и нажать Enter. Блок уже должен быть в текущем файле.
Код:
[Выделить все]
(progn
(setvar "ATTDIA" 0)
(setvar "ATTREQ" 1)
(setq otr (car (entsel "\nВыберите отрезок: ")))
(setq votr (vlax-ename->vla-object otr))
(setq tvs (cdr (assoc 10 (entget otr))))
(setq dlina (vlax-get-property votr 'Length))
(setq ugol (/ (* 180(vlax-get-property votr 'angle)) pi))
(entdel otr)
(vl-cmdf "_-INSERT" "l0" "X" dlina "Y" "1" "Z" "1" "_R" ugol tvs "" "")
(setvar "ATTDIA" 1)
(setvar "ATTREQ" 0)
)
Семёныч вне форума  
 
Автор темы   Непрочитано 03.04.2019, 18:53
#22
Deutschland


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Вот заготовка для однократной замены отрезка блоком.
Скопировать текст в буфер, вставить в командную строку и нажать Enter. Блок уже должен быть в текущем файле.
Блок в текущем файле. Скопировал, вставил в командную строку, далее меня просят выбрать отрезок, выбираю. Ничего не происходит. Несколько раз пробовал. Что я делаю не так
Deutschland вне форума  
 
Непрочитано 03.04.2019, 20:08
#23
Семёныч


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


А что по ожиданию должно происходить? Если выбирается отрезок, то он удаляется, а на его месте оказывается блок. Это можно определить с помощью палитры свойств.
Семёныч вне форума  
 
Непрочитано 03.04.2019, 20:13
#24
Сергей812


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Если выбирается отрезок,
кстати хороший вопрос - исходные примитивы: отрезки (line) или полилинии (polyline)?
Сергей812 вне форума  
 
Непрочитано 03.04.2019, 20:35
#25
Семёныч


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


В моей заготовке пока подразумевается объект, у которого есть свойства "длина" ("Length") и "угол поворота"("angle"). У полилинии таких свойств нет. С другой стороны, если применить программу к отрезку, то он заменяется блоком и повторно применять программу к нему бесполезно. К тому же автор темы постоянно упоминает понятие "отрезок". Я написал именно заготовку программы Если она устроит автора темы, то её можно будет довести до финала.
Семёныч вне форума  
 
Непрочитано 03.04.2019, 20:48
#26
Сергей812


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


Семёныч, это вопрос к ТС был - не сильно удивлюсь, если там и отрезки, и полилинии)

Цитата:
Сообщение от Семёныч Посмотреть сообщение
у которого есть свойства "длина" ("Length") и "угол поворота"("angle"). У полилинии таких свойств нет.
у полилинии есть общая длина.
Сергей812 вне форума  
 
Автор темы   Непрочитано 03.04.2019, 21:05
#27
Deutschland


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
А что по ожиданию должно происходить? Если выбирается отрезок, то он удаляется, а на его месте оказывается блок. Это можно определить с помощью палитры свойств.
Я ожидаю, что произойдёт то, о чём вы и пишете. Но отрезок так и остаётся отрезком.

----- добавлено через ~6 мин. -----
И раз разговор зашёл про полилинии - в схеме намешано всё подряд, где встречаются как отрезки, так и полилинии, которые и нужно заменить на один блок.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 16
Размер:	143.0 Кб
ID:	212622  Нажмите на изображение для увеличения
Название: 2.jpg
Просмотров: 16
Размер:	144.7 Кб
ID:	212623  
Deutschland вне форума  
 
Непрочитано 03.04.2019, 21:37
#28
Семёныч


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
Но отрезок так и остаётся отрезком.
Тогда попробуй начерти ОТРЕЗОК (LINE) и примени к нему программу. Скопируй сюда протокол выполнения по F2.
Сделай то же самое с твоим объектом и тоже скопируй сюда протокол.
Не помешал бы и оригинальный файл (или его фрагмент). Но если страна нахождения - Германия, то я пас.
Семёныч вне форума  
 
Автор темы   Непрочитано 03.04.2019, 22:09
#29
Deutschland


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Тогда попробуй начерти ОТРЕЗОК (LINE) и примени к нему программу. Скопируй сюда протокол выполнения по F2.
Сделай то же самое с твоим объектом и тоже скопируй сюда протокол.
Не помешал бы и оригинальный файл (или его фрагмент). Но если страна нахождения - Германия, то я пас.
Выполняется регенерация модели.

Утилиты меню AutoCAD загружены.
Команда:
Команда:
Команда: <Сетка откл>
Команда:
Команда:
Команда: _insert
Точка вставки или [Базовая точка/Масштаб/Поворот]:
Введите значения атрибутов
SN:
Идентификатор:

Команда:
Команда:
Команда: _line
Первая точка:
Следующая точка или [оТменить]:
Следующая точка или [оТменить]:

Команда: (progn
(_> (setvar "ATTDIA" 0)
(_> (setvar "ATTREQ" 1)
(_> (setq otr (car (entsel "\nВыберите отрезок: ")))
(_> (setq votr (vlax-ename->vla-object otr))
(_> (setq tvs (cdr (assoc 10 (entget otr))))
(_> (setq dlina (vlax-get-property votr 'Length))
(_> (setq ugol (/ (* 180(vlax-get-property votr 'angle)) pi))
(_> (entdel otr)
(_> (vl-cmdf "_-INSERT" "l0" "X" dlina "Y" "1" "Z" "1" "_R" ugol tvs "" "")
(_> (setvar "ATTDIA" 1)
(_> (setvar "ATTREQ" 0)
(_> )

Выберите отрезок: ; ошибка: no function definition: VLAX-ENAME->VLA-OBJECT

Открывается файл формата AutoCAD 2013.
Выполняется регенерация модели.

Утилиты меню AutoCAD загружены.
Команда:

Файл Autodesk DWG. Это файл формата TrustedDWG, сохраненный в приложении Autodesk или в приложении, лицензированном корпорацией Autodesk.

Команда:
Команда: (progn
(_> (setvar "ATTDIA" 0)
(_> (setvar "ATTREQ" 1)
(_> (setq otr (car (entsel "\nВыберите отрезок: ")))
(_> (setq votr (vlax-ename->vla-object otr))
(_> (setq tvs (cdr (assoc 10 (entget otr))))
(_> (setq dlina (vlax-get-property votr 'Length))
(_> (setq ugol (/ (* 180(vlax-get-property votr 'angle)) pi))
(_> (entdel otr)
(_> (vl-cmdf "_-INSERT" "l0" "X" dlina "Y" "1" "Z" "1" "_R" ugol tvs "" "")
(_> (setvar "ATTDIA" 1)
(_> (setvar "ATTREQ" 0)
(_> )

Выберите отрезок: ; ошибка: no function definition: VLAX-ENAME->VLA-OBJECT
Вложения
Тип файла: dwg
DWG 2013
Фрагмент.dwg (49.3 Кб, 12 просмотров)
Deutschland вне форума  
 
Непрочитано 03.04.2019, 22:50
#30
Сергей812


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


Цитата:
Сообщение от Deutschland Посмотреть сообщение
VLAX-ENAME->VLA-OBJECT
добавьте в код
Код:
Сергей812 вне форума  
 
Непрочитано 04.04.2019, 07:53
1 | #31
Семёныч


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


Как-то я привык уже, что в AutoCAD 2013 и в следующих версиях загрузка функций VLisp (vl-load-com) происходит автоматически. Возможно, это у меня так происходит.
Частная задача: замена отрезка блоком l0.
Код:
[Выделить все]
(defun C:LB ( / atd atr echo osm *error* otr votr tvs dlina ugol)
(vl-load-com)
(princ "\nЗамена отрезка блоком.")
(setq atd (getvar "ATTDIA"))
(setvar "ATTDIA" 0)
(setq atr (getvar "ATTREQ"))
(setvar "ATTREQ" 1)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(setq osm (getvar "OSMODE"))
(setvar "OSMODE" 0)
;; Обработчик ошибок
(defun *error* (msg)(princ msg)
(setvar "ATTDIA" atd)
(setvar "ATTREQ" atr)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
) ; *error*
(setq otr (car (entsel "  Выберите отрезок (Enter-отказ): ")))
(if otr 
    (progn
    (if (= (cdr (assoc 0 (entget otr))) "LINE")
        (progn 
        (setq votr (vlax-ename->vla-object otr))
        (setq tvs (cdr (assoc 10 (entget otr))))
        (setq dlina (vlax-get-property votr 'Length))
        (setq ugol (/ (* 180(vlax-get-property votr 'angle)) pi))
        (vl-cmdf "_UNDO" "_BE")
        (entdel otr)
        (vl-cmdf "_-INSERT" "l0" "X" dlina "Y" "1" "Z" "1" "_R" ugol tvs "" "")
        (vl-cmdf "_UNDO" "_E")
        (princ "\nОтрезок заменен на блок.")
        ) ; progn
        (princ "\nВыбранный объект не ОТРЕЗОК.")
    ) ; if
    ) ; progn
    (princ "\nОтмена.")
) ; if
(setvar "ATTDIA" atd)
(setvar "ATTREQ" atr)
(setvar "CMDECHO" echo)
(setvar "OSMODE" osm)
(princ)
)
Скопировать код в командную строку и нажать Enter. Для запуска программы ввести LB.
Семёныч вне форума  
 
Непрочитано 04.04.2019, 09:30
#32
Сергей812


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


Если в образце красным кружком обозначен примитив, к которому применяется программа - то ТС может применять программу хоть до посинения: там полилиния) А так какая то пассивная позиция у ТС - хочет сэкономить много человекочасов, но при этом лениться даже корректные входные условия выдать сразу: почти половина линейных примитивов в образце - полилинии.
Сергей812 вне форума  
 
Непрочитано 04.04.2019, 09:47
#33
Семёныч


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


Ну, до посинения он не буде доходить, программа выдаст сообщение, что объект не отрезок. Я специально не стал вводить в программу расчленение полилинии (а вдруг там нужна именно полилиния). Однако, будь то полилиния или отрезок - этот объект все равно должен удалиться и на его месте должен оказаться блок. А что там в блоке (а там полилиния) - это не нашего ума дело. Автор темы может самостоятельно расчленить попавшиеся полилинии до отрезков.
Непонятно также назначение атрибутов.
Семёныч вне форума  
 
Непрочитано 04.04.2019, 09:52
#34
Сергей812


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Однако, будь то полилиния или отрезок - этот объект все равно должен удалиться и на его месте должен оказаться блок.
не вводите ТС в заблуждение - если будет полилиния, то блок там не появится)

Цитата:
Сообщение от Семёныч Посмотреть сообщение
Непонятно также назначение атрибутов.
так задавал уже:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и откуда берутся данные для двух атрибутов в блоке? вручную вводить - это сразу хороший минус в скорости...
но ТС видит только то, что ему нужно, похоже)
Сергей812 вне форума  
 
Непрочитано 04.04.2019, 10:22
#35
Семёныч


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
не вводите ТС в заблуждение
Что это вы постоянно упоминаете какого-то ТС? Нет здесь никакого ТС. Я общаюсь с автором темы Deutschland и жду от него реакции. Если вы решили подменить собой автора темы, то вам и карты в руки. Дорабатывайте программу по своему разумению. А еще лучше - пошлите автора темы в раздел "Поиск исполнителей".
Семёныч вне форума  
 
Непрочитано 04.04.2019, 10:36
#36
Сергей812


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


Цитата:
Сообщение от Семёныч Посмотреть сообщение
Что это вы постоянно упоминаете какого-то ТС? Нет здесь никакого ТС. Я общаюсь с автором темы Deutschland и жду от него реакции. Если вы решили подменить собой автора темы, то вам и карты в руки. Дорабатывайте программу по своему разумению. А еще лучше - пошлите автора темы в раздел "Поиск исполнителей".
ТС - топикстартер, автор ветки. Стандартное сокращения на множестве форумов.

Offtop: А указывать, что другим делать - будете на своем форуме, если хватит способностей раскрутить его до уровня dwg.ru, чтобы там появились люди
Сергей812 вне форума  
 
Непрочитано 04.04.2019, 10:47
#37
Boxa

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


ИМХО, ветка уже давно переросла раздел Autocad, т.к. штатными средствами автоматизировать работу у ТС не получится и нужно писать соответствующую программу. Самому или привлекая помощь, а т.к. с программированием у автора судя по всему не очень, то....
Цитата:
Сообщение от Семёныч Посмотреть сообщение
А еще лучше - пошлите автора темы в раздел "Поиск исполнителей".
это не самый плохой совет.

ЗЫ.
А полилинии или линии особой разницы нет, _explode все уравняет =)

Последний раз редактировалось Boxa, 04.04.2019 в 10:57.
Boxa вне форума  
 
Автор темы   Непрочитано 04.04.2019, 11:48
#38
Deutschland


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если в образце красным кружком обозначен примитив, к которому применяется программа - то ТС может применять программу хоть до посинения: там полилиния)
Вовсе нет. Красным кружком обозначено место, на которое следует обратить внимание. Это рабочие моменты. И перед тем как загрузить файл сюда я не убрал его.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
А так какая то пассивная позиция у ТС - хочет сэкономить много человекочасов, но при этом лениться даже корректные входные условия выдать сразу: почти половина линейных примитивов в образце - полилинии.)
Виноват. Я не знал как вся эта система работает, что код для упрощения работы пишется чётко под каждую поставленную задачу. Для отрезков - один, для полилиний другой и т.п. Буду иметь в виду. И уже позже я добавил, что в схеме всё намешано (местами линии, местами полилинии).

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и откуда берутся данные для двух атрибутов в блоке? вручную вводить - это сразу хороший минус в скорости...
Блоки были выданы организации в таком виде. Насколько я знаю в дальнейшем планируется идентификация элементов на схемах, которую будут производить на основании идентификатора (системного номера) объекта из БД.

----- добавлено через ~9 мин. -----
Цитата:
Сообщение от Семёныч Посмотреть сообщение
Как-то я привык уже, что в AutoCAD 2013 и в следующих версиях загрузка функций VLisp (vl-load-com) происходит автоматически. Возможно, это у меня так происходит.
Частная задача: замена отрезка блоком l0.
Скопировать код в командную строку и нажать Enter. Для запуска программы ввести LB.
Ура! Премного благодарен Всё заработало исправно. На работе стоит AutoCAD 2010.
1. На данный момент вставляется блок, который я загружал сюда последним. Можно ли заменить вставляемый блок, на динамический (тот, который я скидывал в тему ещё ранее)?
2. Реально ли написать такой код, чтобы применять его не разово? Выделить все отрезки на схеме и сразу всё заменить на данный блок.

Последний раз редактировалось Deutschland, 04.04.2019 в 12:05.
Deutschland вне форума  
 
Непрочитано 04.04.2019, 17:36
#39
koMon


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


Boxa, да я блок и не менял. у него проблема с точкой вставки. упорядочил) а вообще за такие дин. блоки железной линейкой по рукам самое то)
Цитата:
Сообщение от Boxa Посмотреть сообщение
ИМХО доработать Ваш вариант до работы с исходным блоком не так уж и сложно,
если не трудно)
Цитата:
Сообщение от Deutschland Посмотреть сообщение
А что это за лисп такой, чем он поможет? Активировал, пробую что-то выделять - реакции ноль.
1. лисп загружают
2. выделять нужно отрезки
3. лисп заменяет выбранные отрезки на дин. блок i0.
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
точку вставки перенести в середину блока, там же сделать динамический поворот блока.
удобнее будет с точкой вставки на конце линии (в блоке кстати полилиния непонятно нафик) и углом поворота относительно точки вставки.
koMon вне форума  
 
Автор темы   Непрочитано 04.04.2019, 20:41
| 1 #40
Deutschland


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


Цитата:
Сообщение от koMon Посмотреть сообщение
1. лисп загружают
2. выделять нужно отрезки
3. лисп заменяет выбранные отрезки на дин. блок i0.
Я так и делал - не работало. Наконец-то решил эту проблему.

Из протокола:
Команда: LINE_DBLOCK
; ошибка: no function definition: VLAX-GET-ACAD-OBJECT

Добавил в начале лиспа:
Код:
Но только после применения он эти блоки на схеме разворачивает в противоположную сторону.

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


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


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


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


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


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


Цитата:
Сообщение от 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
Просмотров: 47
Размер:	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,814


Цитата:
Сообщение от 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,074


Попалось такое приложение для создания схем сетей газораспределения в 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,814


Цитата:
Сообщение от 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,074


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


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


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

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


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
С.-Петербург
Сообщений: 40,431


Цитата:
Сообщение от 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