・ 画層の状態(表示、非表示、フリーズ、ロック)を変更する

画層の状態は、(entmake) (entmod) で処理できないので (command "-LAYER" ) を使います。
(command "-LAYER" ) は、現在層への処理ができなかったり、確認の"Y"の入力が必要になるので注意が必要です。

1,現在層はフリーズできない

(defun Jos_lay_f ()
  (setq lay (cdr (assoc 8 (entget (car (entsel "\nフリーズする画層のオブジェクト選択"))))))
  (setq clay (getvar "CLAYER"))
  (if (= lay clay)
    (princ "\n選択したオブジェクトの画層は現在層です\nフリーズできません")
    (command "._-LAYER" "F" lay "")
    )
  (princ)
  )

2,現在層を非表示にするには、"Y"入力が必要

(defun Jos_lay_off ()
  (setq lay (cdr (assoc 8 (entget (car (entsel "\n非表示にする画層のオブジェクト選択"))))))
  (setq clay (getvar "CLAYER"))
  (if (= lay clay)
    (progn
      (command "._-LAYER" "OF" lay "Y" "")
      (princ "\n現在層を非表示にしました")
      )
    (command "._-LAYER" "OF" lay "")
    )
  (princ)
  )

3.フリーズ画層は表示できない

 

(command "._LAYER" ) に引数としてわたす画層名は、","で区切って複数の画層名を一度にわたすことが可能です。
ただし、その文字列が長すぎるとエラーになるので注意が必要です。(255文字までは可能であることは確認しましたが、MAXはわかりません)
そのため、文字列の長さをチェックするか、下記のようにリストでわたして処理したほうが安全です。

(setq lay (cdr (assoc 2 (tblnext "LAYER" T)))) ;テーブルの最初の画層 ;
(setq td (tblsearch "LAYER" lay))
(setq list_lay (list lay))
(setq td (tblnext "LAYER"))
(while td ;画層のリスト作成 ;
  (setq list_lay (append list_lay (list (cdr (assoc 2 td)))))
  (setq td (tblnext "LAYER"))
  )
(command "._-LAYER")
(foreach n list_lay (command "T" n)) 
(foreach n list_lay (command "ON" n))
(command "")