if を使って、コマンド実行より前に選択していたらグループ選択、していなかったら1つづつ図形選択していく。
というコマンドを作ります。
基礎知識
個別選択かグループ選択か
編集したい図形を、ssget でグループ選択にするかentsel で個別選択にするかで、コマンドの使い勝手が変わります。
コマンドによっても違うし、同じコマンドでも状況によっては一気に選択したいときもあれば、1つづつクリックして行きたいときもあるということもあると思います。
そんなコマンドを作るときには、図形選択の部分だけ変えてコマンドを2つ作るのもいいですが、if を使って、先に選択した時はグループ選択、していなければコマンド実行後に個別選択にする。ということもできます。
こういう些細な部分を自分の好みに合わせてプログラムできるのも、AutoLISPを学ぶ醍醐味だと思います。
AutoLISPプログラム
図形の色を赤色に変えるコマンドです。
ガバァっと選択してからコマンドを実行すれば一気に選択した図形すべての色が変わるし、選択せずにコマンド実行すれば、一つづつ図形を選択する毎に図形の色が変わります。
(defun c:test ( / Objs Obj)
(setq Objs (ssget "_I")) ;実行前に選択していた図形があればをObjsに入れる
(if Objs ;もしObjsに何か入っていたら
(command-s "._CHANGE" Objs "" "_P" "_C" "1" "") ; 選択セットに入った図形の色を赤にする。
(while T ; そうでなければ、ここから
(setq Obj (car (entsel))) ; 図形の個別選択
(command-s "._CHANGE" Obj "" "_P" "_C" "1" "") ;Objの図形を赤にする。
) ;while ここまで繰り返す
) ;if
(princ));defun
AutoLISPの説明
(setq Objs (ssget “_I”))
sset にはオプションがあり、I は暗黙選択です。
これで、このプログラム実行前に図形を選択していたら、ssgetで選択セットが作られて、変数Objsの中に入ります。
(if Objs
if の最初の引数は、Tかnilを戻す条件式です。
変数を条件式として置く場合、変数に何か情報が入っていれば T 空なら nil になります。
この場合は、もし、Objsに情報が入っていれば(暗黙選択で選択セットが作られていれば)Tで、次の (command-s “._CHANGE” Objs “” “_P” “_C” “1” “”) を実行して、選択セットに入った図形の色を赤にます。
そして、Objsが空っぽなら (while T…….. ) が実行されて、1つづつ選択して色を変えていくコマンドになります。
while は、条件式がTの間は繰り返す機能を持った関数です。
この場合は、Tを直接入れているので、ユーザーがESCキーを押してキャンセルするまで続きます。
コマンドのカスタマイズ例
今回例で使った図形の色を赤色に変えるコマンド。
実際に使うのであれば、好みに合わせてカスタマイズした方が使いやすくなります。
例えば、
個別に選ぶときには、(while T….. ) を使っているので、ユーザーがキャンセルするまで続きます。ESCキーでキャンセルすると、コマンドラインに”エラー”と出ます。エラーという文字を気にする人は多いので、エラー処理を付けてエラーメッセージをカスタマイズすることをおススメします。
あとは、システム変数CMDECHOを0にすると、余分なプロンプトやエコーバックが出てこなくなります。
色の部分を引数して自作関数にすると、変更する色を変えた類似コマンドを作るのが簡単です。
いろいろ改善したサンプルコマンドがこちらです。
まとめ
- 図形選択にはグループ選択と個別選択がある。
- どちらも使いたい場合は、if を使って、コマンド実行前と実行後で変えることもできる。
Comments