DXF文件解析:详细的提取图形坐标数据说明

       

目录

DXF文件组成

解析实体数据的思路

POINT

LINE

ARC

CIRCLE

POLYLINE

LWPOLYLINE

ELLIPSE(椭圆)


        工业自动化领域通常需要导入CAD图形来加工,所以需要提取CAD文件的图行数据。本文介绍如何提取DXF文件中常用的图形的坐标数据,包括:POINT(点)、LINE(直线段)、ARC(圆弧)、CIRCLE(圆)、POLYLINE(多段线)、LWPOLYLINE(轻量多段线)、ELLIPSE(椭圆)

DXF文件组成

DXF文件整体由多个段(SECTION)组成,主要有:HEADER、CLASSES、TABLES、BLOCKS、ENTITIESOBJECTS。每段的开始标识为:

0

SECTION

而结束标识为:

 0

ENDSEC

一个DXF文件内有若干个组,每个组占两行,一行为组码(一组的类型或属性等的代码),组码的下一行为组值。

解析实体数据的思路

需要解析的实体类型:POINT(点)、LINE(直线段)、ARC(圆弧)、CIRCLE(圆)、POLYLINE(多段线)、LWPOLYLINE(轻量多段线)、ELLIPSE(椭圆)。

实体的记录数据都在实体段"ENTITIES",实体段开始的标志如下:

  0

SECTION

  2

ENTITIES

  0

实体段的结束标志如下:

  0

ENDSEC         //每段的结束标志

  0

SECTION

  2

OBJECTS 

  1. 逐行解析。
  2. 查找类型,将每一行的类型的字符串与目标类型比较。可以查找dxf文件的”ENTITIES”和“ENDSEC”作为实体段的开始和结束。在查找到”ENTITIES”后对各实体类型进行解析,直到遇到” ENDSEC”。
  3. 对各实体解析的开始和结束:以实体的类型字符串开始,到”  0”结束或提取最后一个组码的数据后结束,”  0”指示下一个记录的开始。例如对于POINT类型的解析,在查找到”POINT”后开始解析,在查找到字符串”  0”结束该点的解析。
  4. 读取数值,读组码下一行字符串并转化为数值。

各实体类型的具体解析要结合类型的组码所表示的内容。

POINT

POINT 组码

组码

说明

100

子类标记 (AcDbPoint)

10

点位置(在 WCS 中)

DXF:X 值;APP:三维点

20, 30

DXF:点位置的 Y 值和 Z 值(在 WCS 中)

39

厚度(可选;默认值 = 0)

210

拉伸方向(可选;默认值 = 0, 0, 1)

DXF:X 值;APP:三维矢量

220, 230

DXF:拉伸方向的 Y 值和 Z 值(可选)

50

绘制点时所使用的 UCS 的 X 轴的角度(可选;默认值 = 0);当 PDMODE 非零时使用

点类型直接读取点的X、Y、Z坐标即可。

LINE

LINE 组码

组码

说明

100

子类标记 (AcDbLine)

39

厚度(可选;默认值 = 0)

10

起点(在 WCS 中)

DXF:X 值;APP:三维点

20, 30

DXF:起点的 Y 值和 Z 值(在 WCS 中)

11

端点(在 WCS 中)

DXF:X 值;APP:三维点

21, 31

DXF:端点的 Y 值和 Z 值(在 WCS 中)

210

拉伸方向(可选;默认值 = 0, 0, 1)

DXF:X 值;APP:三维矢量

220, 230

DXF:拉伸方向的 Y 值和 Z 值(可选)

Line类型由起点和端点坐标构成,其格式如下:

        LINE
         10    (起点 X)
         20    (起点 Y)
         30    (起点 Z)
         11    (终点 X)
         21    (终点 Y)
         31    (终点 Z)

ARC

ARC 组码

组码

说明

100

子类标记 (AcDbCircle)

39

厚度(可选;默认值 = 0)

10

中心点(在 OCS 中)

DXF:X 值;APP:三维点

20, 30

DXF:中心点的 Y 值和 Z 值(在 OCS 中)

40

半径

100

子类标记 (AcDbArc)

50

起点角度

51

端点角度

210

拉伸方向(可选;默认值 = 0, 0, 1)

DXF:X 值;APP:三维矢量

