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 ответ

Без предоставления аргумента списка фильтров 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 ...
    )
)

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

(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)
)

Для получения дополнительной информации о том, как перебирать объекты в наборе выбора, вы можете обратиться к моему руководству по обработке набора выбора.

Другие вопросы по тегам