AutoLISP-通过选择乘法对象来更改乘法层

时间:2018-12-12 12:27:54

标签: autolisp

我正在尝试创建一个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)
)

感谢所有帮助和指导

预先感谢

1 个答案:

答案 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上的教程。