目录
工业自动化领域通常需要导入CAD图形来加工,所以需要提取CAD文件的图行数据。本文介绍如何提取DXF文件中常用的图形的坐标数据,包括:POINT(点)、LINE(直线段)、ARC(圆弧)、CIRCLE(圆)、POLYLINE(多段线)、LWPOLYLINE(轻量多段线)、ELLIPSE(椭圆)
DXF文件组成
DXF文件整体由多个段(SECTION)组成,主要有:HEADER、CLASSES、TABLES、BLOCKS、ENTITIES、OBJECTS。每段的开始标识为:
0
SECTION
而结束标识为:
0
ENDSEC
一个DXF文件内有若干个组,每个组占两行,一行为组码(一组的类型或属性等的代码),组码的下一行为组值。
解析实体数据的思路
需要解析的实体类型:POINT(点)、LINE(直线段)、ARC(圆弧)、CIRCLE(圆)、POLYLINE(多段线)、LWPOLYLINE(轻量多段线)、ELLIPSE(椭圆)。
实体的记录数据都在实体段"ENTITIES",实体段开始的标志如下:
0
SECTION
2
ENTITIES
0
实体段的结束标志如下:
0
ENDSEC //每段的结束标志
0
SECTION
2
OBJECTS
- 逐行解析。
- 查找类型,将每一行的类型的字符串与目标类型比较。可以查找dxf文件的”ENTITIES”和“ENDSEC”作为实体段的开始和结束。在查找到”ENTITIES”后对各实体类型进行解析,直到遇到” ENDSEC”。
- 对各实体解析的开始和结束:以实体的类型字符串开始,到” 0”结束或提取最后一个组码的数据后结束,” 0”指示下一个记录的开始。例如对于POINT类型的解析,在查找到”POINT”后开始解析,在查找到字符串” 0”结束该点的解析。
- 读取数值,读组码下一行字符串并转化为数值。
各实体类型的具体解析要结合类型的组码所表示的内容。
POINT
POINT 组码 | |
点类型直接读取点的X、Y、Z坐标即可。
LINE
LINE 组码 | |
Line类型由起点和端点坐标构成,其格式如下:
LINE
10 (起点 X)
20 (起点 Y)
30 (起点 Z)
11 (终点 X)
21 (终点 Y)
31 (终点 Z)
ARC
ARC 组码 | |
使用到的组码:10、20、30、40、50、51、210、220、230。
- 圆弧的数据格式如下:
ARC
10 (圆心 X)
20 (圆心 Y)
30 (圆心 Z)
40 (半径)
50 (起始角度,度)
51 (终止角度,度)
210 (法向量 X) [可选]
220 (法向量 Y) [可选]
230 (法向量 Z) [可选]
- 圆弧由圆心(中心点)、半径、起点角度、终点角度确定。起点角度和终点角度单位是度(°),在XY平面内,起点到终点逆时针画圆弧,角度范围[0,360],沿X轴正方向表示0度。若 起点角度 大于终点角度 时,表示圆弧跨越 0°,此时的 角度差 = 终点角度 +360 - 起点角度。圆弧计算的详细代码请看:DXF文件的圆弧(ARC)计算:通过圆心、半径和两端点角度计算出三点坐标(C代码)-CSDN博客
- 记录的圆心坐标是在OCS坐标系中,若圆弧所在平面的OCS坐标系与WCS不重合,如XY圆弧被3D旋转后,则计算出XY圆弧坐标后需要由OCS坐标转换为WCS坐标。组码210、220、230为圆弧所在平面的法向量,该法向量为单位向量。若圆弧所在平面的坐标系与WCS重合,则记录的信息中没有组码210、220、230,此时默认的法向量为(0,0,1),。
- AUTOCAD画三维圆弧测试:先画XY平面圆弧,再输入命令”ROTATE3D”,然后指定旋转轴和输入旋转角度。
CIRCLE
CIRCLE 组码 | |
-
CIRCLE的数据格式如下:
CIRCLE
10 (圆心 X)
20 (圆心 Y)
30 (圆心 Z)
40 (半径)
210 (法向量 X) [可选]
220 (法向量 Y) [可选]
230 (法向量 Z) [可选] -
圆形由圆心和半径组成。与圆弧一样,若圆所在平面的OCS坐标系与WCS不重合,如XY圆被3D旋转后,则计算出XY圆坐标后需要由OCS坐标转换为WCS坐标,但非XY平面的圆形不容易表达,需将圆形转换为圆弧存储。
POLYLINE
POLYLINE 组码 | |
使用到的组码:10、20、30、70
- POLYLINE是多段线,支持三维。每一个顶点数据记录在每一个”VERTEX”下,格式如下:
POLYLINE
70 (polyline flags)
...其他POLYLINE属性...
VERTEX
...顶点1数据...
VERTEX
...顶点2数据...
SEQEND - POLYLINE的三维点坐标为WCS坐标,所以直接读取的坐标就是实际的坐标。
- 多段线标志(组码70):若组码70值为1(bit 0),表示该多段线是闭合的,即首尾相连(用AUTOCAD编辑好多段线最后一个顶点后,使用”close“命令使多段线闭合),该情况记录的信息中最后一个顶点与第一个顶点组成一段线
LWPOLYLINE
LWPOLYLINE 组码 | |
顶点标识符 | |
使用到的组码:10、20、42、70、90。
- LWPOLYLINE(轻量多段线)是二维多段线,没有Z坐标,其格式如下:
LWPOLYLINE
90 (vertex count)
70 (polyline flags)
10 (vertex 1 x)
20 (vertex 1 y)
42 (bulge 1) [可选]
10 (vertex 2 x)
20 (vertex 2 y)
42 (bulge 2) [可选]
...等等 - 且记录的顶点坐标是在OCS坐标系中,所以如果LWPOLYLINE经过三维旋转,则无法将OCS坐标转换为WCS坐标。所以需要画三维多段线时,请使用”3DPOLY”命令生成POLYLINE。
- 凸度(组码42):若顶点坐标后无凸度的记录信息,表示该点与上一点组成一段直线,若有凸度的记录信息,则表示该点与上一点组成一段圆弧。凸度圆弧的计算请看:通过圆弧凸度和两端点坐标计算出圆弧的中点坐标(C代码)-CSDN博客
- 多段线标志(组码70):若组码70值为1(bit 0),表示该多段线是闭合的,即首尾相连(用AUTOCAD编辑好多段线最后一个顶点后,使用”close“命令使多段线闭合),该情况记录的信息中最后一个顶点与第一个顶点组成一段线
ELLIPSE(椭圆)
1. 椭圆的数据格式如下:
ELLIPSE
10 (中心点 X)
20 (中心点 Y)
30 (中心点 Z)
11 (长轴端点 X 相对于中心点)
21 (长轴端点 Y 相对于中心点)
31 (长轴端点 Z 相对于中心点)
40 (短轴/长轴比率)
41 (起始参数,弧度) [可选,默认0]
42 (终止参数,弧度) [可选,默认2π]
210 (法向量 X) [可选]
220 (法向量 Y) [可选]
230 (法向量 Z) [可选]