AutoCAD DxfCode组码值说明

本文详细解析了AutoCAD DXF文件中的各种元素及其作用,包括图元类型、文字值、图元句柄、线型名、文字样式名、图层名、DXF特定组码等,旨在帮助用户理解如何读取和处理此类文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明
-5APP:永久反应器链
-4APP:条件运算符(仅与 ssget 一起使用)
-3APP:扩展数据 (XDATA) 标记(固定)
-2APP:图元名参照(固定)
-1APP:图元名。每次打开图形时,图元名都会发生变化,从不保存(固定)
0表示图元类型的字符串(固定)
1图元的主文字值
2名称(属性标记、块名等)
3-4其他文字或名称值
5图元句柄;最多 16 个十六进制数字的字符串(固定)
6线型名(固定)
7文字样式名(固定)
8图层名(固定)
9DXF:变量名称标识符(仅在 DXF 文件的 HEADER 段中使用)
10主要点;直线或文字图元的起点、圆的圆心,等等。DXF:主要点的 X 值(后跟 Y 和 Z 值代码 20 和 30)。APP:三维点(三个实数的列表)
11-18其他点。DXF:其他点的 X 值(后跟 Y 值代码 21-28 和 Z 值代码 31-38)。APP:三维点(三个实数的列表)
20, 30DXF:主要点的 Y 值和 Z 值
21-28,31-37DXF:其他点的 Y 值和 Z 值
38DXF:如果非零,则为图元的标高
39如果非零,则为图元的厚度(固定)
40-48双精度浮点值(文字高度、缩放比例等)
48线型比例;双精度浮点标量值;默认值适用于所有图元类型
49重复的双精度浮点值。一个图元的可变长度表(例如,LTYPE 表中的虚线长度)中可能会出现多个 49 组。7x 组始终出现在第一个 49 组之前,用以指定表的长度
50-58角度(在 DXF 文件中以度为单位,在 AutoLISP 和 ObjectARX 应用程序中以弧度为单位)
60图元可见性;整数值;未赋值或值为 0 时表示可见;值为 1 时表示不可见
62颜色号(固定)
66“图元跟随”标志(固定)
67空间 — 模型空间或图纸空间(固定)
68APP:指示视口是处于打开状态但在屏幕上完全不可见,还是未激活或处于关闭状态
69APP:视口标识号
70-78整数值,例如重复计数、标志位或模式
90-9932 位整数值
100子类数据标记(将派生类名作为字符串)从其他具体类派生的所有对象和图元类必须具有此标记。子类数据标记用于分离由同一对象的继承链中的不同类定义的数据。对于从 ObjectARX 派生的每个不同的具体类的 DXF 名称来说,这是必须满足的额外要求(参见子类标记)
102控制字符串,后跟“{<任意名称>”或“}”。与扩展数据 1002 组码类似,不同之处在于当字符串以“{”开始时,其后可跟任意字符串,字符串的解释取决于应用程序。唯一允许的另外一个控制字符串是作为组结束符的“}”。除了执行图形核查操作期间外,AutoCAD 不会解释这些字符串。它们供应用程序使用
105DIMVAR 符号表条目的对象句柄
110UCS 原点(仅当将代码 72 设置为 1 时才显示)DXF:X 值;APP:三维点
111UCS X 轴(仅当将代码 72 设置为 1 时才显示)DXF:X 值;APP:三维矢量
112UCS Y 轴(仅当将代码 72 设置为 1 时才显示)DXF:X 值;APP:三维矢量
120-122DXF:UCS 原点的 Y 值,UCS X 轴和 UCS Y 轴
130-132DXF:UCS 原点的 Z 值,UCS X 轴和 UCS Y 轴
140-149双精度浮点值(例如点、标高和 DIMSTYLE 设置)
170-17916 位整数值,例如表示 DIMSTYLE 设置的标志位
210拉伸方向(固定)DXF:拉伸方向的 X 值APP:三维拉伸方向矢量
220, 230DXF:拉伸方向的 Y 值和 Z 值
270-27916 位整数值
280-28916 位整数值
290-299布尔标志值
300-309任意字符串
310-319具有相同表示和 1004 组码限制的任意二进制块:用最大长度为 254 个字符的十六进制字符串表示最大长度为 127 个字节的数据块
320-329任意对象句柄;“按原样”获取的句柄值。它们在 INSERT 和 XREF 操作期间不进行转换
330-339软指针句柄;指向同一个 DXF 文件或图形中的其他对象的任意软指针。在 INSERT 和 XREF 操作期间进行转换
340-349硬指针句柄;指向同一个 DXF 文件或图形中的其他对象的任意硬指针。在 INSERT 和 XREF 操作期间进行转换
350-359软所有者句柄;指向同一个 DXF 文件或图形中的其他对象的任意软所有者指针。在 INSERT 和 XREF 操作期间进行转换
360-369硬所有者句柄;指向同一个 DXF 文件或图形中的其他对象的任意硬所有者指针。在 INSERT 和 XREF 操作期间进行转换
370-379线宽枚举值 (AcDb::LineWeight)。作为 16 位整数存储和移动。自定义非图元对象可以使用整个范围内的组码,但图元类只能在其表示中使用 371-379 DXF 组码,因为 AutoCAD 和 AutoLISP 都始终假定 370 组码是图元的线宽。这使 370 组码与其他“通用”图元字段具有相同的行为
380-389PlotStyleName 类型枚举 (AcDb::PlotStyleNameType)。作为 16 位整数存储和移动。自定义非图元对象可以使用整个范围内的组码,但图元类只能在其表示中使用 381-389 DXF 组码,原因与上述线宽范围相同表示 PlotStyleName 对象的句柄值的字符串,本质上是硬指针,但范围不同,更容易处理向后兼容。作为对象 ID(在 DXF 文件中为句柄)和 AutoLISP 中的特殊类型存储和移动。自定义非图元对象可以使用整个范围内的组码,但图元类只能在其表示中使用 391-399 DXF 组码,原因与上述线宽范围相同
400-40916 位整数
410-419字符串
420-42732 位整数值。与真彩色一同使用时,表示 24 位颜色值的 32 位整数。高阶字节(8 位)为 0;低阶字节为包含“蓝色”值 (0-255)、然后是“绿色”值的无符号字符;次高阶字节是“红色”值。将此整数值转换为十六进制值将得到以下位掩码:0x00RRGGBB。例如,红色==200、绿色==100 和蓝色==50 的真彩色为 0x00C86432,而在 DXF 中以十进制表示则为 13132850
430-437字符串;用于真彩色时,则为表示颜色名称的字符串
440-44732 位整数值。用于真彩色时,表示透明度值
450-459长整数
460-469双精度浮点值
470-479字符串
999DXF:999 组码指示后面的行是注释字符串。SAVEAS 不会在 DXF 输出文件中包含这样的组,但 OPEN 则包括这些组并忽略注释。可以使用 999 组在您编辑的 DXF 文件中包含注释
1000扩展数据中的 ASCII 字符串(最多可以包含 255 个字节)
1001扩展数据的注册应用程序名(最多可以包含 31 个字节的 ASCII 字符串)
1002扩展数据控制字符串(“{”或“}”)
1003扩展数据图层名
1004扩展数据中的字节数据块(最多可以包含 127 个字节)
1005扩展数据中的图元句柄;最多可以包含 16 个十六进制数字的字符串
1010扩展数据中的点 DXF:X 值(后跟 1020 和 1030 组)APP:三维点
1020,1030DXF:点的 Y 值和 Z 值
1011扩展数据中的三维世界空间位置 DXF:X 值(后跟 1021 和 1031 组)APP:三维点
1021,1031DXF:世界空间位置的 Y 值和 Z 值
1012扩展数据中的三维世界空间位移DXF:X 值(后跟 1022 和 1032 组)APP:三维矢量
1022,1032DXF:世界空间位移的 Y 值和 Z 值
1013扩展数据中的三维空间方向DXF:X 值(后跟 1022 和 1032 组)APP:三维矢量
1023,1033DXF:世界空间方向的 Y 和 Z 值
1040扩展数据双精度浮点值
1041扩展数据距离值
1042扩展数据缩放比例
1070扩展数据 16 位有符号整数
1071扩展数据 32 位有符号长整数

