図形を選択ミスしてもコマンドが終わらないようにして、entsel で図形選択をする自作コマンドの使い勝手を向上させます。
予備知識
クリックミスエラー
ここでのクリックミスとは、図形選択するときに何もない所を選択することです。
ここに、(car(entsel)で図形選択をして、その図形を変数Objに入れて、色を赤に変更する。というコマンドtestがあります。
(defun c:test ()
(setq Obj (car (entsel)))
(command-s "._change" Obj "" "_P" "_C" "1" "")
(princ))
このAutoLISPを読み込んで、試してみてください。
図形を選択すれば、その図形は赤色に変わります。
しかし、何もない所を選択すると、エラーでコマンドが終わってしまいます。
エラーの原因
(entsel)
とだけコマンドラインに入力して、何もない所をクリックしてみてください。
AutoCADは nil と戻り値をくれます。
nil は空っぽ、図形は選択されなかったから「何も情報が無いよ」ということです。
(entsel)で得た情報が無いので、そのリスト情報の1つ目を取り出す (car (entsel) も nil になり、変数Objもnilで、空っぽという状態になります。
すると、Obj に情報が入っていない状態で、コマンドに進みます。
(command-s “._change” Obj “” “p” “c” “1” “”)
では、Objに情報が無いので、図形選択の代わりにならず、エラーで終わってしまう。
ということが起きています。
クリックミス対策
クリックミス対策を使ったコマンド例
エラーの原因は、Objに情報が入らないこと。
対策は、Objに情報が入るまでコマンドに進まない。ことです。
(setq Obj nil) ;Obj を空にする
(while (null Obj) ;Obj が空だったら繰り返す 空でなければ繰り返さずにwhileから抜ける
(setq Obj (car (entsel)))
);while 繰り返しの終わり
先ほどの選択した図形の色を赤色に変えるコマンドに組み入れるとこうなります。
(defun c:test ()
(setq Obj nil)
(while (null Obj)
(setq Obj (car (entsel)))
);while
(command-s "._change" Obj "" "p" "c" "1" "")
(princ));defun
もう一度読み込んで試してみてください。今回は何もない所をクリックしてもエラーにならず、図形を選択するまで終わりません。
関数 null
関数 null について。
これは、条件式がnilかどうかを調べる機能があります。条件式がnil ならT、Tならnilが戻り値です。
(null Obj)の場合、nil かどうか調べたい条件式は、変数のObjです。
Objが空ならT、何か入っていればnil が戻り値になります。
(null Obj)
変数Objは空っぽ?
T (空っぽだよ)
nill (情報入ってるよ)
関数 while
関数whileは、その次にくる条件式の戻り値が T であればば繰り返す。という機能を持っています。
ここでは、(null Obj) が繰り返すかどうかを決める “条件式” と呼ばれる部分です。
(while (null Obj) 繰り返す処理 )
この場合は、Obj に情報が入っていなければ、条件式が T になるので、Obj に情報が空なら繰り返す。Obj に情報が入ったら、while の繰り返しを抜けて、次の処理に進む。プログラムになっています。
(setq Obj nil) ;Obj を空にする
(while (null Obj) ;Obj が空だったら繰り返すからじゃなかったら繰り返さずにwhileから抜ける
(setq Obj (car (entsel)))
);while 繰り返しの終わり
些細なことですが、AutoLISPを工夫してエラー対策を加えるとと、エラーでやり直しが減って使い勝手がよくなります。
まとめ
- 関数null は、nil かどうかを調べる機能がある。
- 関数null は、条件式がnil ならT、Tならnil が戻り値。
- 関数while は、条件式がTの間は、while を閉じる)までの処理を繰り返す。
- (while (null Obj) (setq Obj (car (entsel)))) で、Objに情報が入るまでは図形選択を繰り返す。というプログラムになる。
Comments