Sponsored links

【AutoLISP 自作関数】フリーズ画層を解凍する自作関数 – rem 割り算した余りの数字

Sponsored links
AutoLISP
Sponsored links

特定の画層に作図するコマンドを作るとき、その画層がフリーズされていることも想定して、”画層がフリーズなら解凍する” 自作関数があると便利です。

数字を割っていって残ったあまりの数を教えてくれる関数remも紹介します。

Sponsored links

予備知識

自作関数の内容

  • 画層名を引数で得る。
  • 関数 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