====== BLOCKS 段与 ENTITIES 段 ======
本章介绍 DXF 文件中两个最重要的图形段:BLOCKS 段(块定义段)和 ENTITIES 段(图元段)。
===== BLOCKS 段 =====
BLOCKS 段存储图形中所有**块定义**(Block Definition)。每个块定义以 **BLOCK** 图元开始,以 **ENDBLK** 图元结束,中间包含构成该块的所有图元。
==== BLOCK 图元 ====
^ 组码 ^ 说明 ^
| 0 | BLOCK |
| 2 | 块名 |
| 3 | 块的描述 |
| 5 | 句柄 |
| 8 | 图层名 |
| 10,20,30 | 块的基点(世界坐标系) |
| 70 | 块类型标志位 |
| 100 | 子类标记 |
块类型标志位(组码 70):
* 0 = 标准块
* 1 = 由外部参照(Xref)定义
* 2 = 由外部参照依赖
* 4 = 已解析的外部参照
* 8 = 已加载的外部参照
* 16 = 匿名块(*U### 或 *D### 格式)
* 32 = 非恒定属性定义
* 64 = 块为 xref 覆盖
==== ENDBLK 图元 ====
^ 组码 ^ 说明 ^
| 0 | ENDBLK |
| 5 | 句柄 |
| 8 | 图层名 |
==== 特殊的预定义块 ====
* ***MODEL_SPACE**(模型空间)— 所有在模型空间中绘制的图元都存储在此块中
* ***PAPER_SPACE**(图纸空间)— 所有在图纸空间中绘制的图元都存储在此块中
* ***PAPER_SPACE0**、***PAPER_SPACE1** 等 — 其他图纸空间布局
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 的文字内容可以包含格式代码,例如:
* **\H2.5x** — 改变高度
* **\FSimSun|b0|i0** — 改变字体
* **\S 1/2;** — 生成分数
* **\P** — 换行
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 = 直线段
* 1 = 半圆
* 小于 1 的正值 = 圆弧朝向逆时针
* 负值 = 圆弧朝向顺时针
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):
* 0 = 旋转标注
* 1 = 对齐标注
* 2 = 角度标注
* 3 = 直径标注
* 4 = 半径标注
* 5 = 角度 3 点标注
* 6 = 坐标标注
* 64 = 块参照(组码 100=AcDbAlignedDimension 等)
==== 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 文件样例来验证解析逻辑。