ssgetとwhile|選択した図形を1つずつ処理する
要点
ssgetで選択セットを取得し、sslengthで件数を調べ、ssnameで図形を1つずつ取り出します。まず図形種別の表示で繰り返しの動きを確認します。
始める前に
先に確認すると読み進めやすい記事:
確認の手順
- 線と円を含む図形をいくつか選択します。
- sslengthで件数を取得し、カウンターを0から始めます。
- while内でssnameを使い、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で繰り返し処理を行う
この構文を使えば、選択した図形に対して一括処理が可能になります。
結果の確認
選択セットの添字は0から始まります。何も選ばないとnilになるため、件数を調べる前に選択の有無を確認します。
参照資料
対象環境・動作確認
AutoLISP対応環境(関数・OSごとの対応は要確認)。内容更新:2026年10月5日。掲載コードのCAD実機検証は未実施です。図形を変更する例は、コピーした図面で結果を確認してください。