AutoLISPの世界では、データを扱うための基本単位が「リスト」です。図面の属性、座標、オブジェクト情報など、ほぼすべてがリストで表現されます。
今回は、以下のシンプルなリストを使って、AutoLISPのリスト構造と操作方法を順を追って学んでいきましょう。
(setq colors '("赤" "青" "緑"))
このリストには、3つの色名が含まれています。それぞれの要素は文字列であり、AutoCADの属性やラベルに応用できるデータ形式です。
🧺 STEP 1:リストの構造を理解する
AutoLISPのリストは、内部的には「consセル」と呼ばれる2つの要素のペアで構成されています。
CAR
:リストの先頭要素CDR
:残りのリスト(次のペア)
この構造を使って、リストを順番に分解できます:
(car colors) ; => "赤"
(cdr colors) ; => ("青" "緑")
(car (cdr colors)) ; => "青"
(cdr (cdr colors)) ; => ("緑")
このように、リストは「先頭+残り」の繰り返しで構成されているのです。
🔍 STEP 2:要素の数を調べる (length)
(length colors) ; => 3
リストの要素数を取得するには length
関数を使います。入れ子リストがあっても、最上位の要素数を返します。
🔎 STEP 3:要素を検索する (member)
(member "青" colors) ; => ("青" "緑")
(member "黄" colors) ; => nil
member
関数は、指定した要素がリストに含まれているかを調べます。見つかった場合は、その要素以降のリストが返されます。
➕ STEP 4:要素を追加する (cons) と (append)
cons:先頭に追加
(cons "白" colors)
; => ("白" "赤" "青" "緑")
append:末尾に追加
(append colors '("黒"))
; => ("赤" "青" "緑" "黒")
※ append
はリスト同士の結合なので、単一要素は list
で包む必要があります。
❌ STEP 5:要素を削除する(Visual LISP拡張)
AutoLISPには直接削除する関数がないため、vl-remove
を使って新しいリストを作成します。
(vl-remove "青" colors)
; => ("赤" "緑")
🔁 STEP 6:リストの逆順 (reverse)
(reverse colors)
; => ("緑" "青" "赤")
順序を入れ替えたいときに便利です。reverse
は元のリストを変更せず、新しいリストを返します。
🧩 STEP 7:リストかどうかを判定する (listp) と (atom)
(listp colors) ; => T
(atom colors) ; => NIL
listp
はリストかどうかを判定atom
はリスト以外(数値、文字列、シンボルなど)かを判定
🎓 STEP 8:応用例:色リストを属性に変換する
以下は、色リストを使って属性付きブロックに色ラベルを追加する例です。
(defun c:addColorAttr ()
(foreach clr colors
(command "_-insert" "ColorLabel" "0,0" "1" "1" "0")
(command "_attedit" "_N" "_Color" clr)
)
)
※この例では、”ColorLabel” というブロックに "Color"
属性を設定しています。
まとめ:AutoLISPのリストは「データの道具箱」
リストはAutoLISPの基本構造であり、図面処理の自動化に欠かせない道具です。今回のように「色」をテーマにすることで、リストの構造と操作がより直感的に理解できたのではないでしょうか。
次回は、入れ子リストや属性抽出の実践例など、さらに深いAutoLISPの世界へご案内します!質問する
コメント