lisp帮助-添加(ssget)
lisp只需获取一个对象并将其发送到“现有”层。我希望能够通过选择单个对象或一组对象来运行此lisp,但我不确定一旦有了对象,如何浏览对象列表。感谢您的帮助。
附加:我想如果可以通过选择对象然后运行lisp或运行lisp然后选择对象来运行lisp,那将是一件好事。。。这有意义吗?
;;load the visual lisp extensions
(vl-load-com)
(defun c:sendtoexisting (/ object)
;;check for selection
(while
(setq
sset
(car (entsel "\nSelect object to move to existing layer:")
)
)
;;convert to vl object
(setq sset (vlax-ename->vla-object sset))
;;get current layer of object
(setq clayer (vla-get-layer sset))
(if (= nil (vl-string-search "EXST" clayer))
(progn
;;set existing layer
(setq elayer (strcat "S-EXST" (substr clayer 2)))
;;create the existing layer
(_createlayer
elayer
155
(cdr (assoc 6 (tblsearch "LAYER" clayer)))
)
;;move the object to the existing layer
(vla-put-layer sset elayer)
;;set the object's color to ByLayer
(vla-put-color sset 256)
)
(princ "\nObject is already on an EXISTING layer.")
)
)
)
(defun _createlayer (name colour linetype)
(if (null (tblsearch "LAYER" name))
(entmake
(list
'(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
'(70 . 0)
(cons 2 name)
(cons 6 linetype)
(cons 62 colour)
)
)
)
) 你好
试试这个未经测试的快速mods。
(vl-load-com)
(defun c:sendtoexisting(/ ss i obj clay nlay)
(princ "\nSelect objects to move to existing layer:")
(if (setq ss (ssget "_:L"))
(repeat (setq i (sslength ss))
(setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))
clayer (vla-get-layer obj)
)
(if (not (vl-string-search "EXST" clay))
(progn
(setq nlay (strcat "S-EXST" (substr clay 2)))
(_createlayer nelayer 155 (cdr (assoc 6 (tblsearch "LAYER" clay))))
(vla-put-layer obj nlay)
(vla-put-color obj 256)
)
(princ "\nObject is already on an EXISTING layer.")
)
)
)
(princ)
)
(defun _createlayer(name colour linetype)
(if (null (tblsearch "LAYER" name))
(entmake
(list
'(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
'(70 . 0)
(cons 2 name)
(cons 6 linetype)
(cons 62 colour)
)
)
)
) 或者在vanilla AutoLisp中使用更强大的力量:
(defun c:exlayer (/ ln ss i en ed vn vd)
(setq ln "EXISTING")
(if (not (tblsearch "LAYER" ln))
(command "_.LAYER" "_N" ln ""))
(princ (strcat "\nSelect Entities To Change To Layer " ln))
(while (not ss)
(setq ss (ssget)))
(setq i 0)
(while (setq en (ssname ss i))
(setq ed (entget en))
(if (= 1 (cdr (assoc 66 ed)))
(progn
(setq vn (entnext en)
vd (entget vn))
(while (/= "SEQEND" (cdr (assoc 0 vd)))
(entmod (subst (cons 8 ln) (assoc 8 vd) vd))
(setq vn (entnext vn)
vd (entget vn)))
(entupd en))
(entmod (subst (cons 8 ln) (assoc 8 ed) ed)))
(setq i (1+ i)))
(prin1))
-大卫 谢谢你们俩的帮助。最后一个问题。
我添加了只选择一个对象或整个层的选项,但是在我处理对象的情况下,如何将初始entsel从initget添加到ss选择集。基本上,我必须双击我现在想要选择的第一个项目,这是我想要避免的。
谢谢
;; by Chau Huh 2015-10-21
;;load the visual lisp extensions
(vl-load-com)
(defun c:sendtoexisting
(/ ss i obj clayer nlayer ans TargEnt TargLayer)
;;;(princ "\nSelect objects to move to existing layer:")
(initget 1 "Object lAyer")
(setq ans (entsel (strcat "Select by <Object>: ")))
(if (= ans "lAyer")
(progn
(princ "\nSelect layer to move to existing: ")
(setq TargEnt (car (entsel "\nSelect object on layer: ")))
(setq TargLayer (assoc 8 (entget TargEnt)))
(sssetfirst nil (ssget "_X" (list TargLayer)))
(princ)
)
)
(if (setq ss (ssget "_:L"))
(repeat (setq i (sslength ss))
(setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))
clayer (vla-get-layer obj)
)
(if (not (vl-string-search "EXST" clayer))
(progn
(setq nlayer (strcat "S-EXST" (substr clayer 2)))
(_createlayer
nlayer
155
(cdr (assoc 6 (tblsearch "LAYER" clayer)))
)
(vla-put-layer obj nlayer)
(vla-put-color obj 256)
)
(princ "\nObject is already on an EXISTING layer.")
)
)
)
(princ)
)
(defun _createlayer (name colour linetype)
(if (null (tblsearch "LAYER" name))
(entmake
(list
'(0 . "LAYER")
'(100 . "AcDbSymbolTableRecord")
'(100 . "AcDbLayerTableRecord")
'(70 . 0)
(cons 2 name)
(cons 6 linetype)
(cons 62 colour)
)
)
)
)
利用ssadd功能。 您要更改的图层上是否已经选择了实体?
页:
[1]