为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

CAD CASS下实体的扩展属性XDATA

2017-09-20 6页 doc 30KB 62阅读

用户头像

is_266065

暂无简介

举报
CAD CASS下实体的扩展属性XDATACAD CASS下实体的扩展属性XDATA( 2011-09-23 13:15 一:摘自网络 正确叫法为 扩展数据 -- xdata 系统提供了几个用于处理扩展数据的 AutoLISP 函数,它们是由用 ObjectARX 或 AutoLISP 编写的应用程序创建的。如果一个图元包含扩展数据,则该数据会紧跟在图元的正常定义数据之后。 通过调用 entget 可以获取一个图元的扩展数据。entget 函数获取图元的正常定义数据和应用程序(在 entget 调用中指定)的扩展数据。 当用 entget 获取扩展数据时,扩展数据的...
CAD CASS下实体的扩展属性XDATA
CAD CASS下实体的扩展属性XDATA( 2011-09-23 13:15 一:摘自网络 正确叫法为 扩展数据 -- xdata 系统提供了几个用于处理扩展数据的 AutoLISP 函数,它们是由用 ObjectARX 或 AutoLISP 编写的应用程序创建的。如果一个图元包含扩展数据,则该数据会紧跟在图元的正常定义数据之后。 通过调用 entget 可以获取一个图元的扩展数据。entget 函数获取图元的正常定义数据和应用程序(在 entget 调用中指定)的扩展数据。 当用 entget 获取扩展数据时,扩展数据的起始部分由 -3 组码指示。-3 组码位于一个中,该表以第一个 1001 组码开始。如下表所示,该 1001 组码包含所获取的第一个注册的应用名称,详细信息请参见后面章节。 正常和扩展数据的组码 组码 字段 数据类型 (?, ? (0?39 ) 图元名称) 正常定义数据字段) . . . 常规图元定义数据 (? (1001 (1000, 1002?071 (1001 (1000, 1002?071 (1001  扩展数据标记 注册的应用名称 1) XDATA 字段) . . .册的应用程序名称 2) XDATA 字段) . . . 注册的应用名称 3) . . 扩展数据 本节内容包括:    组织扩展数据    注册应用    获取扩展数据    在图元上附着扩展数据    管理扩展数据使用的内存    扩展数据中的句柄 扩展数据由一个或多个 1001 组码组成,其中每个组码都以唯一的应用名称开始。由 entget 返回的扩展数据组码跟随在定义数据之后,按照保存宝数据库中的次序排列。 在每个应用的组码中,扩展数据的内容、含义及其数据的组织都是由应用自身定义的。AutoCAD 维护这些信息,但不使用它们。表中还显示 1000 到 1071 之间扩展数据的组码。如下所示,这些组码的数据类型许多都是熟悉的: 字符串  1000。扩展数据中的字符串可长达 255 字节(第 256 字节是为空字符保留的)。 应用名称 1001(也是字符串)。应用名称可长达 31 字节(第 32 字节是为空字符保留的),而且必须符合符号表的名称规则(如图层名称)。应用名称可包含字母、数字、专用字符 $(美元符号)、-(连字符)以及 _(下划线),但不能包含空格。 图层名称 1003。与扩展数据相关联的图层名称。 数据库句柄 1005。图形数据库中的图元句柄。 三维点 1010。包含在一个点中的三个实数值。 实数 1040。一个实数值。 整数 1070。一个 16 位整数(带符号或不带符号)。 长整数 1071。一个 32 位带符号的(长)整数。如果 1071 组码中出现短整数或实数值,则被转换为一个长整数;如果组码值非法(例如一个字符串),则将被转换为长整数形式的零 (0L)。 注意 AutoLISP 把 1071 组码作为实数值管理。如果用 entget 获取包含 1071 组码的图元定义表,则返回的值是实数。如下例所示: (1071 . 12.0) 如果需要用 entmake 或 entmod 在图元中创建一个 1071 组码,则既可使用实数值,也可使用整数值。如下例所示: (entmake \'((..... (1071 . 12) .... ))) (entmake \'((..... (1071 . 12.0) .... ))) (entmake \'((..... (1071 . 65537.0) .... ))) (entmake \'((..... (1071 . 65537) .... ))) 但 AutoLISP 返回的组码值仍是实数: (entmake \'((..... (1071 . 65537) .... ))) 上述语句的返回值如下所示: (1071 . 65537.0) ObjectARX 总是把 1071 组码作为长整数来管理。 其他几个的扩展数据组码在其上下文中具有特殊含义(如果应用程序选择使用它们): 控制字符串 1002。扩展数据的控制字符串可以是“{”或“}”。这些大括号使应用可以通过将扩展数据细分为表来组织它们。左括号开始一个表,右括号结束最新的表。表是可以嵌套的。 注意 如果一个 1001 组码出现在该表中,则仅把它当作一个字符串,而不是一个新的应用组码的开始。 二进制数据 1004。二进制数据被组织为可变长度的数据块,它可在有 ads_binary 结构的 ObjectARX 中处理。数据块的最大长度为 127 字节。 注意 AutoLISP 不能直接处理二进制数据块,所以适用于长整数 (1071) 组码的预防也同样适用于二进制组码。 世界空间位置 1011。与简单的三维点不同,其 WCS 坐标随扩展数据所属的父图元移动、比例缩放、旋转和镜像。当对父图元使用 STRETCH 命令并且此点位于选择窗口中时,该 WCS 的位置也会被拉伸。 世界空间位移 1012。一个随着父图元比例缩放、旋转或镜像的三维点,但不可拉伸或移动。 世界空间方向 1013。一个随着父图元旋转或镜像的三维点,但不可比例缩放、拉伸或移动。其 WCS 方向是一个单位长度的规格化向量。 距离 1041。一个随着父图元比例缩放的实数值。 比例因子 1042。也是一个随着父图元比例缩放的实数值。 关于扩展数据的 DXF 组码,也请参见 DXF Reference。 为便于 AutoCAD 识别,必须注册应用名称。应用名称与使用该应用的每个图元的扩展数据一起存储,也在 APPID 表中。注册由 regapp 函数来完成,它指定一个字符串作为应用名称。如果 regapp 函数成功地将名称增加到 APPID 表中,则返回应用名称,否则返回 nil。返回 nil 则表示此名称已出现在该符号表中,但这不是一个真正的错误,而是一个正常的返回值,因为应用在每次绘图中只需注册一次。 为了进行注册,应用首先检查它的名称是否已出现在 APPID 表中。如果表中没有该名称,则必须注册它。如果有,则可以如本节的后面部分所述,程序只需继续运行,并使用扩展数据。 下列代码段中有 regapp 的典型用法(关于 tblsearch 函数的详细信息,请参见访问符号表和词典)。 (setq appname "MYAPP_2356")   ; 唯一的应用名称 (if  (tblsearch "appid" appname)   ; 检查是否已经注册   (princ (strcat     "\\n" appname " already registered. "))   (if (=  (regapp appname) nil)   ; 一些其他问题     (princ (strcat       "\\nCan\'t register XDATA for " appname ". "))   ) ) regapp 函数提供了一定的安全度,但它不能保证两个单独的应用不会选择相同的名称。确保不重名的一个办法是,采用一个统一的规则,即使用公司或产品的名称,以及唯一的编号(例如电话号码或当前的日期和时间)。    获取扩展数据 应用程序可以调用 entget 来获得已经注册的扩展数据。entget 函数既能返回定义数据,也能返回应用程序所需的扩展数据。这需要一个额外的参数 application,它用于指定应用名称。传给 entget 的名称必须与上一次调用 regapp 注册的应用一致,它们也可以包含通配符。 在缺省情况下,关联填充图案也包含扩展数据。下列代码显示了该扩展数据的关联表。 命令:  (entget (car (entsel)) \'("ACAD"))  选择对象:  选择关联图案填充 在命令行中输入上述代码,会返回如下所示的一个表: ((-1 . <图元名:600000c0>) (0 . "INSERT") (8 . "0") (2 . "*X0") (10 0.0 0.0 0.0) (41 . 1.0) (42 . 1.0) (50 . 0.0) (43 . 1.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0) (-3 ("ACAD" (1000 . "HATCH") (1002 . "{") (1070 . 16) (1000 . "LINE") (1040 . 1.0) (1040 . 0.0) (1002 . "}")))) 这段代码段演示了为两个指定的应用获取扩展数据的典型序列。请注意,参数 application 以表的格式来传入应用名称: (setq working_elist   (entget ent_name     \'("MY_APP_1" "SOME_OTHER")  ; 仅当扩展数据来自“MY_APP_1”和   )        ;“SOME_OTHER”时,才被获取 ) (if working_elist   (progn     ...      ; 更新工作图元组     (entmod working_elist)   ; 只有仍在表 working_elist 中的注册   )        ; 应用程序的扩展数据才被修改 ) 如样例代码所示,与用 entmod 修改正常定义数据一样,可以通过调用 entmod 的子序列修改用 entget 获取的扩展数据,也可以在传递给 entmake 的图元表中定义扩展数据来创建它。 只返回应用明确要求的扩展数据,可以防止一个应用误用另一个应用的数据。它也控制了应用程序需要使用的内存数量,并简化了应用程序需进行的扩展数据处理。 注意 由于 application 传入的字符串可以包含通配符,因此应用名为“*”将导致 entget 返回附着在图元上的所有扩展数据。 在图元上附着扩展数据 使用扩展数据可以存储任意类型的信息。例如,绘制一个图元(例如直线或圆),然后输入下列代码将扩展数据附着到图元上: (setq lastent (entget (entlast)))   ; 获得最新图元定义数据的关联表 (regapp "NEWDATA")     ; 注册应用名称 (setq exdata      ; 设置 exdata 变量等于  \'((-3 ("NEWDATA"     ; 新的扩展数据   (1000 . "This is a new thing!")   ; 本例中是一个文本字符串   ))) ) (setq newent    (append lastent exdata))    ; 向图元表中增加新的数据表 (entmod newent)                   ; 用新的定义数据修改图元 为了验证扩展数据已被附着到图元上,输入下列代码,并选择该对象: (entget (car (entsel)) \'("NEWDATA")) 本样例显示了在图元上附着扩展数据的基本方法。   二、来自帮助 Signature object.GetXData AppName, XDataType, XDataValue Object , , , , , , , , , , , , , ; The object or objects this method applies to. AppName String; input-only A NULL string will return all the data attached to the object, regardless of the application that created it. Supplying an application name will return only the data that was created by the specified application. XDataType Variant (array of shorts); output-only XDataValue Variant (array of variants); output-only Remarks Extended data is an example of instance-specific data created by applications written with ObjectARX or AutoLISP. This data can be added to any object. This data follows the object's definition data, and is maintained in the order that it was saved into the document. (AutoCAD maintains this information, but doesn't use it.)   三、例子 Sub Example_GetXData() ' This example creates a line and attaches extended data to that line. ' Create the line Dim lineObj As AcadLine Dim startPt(0 To 2) As Double, endPt(0 To 2) As Double startPt(0) = 1#: startPt(1) = 1#: startPt(2) = 0# endPt(0) = 5#: endPt(1) = 5#: endPt(2) = 0# Set lineObj = ThisDrawing.ModelSpace.AddLine(startPt, endPt) ZoomAll ' Initialize all the xdata values. Note that first data in the list should be ' application name and first datatype code should be 1001 Dim DataType(0 To 9) As Integer Dim Data(0 To 9) As Variant Dim reals3(0 To 2) As Double Dim worldPos(0 To 2) As Double '注意以下的1001 1000 1003 1040 1041 1070 1071...这些数字,参照我上面发的内容(来自网络部分) DataType(0) = 1001: Data(0) = "Test_Application" DataType(1) = 1000: Data(1) = "This is a test for xdata" DataType(2) = 1003: Data(2) = "0" ' layer DataType(3) = 1040: Data(3) = 1.23479137438413E+40 ' real DataType(4) = 1041: Data(4) = 1237324938 ' distance DataType(5) = 1070: Data(5) = 32767 ' 16 bit Integer DataType(6) = 1071: Data(6) = 32767 ' 32 bit Integer DataType(7) = 1042: Data(7) = 10 ' scaleFactor reals3(0) = -2.95: reals3(1) = 100: reals3(2) = -20 DataType(8) = 1010: Data(8) = reals3 ' real worldPos(0) = 4: worldPos(1) = 400.99999999: worldPos(2) = 2.798989 DataType(9) = 1011: Data(9) = worldPos ' world space position ' Attach the xdata to the line lineObj.SetXData DataType, Data ' Return the xdata for the line Dim xdataOut As Variant Dim xtypeOut As Variant lineObj.GetXData "", xtypeOut, xdataOut End Sub
/
本文档为【CAD CASS下实体的扩展属性XDATA】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索