entsel 関数や ssget 関数が用意されています。
ssget 関数で作成された選択セットにアクセスするためのsslength関数やssname関数もあります。
一つの図形を選択する
一つの図形を画面から選択するには、entsel 関数を使います。
(setq ep (entsel “図形を選択”))
図形を選択 »
(<EName: 000000356bba7130> (7.5185924 9.31371853 0.0))
戻り値は図形名とクリックした座標値を含むリストです。
図形リストを取得する
図形名から図形リストを取得するには、entget 関数を使います。
(setq el (entget (car ep))
((-1 . <EName: 000000356bba7130>) (0 . “CIRCLE”) (5 . “114”) (330 . <EName: 000000356e703600>) (100 . “AcDbEntity”) (67 . 0) (410 . “Model”) (8 . “floor”) (62 . 120) (100 . “AcDbCircle”) (10 10.0 10.0 0.0) (40 . 2.5) (210 0.0 0.0 1.0))
ここで car 関数はリストの最初の要素を取得する関数です。
図形オブジェクトを取得する
図形名からオートメーションの図形オブジェクトを取得するには、vlax-ename->vla-object 関数を使います。
(setq ent (vlax-ename->vla-object (car ep)))
#<VLA-OBJECT IAcadCircle 62c48c10>
今まで書いていませんでしたが、LISPでは関数名や変数名の大文字、小文字を区別しません。
複数の図形を選択する
複数の図形を画面から選択するには、ssget 関数を使います。
(setq ss (ssget))
エンティティを指定» マウスで矩形範囲を指定
3 個検出
エンティティを指定» Enterキーで選択を終了
<Selection set: 8c4>
戻り値は選択セットと呼ばれる特別なデータです。
選択セットから図形にアクセスするには
例えば、次のようにします。
(setq ss (ssget)) ;ユーザーに複数図形選択を行わせる
(setq i 0 n (sslength ss)) ;ループカウンタ i の初期化と、選択した図形数を取得
(while (< i n)
(setq en (ssname ss i)) ;選択セットから図形名を取得
(setq el (entget en)) ;図形名から図形リストを取得
(setq ent (vlax-ename->vla-object en)) ;図形名から図形オブジェクトを取得
(setq i (1+ i))
)
(setq ss nil) ;使い終わった選択セットは解放する(重要)
sslength 関数は、選択セットに含まれる図形の数を返します。
ssname 関数は、選択セットに番号を指定して図形名を取得します。番号は0始まりです。
図形名から図形リストを取得するには entget 関数を使います。
図形名からオートメーションの図形オブジェクトを取得するには vla-ename->vla-object 関数を使います。
while 関数は直後の式が真(T)の間、その次以降の式の実行を繰り返します。
1+ 関数で、ループカウンター変数 i を1ずつ増加しているので、選択セットに含まれるすべての図形をチェックしたら i が 3 になり、(< i n) は nil になって while ループを抜けます。 使い終わった選択セットは nil を割り当てることで解放します。