Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
Issue
AutoLISP のリスト操作で拡張エンティティ データを付加・参照・削除するには、それぞれ、どのようなコードを作成すればいいでしょうか?
Solution
拡張エンティティ データは、AutoCAD 図面内の任意のオブジェクトに任意のカスタム データの付加、参照する手法です。AutoLISP でも、他の API 同様、拡張エンティティ データの付加・参照・削除を実装することが出来ます。
次のコードは、リスト操作で拡張エンティティ データを付加する AddXData コマンド、参照する GetXData コマンド、削除する RemoveXData コマンドの例です。
;https://help.autodesk.com/view/OARX/2025/JPN/?guid=GUID-A94BC605-5517-437F-A6FE-D3EB8116A01A
; 拡張エンティティデータの追加例
(defun C:AddXData (/)
(setq ename (car (entsel)))
(if (= ename nil)
(exit)
)
(setq appname "Test_App")
(if (= (tblsearch "APPID" appname) nil)
(if (= (regapp appname) nil)
(princ (strcat "\n" appname " アプリケーション名が登録出来ません... "))
)
)
(setq edata (entget ename (list "*")))
(setq exist (cdr (assoc -3 edata)))
(if (= exist nil)
(progn ; 他の拡張エンティティデータも付加されていない場合
(setq xdata (list
(list -3
(list appname
(cons 1002 "{")
(cons 1000 "あいうえお") ; 文字列データ
(cons 1040 999.99) ; 実数データ
(cons 1070 1111) ; 整数データ
(cons 1002 "}")
)
)
)
)
(setq newdata (append edata xdata))
(entmod newdata)
)
(progn ; 既になんらかの拡張エンティティデータが付加されている場合
(foreach xdatas exist
(progn
(if (= appname (car xdatas))
(progn
(princ (strcat "\n既に " appname " データが付加されています..."))
(exit) ; 処理中断
)
)
(setq xdata (list
(list appname
(cons 1002 "{")
(cons 1000 "あいうえお") ; 文字列データ
(cons 1040 999.99) ; 実数データ
(cons 1070 1111) ; 整数データ
(cons 1002 "}")
)
)
)
(setq xdatas (append (list -3) (append exist xdata)))
(setq newdata (subst xdatas (append (list -3) exist) edata))
(entmod newdata)
(princ (strcat "\n" appname " データが付加しました..."))
)
)
)
)
(princ)
)
; 拡張エンティティデータの取得例
(defun C:GetXData (/)
(setq ename (car (entsel)))
(if (= ename nil)
(exit)
)
(setq edata (entget ename (list "*")))
(setq exist (cdr (assoc -3 edata)))
(if (/= exist nil)
(progn
(foreach xdatas exist
(progn
(princ (strcat "\n*** " (car xdatas)))
(setq xdata (cdr xdatas))
(foreach element xdata
(setq code (car element))
(setq value (cdr element))
(cond
((= code 1000)
(princ (strcat "\n文字列値:" value))
)
((= code 1040)
(princ (strcat "\n実数値:" (rtos value)))
)
((= code 1070)
(princ (strcat "\n整数値:" (itoa value)))
)
)
)
)
)
)
(progn
(princ "\n拡張エンティティデータが付加されていません...")
)
)
(princ)
)
; 拡張エンティティデータの削除例
(defun C:RemXData (/)
(setq ename (car (entsel)))
(if (= ename nil)
(exit)
)
(setq appname "Test_App")
(if (= (tblsearch "APPID" appname) nil)
(princ (strcat "\n" appname " アプリケーション名が登録されていません... "))
)
(setq edata (entget ename (list "*")))
(setq exist (cdr (assoc -3 edata)))
(if (/= exist nil)
(progn
(foreach xdatas exist
(progn
(if (= appname (car xdatas))
(progn
(setq xdata (list
(list appname)
)
)
(setq xdatas (append (list -3) (append exist xdata)))
(setq newdata (subst xdatas (append (list -3) exist) edata))
(entmod newdata)
(princ (strcat "\n付加された " appname " データを削除しました..."))
)
)
)
)
)
)
(princ)
)
他の 3rd party アプリケーションや AutoCAD 自身も拡張エンティティデータ利用していますので、既に付加されている拡張エンティティデータに影響を与えずに独自データを付加、削除するようご留意ください。