我正在尝试创建一个AutoLISP函数,该函数采用选择集图层并将其存储在变量中。 我想选择始终位于同一层中的乘法对象,然后稍后使用一些命令更改该层。
我已经根据(setq currentlayer (assoc 8 (entget (car (entsel)) )))
我的代码是:
(defun c:objectslayer()
(setq objects (car (ssget))) ; Need to select multiply objects
(setq currentlayer (entget objects)) ; Need the layer of the objects, in my case, it will allways be in the same layer
(setq cl (assoc 8 currentlayer)) ; Need the layer, for commands to change the layer later
(prompt (strcat "\nThe layer of the objects is: " cl))
(princ)
)
感谢所有帮助和指导
预先感谢
答案 0 :(得分:1)
如果不向ssget
函数提供过滤器列表参数,则不能保证所选内容中的所有对象都位于同一层。
如果您要在程序中定位特定的图层,则建议使用过滤器列表,仅允许选择位于该图层上的对象,例如:
(ssget '((8 . "YourLayerHere")))
或者,您可以提示选择一个对象以设置目标图层(使用entsel
),然后使用ssget
并使用过滤器提示选择位于该图层上的多个对象使用从entsel
获得的实体层构造的列表,例如:
(if
(and
(setq ent (car (entsel "\nSelect object on target layer: ")))
(setq sel (ssget (list (assoc 8 (entget ent)))))
)
(progn
;; Do some operations ...
)
)
如果您确实要允许用户选择 any 层上的对象,然后要获取所选层的列表,则可以使用类似以下内容的东西:
(defun c:test ( / idx lay lst sel )
(if (setq sel (ssget))
(progn
(repeat (setq idx (sslength sel))
(setq idx (1- idx)
lay (cdr (assoc 8 (entget (ssname sel idx))))
)
(if (not (member lay lst)) (setq lst (cons lay lst)))
)
(print lst)
)
)
(princ)
)
有关如何遍历选择集中的对象的更多信息,您可能希望参考我在Selection Set Processing上的教程。