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