特定の画層に作図するコマンドを作るとき、その画層が非表示になっていることも想定して、”画層が非表示なら表示する” 自作関数があると便利です。
文字列をつなげる関数 strcat も紹介します。
予備知識
自作関数の内容
- 画層名を引数で得る。
- 関数 tblsearchを使って、画層のDXF情報を得る。
- 色と表示/非表示の情報が入っているグルーコード62の情報を取り出す。
- 非表示なら、表示して、画層<画層名>非表示だったので表示にしました とメッセージを出す。
という内容の自作関数を作ります。
AutoLISP プログラム
(defun Jaga00LyOffCk (LyNm / LyInfo Ly62)
(setq LyInfo (tblsearch "layer" LyNm)) ;
(if LyInfo ; もしLyInfoに情報があれば(画層があれば)
(progn
(setq Ly62 (cdr(assoc 62 LyInfo))) ; 62の情報を取り出して変数Ly62に入れる
(if (> 0 Ly62) ; もしLy62が0よりも小さければ
(progn
(command-s "._LAYER" "ON" LyNm "") ; 画層をオンにして
(princ (strcat " \n 画層 < " LyNm " > 非表示だったので表示にしました\n")) ;メッセージを出す
));if progn
));if progn
(princ));defun
AutoLISP の説明
(defun Jaga00LyOffCk (LyNm / LyInfo Ly62)
自作関数名は Jaga00LyOffCk です。関数名に続く( )には、実行するときに引数として得る情報を入れる変数と、/ の後ろはローカル変数です。
LyNmでは、画層名を受け取る前提でプログラムを書いていきます。
(setq LyInfo (tblsearch “layer” LyNm))
関数 teblsearch で画層LyNm のDXF情報を得ています。
例えば、初期設定の画層”0”の情報を得た場合、
((0 . "LAYER") (2 . "0") (70 . 0) (62 . 7) (6 . "Continuous"))
このように、情報が戻ってきます。これをsetqを使って変数LyInfoに入れています。
(if LyInfo
(progn
もし、引数として渡されてLyNmに入った画層名が存在しなければ、その後の処理にエラーになるので、ここでまず、”もしLyInfoに情報が入っているなら”を入れておきます。
もし、画層が無ければ、tblsearchの結果はnilなので、その後の処理は実行されずに終わります。
(setq Ly62 (cdr(assoc 62 LyInfo)))
LyInfoに入れたDXF情報から、62とペアになっている情報を取り出します。
上の例でいうと、(assoc 62 LyInfo)で、(62 . 7) を取り出し、さらに cdr で 7 だけを取り出して、変数Ly62に入れています。
DXF情報から、情報を得る方法は、コチラの記事を参考にしてください。
(if (> 0 Ly62)
(progn
先ほど挙げた例では、表示されていたので 7 です。これは色番号なのですが、もし、画層が非表示になっていると、-7になります。
なので、”もしLy62が0よりも小さければ”とすることで、もし画層が非表示ならばとなります。
(command-s “._LAYER” “ON” LyNm “”)
非表示ならば、画層管理コマンドを使って、表示にします。
(princ (strcat ” \n 画層 < ” LyNm ” > 非表示だったので表示にしました\n”))
そして、princ を使って、コマンドラインにメッセージを表示します。
AutoLISP関数 strcat は、文字列をつなげる機能があります。
そして、文字列 \n は改行です。
” \n 画層 < “
LyNm
”> 非表示だったので表示にしました\n”
LyNmには画層名が文字列で入っているので、この3つの文字列を strcat でつなげて、
画層 < 画層名> 非表示だったので表示にしました
と表示されるようになっています。
試してみよう
この関数に必要な引数は、画層名です。
(Jaga00LyOffCk “画層名”)
となります。
(defun c:test ()
(Jaga00LyOffCk "0")
(princ))
画層0を非表示にして、コマンドtestで試してみ出ください。
コマンドラインに (Jaga00LyOffCk “0”) と入力するだけでもいいです。
このようにメッセージが出て、画層0が表示されます。
まとめ
- 特定の画層を使うコマンドを作るときは、非表示になっていることも想定する。
- 関数strcat は、複数の文字列をつなげる機能がある。
Comments