转载于:https://www.cnblogs.com/bomb12138/p/3783902.html

<think>我们正在回答用户的问题:如何在AutoCAD或DXF文件中获取对象的信息? 根据之前的引用,我们知道DXF是描述图形对象属性的代。获取这些主要有两种场景: 1. 在AutoCAD软件内部通过API获取(如ActiveX、.NET API等) 2. 在外部通过解析DXF文件获取 下面我们将分别介绍这两种方法。 ### 方法1:在AutoCAD中使用API获取对象(以VBA和.NET为例) #### 1.1 VBA (ActiveX) 方法 在AutoCAD VBA中,可以通过访问对象的`GetXData`方法或直接属性获取。但更直接的方式是使用`entget`函数(类似AutoLISP)在VBA中并不直接存在,因此我们通常通过对象的属性来获取。 然而,有一个通用的方法:使用`ThisDrawing.SendCommand`发送AutoLISP表达式到命令行,然后获取结果。但这不是最佳实践。 推荐方法:通过对象模型获取属性。例如,获取一个直线的起点(10): ```vba Sub GetLineStartPoint() Dim ent As AcadEntity ThisDrawing.Utility.GetEntity ent, pickPoint, "选择直线" If TypeOf ent Is AcadLine Then Dim line As AcadLine Set line = ent Dim startPoint As Variant startPoint = line.StartPoint &#39; startPoint(0), startPoint(1), startPoint(2) 对应X,Y,Z End If End Sub ``` 但是,这种方法只能获取部分属性(对应)。要获取更多(如图层、线型等),可以通过对象的相应属性(如`Layer`属性对应8)。 如果需要获取扩展数据(>=1000),则可以使用`GetXData`方法。 #### 1.2 .NET API (C#) 方法 在.NET API中,我们可以通过访问实体的`DXFCode`属性来获取。但是,请注意,.NET API并没有直接提供一个方法返回所有的字典。通常,我们通过遍历实体的`XRecord`或使用`ResultBuffer`来获取。 示例(获取实体的所有扩展数据): ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.EditorInput; public void GetEntityDXFCodes() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptEntityResult per = ed.GetEntity("请选择一个实体"); if (per.Status != PromptStatus.OK) return; using (Transaction tr = db.TransactionManager.StartTransaction()) { Entity ent = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Entity; if (ent != null) { // 获取实体的扩展数据(应用注册名称为空字符串,表示获取所有) ResultBuffer rb = ent.XData; if (rb != null) { TypedValue[] values = rb.AsArray(); foreach (TypedValue tv in values) { // tv.TypeCode 就是,tv.Value 是 ed.WriteMessage("\n: {0}, : {1}", tv.TypeCode, tv.Value); } rb.Dispose(); } // 获取实体的常规属性(如图层、线型等)可以通过实体的属性 ed.WriteMessage("\n图层: {0}", ent.Layer); // 对应8 // 其他属性... } tr.Commit(); } } ``` 注意:上述代中,`XData`获取的是扩展数据(>=1000)。常规属性(如起点、终点等)需要通过实体对应的属性获取。 对于常规属性,我们可以通过实体的类型来获取。例如,直线有`StartPoint`和`EndPoint`,圆有`Center`和`Radius`等。 ### 方法2:通过解析DXF文件获取 DXF文件是文本文件(也可以是二进制,但文本更常见),我们可以逐行读取并解析。 DXF文件结构: - 文件由多个段(SECTION)成,每个段包含多个条目。 - 每个对象由成。占一行,在下一行。 例如,一个直线的表示可能如下: ``` 0 LINE 5 100 8 0 10 0.0 20 0.0 30 0.0 11 10.0 21 0.0 31 0.0 ``` 其中: - 0表示实体类型(这里是LINE) - 5是句柄(唯一标识) - 100是子类标记 - 8是图层名(这里是0图层) - 10,20,30是起点坐标(X,Y,Z) - 11,21,31是终点坐标(X,Y,Z) 解析步骤: 1. 打开DXF文件(文本模式) 2. 逐行读取,当读取到0且为SECTION时,进入段处理。 3. 在ENTITIES段中,0后面跟着的字符串就是实体类型(如LINE, CIRCLE等),然后后续的对就是该实体的属性。 4. 对于每个实体,我们可以将其存储在一个字典或列表中。 由于DXF文件可能很大,我们通常只关注ENTITIES段和OBJECTS段(对于非图形对象)。 在Python中,我们可以使用现有的库来解析DXF文件,例如`dxfgrabber`(仅支持到DXF2000)或`ezdxf`(功能更强大)。 使用`ezdxf`获取的示例: ```python import ezdxf doc = ezdxf.readfile("yourfile.dxf") msp = doc.modelspace() for entity in msp: # 每个entity是一个DXFEntity,我们可以获取它的所有标签 print(f"实体类型: {entity.dxftype()}") # 遍历实体的所有标签 for tag in entity.tags: print(f": {tag.code}, : {tag.value}") ``` 注意:`ezdxf`库内部已经解析了DXF文件,我们可以直接通过实体对象的属性获取大部分信息,但使用`tags`属性可以获取原始。 对于扩展数据,可以使用`entity.xdata`获取。 ### 总结 | 方法 | 适用场景 | 工具/库 | |--------------|--------------------------|----------------------| | AutoCAD API | 在AutoCAD内部获取对象数据 | VBA, .NET API | | 解析DXF文件 | 外部程序处理DXF文件 | ezdxf (Python), 自定义解析 | ### 注意事项 1. **顺序**:不要依赖出现的顺序,因为顺序可能会变化[^1]。 2. **版本兼容性**:不同AutoCAD版本支持的可能不同,解析时需注意[^2]。 3. **图元类型**:非图元对象(如字典、布局等)使用不同的范围,注意370-379用于图元线宽[^2]。 4. **模型空间与图纸空间**:注意图块定义中的特殊块(*Model_Space, *Paper_Space)[^3]。 建议在开发时参考官方DXF文档:https://help.autodesk.com/view/OARX/ §§相关问题§§ 1. 如何使用AutoLISP获取AutoCAD对象的DXF? 2. 在Python中解析DXF文件时如何处理复杂实体(如样条曲线、椭圆)? 3. DXF文件中100(子类标记)的作用是什么? 4. 如何通过DXF创建新的AutoCAD实体?</think>### 如何在 AutoCAD 或 DXF 文件中获取对象的信息 获取对象的 DXF 主要有两种方式:**在 AutoCAD 内部获取**和**通过 DXF 文件解析获取**。以下是详细方法: --- ### 一、在 AutoCAD 内部获取 #### 方法 1:使用 LIST 命令(交互式) 1. 在 AutoCAD 命令行输入 `LIST` ↵ 2. 选择需要查询的对象 ↵ 3. 文本窗口将显示对象的所有 DXF 信息 *示例输出:* ``` LINE 图层: "0" 空间: 模型空间 句柄 = 4A3 自点,X=10.0 Y=20.0 Z=0.0 // 10 到点,X=50.0 Y=30.0 Z=0.0 // 11 ``` #### 方法 2:使用 AutoLISP(编程式) ```lisp (defun c:GetDXF ( / ent obj) (setq ent (car (entsel "选择对象: "))) ; 选择对象 (setq obj (entget ent)) ; 获取列表 (princ "\n列表: ") (princ obj) ; 打印 (princ) ) ``` *执行步骤:* 1. 将代保存到 `.lsp` 文件 2. 在 AutoCAD 输入 `APPLOAD` 加载脚本 3. 执行命令 `GETDXF` 并选择对象 4. 命令行输出示例: `((-1 . <图元名>) (0 . "LINE") (330 . <图元名>) (5 . "4A3") (100 . "AcDbEntity") (67 . 0) (8 . "0") ...)` #### 方法 3:通过 .NET API(C#) ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; public void GetDXFCodes(ObjectId id) { using (Transaction tr = doc.TransactionManager.StartTransaction()) { Entity ent = tr.GetObject(id, OpenMode.ForRead) as Entity; ResultBuffer rb = ent.GetXDataForApplication(""); // 获取所有 if (rb != null) { TypedValue[] values = rb.AsArray(); foreach (TypedValue tv in values) { Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage( $"\n: {tv.TypeCode}, : {tv.Value}"); } } tr.Commit(); } } ``` --- ### 二、通过 DXF 文件解析获取 #### 步骤 1:生成 DXF 文件 1. 在 AutoCAD 输入 `DXFOUT` 命令 2. 选择 ASCII 格式(便于查看) 3. 保存为 `.dxf` 文件 #### 步骤 2:解析 DXF 文件结构 DXF 文件是分段的文本文件,关键段: ```text ENTITIES // 图形对象段 0 LINE // 0标识实体类型 5 4A3 // 5=句柄ID 8 0 // 8=图层 10 10.0 // 10=起点X 20 20.0 // 20=起点Y 11 50.0 // 11=终点X 21 30.0 // 21=终点Y ``` #### 步骤 3:使用解析库(Python + ezdxf) ```python import ezdxf doc = ezdxf.readfile("demo.dxf") msp = doc.modelspace() for entity in msp: print(f"\n实体类型: {entity.dxftype()}") if entity.dxftype() == "LINE": print(f"起点: {entity.dxf.start}") # 10,20,30 print(f"终点: {entity.dxf.end}") # 11,21,31 print(f"图层: {entity.dxf.layer}") # 8 print(f"颜色: {entity.dxf.color}") # 62 ``` --- ### 三、关键参考表 | | 对象属性 | 示例 | |------|------------------|---------------------| | 0 | 实体类型 | "LINE", "CIRCLE" | | 5 | 句柄(唯一ID) | "4A3" | | 8 | 图层名 | "WALL_LAYER" | | 10 | 主要X坐标 | 15.0 (直线起点X) | | 20 | 主要Y坐标 | 25.0 (直线起点Y) | | 40 | 数属性 | 10.0 (圆半径) | | 62 | 颜色索引 | 1(红), 2(黄) | | 370 | 线宽 | 25 (0.25mm) | | 100 | 子类标记 | "AcDbCircle" | > **重要提示**:出现顺序不可依赖,编程时应使用键查询而非顺序解析[^1]。线宽等特殊属性需使用指定范围(370-379)[^2]。 --- ### 四、特殊对象处理 1. **图块属性**(引用[3]): - 模型空间:`*Model_Space` - 图纸空间:`*Paper_Space`, `*Paper_Space0` ```text 0 INSERT 5 1F2 2 DOOR_BLOCK // 块名 10 0.0 // 插入点X 20 0.0 // 插入点Y ``` 2. **自定义对象**: - 使用 ≥ 1000 的扩展数据区域 - 需注册应用程序名避免冲突 --- ### 推荐工具 1. [DXF Viewer](https://www.autodesk.com/viewers) - Autodesk 官方查看器 2. [ezdxf 库](https://pypi.org/project/ezdxf/) - Python 解析库 3. [DXF 参考文档](https://help.autodesk.com/view/OARX/) - 官方手册 > 通过合使用 AutoCAD 内部命令和外部解析工具,可高效获取和处理 DXF 数据。对于开发场景,建议优先使用 ezdxf 等库避免直接操作原始文件[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值