選択セット

選択セットとは

【選択セット】は複数の図形のグループを表し、ユーザーの選択操作などによって作成されます。また、【選択セット】作成時にフィルタを指定することによって、ユーザーが選択できる図形の種類や属性を制限することができます。【選択セット】は LISP のリストなどとは異なる AutoLISP 独自のオブジェクトで、独自のアクセス関数が用意されています。【選択セット】内は、インデックスを用いて含まれる【図形名】を取り出します。

【選択セット】は、現に今、画面上で選択されているかどうかとは関係ありません。そのため、【選択セット】は複数(AutoLISP の仕様上、最大 128 個)存在できるものです。【選択セット】を変数に代入して保存しておけば、任意の時に利用できます。このことは、【選択セット】に含まれるからといって、作図ウィンドウで図形が必ずハイライト表示になっているわけではないことを示します。AutoCAD ユーザーが図形を選択した場合は、自動的にハイライト表示になりますが、プログラムから【選択セット】を作成した場合は、sssetfirst 関数で図形の表示状態を変更しなければハイライト表示になりません。sssetfirst 関数は、この章ではなく、ユーザー出力関数で説明しています。この他に、保存しておいた【選択セット】に含まれる【図形名】は、現在でも有効かどうか考慮する必要が出てきます。

以下、【選択セット】を操作する関数が出てきますが、実際の場面ではユーザー選択などから【選択セット】が得られたら、直ぐにリストに変換して操作した方が AutoLISP では簡単です。

作成

AutoLISP関数
(ssget [sel-method] [pt1 [pt2]] [pt-list] [filter-list])
sel-method:文字列
pt1,pt2:リスト
pt-list:リスト
filter-list:リスト
選択セットを作成します。
戻り値:選択セット、またはnil

ssget 関数は【選択セット】を作成します。

ssget 関数は引数を与えずに呼び出した場合、状況により動作が異なります。

既存の選択図形 システム変数 PICKFAST ssget 関数の動作
なし 【コマンドライン】に「オブジェクトを選択:」と表示してユーザーにオブジェクトを選択するよう促します。
あり 0
あり 1 ただちに既存の選択図形より【選択セット】を作成し、返します。

システム変数PICKFIRST

タイプ: 整数型 保存先: レジストリ 初期値: 1

コマンドを呼び出す前にオブジェクトを選択するのか、コマンドを呼び出した後にオブジェクトを選択するのかをコントロールします。

0 コマンドの発行後にオブジェクトを選択します。
1 コマンドの発行前にオブジェクトを選択します。

戻り値は、作成された【選択セット】です。何も選択されなければnilを返します。空の【選択セット】ではありません。

ESC キーが押されると、「*キャンセル*」と表示されエラーが発生します。

下は最も簡単な実行例です。AutoCADを使っていれば、おなじみのシーンです。

コマンド: (ssget)⏎

オブジェクトを選択: 認識された数: 1

オブジェクトを選択: w⏎
最初のコーナーを指定: もう一方のコーナーを指定: 認識された数: 0
オブジェクトを選択: c⏎
最初のコーナーを指定: もう一方のコーナーを指定: 認識された数: 2 (重複している数: 1), 総数 2

オブジェクトを選択: f⏎
フェンスの 1 点目を指定:
フェンスの次の点を指定 または [元に戻す(U)]:
フェンスの次の点を指定 または [元に戻す(U)]:
認識された数: 1, 総数 3

オブジェクトを選択: cp⏎
ポリゴンの 1 点目:
線分の端点を指定 または [元に戻す(U)]:
線分の端点を指定 または [元に戻す(U)]:
線分の端点を指定 または [元に戻す(U)]:
線分の端点を指定 または [元に戻す(U)]:
認識された数: 1, 総数 4

オブジェクトを選択: ⏎
<Selection set: 66>

ssget関数に引数を与えて呼び出すと、【選択セット】の作成方法を細かく指定することができます。

sel-method 引数は、選択する方法を表す文字列です。「非対話的」なものは後続の引数と共に即座に選択セットが作成されます。「対話的」なものはユーザーによる選択のオプションとして働きます。pt1,pt2,pt-list 引数は、sel-method 引数で選択された方法に応じて必要となる UCS に基づく座標情報です。

  sel-method 引数 説明 