220, 230

DXF:拉伸方向的 Y 值和 Z 值(可选)

        使用到的组码:10、20、30、40、50、51、210、220、230。

  1. 圆弧的数据格式如下:

                ARC
                 10    (圆心 X)
                 20    (圆心 Y)
                 30    (圆心 Z)
                 40    (半径)
                 50    (起始角度,度)
                 51    (终止角度,度)
                210    (法向量 X) [可选]
                220    (法向量 Y) [可选]
                230    (法向量 Z) [可选]

  1. 圆弧由圆心(中心点)、半径、起点角度、终点角度确定。起点角度和终点角度单位是度(°),在XY平面内,起点到终点逆时针画圆弧,角度范围[0,360],沿X轴正方向表示0度。若 起点角度 大于终点角度 时,表示圆弧跨越 0°,此时的 角度差 = 终点角度 +360 - 起点角度。圆弧计算的详细代码请看:DXF文件的圆弧(ARC)计算:通过圆心、半径和两端点角度计算出三点坐标(C代码)-CSDN博客
  2. 记录的圆心坐标是在OCS坐标系中,若圆弧所在平面的OCS坐标系与WCS不重合,如XY圆弧被3D旋转后,则计算出XY圆弧坐标后需要由OCS坐标转换为WCS坐标。组码210、220、230为圆弧所在平面的法向量,该法向量为单位向量。若圆弧所在平面的坐标系与WCS重合,则记录的信息中没有组码210、220、230,此时默认的法向量为(0,0,1),。
  3. AUTOCAD画三维圆弧测试:先画XY平面圆弧,再输入命令”ROTATE3D”,然后指定旋转轴和输入旋转角度。

CIRCLE

CIRCLE 组码

组码

说明

100

子类标记 (AcDbCircle)

39

厚度(可选;默认值 = 0)

10

中心点(在 OCS 中)

DXF:X 值;APP:三维点

20, 30

DXF:中心点的 Y 值和 Z 值(在 OCS 中)

40

半径

210

拉伸方向(可选;默认值 = 0, 0, 1)

DXF:X 值;APP:三维矢量

220, 230

DXF:拉伸方向的 Y 值和 Z 值(可选)

  1. CIRCLE的数据格式如下:

            CIRCLE
             10    (圆心 X)
             20    (圆心 Y)
             30    (圆心 Z)
             40    (半径)
            210    (法向量 X) [可选]
            220    (法向量 Y) [可选]
            230    (法向量 Z) [可选]

  2. 圆形由圆心和半径组成。与圆弧一样,若圆所在平面的OCS坐标系与WCS不重合,如XY圆被3D旋转后,则计算出XY圆坐标后需要由OCS坐标转换为WCS坐标,但非XY平面的圆形不容易表达,需将圆形转换为圆弧存储。

POLYLINE

POLYLINE 组码

组码

说明

100

子类标记(AcDb2dPolyline 或 AcDb3dPolyline)

66

已废弃;以前是“后跟图元标志”(可选;如果存在则忽略)

10

DXF:始终为 0

APP:“虚拟”点;X 值和 Y 值始终为 0,Z 值是多段线的标高(二维时在 OCS 中,三维时在 WCS 中)

20

DXF:始终为 0

30

DXF:多段线的标高(二维时在 OCS 中,三维时在 WCS 中)

39

厚度(可选;默认值 = 0)

70

多段线标志(按位编码;默认值 = 0):

1 = 这是一个闭合多段线(或按 M 方向闭合的多边形网格)

2 = 已添加曲线拟合顶点

4 = 已添加样条曲线拟合顶点

8 = 这是一条三维多段线

16 = 这是一个三维多边形网格

32 = 多边形网格以 N 方向闭合

64 = 多段线是一个多面网格

128 = 线型图案在该多段线顶点的周围连续生成

40

默认起点宽度(可选;默认值 = 0)

41

默认端点宽度(可选;默认值 = 0)

71

多边形网格 M 顶点计数(可选;默认值 = 0)

72

多边形网格 N 顶点计数(可选;默认值 = 0)

73

平滑曲面 M 密度(可选;默认值 = 0)

74

平滑曲面 N 密度(可选;默认值 = 0)

75

