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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить формулу поля атрибута блока посредством lisp?

Как получить формулу поля атрибута блока посредством lisp?

Ответ
Поиск в этой теме
Непрочитано 22.03.2021, 18:31 #1
Как получить формулу поля атрибута блока посредством lisp?
Bamka70
 
Инженер-проектировщик ОВиК
 
Томск
Регистрация: 11.03.2020
Сообщений: 7

Привет всем! Месяц назад начал знакомиться с Lisp и пока что я совсем зеленый в данном направлении. Но имеется дикая необходиомасть создания мультивыноски, которая способна вытащить атрибут из блока в виде поля, чтобы содержимое выноски изменялось с изменением абрибута в блоке.
На данный момент, на просторах интрнета нашел такое решение
Код:
[Выделить все]
 
(defun c:мв_атриб (/)
(setq obj (car (entsel "\nВыбирете блок: "))) ;выбираем блок
(setq at1 (entget (entnext obj))) ;извлекаем список первого атрибута
(setq at1_text (cdr (assoc 1 at1))) ;читаем значения атрибута
  

(setq po (getpoint "\nУкажите местоположение стрелки выноски: "))
(setq p1 (getpoint po "\nПоложение полки выноски: "))    
	
(command "_.mleader" po p1 at1_text)
  )
выноска вытигивает первый артибут блока и вставляет его в выноску в виде простого текста. Кто подскажет, как вставить не просто занчение атрибута, а поле атрибута? Может есть какая-либо функция, способная вытащить информацию о формуле поля атрибута?
Просмотров: 5710
 
Непрочитано 22.03.2021, 22:37
#2
Кулик Алексей aka kpblc
Moderator

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


Поставь это дело вручную и проанализируй формулу поля - там обычно показывается все что необходимо.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.03.2021, 05:09
#3
Bamka70

Инженер-проектировщик ОВиК
 
Регистрация: 11.03.2020
Томск
Сообщений: 7


Кулик Алексей aka kpblc, Да я прекрасно понимаю, что хочу вытащить, а именно идентификатор атрибута, если его можно так назвать, некий порядковый номер.
Например, есть блок, шаровой кран и у него есть атрибут "Позиция", формула для поля данного атрибута выглядит следующим образом "%<\AcObjProp Object(%<\_ObjId 4591463040>%).TextString>%", исхидя из формулы, я понимаю, что мне необходимо получить индетификатор 4591463040, вот каким образом его получить, не могу понять, сначала думал, что поможет метод FieldCode, но что-то не получилось, как я понял, он вытягивает поля только из текстовых элементов... пробовал через методы ActiveX, но знаний, видимо, пока не хватает...тоже не вышло получить данную информацию. Методы и функции разбираю по Полещуку.
Bamka70 вне форума  
 
Непрочитано 23.03.2021, 09:34
#4
AndruxaZ


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


вот тут у Алексея почитайте, может поможет - https://autolisp.ru/2010/05/30/field-proceed-2/
AndruxaZ вне форума  
 
Непрочитано 23.03.2021, 10:00
#5
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


ух какая веселая задачка.

