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