・ XDATA(拡張データ)を 取得/設定 する

XDATAとは、アプリケーション独自の情報のことで、図形オブジェクト・非グラフィカルオブジェクト共に持たせることが可能です。
たとえば、寸法スタイルの上書きなどの情報は、AcadアプリケーションのXDATAとして、寸法オブジェクトに持たせています。

XDATAを取得するには

(entget en '("appname")) のように、(entget) でアプリケーション名リストを指定します。(リストだから複数指定も可)
登録されているアプリケーション名が判らない場合には、(entget en '("*")) のようにワイルドカード指定もできます。
これで、返されるエンティティーデータのリストの中には、XDATAが含まれます。
XDATAを持たないオブジェクトの場合は、(entget en) の場合と同じリストが返ります。
返されたリストの中で、グループコード -3 のリストが、XDATAです。

コマンド: (entget (car (entsel)) '("*"))
オブジェクトを選択: ((-1 . <図形名: 400cac58>) (0 . "DIMENSION") (330 . <図形名: 
40080cc8>) (5 . "133B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") 
(48 . 8.0) (100 . "AcDbDimension") (2 . "*D6") (10 332.139 281.776 0.0) (11 
259.809 285.276 0.0) (12 0.0 0.0 0.0) (70 . 32) (1 . "") (71 . 5) (72 . 1) (41 
. 1.0) (42 . 139.661) (52 . 0.0) (53 . 0.0) (54 . 0.0) (51 . 0.0) (210 0.0 0.0 
1.0) (3 . "S001$0") (100 . "AcDbAlignedDimension") (13 192.478 252.387 0.0) (14 
332.139 253.122 0.0) (15 0.0 0.0 0.0) (16 0.0 0.0 0.0) (40 . 0.0) (50 . 0.0) 
(100 . "AcDbRotatedDimension")
(-3 ("ACAD" (1000 . "DSTYLE") (1002 . "{") (1070 
. 41) (1040 . 5.0) (1070 . 75) (1070 . 1) (1070 . 344) (1005 . "0") (1070 . 
343) (1005 . "1348") (1002 . "}"))))

XDATAを設定するには

XDATAを設定するには、その前にアプリケーションの登録が必要です。
アプリケーションを登録するには (regapp "app_name")
アプリケーションが登録されているか確認するには (tblsearch "APPID" "app_name")
あとは、エンティティーデータに XDATA のリストを追加して (entmod) すれば完了です。
すでに、同じアプリケーションでXDATAを持つエンティティーデータに追加する場合は、既存のデータを消しちゃわないように注意が必要です。>けっこう面倒・・・(-_-;)

 

  ;********************************************************************************************;
  ;サブルーチン (エンティティーデータの要素削除)  ;
  (defun Jof_lstdel_ed (
			ed  ;エンティティーデータのリスト;
			lst ;削除したいグループコードのリスト;
			/ ret )
    (foreach n ed (if (not (member (car n) lst)) (setq ret (cons n ret))))
    (reverse ret)
    )

  ;********************************************************************************************;
  ;サブルーチン  (リストをn番目より前と以後にわけて返す );
  (defun Jof_lst_div(
		     lst ;リスト;
		     n   ;n番目 先頭は0番目;
		     / len ret1 ret2 )
    (setq len (length lst))
    (repeat (min n len)
      (setq ret1 (cons (car lst) ret1))
      (setq lst (cdr lst))
      )
    (setq len (length lst))
    (repeat len
      (setq ret2 (cons (car lst) ret2))
      (setq lst (cdr lst))
      )
    (list (reverse ret1) (reverse ret2))
    )

  ;********************************************************************************************;
  ;サブルーチン (xdataのリスト取得)  ;
  (defun Jof_get_xdata (ed app field / lst_ret lst_xdata flag n c xdata)
    (setq lst_ret (assoc app (cdr (assoc -3 ed))))
    (if field
      (progn
	(setq lst_ret (member (cons 1000 field) lst_ret))
	(setq lst_xdata (cons (car lst_ret) lst_xdata))
	(setq n 1)
	(setq c 0)
	(while (and (not flag) (< n (length lst_ret)))
	  (setq xdata (nth n lst_ret))
	  (setq lst_xdata (cons xdata lst_xdata))
	  (cond
	    ((equal xdata '(1002 . "{"))
	     (setq c (1+ c)))
	    ((equal xdata '(1002 . "}"))
	     (setq c (1- c))
	     (setq flag (if (= c 0) T nil)))
	    )
	  (setq n (1+ n))
	  )
	(setq lst_ret (reverse lst_xdata))
	)
      )
    lst_ret
    )
  
  ;********************************************************************************************;
  ;サブルーチン (xdataを付加する)  ;  
  (defun Jof_add_xdata (ed     ;(entget 図形名 '("アプリケーション名"))で取得したもの;
			app    ;アプリケーション名(文字列);
			field  ;フィールド名(文字列 or nil);
			lst_add;追加するデータ('((1070 . 279) (1070 . 2))のようなペアーのリスト;
			/ lst_xdata_org lst_xdata_new )
    (setq lst_xdata_org (Jof_get_xdata ed app field))
    (setq lst_xdata_new (if field
			  (cons
			    (cons 1000 field)
			    (cons '(1002 . "{")
				  (reverse (cons '(1002 . "}")
						 (reverse lst_add)))))
			  lst_add))
    (if (not (tblsearch "APPID" app)) (regapp app))
    (cond
      ((not (assoc app (cdr (assoc -3 ed)))) nil)
      ((and field (not (member (cons 1000 field) lst_xdata_org)))
       (setq lst_xdata_new (append (reverse (cdr (reverse lst_xdata_org))) lst_add (list (last lst_xdata_org)))))
      ((not (member (car lst_add) lst_xdata_org))
       (setq lst_xdata_new (append (reverse (cdr (reverse lst_xdata_org))) lst_add (list (last lst_xdata_org)))))
      ((assoc (caar lst_add) lst_xdata_org)
       (setq n (1+ (- (length lst_xdata_org) (length (member (car lst_add) lst_xdata_org)))))
       (setq lst_div (Jof_lst_div lst_xdata_org n))
       (setq lst_xdata_new (append (car lst_div) (cdr lst_add) (cadr lst_div))))
      )
    (setq lst_xdata_new (cons -3 (list (cons app lst_xdata_new))))
    (setq ed (reverse (cons lst_xdata_new (reverse (Jof_lstdel_ed ed '(-3))))))
    )