Код:
[Выделить все]
 (defun c:atr-ml ( / obj att_lst att_def fild_str obj_ml pt_base pt_ins)
	(defun get-ObjectId ( x / )
		(if (> (vl-string-search "x64" (getvar "platform")) 0)
			(vla-GetObjectIdString (vla-get-utility (vla-get-activeDocument (vlax-get-acad-object))) x :vlax-false)
			(rtos (vla-get-objectId x) 2 0)
		)
    )
	
 (setq obj  (car (entsel)) ;; select insert
	
 )
(if 
	(and 
		(not (null obj)) 		                                    ;;not empty select
		(= (vla-get-ObjectName (vlax-ename->vla-object obj)) "AcDbBlockReference")		;;is insert
		(= (vla-get-HasAttributes (vlax-ename->vla-object obj)) :vlax-true)				;;has attributes
	 )
	(progn
		(setq 
			att_lst (vlax-safearray->list (vlax-variant-value (vla-GetAttributes (vlax-ename->vla-object obj)))) ;;lst of attr
			att_def (car att_lst)  ;;тут осуществить поиск нужного атрибута если их несколько 
			pt_base (vlax-safearray->list (vlax-variant-value (vla-get-InsertionPoint (vlax-ename->vla-object obj))))
			pt_ins (polar pt_base 10 10.3)
			fild_str (strcat "%<\\AcObjProp Object(%<\\_ObjId " (get-ObjectId att_def) ">%).TextString>%")
			obj_ml (sad-addMleader nil (list pt_base pt_ins) 	(list (list "TextString" fild_str)) )
		)
		(vla-regen (vla-get-activeDocument (vlax-get-acad-object)) acActiveViewport) ;;for regen filed value
		(sad-parse-ml-line obj_ml)
	)
	(princ "\nIncorrect input")
)
 
 
 (princ)
) 
(defun sad-addMleader (owner pt_list draw_opt / doc index obj pt_variant) ;|Отрисовка мультивыноски ActivX
	(sad-addMleader  nil (list (getpoint) (getpoint)) '( ("TextString" "Text1") ("TextRotation" 0.785) ))
	Аргументы 
	*  Указатель на владельца или nil
	*  Список из точек (не менее двух)
	*  Список кривизны
	*  Cписок опций. По умолчанию - активные настройки (поддерживаются все свойства размера, кроме RO) 
		'("Layer" "Размеры ЭН")
		'("" "")	
	Возвращаемое значение
	*  Указатель на созданный объект
	|;
(if (not owner) (setq owner (sad-get-CurrentSpace))) ;;если не указано другого - активное пространство активного документа	
(if (not index) (setq index 1))
(setq pt_variant 
	(vlax-make-variant
		(vlax-safearray-fill 
			(vlax-make-safearray 
				vlax-vbDouble 
				'(0 . 5) 
			) 
			(append (car pt_list) (cadr pt_list) 	)	
		) 	
	) 
)
(setq obj (vla-addMleader owner pt_variant index))
(sad-change-property obj draw_opt)
)  ;;sad-addLightWeightPolyline  
(defun sad-change-property (obj draw_opt) ;|внутрення функция
	присовение примитиву свойств ActivX
	Аргументы:
	* указатель на объект - vla-object
	* список опций
	Возвращаемое значение 
	* указатель на объект - vla-object
	|;
	(foreach opt draw_opt
		(vl-catch-all-apply 
			'(lambda ()
				(vlax-put-property obj (car opt) (cadr opt))
			)
		)
	)
	;;(vla-update obj)
	obj
);;
(defun sad-get-CurrentSpace ( ) ;|получение активного пространства в активном документе
	*аргументов нет
	*возвращаемое значение указатель на модель или лист
	|;
	(if
		(= (vla-get-ActiveSpace (vla-get-activedocument (vlax-get-acad-object))) 1)
		(vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)))
		(if 
			(= (vla-get-MSpace (vla-get-activedocument (vlax-get-acad-object))) :vlax-false)
			(vla-get-PaperSpace (vla-get-activedocument (vlax-get-acad-object)))
			(vla-get-ModelSpace (vla-get-activedocument (vlax-get-acad-object)))
		)
	) 
);  

