APP下载

DXF文件中直线数据的读取及重新绘制流程

2021-08-01闫帅鹏罗孟勤

科技经济导刊 2021年20期
关键词:纵坐标分母起点

闫帅鹏 ,罗孟勤

(中国电子科技集团公司第二十九研究所,四川 成都 610036)

1. DXF文件信息元素构成

一幅完整的CAD图形会包含图层、线型、直线、多段线、圆弧、椭圆、样条曲线等多种元素信息。为了更加完整且有条理地解析图形原有的信息,并还原出最符合加工要求的图形[1],本文将DXF文件读入的流程分为几个功能模块,文件读入流程如图1所示。本文对于DXF文件中的图形元素的解析分为五个模块[2]:直线元素读入模块、多段线元素读入模块、椭圆(弧)元素读入模块、圆(弧)元素读入模块、样条曲线元素读入模块。

图1 DXF文件读取流程图

2.直线数据的读写流程设计

直线作为绘图的基础,在近乎所有的CAD制图中都会出现。因此,将直线的读写作为整个DXF文件解析的基础是很具有代表性的。对于直线的关键数据就是其起始点的坐标值[3]。根据DXF文件的编码规则,直线数据段的结构如下:直线关键字为“LINE”;“LINE”后面出现的组码“10”的下方,代表示起点X坐标值;“LINE”之后出现的组码“20”的下方,代表起点Y坐标值;“LINE”之后出现的组码“11”的下方,代表终点X坐标值;“LINE”之后出现的组码“21”的下方,代表终点Y坐标值。根据上述结构,分析得到直线数据段的读取流程,如图2所示。在直线数据段读取的过程中,需要特别注意对于不同线型的区分,这样做的目的有两个:更加全面地读取所有线型的数据,完整还原CAD图形;便于在进行激光划片的过程中把不需要进行实际操作的虚线、点画线等剔除掉。对于将直线还原到软件界面上,有两种方案可以选择。一是将起始点的坐标值提取出来,利用直线计算的公式便可直接计算出直线方程,然后将起始点的横坐标或者纵坐标按照相当小的差值进行插值计算,得到整条直线的点坐标,最后通过描点的方式完成直线,其流程如图3所示。二是利用编程软件中自带的直线绘制函数进行绘制。

图2 直线数据读取流程图

图3 直线数据重新绘制流程图

通过对比,方案1需要用户自行编写相应算法,过程复杂;而方案2可以方便快捷地实现图像的绘制。但是,在使用激光划片机进行操作时,对于运动终端的控制,仍需按照方案1的算法逐点进行插补,完成对直线的激光划片。直线绘制的关键点:直线的绘制中,按照斜率公式计算时,由于可能出现横坐标相等的分母为零的情况,所以分情况讨论。一是分母不为零时,按公式求方程;二是分母为零时,只是Y方向的坐标变化。在判断分母时需要注意,由于DXF文件中读出的相同坐标值有可能在小数点后的3开始就不一样,所以直接判断分母是否为零会出现错误导致该直线基本没有绘制的点出现(X坐标基本相同,如果按公式求方程,则横坐标几乎无法变化,循环就已经结束了)。因此,在判断分母为零时,不直接判断是否等于0,而是加入一定的冗余量,只要ΔX<0.001时,就判断其属于分母等于零的情况。对于直线的绘制,通过判断起始点与终止的上下以及左右的位置,来确定步长的正负,以确保绘制的顺序。

3.基于VB.NET对DXF文件中直线数据读取的软件设计

上文已经详细阐述了直线数据段的读写流程。基于VB.NET的特点,对软件编制过程中所需的重难点进行讲解。对于图元中包含的直线类数据,可以定位一个类名为“Line”。这个类由以下属性组成:StartX,表示原始起点的X坐标;StartY,表示原始起点的Y坐标;EndX,表示原始终点的X坐标;EndY,表示原始终点的Y坐标;LaserStartX,表示转换后的起点X坐标;LaserStartY,表示转换后的起点Y坐标;LaserEndX,表示转换后的终点X坐标;LaserEndY,表示转换后的终点Y坐标。在读取坐标点数据时,由于DXF文件读入时均是文本形式,也就是说读入的数据全部是字符串,并不能够参与数值运算。本软件利用VB.NET所拥有的Csng函数功能,可以使Single类型的单精度浮点数由字符串转换而得。同时,利用Round函数,将数据精度控制在小数点后三位。举例说明:Line.StartX=Math.Round(Csng(dxfmember(i)))

上式表示将dxfmember数组中的第i项读出,然后利用Csng函数和Round函数,将第i项所表示的字符串转换为此时该条直线类的原始起点X坐标值。

在对直线类进行绘制时,可以采用Graphics的画图类在软件界面进行画图,其中Graphics是VB.NET自带功能函数。该类的使用首先需要定义一个Graphics类的对象,名为Draw,其定义格式为:

Public Draw As Graphics

同时,还需要定义一个画笔类的对象,名为ObjPen,其格式为:

Public objPen As New Pen(Color.DeepPink, 1)

其中“Color.DeepPink”表示画笔颜色,后面的“1”表示画笔的宽度为1个像素。在进行绘制时,直接调用DrawLine模块,输入下列参数:画笔对象; 直线起点X坐标值;直线起点Y坐标值;直线终点X坐标值;直线终点Y坐标值。需要特别注意,由于VB.NET在绘制图形时,其XOY坐标系的定义是屏幕的左上角为(0,0)点,如图4所示。

图4 VB.NET绘制坐标系

而CAD原图形的XOY坐标系定义是以左下角为(0,0)点,如图5所示。

图5 CAD原图形的XOY坐标系

通过对比图4和图5可以得知,对于任意的坐标点在绘制时,其横坐标保持不变,但其纵坐标的值需要由Y轴方向所设定的最大值与坐标点纵坐标的数值相减才能正确表达。也就是说,需要由所设定图幅的高度值减去坐标点纵坐标值,从而得到绘图所使用的纵坐标值。综上所述,完整的直线绘制命令如下:

Draw.DrawLine(objPen, Line.LaserStartX, Form1.PictureBox1.Height - Line.LaserStartY, Line.LaserEndX, Form1.PictureBox1.Height - Line.LaserEndY)

其中,objPen代表绘制所用的画笔;LaserStartX表示转换后的起点X坐标;LaserStartY表示转换后的起点Y坐标;Form1.PictureBox1.Height表示绘图界面的高度值;LaserEndX表示转换后的终点X坐标;LaserEndY表示转换后的终点Y坐标。参照上面的命令,就可以将不同起始点的所有直线数据全部完整地绘制在软件界面上。

4.结论

本文根据实际应用的需求,通过读取DXF文件获得了AUTOCAD文件中直线数据的几何信息,提取了直线数据存储数据,并将其转化,进行重新绘制,基于VB软件进行编程。这可以在实际的加工生产中促进加工效率的提升。

猜你喜欢

纵坐标分母起点
更正
勘 误
平面直角坐标系中的特殊点
六月·起点
“去括号与去分母”检测题
找回“丢弃”的分母
弄清楚“起点”前面有多少
疯狂迷宫大作战
快速求最小公倍数
新年的起点