目录

BLOCKS 段与 ENTITIES 段

本章介绍 DXF 文件中两个最重要的图形段:BLOCKS 段(块定义段)和 ENTITIES 段(图元段)。

BLOCKS 段

BLOCKS 段存储图形中所有块定义(Block Definition)。每个块定义以 BLOCK 图元开始,以 ENDBLK 图元结束,中间包含构成该块的所有图元。

BLOCK 图元

组码 说明
0 BLOCK
2 块名
3 块的描述
5 句柄
8 图层名
10,20,30 块的基点(世界坐标系)
70 块类型标志位
100 子类标记

块类型标志位(组码 70):

ENDBLK 图元

组码 说明
0 ENDBLK
5 句柄
8 图层名

特殊的预定义块

BLOCKS 段基本结构示例:

 0
 SECTION
 2
 BLOCKS

 0
 BLOCK
 2
 *MODEL_SPACE    ; 模型空间块
 70
 0
 10
 0.0
 20
 0.0
 30
 0.0
 0
 ENDBLK

 0
 BLOCK
 2
 MY_BLOCK        ; 用户定义的块
 70
 0
 10
 5.0
 20
 5.0
 30
 0.0
 ; 块内的图元定义
 0
 LINE
 10
 0.0
 20
 0.0
 11
 10.0
 21
 10.0
 0
 ENDBLK

 0
 ENDSEC

ENTITIES 段

ENTITIES 段包含图形中的所有图元(实体/图形对象)。这是 DXF 二次开发中最常处理的段落。每个图元以组码 0 后跟图元类型名开始。

通用图元组码

以下组码适用于所有图元类型:

组码 说明 是否必需
0 图元类型名
5 句柄
8 图层名
6 线型名
62 颜色号
48 线型比例
67 模型/图纸空间
100 子类标记
210 拉伸方向(默认为 (0,0,1))
330 所有者句柄
347 材质句柄
370 线宽
420 真彩色

常用图元类型详解

LINE(直线)

直线是 DXF 中最简单的图元:

组码 说明
100 AcDbLine
10,20,30 起点坐标
11,21,31 终点坐标
39 厚度(可选)
 0
 LINE
 5
 42
 8
 0
 100
 AcDbLine
 10
 0.0      ; 起点 X
 20
 0.0      ; 起点 Y
 30
 0.0      ; 起点 Z
 11
 100.0    ; 终点 X
 21
 100.0    ; 终点 Y
 31
 0.0      ; 终点 Z

CIRCLE(圆)

组码 说明
100 AcDbCircle
10,20,30 圆心坐标
40 圆半径
39 厚度(可选)
210 拉伸方向(可选)
 0
 CIRCLE
 5
 43
 8
 0
 100
 AcDbCircle
 10
 50.0     ; 圆心 X
 20
 50.0     ; 圆心 Y
 30
 0.0      ; 圆心 Z
 40
 25.0     ; 半径

ARC(圆弧)

组码 说明
100 AcDbArc
10,20,30 圆心坐标
40 半径
50 起始角度(度)
51 终止角度(度)
 0
 ARC
 5
 44
 8
 0
 100
 AcDbArc
 10
 50.0
 20
 50.0
 30
 0.0
 40
 30.0
 50
 0.0       ; 起始角度 0°
 51
 180.0     ; 终止角度 180°

TEXT(单行文字)

组码 说明
100 AcDbText
10,20,30 文字插入点
11,21,31 对齐点(可选)
1 文字内容
7 文字样式名
40 文字高度
41 宽度因子(默认 1.0)
50 旋转角度
51 倾斜角度
71 文字生成标志
72 水平对齐方式(0=左对齐,1=居中对齐,2=右对齐)
73 垂直对齐方式
 0
 TEXT
 5
 45
 8
 0
 100
 AcDbText
 10
 10.0
 20
 20.0
 30
 0.0
 1
 Hello DXF
 40
 5.0       ; 高度
 7
 STANDARD  ; 文字样式
 50
 0.0       ; 旋转角度

MTEXT(多行文字)

组码 说明
100 AcDbMText
10,20,30 插入点
1 文字内容(含格式代码)
7 文字样式名
40 文字高度
41 参考宽度
71 附着点(1=左上,2=中上,3=右上等)
72 绘制方向
44 行间距比例
73 行间距类型(1=至少,2=精确)

MTEXT 的文字内容可以包含格式代码,例如:

 0
 MTEXT
 5
 46
 8
 0
 100
 AcDbMText
 10
 50.0
 20
 50.0
 30
 0.0
 1
 {\FSimSun|c0;这是一段多行文字}\P第二行内容
 40
 5.0
 41
 100.0
 71
 1

INSERT(块参照)

INSERT 用于在图形中插入块的实例:

组码 说明
100 AcDbBlockReference
2 块名
10,20,30 插入点
41 X 缩放比例(默认 1.0)
42 Y 缩放比例(默认 1.0)
43 Z 缩放比例(默认 1.0)
50 旋转角度(默认 0)
70 列数(MINSERT 时使用)
71 行数
44 列间距
45 行间距
 0
 INSERT
 5
 47
 8
 0
 100
 AcDbBlockReference
 2
 MY_BLOCK      ; 引用的块名
 10
 100.0         ; 插入点 X
 20
 100.0         ; 插入点 Y
 30
 0.0
 41
 1.0           ; X 比例
 42
 1.0           ; Y 比例
 43
 1.0           ; Z 比例
 50
 45.0          ; 旋转 45°

LWPOLYLINE(轻量多段线)

LWPOLYLINE 是 AutoCAD R14 引入的优化多段线格式,比传统的 POLYLINE 更紧凑:

