Смешная программа, но работает.
Условие: слои должны существовать.
Проверка текущего слоя не выполняется, словом, примитивная программа.
Но себе я ее оставлю, может, на досуге доработаю.
(defun C:LAYOFFON ( / lay lay_list)
(setq lay (getvar "CLAYER"))
(if (tblsearch "LAYER" "lay_offon")
(progn
(ssget "_X" (list (cons 8 "lay_offon")))
(setq lay_list (cdr (assoc 1 (entget (entlast)))))
(Cond
((= (getvar "USERI1") 0)
(command "_-layer" "_off" lay_list "")
(setvar "USERI1" 1)
)
((= (getvar "USERI1") 1)
(command "_-layer" "_on" lay_list "")
(setvar "USERI1" 0)
)
)
)
(progn
(princ "\n Для работы программы необходимо определить атрибут на слое LAY_OFFON.")
(alert " Для работы программы необходимо\nопределить атрибут на слое LAY_OFFON.")
(command "_-LAYER" "_m" "LAY_OFFON" "_p" "_n" "LAY_OFFON" "")
(command "_attdef" "" "LAY_OFFON" "Записать слои через запятую без пробелов" "" (list 0 0) "" "")
(command "_ddedit" (list 0 0) "")
)
)
(setvar "CLAYER" lay)
(princ)
)
Если сохранить код в файле lay_offon.lsp, то макрос для кнопки или пункта меню может выглядеть так:
^C^C^P(if (not C:LAYOFFON) (load "lay_offon")) LAYOFFON
При первом запуске программа создаст непечатаемый слой "LAY_OFFON" и разместит
в начале координат атрибут, в который будут записываться слои.
Для изменения списка слоев надо сделать еще одну кнопку с таким макросом: