AutoLISPで図形を選択して、繰り返し処理を行うには ssget
と while
の組み合わせが基本です。今回は、選択セットを取得し、それを1つずつ処理する方法です。処理文を変更すれば応用ができるのでおすすめです。
選択セットを取得する(ssget)
AutoCAD上でユーザーが選択した図形を取得するには ssget
を使います。
(setq ss (ssget)) ; ユーザーが選択した図形群を取得
この時点で、選択セット ss
に図形が格納されます。選択されなかった場合は nil
が返ります。
選択セットの図形を1つずつ処理する基本構文(whileループ+sslength+ssname)
以下のコードは、選択セット ss
に含まれる図形を1つずつ取り出して処理するための基本的なループ構文です。
(setq i 0)
- 変数
i
を 0 に初期化します。
これは、選択セットの最初の図形(インデックス0)から処理を始めるためです。
(while (< i (sslength ss))
i
が選択セットの長さより小さい間、繰り返し処理を行うという意味です。sslength
関数は選択セットss
に含まれる図形の数を返します。
(setq ent (ssname ss i)) ; i番目の図形を取得
- 選択セットの
i
番目の図形を取得して、変数ent
に代入します。ssname
関数は、選択セットから個々の図形を取り出すために使います。
;; ここに処理を書く(例:図形の種類を表示)
- ここに、取得した図形に対して行いたい処理を記述します。
例えば、図形の種類を調べて表示したり、属性を変更したりできます。
(setq i (1+ i))
- 変数
i
を 1 増やして、次の図形に進むようにします。
これにより、次のループでi+1
番目の図形が処理されます。
- whileループの終了を示します。
i
が選択セットの長さに達するまで、ループが繰り返されます。
この構文を使えば、選択されたすべての図形に対して、順番に処理を行うことができます。
処理内容は ;; ここに処理を書く
の部分に自由に追加できます。
例:選択した図形の種類を表示する
以下は、選択した図形の種類(LINE, CIRCLEなど)を表示するサンプルです。
(defun c:CheckTypes ()
(setq ss (ssget))
(if ss
(progn
(setq i 0)
(while (< i (sslength ss))
(setq ent (ssname ss i))
(setq entData (entget ent))
(setq entType (cdr (assoc 0 entData)))
(prompt (strcat "\nEntity Type: " entType))
(setq i (1+ i))
)
)
(prompt "\nNo objects selected.")
)
)
まとめ
今回のポイントは以下の3つ:
ssget
で選択セットを取得sslength
とssname
で図形を1つずつ取り出すwhile
で繰り返し処理を行う
この構文を使えば、選択した図形に対して一括処理が可能になります。
コメント