组码 说明
100 AcDbPolyline
90 顶点数量
70 多段线标志(1=闭合,128=样条化等)
43 恒定宽度(可选)
38 标高
39 厚度
10 顶点 X 坐标(可重复)
20 顶点 Y 坐标(可重复)
40 起点宽度(可重复,可选)
41 终点宽度(可重复,可选)
42 凸度(可重复)

凸度(组码 42)说明:

 0
 LWPOLYLINE
 5
 48
 8
 0
 100
 AcDbPolyline
 90
 4           ; 4 个顶点
 70
 1           ; 闭合多段线
 10
 0.0         ; 顶点 1 X
 20
 0.0         ; 顶点 1 Y
 10
 100.0       ; 顶点 2 X
 20
 0.0
 10
 100.0       ; 顶点 3 X
 20
 100.0
 10
 0.0         ; 顶点 4 X
 20
 100.0

POLYLINE(传统多段线)

传统的 POLYLINE 使用 VERTEX 图元定义顶点:

组码 说明
100 AcDb2dPolyline 或 AcDb3dPolyline
70 多段线标志(0=2D,8=3D等)
40 默认起点宽度
41 默认终点宽度
71 多边形网格 M 数量
72 多边形网格 N 数量

顶点使用 VERTEX 图元定义,以 SEQEND 结束。

ELLIPSE(椭圆)

组码 说明
100 AcDbEllipse
10,20,30 中心点
11,21,31 长轴端点相对中心点的矢量
40 短轴与长轴的比例(< 1)
41 起始参数(可选,默认 0)
42 终止参数(可选,默认 2π)
 0
 ELLIPSE
 5
 49
 8
 0
 100
 AcDbEllipse
 10
 50.0         ; 中心 X
 20
 50.0         ; 中心 Y
 30
 0.0
 11
 30.0         ; 长轴矢量 X
 21
 0.0          ; 长轴矢量 Y
 31
 0.0
 40
 0.5          ; 短轴/长轴比例

POINT(点)

组码 说明
100 AcDbPoint
10,20,30 点坐标
50 点显示角度(UCS 下的角度)

HATCH(填充)

HATCH 是较复杂的图元,包含边界路径和填充图案数据:

组码 说明
100 AcDbHatch
10 填充图案名称
30 填充类型(0=用户定义,1=预定义,2=自定义)
91 边界路径数量
92 边界路径类型(1=多段线,2=圆,4=图元等)
93 边界路径中的边数
72 边界边类型(1=直线,2=圆弧,3=椭圆弧)
10,20 顶点坐标(直线边)
11,21,31 中心点(圆弧边)
40 半径(圆弧边)
50,51 起始/终止角度(圆弧边)
94 图案线数量
76 图案线角度
52 图案线偏移(可选)

示例 - 矩形填充:

 0
 HATCH
 5
 50
 8
 0
 100
 AcDbHatch
 10
 ANSI31    ; 填充图案
 30
 1         ; 预定义图案
 91
 1         ; 1 个边界路径
 92
 1         ; 多段线路径
 93
 4         ; 4 条边
 72
 1         ; 直线边
 10
 0.0
 20
 0.0
 72
 1
 10
 100.0
 20
 0.0
 72
 1
 10
 100.0
 20
 100.0
 72
 1
 10
 0.0
 20
 100.0
 97
 0         ; 0 个填充图案线

SPLINE(样条曲线)

组码 说明
100 AcDbSpline
70 样条曲线标志
71 阶数(通常为 3)
72 节点数
73 控制点数
74 拟合点数(可选)
40 节点值(可重复)
10,20,30 控制点坐标(可重复)
11,21,31 拟合点坐标(可重复、可选)
12,22,32 起始切向(可选)
13,23,33 终止切向(可选)

DIMENSION(标注)

DIMENSION 是一个复合图元,包含多种标注子类型:

组码 说明
100 AcDbDimension
2 标注块名(包含标注图元的匿名块)
10,20,30 标注线定义点
11,21,31 文字中点
12,22,32 插入点(用于块参照类型)
70 标注类型(0=旋转、1=对齐等)
1 标注文字替代文字(可选)
53 旋转角度
54 水平/垂直方向角度

标注类型(组码 70):

3DFACE(三维面)

组码 说明
100 AcDbFace
10,20,30 第一角点
11,21,31 第二角点
12,22,32 第三角点
13,23,33 第四角点
70 不可见边标志(1=边1,2=边2,4=边3,8=边4)

VIEWPORT(视口)

组码 说明
100 AcDbViewport
10,20 视口中心
40 视口宽度
41 视口高度
68 视口状态
69 视口 ID

编程要点

1. **图元结束判断**:图元的结束由下一个组码 **0** 标识,这可能是新图元的开始或段结束标记。
2. **可见性控制**:组码 60 值为 1 表示图元不可见,0 或未赋值表示可见。
3. **颜色处理**:组码 62 值为 256 表示 BYLAYER,值为 0 表示 BYBLOCK。
4. **子类标记**:组码 100 的 **AcDb*** 字符串标识图元的具体类型,对正确解析至关重要。
5. **拉伸方向**:组码 210/220/230 默认值为 (0,0,1),即平行于世界坐标系 Z 轴。当图元在非水平平面时此值会变化。

本章小结

BLOCKS 段定义了图形的块资源,ENTITIES 段包含实际的图形对象。从二次开发角度看,ENTITIES 段的处理占据了大部分工作。掌握常用图元的组码结构是成功读写 DXF 文件的关键。建议在开发中大量参考具体的 DXF 文件样例来验证解析逻辑。