(defun sad-parse-ml-line ( mlObj / temp originPt originDl mlBasePt mlDestPoint pt_variant fl) ;|двигаем выноску
	*аргумент - vla-object мультивыноски
	*возвращет - vla-object мультивыноски или nil при нажатии esc
	|;
	(defun dir2pt (ang / ) (list (cos ang) (sin ang) 0)) 
	(defun pt2dir (pt / ang)
	;;; input - 2d vector
	;;; return - direction in rad
		(setq ang (atan (/ (cadr pt) (car pt)))	)
		(cond 
			((< (car pt) 0) (setq ang (+ ang (* pi 1))))
			((and (>= (car pt) 0) (< (cadr pt) 0)) (setq ang (+ ang (* pi 2)))) 
		)
		ang
	)
	(defun 2ptVariant (pt1 pt2 /  )
	;;;input - 2 points
	;;;output - vla-variant
		(vlax-make-variant
			(vlax-safearray-fill 
				(vlax-make-safearray 
					vlax-vbDouble 
					'(0 . 5) 
				) 
				(append pt1 pt2)
			) 	
		) 
	)
	(defun dlDir (obj ptBase ptEnd / dlVec txtVec rez alf)
	;;;
	;;;return - vla-variant - DogLeg's vector
		(setq 
			txtVec (vla-get-TextRotation obj) ;; dirction text
			dlVec (angle ptEnd ptBase)
		)
		(if ;;angle betveen vecs
			(> 	(setq alf (abs (- txtVec dlVec) )) pi	) 
			(setq alf (abs (- dlVec txtVec) )) 
		)
		(if (> alf pi) (setq alf (- (* pi 2) alf)))
		(if (< alf (* pi 0.5 ) )
			(setq rez (dir2pt (+ txtVec pi)))
			(setq rez (dir2pt txtVec))
		)
		(vlax-3d-point rez)
	)
	(setq 
		temp (vlax-safearray->list (vlax-variant-value (vla-GetLeaderLineVertices mlObj 0)))
		mlBasePt (list (car temp) (cadr temp) (caddr temp))
		temp (cdr (cdr (cdr temp)))
		originPt (list (car temp) (cadr temp) (caddr temp))
		originDl (vla-GetDoglegDirection mlObj 0)
		fl t
	)
	(while fl
		(if (vl-catch-all-error-p (setq temp (vl-catch-all-apply 'grread '(t 12 0))))
			(progn ;;ESC
				(vla-SetDoglegDirection mlObj 0 originDl)
				(vla-SetLeaderLineVertices mlObj 0 (2ptVariant mlBasePt originPt))
				(setq fl nil mlObj nil)
			) 
			(progn 
				(if (or (= (car temp) 5) (= (car temp) 3)) 
					(progn
						(vla-SetLeaderLineVertices mlObj 0 (2ptVariant mlBasePt (cadr temp))) 
						(vla-SetDoglegDirection mlObj 0 (dlDir mlObj mlBasePt (cadr temp)))
				))
				(if (or (= (car temp) 3) (= (car temp) 25)) (setq fl nil))
			)
		)
	) ;;while
	mlObj
)

AndruxaZ, жуть какая, век бы сам копал
В целом задача решена, в частностях: надо переписывать указание объекта и прочие взаимодействия с пользователем и проверки корректности ввода.

з.ы. переписал что бы повеселей выглядело, но над обработкой ESC еще нужно поколдовать.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 23.03.2021 в 12:09.
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 24.03.2021, 05:14
#6
Bamka70

Инженер-проектировщик ОВиК
 
Регистрация: 11.03.2020
Томск
Сообщений: 7


AndruxaZ, Спасибо! Посмотрел, но при попытке реализовать у себя рассмотренные коды ActiveX выдает ошибку "ошибка: ActiveX Server возвратил ошибку: неизвестное имя: FieldCode", такое же было, когда пытался применить методы...пробовал примеры из учебника Полещука и из справочной документации по AciveX...но скорее всего я что-то делаю не так...

----- добавлено через ~1 мин. -----
Vladimir_Sergeevich, Спасибо за код, почти то что надо, буду его рабирать, чтобы понять, как это работает. Может добавлю возможность указывать конкретную точку вставки выноски и полочки.
Bamka70 вне форума  
 
