+CADLabo.comCAD / LISP / AUTOMATION
AutoLISP初心者講座

ssgetとwhile|選択した図形を1つずつ処理する

AutoLISPの基本・図形操作のTips一覧
要点

ssgetで選択セットを取得し、sslengthで件数を調べ、ssnameで図形を1つずつ取り出します。まず図形種別の表示で繰り返しの動きを確認します。

始める前に

先に確認すると読み進めやすい記事:

確認の手順

  1. 線と円を含む図形をいくつか選択します。
  2. sslengthで件数を取得し、カウンターを0から始めます。
  3. while内でssnameを使い、1つの図形を取り出します。
  4. カウンターを更新し、選択した件数分だけ処理されることを確認します。

選択セットを取得する(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実機検証は未実施です。図形を変更する例は、コピーした図面で結果を確認してください。