ssget を使ってグループ選択をするとき、フィルターをかけて、円だけ、テキストだけ、画層”0”だけなどなど、欲しい種類の図形だけを選ぶことができるよ。
予備知識
フィルター無しで、ssgetを使って図形を複数選択するコマンドの作り方について書いた記事です。
選択セット フィルター
AutoLISP 関数 ssget は、グループ選択で複数の図形を選択して、選択セットを作る機能があり、複数の図形を選択して変数に入れるときに使う関数でしたね。
今回は、フィルターをかけて、特定のプロパティを持った図形を選びます。
グループコード
フィルターをかけるには、グループコードが必要になります。
APP図形名( -1)、ハンドル(5)、xdata (1000以上) など、使用できないグループコードもありますが、それらは特に使いたい機会もないのかなと思います。
では、テキストだけを選択するフィルターを作りたいと思います。
テキスト、円、線分、、、などの図形の種類は、”図形タイプ”と言います。
ヘルプサイトから”図形タイプ”のグループコードを調べてください。
AutoLISPで利用するDXFグループコードの一覧はこちらです。
図形タイプのグループコードは 0 ですね。
フィルターのかけ方は、グループコードとその情報でのドットペアを作ります。
(グループコード . “情報”)
例えば、”TEXT” だけを選べるようにフィルターをかけるとこうなります。
(ssget '((0 . "TEXT")))
フィルター付き選択セットを使ったTestコマンド
ssget で得た値を変数に入れて、図形の色を赤にするコマンドで、テキストだけが選ばれたかどうか確かめてみましょう。
下記に Test という名前のコマンドを用意しました。
(defun c:Test ()
(setq Objs (ssget '((0 . "TEXT"))))
(command-s "._change" Objs "" "p" "c" "1" "")
(princ))
図形をいろいろ用意してください。
先ほど作ったコマンドtest を実行すると図形選択のを促されます。
図形をすべて選択すると、
このように、テキストだけが選択セットに入って色変更されて赤くなりました。
Testコマンドの詳細
この、Test コマンドの内容ですが、
(setq Objs (ssget '((0 . "TEXT"))))
まず、テキストフィルター付きのssgetで選択した図形セットを変数Objsに代入しました。
(command-s "._change" Objs "" "_p" "_c" "1" "")
そして、コマンドCHANGE[データ変更]を使い、
“._change” コマンドCHANGE [データ変更] 実行
“” エンター(空白キー)
Objs 図形選択に変数Objsに代入された図形を使う
“” エンター(空白キー)
“_p” [プロパティ(P)]を選択
“_c” [色(C)]を選択
“1” 色番号入力 1
“” エンター(空白キー)
このように、Objsに代入された図形の色を1(赤)に変更しました。
複数の図形タイプのフィルター
(ssget '((0 . "TEXT,LINE")))
テキストと線分、2種類の図形タイプを指定したいというときは、コンマの後に続けて別の図形タイプを入れることができます。
(defun c:Test ()
(setq Objs (ssget '((0 . "TEXT,LINE"))))
(command-s "._change" Objs "" "p" "c" "1" "")
(princ))
これを実行するとこうなります。
細い線は線分(LINE)、太い線はポリライン(LWPOLYLINE)です。
* ワイルドカード
AutoLISPでは、* (アスタリスク)はワイルドカードと呼ばれる、すべての文字の代わりにになるシンボルです。
テキストだけではなく、マルチテキストも選びたい。というときは、*TEXT とすれば、TEXT だけでなく、MTEXT(マルチテキスト)も含まれます。
そして、線分(LINE) だけではなく、ポリライン(LWPOLYLINE)も選びたい。というときは、*LINE とすれば、LINE だけでなく、POLYLINE (ポリライン)LWPOLYLINE(軽量ポリライン)も含まれます。
(defun c:Test ()
(setq Objs (ssget '((0 . "*TEXT,*LINE"))))
(command-s "._change" Objs "" "p" "c" "1" "")
(princ))
*(アスタリスク)を入れたコマンドを実行して図形をすべて選択すると、
テキスト、マルチテキスト、線分、ポリラインが選択されて赤くなりました。
複数のグループコードを使う
複数のグループコードを使うこともできます。その場合は、
‘((0 . “*TEXT,*LINE”)(8 . “0”))
というように、隣に続けて記入します。
この例の場合、8は画層のグループコードなので、テキスト、マルチテキスト、線分、ポリライン、かつ画層 “0”の図形。といフィルターになります。
まとめ
- ssget で選択セットを作るとき、フィルターをかけることができる。
- ssget の引数に、グループコードと情報のドットペアを入れるとフィルターになる。
- 図形タイプが”TEXT” の図形のみ選択するようにしたいときは、(ssget ‘((0 . “TEXT”)))
- 2つ以上の情報でフィルターをかけたいときはコンマに続けて複数の情報を入れることができる。
- 図形タイプが ”TEXT” と “LINE” 両方を選びたいときは (ssget ‘((0 . “TEXT,LINE”)))
- *(アスタリスク)はAutoLISPではワイルドカードと呼ばれて、全ての文字の代わりになる。
- “*TEXT”とすると、TEXT だけでなく、MTEXT も対象になる。
- 複数のグループコードでフィルターをかけることもできる。
- 図形タイプと画層、両方に選択条件を付ける場合は、'((0 . “*TEXT,*LINE”)(8 . “0”))
関連記事
今回の記事では、 コマンドCHANGE[データ変更] を使用しました。
従来のAutoCADコマンドを実行する方法についてもっと詳しく知りたい方はコチラを。
フィルターがかかっていない、シンプルな図形の複数選択についてはコチラを。
フィルター付き選択セットを作った場合、キチンと入りたい図形が選択セットにどうかをチェックする自作関数があると便利です。
図形を選択した状態でコマンドを実行するか、何も選択していない状態で実行するかでコマンドの機能を変える方法です。
図形を1つづつ選択しながら実行して確認しながら使っていきたい場合と、一気に選択してまとめて実行したい場合がある。というコマンドがあるとき、選択した状態で実行=一気にまとめて実行、何も選択していない状態で実行=1つづつ選択&実行、というようにできます。
フィルター付き選択セットを使ったサンプル記事です。
Comments