システム変数 “OSMODE” を変更して、点(NOD)のオブジェクトスナップだけをON/OFFするコマンドを作ります。
関数 logand 、IF条件式を使います。
基礎知識
getvar、setvarを使いシステム変数の値を変更するコマンドを作ります。
getvar setvar システム変数って何?という方はこちらの記事を確認してください。
もしオンならオフに、オフならオンに、というIF条件式が出てきます。
IF条件式がよくわからないという方はこちらの記事で確認してください。
システム変数 ”OSMODE”
“OSMODE”は、オブジェクトスナップ設定をコントロールするシステム変数です。
ビットコード
“OSMODE”の値は「ビットコード」というものが使われています。
欲しいオブジェクトスナップの以下の表の番号を足したものが、そのオブジェクトスナップ設定の値です。
例えば、端点と中心だけがオンになっている状態にしたいのであれば、1 + 4 で、システム変数 ”OSMODE”の値を 6 にすれば、オブジェクトスナップ設定は、端点と中心だけになります。
0 | NON[解除] |
1 | END[端点] |
2 | MID[中点] |
4 | CEN[中心] |
8 | NOD[点] |
16 | QUA[四半円点] |
32 | INT[交点] |
64 | INS[挿入基点] |
128 | PER[垂線] |
256 | TAN[接線] |
512 | NEA[近接点] |
1024 | GCE[図芯] |
4096 | APP[仮想交点] |
8192 | PAR[平行] |
16384 | 現在の定常オブジェクト スナップを無効にします。 |
今回は、
もし、システム変数”OSMODE”に 8 が含まれていたら8を引く、含まれていなかったら8を足す。
とプログラミングして、NOD 点のオブジェクトスナップON/OFF切り替えコマンドを作ります。
関数 logand
AutoLISP関数 logand を使うと、合算された数字にビットコードが含まれているかどうかを調べることができます。
引数に調べたい単体のビットコードと、合計のビットコードを渡します。
getvar で得たOSMODEの値に、点のビットコード8が含まれているかどうかを調べるコードは下記の通りです。
(logand 8 (getvar "OSMODE"))
含まれていれば8、そうでなければ0が戻り値になります。
AutoLISP プログラム
(defun c:test (/ OS)
(setq OS (getvar "OSMODE"))
(if (= 0 (logand 8 OS))
(setq OS (+ OS 8))
(setq OS (- OS 8))
)
(setvar "OSMODE" OS)
(princ))
AutoLISP の説明
(setq OS (getvar “OSMODE”))
現在のOSMODEの値を、変数OSに入れました。
(if (= 0 (logand 8 OS))
(setq OS (+ OS 8))
(setq OS (- OS 8))
)
(logand 8 OS) は、OSに8が含まれていれば8、含まれていなければ0が戻ります。
なので、もし、0、つまり点のビットコードが含まれていないならばOSに8を足し、そうでなければ、8を引いて、setqでOSの値を上書きします。
(setvar “OSMODE” OS)
setvarを使い、OSMODEの値を変更してオブジェクトスナップの設定を変更しました。
まとめ
- オブジェクトスナップ設定をコントロールするシステム変数は”OSMODE”
- “OSMODE”はビットコードと呼ばれる数値が使われている。
- 必要なオブジェクトスナップのビットコードを足したものを使う。
- 特定のビットコードが含まれているか知りたいときは関数logandを使う
関連記事
画層のロック/ロック解除例にしたlogandの記事です。
if条件式について
Comments