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 文件样例来验证解析逻辑。