(car (entsel を使って図形(オブジェクト)を1つ選ぶコマンドを作るときに、フィルターをかけて条件に合ったものだけ選択するようにします。
予備知識
図形選択でフィルター
entsel で図形を選ぶ場合、引数にいれることができるのはメッセージだけで、直接フィルターをかけることはできません。
しかし、while と if を使って、
「選択されたオブジェクトが欲しいものと違っていたら選択しなおす。」
とすればフィルターをかけた状態になります。
線分と円弧だけを選んでポリラインにするコマンド
例として、線分と円弧だけを選んでポリラインにするコマンドを作ったので、これを見ながら説明していきます。
AutoLISPコマンド
(defun c:Test ( / Flg Obj Ent0 )
(setq Flg 1)
(while Flg
(setq Obj (car (entsel "円弧か線分を選択:")))
(setq Ent0 (cdr(assoc 0 (entget Obj))))
(if (or (= Ent0 "LINE") (= Ent0 "ARC"))
(setq Flg nil)
(princ "\n選択された図形は線分か円弧ではありません\n")
);if
);while
(command "._PEDIT" Obj "")
(princ))
AutoLISPの説明
(setq Flg 1)
変数 Flg に情報を入れました。
この変数は”フラグを立てた”だけで、あとで回収します。
中身は何でもいいです。ここでは 1 を入れました。
(while Flg … )
そして、続く図形選択ですが、(while Flg … ) で囲んでいます。
while は条件式がTなら繰り返すnilなら繰り返さない関数です。
変数を条件式として入れた場合、変数に値が入っていればT、空ならnilです。
つまり、
変数 Flg に何か情報が入っている間は繰り返す。
ということです。
(setq Obj (car (entsel “円弧か線分を選択:”)))
(car(entsel)) を使って図形名を得ます。
entsel は引数にメッセージを入れることができます。
このコマンドは円弧か線分を選択しないと先に進めないコマンドなので、ユーザーが何を選択すればよいのかわかるように、メッセージを入れました。
(setq Ent0 (cdr(assoc 0 (entget Obj))))
ここでは、DXFグループコード 0 の要素 (図形タイプ)を取得して、変数Ent0に入れました。
(if (or (= Ent0 “LINE”) (= Ent0 “ARC”))
(if (or (= Ent0 “LINE”) (= Ent0 “ARC”))
(setq Flg nil)
(princ “\n選択された図形は線分か円弧ではありません\n”)
);if
線分の図形タイプは“LINE”、円弧の図形タイプは“ARC”です。
AutoLISP関数 or は、引数のどれか1つでも T ならT、すべてnilならnilを戻します。
AutoLISP関数 = は、複数の引数を比べて、全て同じ値ならT、1つでも違っていたらnilを戻します。
ですので、
(if (or (= Ent0 “LINE”) (= Ent0 “ARC”) は、もしEnt0(先ほど取得した図形がタイプ)が“LINE”か“ARC”なら、 (setq Flg nil) 変数Flgをnil(空っぽ)にする。ということです。
ここでフラグ回収です。
(princ “\n選択された図形は円弧か図形ではありません\n”) は、条件に合ってない場合の処理です。
選択された図形が線分か円弧出ない場合、ユーザーに先に進めない理由を表示してあげると使いやすいコマンドになります。princ でメッセージをコマンドラインに表示。\n は改行です。
while で繰り返すための条件は、「Flgに情報が入っていること」でした、が、線分か円弧を選ぶことでFlgが空っぽになり、(while Flg … )の繰り返しから抜けて次に移ります。
つまり、ユーザーが線分か円弧を選ぶまで、図形選択を繰り返す。ということになります。
(command “._PEDIT” Obj “”)
そして、ここではAutoCADコマンドの”PEDIT”を使って、線分/円弧をポリラインに変えています。
カスタマイズ例
クリックミス対策
今回のコマンドは、図形選択時に何もない所をクリックするとエラーで終わってしまいます。
実際に使う自作コマンドを作る際は、図形選択時のクリックミス対策をしておくと、使い勝手がよくなります。
グループ選択にする
グループ選択でフィルターをかけるのもいいと思います。複数のオブジェクトを一気に変更できます。
グループ選択でフィルターをかけて、選択セットから一番最初の図形を選ぶとしても、今回のように1つだけ図形を選びたいときに使えます。
状況によってグループ選択と図形選択を使い分けたいときは、先に図形を選択していたらグループ選択で選択セット、コマンドを実行してからなら1つづつ図形を選ぶようにしてもいいと思います。
フィルターはかけてないですが、コマンド前に選択でグループ選択、後は1つづつにした選択についての記事です。
繰り返し
全体を、(while T …… ) で囲むと、条件式は常にTなのでESCキーでキャンセルするまで繰り返すようになります。
まとめ
- entsel そのものにはフィルターを付ける引数は無い。
- DXFグループコードで要素を得て、if while を使って、条件に合わなければ図形選択を繰り返すことで、フィルターになる。
Comments