Sponsored links

【AutoLISP 自作関数】画層のロック/ロック解除切り替る自作関数 – logand ビットコードが含まれてるか調べる

Sponsored links
AutoLISP
Sponsored links

画層のロックしてたらロック解除、ロック解除だったらロックと、一つのコマンドで切り替える自作関数を作ります。

ビットコードが含まれているかどうかを調べる関数 logand も紹介します。

Sponsored links

予備知識

自作関数の内容

  • 画層名を引数で得る。
  • 関数 tblsearchを使って、画層のDXF情報を得る。
  • ロック/ロック解除の情報が入っているグルーコード70の情報を取り出す。
  • ロックなら、ロック解除して、画層<画層名>ロック解除しました とメッセージを出す。
  • ロック解除なら、ロックして、画層<画層名>ロックしました とメッセージを出す。

AutoLISP プログラム

(defun Jaga00LyLkSw (LyNm / LyInfo Ly70)

    (setq LyInfo (tblsearch "layer" LyNm))	 
  
    (if LyInfo ; もしLyInfoに情報があれば(画層があれば)	
    (progn
        (setq Ly70 (cdr(assoc 70 LyInfo))) ; 70の情報を取り出して変数Ly70に入れる
        (if (= 0 (logand 4 Ly70)) ; Ly70に4が含まれていなければ(ロック解除なら)
        (progn
           (command-s "._LAYER" "LO" LyNm "") ; 画層をロック
           (princ (strcat " \n 画層 < " LyNm " > ロックしました")) ; メッセージを出す
         )(progn ;progn そうでなければ
           (command-s "._LAYER" "U" LyNm "") ; 画層をロック解除
           (princ (strcat " \n 画層 < " LyNm " > ロック解除しました")) ;メッセージを出す
      ));if progn
   ));if progn

(princ))

AutoLISPの説明

(defun Jaga00LyFrzCk (LyNm / LyInfo Ly70)

自作関数名は 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 Ly70 (cdr(assoc 70 LyInfo)))

LyInfoに入れたDXF情報から、70とペアになっている情報を取り出します。
上の例でいうと、(assoc 70 LyInfo)で、(70 . 0) を取り出し、さらに cdr で 0 だけを取り出して、変数Ly70に入れています。

DXF情報から、情報を得る方法は、コチラの記事を参考にしてください。

(if (= 0 (logand 4 Ly70))

先ほど挙げた例では、ロック解除だったので 0 です。
この番号はいろんな設定のビットコードと呼ばれる数字の合算になります。

  • 1 フリーズオン
  • 2 新しい VP でフリーズがオン
  • 4 ロック
  • 16 外部参照の画層
  • 32 問題なく外部参照されている画層(16とセット)

AutoLISP関数 logand

AutoLISP関数 logand を使うと、合算された数字にビットコードが含まれているかどうかを調べることができます。

今回は、ロックのコード 4 が、Ly70に入れた合算された数字に入っているかどうか。を調べているので

(logand 4 Ly70))

となります。4が含まれていたら、4が戻り値になり、含まれていなければ0が戻ります。

なので、(= 0 (logand 4 Ly70)) で、戻り値が0(ロック解除)ならT、そうでなければnilになり、

if関数を使って、”もしロック解除なら” ”ロックしてメッセージを出す” そうでないなら、 ”ロックしてメッセージを出す”

となります。

もし、このメッセージを目立たせたいのであれば、princ の代わりに alert を使うとメッセージボックスが出てくるので、必ずユーザーの目にとまります。

試してみよう

この関数に必要な引数は、画層名です。

(Jaga00LyLkSw”画層名”)

となります。

(defun c:test ()

   (Jaga00LyLkSw "0")

(princ))

コマンド test 試してみ出ください。
コマンドラインに (Jaga00LyLkSw “0”) と入力するだけでもいいです。

画層0が、ロック解除ならロックされ、ロックされていたら解除になります。

まとめ

  • 関数 logand を使うと、ビットコードが合算された数字に、特定のビットコードが含まれているかどうか調べることができる。

関連記事

オブジェクトスナップの設定を管理するシステム変数 ”OSMODE”もビットコードの合算です。特定のオブジェクトスナップがオンになっているかどうかを調べるのにも、関数logand が使えます。

画層のロック/ロック解除を組み入れたコマンドサンプル

テキストをテキスト用画層にする、雲マークを雲用の画層にする、抽出した図形を下書き用画層に入れるなどなどのコマンドです。

移動させる画層がフリーズしているとオブジェクトが非表示になってしまいます。

フリーズしていることに気づかずコマンドを実行して、「オブジェクトが消えた!?」と焦らないように、特定の画層図形を描いたり移すコマンドを作るときには、”もしフリーズしていたらフリーズ解除する”という処理を加えておきましょう。

Comments