曲线和平滑曲面类型(可选;默认值 = 0);整数代码,非按位编码:

0 = 不拟合平滑曲面

5 = 二次 B 样条曲面

6 = 三次 B 样条曲面

8 = Bezier 曲面

210

拉伸方向(可选;默认值 = 0, 0, 1)

DXF:X 值;APP:三维矢量

220, 230

DXF:拉伸方向的 Y 值和 Z 值(可选)

        使用到的组码:10、20、30、70

  1. POLYLINE是多段线,支持三维。每一个顶点数据记录在每一个”VERTEX”下,格式如下:

    POLYLINE
     70    (polyline flags)
    ...其他POLYLINE属性...
    VERTEX
    ...顶点1数据...
    VERTEX
    ...顶点2数据...
    SEQEND

  2. POLYLINE的三维点坐标为WCS坐标,所以直接读取的坐标就是实际的坐标。
  3. 多段线标志(组码70):若组码70值为1(bit 0),表示该多段线是闭合的,即首尾相连(用AUTOCAD编辑好多段线最后一个顶点后,使用”close“命令使多段线闭合),该情况记录的信息中最后一个顶点与第一个顶点组成一段线

LWPOLYLINE

LWPOLYLINE 组码

组码

说明

100

子类标记 (AcDbPolyline)

90

顶点数

70

多段线标志(按位编码);默认值为 0:

1 = 关闭;128 = Plinegen

43

固定宽度(可选;默认值 = 0)。如果设定为可变宽度(代码 40 和/或 41),则不使用

38

标高(可选;默认值 = 0)

39

厚度(可选;默认值 = 0)

10

顶点坐标(在 OCS 中),多个条目;每个顶点一个条目

DXF:X 值;APP:二维点

20

DXF:顶点坐标的 Y 值(在 OCS 中),多个条目;每个顶点一个条目

91

顶点标识符

40

起点宽度(多个条目;每个顶点一个条目)(可选;默认值 = 0;多个条目)。如果设定为固定宽度(代码 43),则不使用

41

端点宽度(多个条目;每个顶点一个条目)(可选;默认值 = 0;多个条目)。如果设定为固定宽度(代码 43),则不使用

42

凸度(多个条目;每个顶点一个条目)(可选;默认值 = 0)

210

拉伸方向(可选;默认值 = 0, 0, 1)

DXF:X 值;APP:三维矢量

220, 230

DXF:拉伸方向的 Y 值和 Z 值(可选)

使用到的组码:10、20、42、70、90。

  1. 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)    [可选]
    ...等等

  2. 且记录的顶点坐标是在OCS坐标系中,所以如果LWPOLYLINE经过三维旋转,则无法将OCS坐标转换为WCS坐标。所以需要画三维多段线时,请使用”3DPOLY”命令生成POLYLINE。
  3. 凸度(组码42):若顶点坐标后无凸度的记录信息,表示该点与上一点组成一段直线,若有凸度的记录信息,则表示该点与上一点组成一段圆弧。凸度圆弧的计算请看:通过圆弧凸度和两端点坐标计算出圆弧的中点坐标(C代码)-CSDN博客
  4. 多段线标志(组码70):若组码70值为1(bit 0),表示该多段线是闭合的,即首尾相连(用AUTOCAD编辑好多段线最后一个顶点后,使用”close“命令使多段线闭合),该情况记录的信息中最后一个顶点与第一个顶点组成一段线

ELLIPSE(椭圆)

ELLIPSE 组码

组码

说明

100

子类标记 (AcDbEllipse)

10

中心点(在 WCS 中)

DXF:X 值;APP:三维点

20, 30

DXF:中心点的 Y 值和 Z 值(在 WCS 中)

11

相对于中心的长轴端点(在 WCS 中)

DXF:X 值;APP:三维点

21, 31

DXF:相对于中心的长轴端点的 Y 值和 Z 值(在 WCS 中)

210

拉伸方向(可选;默认值 = 0, 0, 1)

DXF:X 值;APP:三维矢量

220, 230

DXF:拉伸方向的 Y 值和 Z 值(可选)

40

短轴与长轴的比例

41

起点参数 (对于闭合椭圆,该值为 0.0)

42

端点参数 (对于闭合椭圆,该值为 2pi)

     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) [可选]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MotionHao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值