牢固 发表于 2013-9-24 12:17:09

【Gu_xl】动态浏览图形的扩展数据

本帖最后由 牢固 于 2013-9-24 20:37 编辑

加在程序后,输入命令:ViewXData,鼠标在含有扩展数据的对象上停留,会自动在屏幕上显示出该对象的扩展数据,鼠标移开则扩展数据显示自动消失!再次键入命令ViewXData,则自动关闭该功能!
程序加在前需加在XDRX_API!

;;动态查看扩展数据,BY Gu_xl
(defun c:ViewXData(/ ret)
(VL-ACAD-DEFUN 'Gxl-Dyn_View_XData)
(if *ViewXData*
(progn
   (xdrx_PointMonitor)
   (princ "\n扩展数据浏览关闭!")
   (setq *ViewXData* nil)
   )
(progn
   (xdrx_PointMonitor "Gxl-Dyn_View_XData")
   (princ "\n扩展数据浏览打开!")
   (setq *ViewXData* t)
   )
)
(princ)
)
(defun Gxl-Dyn_View_XData(PT / ENT ENL STR)
(setq ent (nentselp pt)
ent (if (and ent (= (type (last (last ent))) 'ename))
       (last (last ent))
       (car ent)
       )          ;if
)
(if ent
    (progn
      (setq enl (entget ent '("*")))
      (if (setq enl (assoc -3 enl))
(progn
   (foreach a(cdr enl)
   (if str
       (progn
(setq str (strcat str
      "\n\n"
      "应用名: \""
      (car a)
      "\""))
(foreach b(cdr a)
    (setq str (strcat str
      "\n   "
      (VL-PRIN1-TO-STRING b)))
    )
)
       (progn
(setq str (strcat "扩展数据:\n应用名: \""
      (car a)
      "\""))
(foreach b(cdr a)
    (setq str (strcat str
      "\n    "
      (VL-PRIN1-TO-STRING b)))
    )
)
       )
   )
   str
   )
)
      )
    )
)


newer 发表于 2013-9-24 12:31:50

棒,顶固版。

newer 发表于 2013-9-24 12:37:41

获取扩展实体数据,也可以用API函数, (xdrx_xdata_get ent "应用程序名) 获取看, 不给应用程序名参数,直接得到该实体上所有的扩展实体数据,表的格式。

牢固 发表于 2013-9-24 14:40:13

newer 发表于 2013-9-24 12:37
获取扩展实体数据,也可以用API函数, (xdrx_xdata_get ent "应用程序名) 获取看, 不给应用程序名参数,直 ...

这个函数有Bug,不带应用名,(xdrx_xdata_get (car(entsel))),返回值: '(("SOUTH")) . 只能返回扩展数据的应用名,并没有扩展数据!
给应用名称 (xdrx_xdata_get (car(entsel) "SOUTH") 或 (xdrx_xdata_get (car(entsel) '("SOUTH") ),都返回nil,
使用版本:2004

newer 发表于 2013-9-24 16:53:57

牢固 发表于 2013-9-24 14:40
这个函数有Bug,不带应用名,(xdrx_xdata_get (car(entsel))),返回值: '(("SOUTH")) . 只能返回扩展数 ...

你用API的 xdrx_xdata_set 函数,写下扩展数据呢,然后读读试试。

牢固 发表于 2013-9-24 19:20:12

newer 发表于 2013-9-24 16:53
你用API的 xdrx_xdata_set 函数,写下扩展数据呢,然后读读试试。

不行啊!
命令: ( xdrx_xdata_set (car(entsel)) "AAA" "CCC")
选择对象: T
命令: le
Select a Object :
((-1 . <图元名: -10ef88>) (0 . "TEXT") (330 . <图元名: -13c308>) (5 . "32F") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "ZDH") (6 . "Continuous") (100 .
"AcDbText") (10 200.25 -0.375 0.0) (40 . 1.0) (1 . "2") (50 . 0.0) (41 . 0.8)
(51 . 0.0) (7 . "HZ") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100
. "AcDbText") (73 . 0) (-3 ("AAA" (1070 . 20001) (1000 . "CCC"))))
命令:
命令: (xdrx_getxdata (car(entsel)))
选择对象:
ERROR: malfomed Xdata tag: 20001(("AAA"))


newer 发表于 2013-9-24 20:04:56

牢固 发表于 2013-9-24 19:20
不行啊!
命令: ( xdrx_xdata_set (car(entsel)) "AAA" "CCC")
选择对象: T


试试这个   (xdrx_xdata_get (car (entsel)) "aaa") 和   (xdrx_xdata_get (car (entsel)))

牢固 发表于 2013-9-24 20:22:21

newer 发表于 2013-9-24 20:04
试试这个   (xdrx_xdata_get (car (entsel)) "aaa") 和   (xdrx_xdata_get (car (entsel)))

用 ( xdrx_xdata_get (car(entsel)) "AAA" 222) 为什么扩展数据会多出 (1070 . 20001) ?添加扩展数据后组码结果:
命令: le
Select a Object :
((-1 . <图元名: -10eee8>) (0 . "LINE") (330 . <图元名: -13c308>) (5 . "343") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "ZDH") (100 . "AcDbLine") (10
198.741 0.323983 0.0) (11 199.04 0.097874 0.0) (210 0.0 0.0 1.0) (-3 ("AAA"
(1070 . 20001) (1070 . 222))))
红色部分是不应该有的啊!
测试结果:
命令: (xdrx_xdata_get (car (entsel)))
选择对象:
ERROR: malfomed Xdata tag: 20001(("AAA"))



命令: (xdrx_xdata_get (car (entsel)) "aaa")
选择对象: 222



其实 (xdrx_xdata_get (car (entsel)))函数应该返回如下的结果才有用:
' (("AAA" (1070 . 222)))

因为同一个应用名下会有各种数据:如实数、整数、字串等等!

eachy 发表于 2013-9-24 21:02:52

xdata实在不好用,早放弃了

牢固 发表于 2013-9-24 21:49:46

eachy 发表于 2013-9-24 21:02
xdata实在不好用,早放弃了

好用不好用,问题的关键在于程序数据结构的设计和实际使用的需求!扩展数据和图形词典之间的优缺点是相当分明,使用哪种数据结构,是编程人员根据自己程序结构设计的需求来定!无所谓谁优谁劣!

XDSoft 发表于 2013-9-25 00:08:24

牢固 发表于 2013-9-24 21:49
好用不好用,问题的关键在于程序数据结构的设计和实际使用的需求!扩展数据和图形词典之间的优缺点是相当 ...
请下载最新的0925 API

XDATA支持函数包括:


xdrx_object_removeXdata
xdrx_xdata_get
xdrx_xdata_set
xdrx_xdata_setbyproperty
xdrx_xdata_setDirection
xdrx_xdata_setDisplacement
xdrx_xdata_setHandle
xdrx_xdata_setLayer
xdrx_xdata_setPoint
xdrx_xdata_setString
xdrx_xdata_setLong
xdrx_xdata_setInteger
xdrx_xdata_setReal
xdrx_xdata_setPosition
xdrx_xdata_setScale


====================
xdrx_xdata_set 设置通用的点、实数、字符串,不能设置方向、位置、距离、比例、层名、句柄

xdrx_xdata_setByProperty 可以设置方向、位置、距离、比例、层名、句柄、普通点、实数、整数、长整数

用法:
(xdrx_xdata_setByProperty <实体> <应用程序名> < ["Integer" <整数>] ["Real" <实数>] ["Long" <长整数>] ["String" <字符串>] ["Layer" <字符串>]["Scale" <实数或整数>] ["Position" <3D点>] ["Displacement" <3D点>] ["Direction" <3D点向量>] ["Distance" <实数或整数>] ["Handle" <实体名>])

测试:

命令: (xdrx_xdata_set (entlast) "faf" 345 34.5)
T

命令: (entget (entlast) '("*"))
((-1 . <图元名: 7ef95400>) (0 . "LINE") (330 . <图元名: 7ef93cf8>) (5 . "1B8") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 1561.22
418.646 0.0) (11 1906.55 785.498 0.0) (210 0.0 0.0 1.0) (-3 ("faf" (1070 .
20001) (1002 . "{") (1070 . 345) (1040 . 34.5) (1002 . "}"))))

命令: (xdrx_xdata_set (entlast) "def" 456 "faf" (getpoint))
T

命令: (entget (entlast) '("*"))
((-1 . <图元名: 7ef95400>) (0 . "LINE") (330 . <图元名: 7ef93cf8>) (5 . "1B8") (100 .
"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbLine") (10 1561.22
418.646 0.0) (11 1906.55 785.498 0.0) (210 0.0 0.0 1.0) (-3 ("faf" (1070 .
20001) (1002 . "{") (1070 . 345) (1040 . 34.5) (1002 . "}")) ("def" (1070 .
20001) (1002 . "{") (1070 . 456) (1000 . "faf") (1010 1766.49 425.887 0.0)
(1002 . "}"))))

命令: (xdrx_xdata_get (entlast) "abc")
nil

命令: (xdrx_xdata_get (entlast) "faf")
(345 34.5)

命令: (xdrx_xdata_get (entlast) "def")
(456 "faf" (1766.49 425.887 0.0))

命令: (xdrx_xdata_get (entlast))   ;不给应用程序名,返回所有的
(("faf" 345 34.5) ("def" 456 "faf" (1766.49 425.887 0.0)))


牢固 发表于 2013-9-25 00:36:59

XDSoft 发表于 2013-9-25 00:08
请下载最新的0925 API

XDATA支持函数包括:


慢慢研习一下!

wxytiger 发表于 2013-10-7 00:06:36

Mark一个。

77777kcf 发表于 2015-1-9 14:39:31

完全看不懂:(

brainstorm 发表于 2017-7-17 12:18:47

在2010下可以显示数据,在2014下,有时候没有反应,需要鼠标滚轮放大缩小一下,是什么原因
页: [1] 2
查看完整版本: 【Gu_xl】动态浏览图形的扩展数据