Непрочитано 24.03.2021, 06:28
#7
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от Bamka70 Посмотреть сообщение
Может добавлю возможность указывать конкретную точку вставки выноски и полочки.
Ну собственно переписывай указание pt_base (строка 22) на интерактивный ввод, а полка сажается и так ручками, что реализуется в строке 28 (sad-parse-ml-line obj_ml). В моем варианте pt_ins высчитывается жестко только потому, что она нужна для создания самой выноски.
По хорошему, надо бы обернуть строку 28 в (if (sad-parse-ml-line... и на ветку else повесить удаление созданной мультивыноски.
Совсем в идеале, надо крепко переписать sad-parse-ml-line что бы она корректно обрабатывала в ПСК.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 24.03.2021, 16:56 Вопрос решен!
#8
Bamka70

Инженер-проектировщик ОВиК
 
Регистрация: 11.03.2020
Томск
Сообщений: 7


Спасибо всем, кто ответил в теме и давал полезные материалы! Особая балгодарность Vladimir_Sergeevich
С кодом более менее разобрался, для моих целей решение оказалось чуть короче, может конечно я что-то упустил, но вроде как все работает, всего навсего соединил два кода и получил результат.
код оставлю здесь, вдруг кому пригодится...или может опытные пользователи ткнут меня в неверное решение или какое-либо упущение.

Код:
[Выделить все]
 
 (defun c:мва ( / obj att_lst att_def fild_str obj_ml pt_base pt_ins)
	(defun get-ObjectId ( x / )
		(if (> (vl-string-search "x64" (getvar "platform")) 0)
			(vla-GetObjectIdString (vla-get-utility (vla-get-activeDocument (vlax-get-acad-object))) x :vlax-false)
			(rtos (vla-get-objectId x) 2 0)
		)
    )
	
 (setq obj  (car (entsel)) ;; select insert
	
 )
(if 
	(and 
		(not (null obj)) 		                                    ;;not empty select
		(= (vla-get-ObjectName (vlax-ename->vla-object obj)) "AcDbBlockReference")		;;is insert
		(= (vla-get-HasAttributes (vlax-ename->vla-object obj)) :vlax-true)				;;has attributes
	 )
	(progn
		(setq 
			att_lst (vlax-safearray->list (vlax-variant-value (vla-GetAttributes (vlax-ename->vla-object obj)))) ;;lst of attr
			att_def (car att_lst) 
			fild_str (strcat "%<\\AcObjProp Object(%<\\_ObjId " (get-ObjectId att_def) ">%).TextString>%")
			po (getpoint "\nУкажите местоположение стрелки выноски: ")
			p1 (getpoint po "\nПоложение полки выноски: ")
		)

	  (command "_.mleader" po p1 fild_str)
	)
	(princ "\nIncorrect input")
)
 
 
 (princ)
   
)
Bamka70 вне форума  
 
Непрочитано 25.03.2021, 06:39
#9
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Bamka70, код может и короче (по сути вырезаны функции рисовки и интерактивного редактирования реализованные через VisualLisp) и вся красота заменена на (command "_.mleader"...
В своей практике я сталкивался с тем, что быстродействие командных методов оставляет желать лучшего (вот прям до выбешивания). В результате у меня развилось религиозное неприятие командных методов программирования.
С одной стороны понято, что command кушает в более понятном для инженера-непрограммиста виде, с другой моя sad-addMleader не намного сложнее.
До кучи, есть лишний тычок мышкой и не видно как сядет выноска.

з.ы. а где короче? как было 35 строк, так 35 строк и осталось

Код:
[Выделить все]
 (defun c:atr-ml ( / obj att_lst att_def fild_str obj_ml pt_base pt_ins)
	(defun get-ObjectId ( x / )
		(if (> (vl-string-search "x64" (getvar "platform")) 0)
			(vla-GetObjectIdString (vla-get-utility (vla-get-activeDocument (vlax-get-acad-object))) x :vlax-false)
			(rtos (vla-get-objectId x) 2 0)
		)
    )
(setq obj  (entsel) ;; select insert
	pt_base (trans (cadr obj) 1 0)
	obj (car obj)
	) 
(if 
	(and 
		(not (null obj)) 		                                    ;;not empty select
		(= (vla-get-ObjectName (vlax-ename->vla-object obj)) "AcDbBlockReference")		;;is insert
		(= (vla-get-HasAttributes (vlax-ename->vla-object obj)) :vlax-true)				;;has attributes
	 )
	(progn
		(setq 
			att_lst (vlax-safearray->list (vlax-variant-value (vla-GetAttributes (vlax-ename->vla-object obj)))) ;;lst of attr
			att_def (car att_lst)  ;;тут осуществить поиск нужного атрибута если их несколько 
			pt_ins (polar pt_base 10 0.3)
			fild_str (strcat "%<\\AcObjProp Object(%<\\_ObjId " (get-ObjectId att_def) ">%).TextString>%")
			obj_ml (sad-addMleader nil (list pt_base pt_ins) 	(list (list "TextString" fild_str)) )
		)
		(vla-regen (vla-get-activeDocument (vlax-get-acad-object)) acActiveViewport) ;;for regen filed value
		(if (sad-parse-ml-line obj_ml) t (vla-delete obj_ml))
	)
	(princ "\nIncorrect input")
)
(princ)
) 
Может все таки так (библиотечные функции с предыдущего поста с кодом)
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 25.03.2021, 10:05
#10
koMon


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


Цитата:
Сообщение от Bamka70 Посмотреть сообщение
ткнут меня в неверное решение или какое-либо упущение
Bamka70,
зачем вообще циклиться на выборе блока, первом атрибуте... атрибут ведь видимый - почему не тыкнуть сразу в него?

Код:
[Выделить все]
 (defun c:first_attrib_mleader ( / entsel_data field_value mleader_basepoint block_entity)
	(while (and                   
				(or (null (setq entsel_data (vl-catch-all-apply 'entsel (list "\nУкажите блок: ")))) t)
				(cond
					(
						(null entsel_data)
							t
					)
	 
				(
						(vl-catch-all-error-p entsel_data)
							(setq block_entity nil)
					)
					(
						(and
							 (= "INSERT" (cdr (assoc 0 (entget (setq block_entity (car entsel_data))))))
							 (minusp (vlax-get (vlax-ename->vla-object block_entity) 'hasattributes))
						)
							nil
					)
					(
						t
							t
					)
				)
			)
	)
	(if block_entity
		(progn
			(setq field_value (strcat "%<\\AcObjProp Object(%<\\_ObjId "
									   (itoa (vla-get-objectid (car (vlax-safearray->list (vlax-variant-value (vla-getattributes (vlax-ename->vla-object block_entity)))))))
									   ">%).TextString>%"
							  )
			)
			(command "_.mleader" (setq mleader_basepoint (getpoint "\nУкажите местоположение стрелки выноски: "))
								 (getpoint mleader_basepoint "\nПоложение полки выноски: ")
								 field_value
			)
		)
		(princ "\nОтмена")
	)
	(princ)
)

Последний раз редактировалось koMon, 25.03.2021 в 12:23.
koMon вне форума  
 
Автор темы   Непрочитано 25.03.2021, 10:20
#11
Bamka70

Инженер-проектировщик ОВиК
 
Регистрация: 11.03.2020
Томск
Сообщений: 7


koMon, в моем случае атрибуты скрыты и несут лишь информационную ценность, видеть их не надо...а вот вытаскивать в выноски или таблицы переодически надо.
Bamka70 вне форума  
 
Непрочитано 25.03.2021, 12:21
#12
koMon


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


Bamka70,
ну если скрытые, то ↑
koMon вне форума  
 
Непрочитано 25.03.2021, 12:30
#13
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от koMon Посмотреть сообщение
(itoa (vla-get-objectid
koMon, посмотри ссылку из поста #4 и описание функции get-ObjectId из #5 или #9
на современной оси vla-get-objectid вернет не то значение, и надо стучаться через vla-GetObjectIdString
я сначала тоже долго думал, почему же оно не хочет работать, пока AndruxaZ не подсказал где списать
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 25.03.2021, 16:18
#14
koMon


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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
на современной оси vla-get-objectid вернет не то значение
Vladimir_Sergeevich, я бы наверное озадачился 100% этой проблемой если бы она, например, у меня возникла) но пока на воду не дую. попробуй загрузить лисп и проверить и напиши что, да как.
koMon вне форума  
 
Непрочитано 26.03.2021, 07:03
#15
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


koMon, грузить не буду, так отвечу.
vla-GetObjectIdString возвращает 1007938000 и поле нормально работает,
vla-get-ObjectId возвращает 37 и поле не понимает что от него хотят.
з.ы.
Цитата:
Команда: (getvar "platform")
"Microsoft Windows NT Version 6.1 (x64)"
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 26.03.2021, 09:30
#16
koMon


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


Vladimir_Sergeevich,
ну на нет и суда нет!
но как говорится, почувствуй разницу

Код:
[Выделить все]
Command: (vla-get-objectid (vlax-ename->vla-object (car (nentsel))))
Select object: 2372

Command: (itoa (vla-get-objectid (vlax-ename->vla-object (car (nentsel)))))
Select object: "2187135409696"
koMon вне форума  
 
Непрочитано 26.03.2021, 09:37
#17
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


очешуеть
я, что бы не думать, пытался скормить через vl-princ-to-string... какого-ж лешего itoa работает не как все
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 26.03.2021, 09:44
#18
koMon


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


думать это полезно, читать мануалы полезней вдвойне

----- добавлено через ~8 мин. -----
Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
какого-ж лешего itoa работает не как все
да потому что vla-get-objectid возвращает не десятичное число а Long_PTR

Последний раз редактировалось koMon, 26.03.2021 в 09:52.
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить формулу поля атрибута блока посредством lisp?

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Создание поля (field), ссылающегося на текстовое значение ячейки таблицы. skkkk Готовые программы 141 24.11.2023 15:49
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
LISP. Получение значения ID пользовательского атрибута динамического блока modest-bp LISP 23 03.09.2020 11:40
Использование Поля в Атрибуте Блока 128500 AutoCAD 3 02.11.2012 18:42
Как с помощью lisp получить список всех состояний видимости динамического блока crosandr LISP 4 11.04.2012 22:33