assoc関数 DXFデータから情報を取り出す

Autolisp

AutoLISPで図形の情報を調べたり変更したりするには、まずその図形の「中身」を取り出す必要があります。
そのときに活躍するのが assoc 関数。今回は、図形のレイヤー名を取り出すところから始めて、色の変更までやってみましょう!


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で取り出してみよう!
  • 自分の図面で、レイヤーや色を一括変更するツールを作ってみよう!

コメント

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