・ 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)))))) )