非対話的  "C" 矩形 pt1,pt2 による交差選択
"CP" ポリゴン pt-list による交差選択
"F" フェンス pt1,pt2 による選択
"I" 事前選択(コマンドより前に現に選択されている図形を選択)
システム変数PICKFIRSTが1である必要があります。
"P" 最後に作成された選択セット
"W" 矩形 pt1,pt2 による窓選択
"WP" ポリゴン pt-list による窓選択
"X" 図面データベース内の図形すべてを選択
対話的 ":E" 選択ピックボックスにかかっている複数図形を一度に選択
":N" ssnamex関数で取り出すことができる、ブロック図形や複合図形の追加情報を付加
":E" 図形選択の取捨選択が長時間かかると判断されるような選択を許可
":S" 単一図形選択
":U" 従属図形の選択可
":V" 従属図形の選択に限定

座標は、2D 点と 3D 点が使用可能です。ただし、作図ウインドウが 3D 表示の際では、見ている方向によって選択のための座標が図形に重なったり重ならなかったりするので結果が異なります。

一般的な引数の例は以下のとおりです。

(ssget ‘(50.0 50.0))
点(50.0 50.0)を通る図形を選択した選択セットを返します。
(ssget “P”)
「以前」の選択セットを返します。(もっとも最近に使用した選択セット)
(ssget “W” ‘(0.0 0.0) ‘(50.0 50.0))
2点(0.0 0.0) (50.0 50.0)で窓選択した選択セットを返します。
(ssget “CP” ‘((0.0 0.0) (50.0 50.0) (0.0 100.0))
ポリゴンの頂点(0.0 0.0) (50.0 50.0) (0.0 100.0)で表される領域で、交差選択した選択セットを返します。
(ssget “X”)
すべての図形を含む選択セットを返します。

filter-list 引数にDXFのグループコードで修飾された連想リストを指定するとフィルタとして働き、そのすべての連想リストに合致する図形のみを選択します。これは図面データベースをループなどで一つ一つ条件に合うものを走査するのに比べてたいへん高速に機能します。

(ssget "X" '((0 . "LINE")(8 . "0")))
図面の中から、線分で、かつ画層が“0”の図形の選択セットを返します。

ここで自動的に選択され【選択セット】に含まれて帰ってくる図形は、AutoCAD ユーザーが現在使用している空間に存在していた図形に限りません。つまり特に指定しなければ【モデル空間】と各レイアウトの【ペーパー空間】に含まれる図形が区別なくピックアップされます。現在の空間に含まれるものに限りたければ、空間を指定するフィルタを連想リストに追加します。

現在の空間名は次の関数で得られます。

(defun ActiveLayoutName	(/ doc-object)
  (setq doc-object (vla-get-ActiveDocument (vlax-get-acad-object)))
  (if (or (= (vla-get-ActiveSpace doc-object) acModelSpace)
	  (/= (getvar "CVPORT") 1)
      )
    "Model"
    (vla-get-Name (vla-get-ActiveLayout doc-object))
  )
)

ここで得られた空間名を次のように連想リストのフィルタに含めます。

(ssget "X" (list '(0 . "LINE") '(8 . "0") (cons 410 (ActiveLayoutName))))

なお、AutoLISP で ActiveX を扱う方法を学ぶと各空間とブロック定義が同じ Block オブジェクトで表現されていることを知っているかと思いますが、ssget 関数はブロック定義の中までは走査しません。

filter-list引数のDXFのグループコードで修飾された連想リストには、条件式を含めることができます。条件式は、DXFグループコード -4 で装飾されます。条件式には論理演算式と関係式といった種類があります。ただし、図形のデータで出てくる総ての DXF グループコードでフィルタが機能するかというとそうでもないようです。エンティティタイプや画層、線種といった基本的なものは機能するようですが、それ以外は確認が必要です。

次は論理演算の例で、円または円弧の図形を選択するフィルタです。

'((-4 . "<OR") (0 . "CIRCLE") (0 . "ARC") (-4 . "OR>"))

論理演算式は、開始演算子と終了演算子がセットで使用され、次の種類があります。

開始演算子 終了演算子
"<AND" "AND>"
"<OR" "OR>"
"<XOR" "XOR>"
"<NOT" "NOT>"

関係式は、直後のグループと合わせて意味を成します。次の例は円の中から、半径が 2.0 以上のものを意味します。

'((0 . "CIRCLE") (-4 . ">=") (40 . 2.0))

関係式の種類は、次のとおりです。

関係式 説明 対応データタイプ 座標リスト ベクトル
"*" 常に真(ワイルドカード) 整数、実数
"=" 等しい
"!=" 等しくない
"/=" ×
"<>"
"<" より小さい
"<=" より小さいか等しい
">" より大きい
">=" より大きいか等しい
"&" いずれか(ビット方式) 整数
"&=" 等しい(ビット方式)

座標やベクトルのリストの場合は、関係式を「,」(カンマ)で区切って">,>,="のように必要な分だけ並べます。

"&"は(整数 AND フィルタ値)の結果が 0 とならない場合に真です。"&="は(整数 AND フィルタ値)の結果がフィルタ値、つまり二つが等しかった場合に真です。

AutoLISP関数
(ssgetfirst)
選択されている図形の選択セットを返します。
戻り値:リスト

ssgetfirst 関数は、現に今、ユーザーが選択状態にしている図形を【選択セット】として返します。ssget 関数でも同じような動作をしますが、ssgetfirst 関数はシステム変数 PICKFIRST の影響を受けません。

戻り値は、一番目が nil、二番目が得られた【選択セット】(【選択セット】が無い場合は nil)のリストが返ります。一番目の要素は、現在は使われていないので常に nil です。

下の実行例は、画面でいくつか図形が選択されている状態で実行したものです。

コマンド: (ssgetfirst)⏎
(nil <Selection set: 17e>)

何も選択されていないと次のようになります。

コマンド: (ssgetfirst)⏎
(nil nil)

参照

AutoLISP関数
(sslength ss)
ss:選択セット
【選択セット】に含まれる図形の数を示す整数を返します。
戻り値:整数
AutoLISP関数
(ssname ss index)
ss:選択セット
index:整数
【選択セット】の指定されたインデックス番号の要素の【図形名】を返します。
戻り値:【図形名】、またはnil

sslength 関数で【選択セット】の要素数を返します。ここからインデックスの有効範囲を考慮して、ssname 関数でインデックスの指す【図形名】を取得します。インデックスの最初は 0 から始まります。インデックスが範囲外の場合は nil が返ります。

以下を実行すると、今画面で選択されているものの【選択セット】を作成し、要素数と個々の【図形名】を表示します。

(setq sset (cadr (ssgetfirst)))
(setq i 0 sl (sslength sset))
(prompt (strcat "\n要素数:" (vl-princ-to-string sl)))
(repeat	sl
  (prompt (strcat "\n"
		  (vl-princ-to-string i) " : "
		  (vl-princ-to-string (ssname sset i))
	  )
  )
  (setq i (1+ i))
)

実行してみると、以下のように表示されます。

要素数:3
0 : <図形名: 7ffff7061e0>
1 : <図形名: 7ffff7061d0>
2 : <図形名: 7ffff7061c0>
AutoLISP関数
(ssnamex ss [index])
ss:選択セット
index:整数
【選択セット】に含まれる図形が、どのように選択されたかに係る情報を返します。
戻り値:リスト

作成された【選択セット】は、選択された際の選択方法の情報を保持しています。

ssnamex 関数は【選択セット】の詳細な情報にアクセスできます。index 引数が指定されなければ、【選択セット】内すべての図形についてのリストが返ります。

戻り値のリストの基本構造は以下のとおりです。

( ( 1                                ;選択方法
    <図形名: 7ffff706230>             ;【図形名】
    0                                ;詳細データ1
    (0 (139.268 31.3991 0.0))        ;詳細データ2
  )
  (選択方法補足情報のサブリスト)
)

一番目の整数は選択方法を意味しており、意味は以下のとおりです。

一番目の要素 説明
0 以前、全図形
1 ピック
2 窓またはポリゴン窓
3 交差またはポリゴン交差
4 フェンス

二番目は図形の【図形名】です。

三番目以降は選択方法に関係する頂点などの詳細なデータです。選択方法によっては、より詳細な補足情報のサブリストが付加されます。詳しくはヘルプを参照してください。

以下は、現在選択されていた図形から【選択セット】を作成し、個々の図形のssnamex関数の戻り値を表示します。

(setq sset (cadr (ssgetfirst)))
(setq i 0 sl (sslength sset))
(prompt (strcat "\n要素数:" (vl-princ-to-string sl)))
(repeat	sl
  (prompt (strcat "\n"
		  (vl-princ-to-string i) "番要素のssnamexの戻り値 : \n"
		  (vl-princ-to-string (ssnamex sset i))
	  )
  )
  (setq i (1+ i))
)

実行すると、以下のように表示されます。

要素数:3
0番要素のssnamexの戻り値 :
((3 <図形名: 7ffff706250> 0 -1) (-1 (0 (121.356 82.2556 -15.3595)<中略>(0.281164 0.798783 -0.531876))))
1番要素のssnamexの戻り値 :
((1 <図形名: 7ffff706230> 0 (0 (76.1839 116.143 11.6539) (0.281164 0.798783 -0.531876))))
2番要素のssnamexの戻り値 :
((2 <図形名: 7ffff706260> 0 -1) (-1 (0 (26.174 141.217 22.8749)<中略>(0.281164 0.798783 -0.531876))))

上から順に、交差、ピック、窓で選択されたことが分かります。