特定の画層に作図するコマンドを作るとき、その画層がフリーズされていることも想定して、”画層がフリーズなら解凍する” 自作関数があると便利です。
数字を割っていって残ったあまりの数を教えてくれる関数remも紹介します。
予備知識
自作関数の内容
- 画層名を引数で得る。
- 関数 tblsearchを使って、画層のDXF情報を得る。
- 画層フリーズの情報が入っているグルーコード70の情報を取り出す。
- フリーズなら、解凍して画層<画層名>フリーズ解除しました とメッセージを出す。
という内容の自作関数を作ります。
AutoLISP プログラム
(defun Jaga00LyFrzCk (LyNm / LyInfo Ly70)
(setq LyInfo (tblsearch "layer" LyNm)) ;
(if LyInfo ; もしLyInfoに情報があれば(画層があれば)
(progn
(setq Ly70 (cdr(assoc 70 LyInfo))) ; 70の情報を取り出して変数Ly70に入れる
(if (= 1 (rem Ly70 2)); もしLy70から2を引けるだけ引いて1余ったら(フリーズしてたら)
(progn
(command-s "._LAYER" "T" LyNm "") ; 画層を解凍して
(princ (strcat " \n 画層 < " LyNm " > フリーズ解除しました")) ;メッセージを出す
));if progn
));if progn
(princ));defun
AutoLISP の説明
(defun Jaga00LyFrzCk (LyNm / LyInfo Ly70)
自作関数名は Jaga00LyFrzCk です。関数名に続く( )には、実行するときに引数として得る情報を入れる変数と、/ の後ろはローカル変数です。
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 Ly70 (cdr(assoc 70 LyInfo)))
LyInfoに入れたDXF情報から、70とペアになっている情報を取り出します。
上の例でいうと、(assoc 70 LyInfo)で、(70 . 0) を取り出し、さらに cdr で 0 だけを取り出して、変数Ly70に入れています。
DXF情報から、情報を得る方法は、コチラの記事を参考にしてください。
(if (= 1 (rem Ly70 2))
(progn
先ほど挙げた例では、フリーズはオフだったので 0 です。
この番号はいろんな設定のビットコードと呼ばれる数字の合算になります。
- 1 フリーズオン
- 2 新しい VP でフリーズがオン
- 4 ロック
- 16 外部参照の画層
- 32 問題なく外部参照されている画層(16とセット)
フリーズは1です。しかし、ここでは
”もし、Ly70が1だったら”
だけでは、”もしフリーズしていたら”にはなりません。
フリーズ状態を表すのは、1だけではありません。
これは足し算なので、例えば、フリーズしていてさらにロックされていたら、フリーズの1とロックの4で、数字が5になります。
新しいVPでフリーズもオンになっていたら、さらに2が足されて7です。
AutoLISP関数 rem
そこで、フリーズのビットコード以外は偶数なのに注目して、AutoLISP関数rem を使いました。
rem は割り算をして、”余り”を戻す機能があります。
例えば、9を4で割り算したら、2と余りが1ですね。なので、1が戻り値です。
(rem Ly70 2) では、Ly70の数字を2で割ってその余りが戻り値です。
その他の要素がオンでビットコードの数字が足されても、偶数なので2で割れます。
しかし、フリーズがオンになっていたら、1が余ります。
ということで、(= 1 (rem Ly70 2) なら、フリーズがオンになっている。
ことになります。
(command-s “._LAYER” “T” LyNm “”)
もし、画層がフリーズならば、画層管理コマンドを使って、[フリーズ解除(T)] で解凍します。
(princ (strcat ” \n 画層 < ” LyNm ” > フリーズ解除しました”))
そして、princ を使って、コマンドラインにメッセージを表示します。
AutoLISP関数 strcat は、文字列をつなげる機能があります。
そして、文字列に \n (¥n) は改行です。
” \n 画層 < “
LyNm
”>フリーズ解除しました\n”
LyNmには画層名が文字列で入っているので、この3つの文字列を strcat でつなげて、
画層 < 画層名> フリーズ解除しました
と表示されるようになっています。
もし、このメッセージを目立たせたいのであれば、princ の代わりに alert を使うとメッセージボックスが出てくるので、必ずユーザーの目に付きます。
試してみよう
この関数に必要な引数は、画層名です。
(Jaga00LyFrzCk”画層名”)
となります。
画層0をフリーズにして、コマンドtestで試してみ出ください。
コマンドラインに (Jaga00LyFrzCk”0″) と入力するだけでもいいです。
このようにメッセージが出て、画層0のフリーズが解除されます。
もし、メッセージを出すprinc を alert にした場合
このようにメッセージボックスが出てきます。
まとめ
- 特定の画層を使うコマンドを作るときは、フリーズになっていることも想定する。
- 関数strcat は、複数の文字列をつなげる機能がある。
Comments