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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Выбор элемента в модели из пространства листа

LISP. Выбор элемента в модели из пространства листа

Ответ
Поиск в этой теме
Непрочитано 25.02.2025, 22:20 #1
LISP. Выбор элемента в модели из пространства листа
Сергей Кудряшов
 
Регистрация: 29.04.2013
Сообщений: 1

Коллеги, привет!

Прошу Вашей помощи.
Нашел на пространствах Форума LISP, который позволяется выбрать блок, вытащить из него атрибут и сразу построить выноску с полем, которое имеет этот атрибут.
Выбор производится посредством entsel и позволяет выбирать блоки только в соответствующем пространстве. Т.е. из листа только блоки, размещенные на листе, а блоки размещенные в модели из модели либо в режиме редактирования ВЭ. Но в таком случае и мультивыноска ставится в том же пространстве

Мне нужно выбирать блок в модели, но мультивыноску ставить на листе.

В самом автокаде есть такая кнопка в окне выбора объекта при вставке поля, но я так и не смог докопаться до того, что это за команда.
Скрин с кнопкой прилагаю. Скрипт тоже.

Код:
[Выделить все]
  (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 "_C")) ;; 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 (nth 4 att_lst)
			pt_base (getpoint "\nНачало выноски")
			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
)

Может есть какие-нибудь мысли: как это реализовать?

Миниатюры
Нажмите на изображение для увеличения
Название: Выбор_объекта.jpg
Просмотров: 19
Размер:	105.4 Кб
ID:	266971  

Просмотров: 634
 
Непрочитано 14.04.2025, 14:01
#2
getr

Конструктор
 
Регистрация: 06.04.2005
Из тех ворот-откуда весь народ.
Сообщений: 361
<phrase 1=


Прикрепил к сообщению лисп. Он переносит объекты из пространства модели в пространство листа.Попробуй применить его для переноса выноски в лист, а она пусть сначала рисуется в модели..надо как то скомбинировать два лиспа.
Вложения
Тип файла: lsp ms2psV1-0.lsp (7.3 Кб, 4 просмотров)
__________________
"Мнение не бывает ни истинным, ни ложным, а лишь полезным в жизни или бесполезным. ",- Ауробиндо
И не надо делать удивленных движений руками.
getr вне форума  
 
Непрочитано 14.04.2025, 14:08
#3
Кулик Алексей aka kpblc
Moderator

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


_chspace не катит? Код ms2psV1-0.lsp не смотрел.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.04.2025, 14:15
#4
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 613


Из описания ms2psV1-0.lsp:

;; Эта функциональность аналогична стандартной команде CHSPACE, однако, ;;
;; эта программа будет копировать выбор объектов, в отличие от переме- ;;
;; щения объектов из пространства модели в пространство листа.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Выбор элемента в модели из пространства листа



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размерные стили в видовом окне листа и модели, автокад 2009 Тубус AutoCAD 9 01.11.2023 15:48
Не работает lisp на autocad 2014. Lisp предназначен для изменения порядкового номера листа vladykinalex LISP 28 14.07.2023 19:27
При смене рабочего пространства меняется пространство черчения (с модели на лист и наоборот), как это предотвратить? Geor9e AutoCAD 0 13.05.2016 16:32
Ошибка при зумировании листа. Алгоритм печати в модели и в листе Rask Программирование 8 30.08.2012 13:54
Программное позиционирование пространства модели во ViewPort Danger_pgs Программирование 8 10.06.2008 20:42