Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。

AutoLISP:拡張エンティティ データの付加・参照・削除

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 自身も拡張エンティティデータ利用していますので、既に付加されている拡張エンティティデータに影響を与えずに独自データを付加、削除するようご留意ください。

2024-11-27_15-39-39.jpg