ssgetとwhileで繰り返し処理

Autolisp

AutoLISPで図形を選択して、繰り返し処理を行うには ssgetwhile の組み合わせが基本です。今回は、選択セットを取得し、それを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 で選択セットを取得
  • sslengthssname で図形を1つずつ取り出す
  • while で繰り返し処理を行う

この構文を使えば、選択した図形に対して一括処理が可能になります。


コメント

タイトルとURLをコピーしました