基于DXF文件获取激光切管系统中三维轨迹点算法的研究
2022-01-11方素平张坤朋
徐 陈,方素平,顾 磊,张坤朋
(1.合肥工业大学机械工程学院,安徽 合肥 230009;2.河海大学机电工程学院,江苏 常州 213002)
0 引言
在激光切管系统中,为了实现系统的多功能,有必要提供一种根据已编辑好的图形交换格式(Drawing Exchange Format,DXF)文件就能直接在圆管、矩形管、腰型管上切割出相应图形的功能。如何根据DXF文件提取有用信息满足所需要求就显得尤为重要。
在DXF文件解析方面,已有一些学者做过研究。文献[1-4]中详细介绍了DXF格式和文件结构,设计了DXF解析模块。文献[5]探讨了CAD与C语言程序的数据接口设计。文献[6]针对DXF文件中的多个图形进行排序,利用贪婪算法进行路径规划。本文在综合了文献[1-6]所提供方法的基础上,实现了直线、圆、圆弧、多段线等图元的解析,并进一步在一个平面域上存在有多个图形时,实现了多个图形有序且每个图形的图元有序的DXF模块解析,最终得到了有序的二维离散点。在管件展开方面,关于圆管、矩形管、腰型管展开的研究很少,文献[7]中介绍了相贯线展开和圆锥面展开的方法,文献[8]中介绍了异径管件放样的展开方法,但对于具体实现均未给出具体有效的方法。
针对管件上三维轨迹点的获取问题,本文提供了一种解析DXF文件和管件展开相结合的新方法,得到了实际切割中的三维轨迹点。
1 DXF文件解析获得二维离散点
DXF文件是Autodesk公司开发的用于AutoCAD与其他软件之间进行数据交换的文件格式,有二进制和ASCII码两种格式,本文中所研究的DXF文件是ASCII格式文本文件。
1.1 DXF文件解析
一个完整的DXF文件由HEADER段、CLASSES段、TABLE段、BLOCKS段、ENTITIES段、OBJECTS段和文件结束标志组成。DXF文件中,所需的图元信息都存储在ENTITIES段,因此获得直线、圆、圆弧、多段线的数据只需对ENTITIES段进行解析。而多段线是由直线和圆弧组成,因此多段线的存储可以将其拆分为直线和圆弧分别存储。
在读DXF文件时,图元元素是先绘制的先存储,依次读取到的直线、圆、圆弧、多段线是无序的,因此在设计DXF文件解析模块时分为两步,先将读取到的图元信息临时存储,直到所有图元存储完成后,再通过两次排序使得多个图形有序且每个图形的图元有序。其中,第一次排序使得多个图形有序,第二次排序使得每个图形内的图元有序。
在C语言中,共用体具有在同一块内存上可以存储不同类型成员的优点,因此可以将DXF文件中所有的直线、圆、圆弧、多段线数据存储到一个共用体中,再将共用体和图元类型一起封装到结构体中。DXF文件主要解析流程图如图1所示。
图1 DXF文件主要解析流程
提取直线、圆、圆弧、多段线的数据时,方法相同,都是逐行读取组码和组值,来获取图元的参数值,通过表1中的组码信息对DXF文件进行解析,并将这个图元的参数值存储到共用体数组中。
表1 DXF组码信息
读取直线、圆、圆弧、多段线的图元信息时,将读取到的组值依次与“LINE”“CIRCLE”“ARC”“LWPOLYLINE”等字符串作比较来确定图元类型,进而对这个图元进行解析。
1.2 获得二维有序离散点
二维有序离散点的获取分为两步。第一步,用排序算法,根据图元特征,使得图元由无序存储变为有序;第二步,将有序图元进行离散,得到有序离散点。
排序算法的作用是将所有图元通过首尾相连的方式依次串联起来,保证图元在内存中存储位置的正确性。
已知直线的起点和终点,可以得到直线的总长度,再按照离散精度值δ1,得到直线上的离散点。圆的离散和圆弧的离散方法相同,都是用弓高值δ2作为离散的约束条件。将求得的弓高值与δ2作比较,如果求得的弓高值大于δ2,则对圆和圆弧进行二分后再次求取弓高值,依次循环下去,直到求得的弓高值不大于δ2为止。
最后,根据链表具有顺序随机存储和动态申请内存空间的优点,将得到的离散点依次有序存储到链表中。
2 三维轨迹点的算法实现
根据上述步骤,获得了有序的二维离散点。接下来将二维离散点转化到圆管、矩形管、腰型管等三种管型上去。3种管型建模如图2所示。
图2 圆管、矩形管、腰型管建模
基于建立的圆管、矩形管、腰型管的三维模型,以O1点为起始点,Y轴方向为中轴方向,对Z轴左右两侧进行展开,展开图如图3所示。
图3 圆管、矩形管、腰型管展开图
图3中,阴影部分表示圆弧区域,标注尺寸表示线段长度。图3(a)中,R为圆管半径;图3(b)中,L表示矩形管的长,H表示矩形管的高,R为圆角半径,当L与H相等时,矩形管型为方管;图3(c)中L表示腰形管的长,R表示腰型管的圆弧半径。
经过DXF文件解析得到的二维离散点用坐标(XSource,YSource)表示,三维管件上的轨迹点用坐标(X,Y,Z)表示。
2.1 数据处理
在对圆管、矩形管、腰型管进行建模时,由于是人为定义空间坐标系原点O,那么将二维离散点转化到管件上得到的轨迹点是绝对轨迹点。因此要实现管件上的任意位置切割,必须使三维轨迹点具有相对坐标系原点O偏移的功能。如果是单个图形切割,可以直接求出这个图形的几何中心(CoreX,CoreY);对于多个图形切割,先确定每个图形的几何中心,然后通过几何中心作差的方式,确定每个图形的相对位置。这里仅给出单个图形切割,得到具有偏移功能的相对轨迹点算法:
(1)
其中,X0、Y0为偏移参数。
将二维离散点转化为三维轨迹点之前,要先确保二维离散点能够落在圆管、矩形管、腰型管两侧的展开区域,这里要对数据作如下处理:
对于圆管:
XSource=XSource%(2·π·R)
(2)
(3)
对于矩形管:
XSource=XSource%(2·L+2·H+2·π·R)
(4)
(5)
对于腰型管:
XSource=XSource%(2·L+2·π·R)
(6)
(7)
式(2)、(4)、(6)中“%”为取余运算。
根据图2中建立的坐标系,每一个二维离散点转化为三维轨迹点都满足Y=YSource;下文中将给出每种管型上X和Z的求解算法。
2.2 圆管上轨迹点的获取
根据图3(a)中制定的圆管展开规则,将圆管划分为①、②两个区域。①、②两个区域满足的算法公式相同。圆管上三维轨迹点的获取算法如下:
(8)
2.3 矩形管上轨迹点的获取
根据图3(b)中制定的矩形管展开规则,将矩形管划分为①~⑩十个区域。通过判断二维离散点在矩形管展开图上的位置,获得转化后矩形管上的三维轨迹点。判断条件如下:
(9)
(10)
式(9)、(10)为①~⑩区域的判断条件。
矩形管上三维轨迹点的获取算法如下:
(11)
(12)
其中,θ1=(XSource-L/2)/R;θ2=(XSource-L/2-π·R/2-H)/R;θ3=(-XSource-L/2)/R;θ4=(-XSource-L/2)/R。
2.4 腰型管上轨迹点的获取
根据图3(c)中制定的腰型管展开规则,将腰型管划分为①~⑥六个区域。通过判断二维离散点在腰型管展开图上的位置,获得转化后腰型管上的三维轨迹点。判断条件如下:
(13)
式(13)为①~⑥区域的判断条件。
腰型管上三维轨迹点的获取算法如下:
(14)
(15)
其中,θ1=(XSource-L/2)/R;θ2=(-XSource-L/2)/R。
3 Matlab仿真
3.1 圆管上轨迹点仿真
圆管半径R=17.5 mm。如图4所示,图4(a)是CAD画的直线和圆弧组成的对称图形,直线长度L=20 mm,圆弧半径r=14 mm;图4(b)是由图4(a)得到的三维轨迹点。
图4 CAD二维图和转化到圆管上的三维轨迹点
3.2 矩形管上轨迹点仿真
矩形管长L=30 mm,高H=20 mm,圆角半径R=2 mm。如图5所示,图5(a)是CAD画的矩形,长L2=60 mm,高H2=15 mm,;图5(b)是由图5(a)得到的三维轨迹点,分布在矩形管的三个面和圆角上。
图5 CAD二维图和转化到矩形管上的三维轨迹点
3.3 腰型管上轨迹点仿真
腰型管长L=40 mm,圆弧半径R=10 mm。图6(a)是CAD画的带圆角矩形,长L1=80 mm,高H1=30 mm,圆角半径r2=4 mm;图6(b)是由图6(a)得到的三维轨迹点,分布在腰型管两个面和圆弧上。
图6 CAD二维图和转化到腰型管上的三维轨迹点
4 结语
本文通过DXF文件解析与管件展开相结合的方式获取了圆管、矩形管、腰型管等3种常见管型上的三维轨迹点,并给出了具体实现方法。以Matlab2020b为仿真软件,验证了获取三维轨迹点算法的正确性。对激光切管机的研发具有实际意义,有广泛的应用前景。