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

assoc|DXFデータから画層や色を取り出す

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

assocで指定したグループコードのデータを探し、cdrで値を取り出します。画層名の取得から、コードが見つからない場合の扱いまでを確認します。

始める前に

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

確認の手順

  1. 練習図形を選び、entgetで情報を取得します。
  2. assocで画層を表すグループコード8を探します。
  3. cdrで値を取り出し、プロパティの画層名と照合します。
  4. 存在しないコードも調べ、nilを確認してから値を使う流れを確認します。

Step 1:assocって何?

assocは、DXFデータから必要な情報を取り出す関数です。リストの中から特定のグループコードのデータを抽出できます。

たとえば、こんなリストがあったとします:

掲載コード
(setq info '((8 . "Layer1") (62 . 1) (10 . (100.0 200.0 0.0))))

この中から「レイヤー名(コード8)」を取り出したいときは:

掲載コード
(assoc 8 info)       ; => (8 . "Layer1")
(cdr (assoc 8 info)) ; => "Layer1"

ポイント:assocは「ペアごと」返す。値だけ欲しいなら cdr を使う!

Step 2:実際の図形からレイヤー名を取り出してみよう

AutoCAD上で、図形を選んでそのレイヤー名を表示する簡単なコマンドを作ってみます。

掲載コード
(defun c:show-layer (/ en ed lay)
  (setq en (car (entsel "\n図形を選んでください: ")))
  (setq ed (entget en))               ; 図形の情報を取得
  (setq lay (cdr (assoc 8 ed)))       ; レイヤー名を取り出す
  (princ (strcat "\nレイヤー名は: " lay))
)

実行方法:”show-layer.lsp”で保存してドラッグアンドドロップしてAutoCADのコマンドラインで show-layer と入力して、図形を選んでみましょう!

Step 3:assocで取り出した値を使って色を変更してみよう

次は、assocで色番号(コード62)を取り出して、別の色に変更してみます。

掲載コード
(defun c:change-color (/ en ed old new)
  (setq en (car (entsel "\n図形を選んでください: ")))
  (setq ed (entget en))
  (setq old (cdr (assoc 62 ed)))       ; 現在の色番号
  (princ (strcat "\n現在の色番号は: " (itoa old)))
  (setq new (getint "\n新しい色番号を入力してください(例: 1=赤): "))
  (setq ed (subst (cons 62 new) (assoc 62 ed) ed)) ; 色番号を差し替え
  (entmod ed)                          ; 変更を反映
  (princ "\n色を変更しました。")
)

例:赤にしたい場合は「1」、青なら「5」、緑なら「3」などを入力!

Step 4:assocの応用テクニック

値が見つからないときの安全な書き方

掲載コード
(defun safe-get (code ed)
  (if (assoc code ed)
    (cdr (assoc code ed))
    nil))

同じコードが複数ある場合(例:座標コード10)

掲載コード
(defun get-all-10 (ed)
  (mapcar 'cdr (vl-remove-if-not '(lambda (p) (= (car p) 10)) ed)))

おまけ:よく使うショート関数

掲載コード
(defun dxf (code ed) (cdr (assoc code ed)))

使い方:

掲載コード
(dxf 8 (entget en)) ; レイヤー名
(dxf 62 (entget en)) ; 色番号

まとめ

やったこと内容
assocの基本番号札つきメモから欲しい情報を探す
entgetとの組み合わせ図形の情報を取得してassocで抜き出す
色の変更assocで取得 → substで差し替え → entmodで反映
安全な使い方nil対策や複数コードの処理

次のステップ

  • 線種(コード6)や線の太さ(コード370)もassocで取り出してみよう!
  • 自分の図面で、レイヤーや色を一括変更するツールを作ってみよう!

結果の確認

assocは最初に一致した項目を返します。同じコードが複数あるデータや、色コードが省略された図形を扱う場合は、戻り値を無条件に使わないでください。

参照資料

対象環境・動作確認

AutoLISP対応環境(関数・OSごとの対応は要確認)。内容更新:2026年10月5日。掲載コードのCAD実機検証は未実施です。図形を変更する例は、コピーした図面で結果を確認してください。