APP下载

数控系统中HPGL 图形文件识别与图形处理研究*

2013-12-23张书伟刘建群吕振飞

组合机床与自动化加工技术 2013年2期
关键词:链表圆弧图层

张书伟,刘建群,施 为,吕振飞

(广东工业大学 机电工程学院,广州 510006)

0 引言

随着加工制造业自动化、一体化的快速发展,数控系统也在不断向高智能化和高精度方向发展,数控系统中对图形文件的要求也越来越高,传统的图形文件如DXF 由于在某些方面的缺陷已经不能够完全满足数控系统发展的需要,而HPGL 图形文件以其独特的优点逐渐受到数控系统开发者的青睐。

HPGL 是一种矢量图形语言,支持面向对象,通过几何学方法来描述图像,是惠普公司20 世纪50 年代为控制其绘图仪产品建立的一套指令系统,目的是提供可被多种外部设备支持的一致功能,从而减轻程序开发过程中的工作,随后被广泛应用于绘图仪和打印机控制语言并成为标准[1]。主要有plt、hpg、hp2、pl2、prn 五种扩展名,其中plt 最为常用,本文就是以plt 格式为数据对象。HPGL 原来是为控制绘图仪而设计的,因此它只能表达二维非交互的图形[2]。随着当前数控技术的不断发展,对图形文件的要求也越来越高,在表达一些复杂的图形时,一般的光栅图形文件所占用的内存会比较大,对输入输出调用的速度比较慢,这样会影响工作的效率。而HPGL 图形文件具有丰富的指令信息,易于读写,使工作人员在创建图形时具有很大的灵活性,并且为设备之间的使用提供了兼容性,占用内存较少,对输入输出的调用也更有效率,使得打印速度也更快,能够大大提高工作效率,因此逐渐被广泛应用到数控系统中。HPGL 图形文件的生成方法有多种,一般是由AUTOCAD、CorelDraw 等绘图软件直接生成,也可以根据需要人为地进行指令的编写。

1 图形文件读取与存储

1.1 指令读取

实现文件中指令读取的操作方法有许多种,在本次设计中采用的是逐一字符比较的方法对HPGL图形文件中几种常用指令进行读取。所读取指令及所表达含义表1 所示。

表1 读取指令及所表达含义

首先打开文件并判断文件是否为空,如果不为空将文件中所有字符存储到容器中,然后循环读取容器中的字符,每一次读出一个字符进行比较,如果遇到要识别指令,则读出指令信息并将指令信息按直线、圆弧和圆归类,直到容器中所有字符读完结束。这种方法优点比较直观,便于理解,易于修改,程序结构比较简练。指令读取流程如图1 所示。

图1 指令读取流程图

1.2 数据计算

从图形文件中读取的圆弧指令信息并不能够满足图形显示需要,因此需要通过计算获取所需数据信息。从图形文件中可以得到圆弧的起点坐标、圆心坐标、圆心角。在此需要计算图形的起始角、终止角、终点坐标、起始切线角、终止切线角。以圆心为起点过圆弧起点坐标的向量与X 轴正方向的夹角记为起始角sAngle,过圆弧起点和圆弧相切且方向与圆弧走向相同的向量与X 轴正方向的夹角记为起始切线角sTan,以圆心为起点过圆弧终点坐标的向量与X轴正方向夹角记为终止角eAngle,过圆弧终点和圆弧相切且方向与圆弧走向相同的向量与X 轴正方向的夹角记为起始切线角eTan,设圆弧圆心角为angle,圆弧起点坐标为(Xs,Ys),终点坐标为(Xe,Ye),圆心坐标为(Xo,Yo),圆弧半径为R。则:

如果Ys<Yo,说明sAngle 应该为大于180°,由于在VC 中函数acos 所计算结果为0 ~180°,所以sAngle= 360°-sAngle。由此可以求得eAngle =sAngle +angle,当eAngle >360°时,eAngle = eAngle-360°,当eAngle <0 时,eAngle =eAngle +360°,当angle 为正时说明圆弧为逆时针走向,否则为顺时针走向。如果圆弧为逆时针,则sTan 和eTan 分别等于起始角和终止角加上90°,否则sTan 和eTan 分别等于起始角和终止角减去90°,根据圆弧终止角可以求得圆弧终点坐标(Xe,Ye),即:

在VC 绘制图形过程中,由于只能绘制逆时针的图形,因此对于顺时针图形绘制时应当进行起点与终点之间的对换。

1.3 数据存储

采用链表进行数据存储,首先建立一个双向图层链表,用来存储图层信息。当读取SP 指令信息时,读取刀号的同时创建一个图层,使得一个刀号对应一个图层,将该图层插入到图层链表中。然后在每个图层下创建一个双向实体链表,用来存储从图形文件中读取的直线、圆和圆弧实体的数据信息。双向图层链表结构如图2 所示。

图2 图层链表结构

2 图形处理

2.1 轮廓识别

从图形文件中读取的图形信息,只是一段段单独的实体线段,并不是整体封闭的轮廓,也没有进行内外轮廓区分,在做后续的加工时,可能会出现先加工外轮廓后加工内轮廓的情况,这样会产生定位误差,造成加工精度不精确[3],因此要先做轮廓识别,以整轮廓的形式存储,并区分好内外轮廓,以此避免加工时的随意性,提高加工精度。

轮廓识别过程大体可以分为以下几步:

第一步:遍历整个图层链表,从所存储的实体线段的起点中找出最大Y 坐标,如果出现最大Y 坐标的坐标点有多个,则找出这些坐标点中X 坐标最小的那个点记为firstPoint,作为一个外轮廓的起点坐标。

第二步:从链表中找出所有包含firstPoint 点的实体线段,如果该点为线段的终点则将线段首尾倒序。计算出这些线段与X 轴正方向的逆时针夹角,比较计算出来的角度,找出角度最小的线段,作为该外轮廓的一条边暂存起来。角度计算方法如下:如果是直线计算出以firstPoint 为起点过直线另一端点的向量与X 轴正方向的逆时针夹角,如果是圆弧计算出过firstPoint 点,且方向与圆弧走向相同的切线与X 轴正方向的逆时针夹角,在计算直线和圆弧过程中如果向量方向与X 轴正方向相同,则求得夹角记为360°,如果是圆,则不计算直接作为一外轮廓。找到该外轮廓的一条边后将线段与firstPoint 不同的另一端点,赋值给firstPoint。然后从图层链表中删除该线段。

第三步:重复第二步操作,直到找到一条线段的终点与该外轮廓的起点相同,则一个外轮廓识别结束。

第四步:采用传统的射线法[3-4]从图层链表中找出该外轮廓内部的所有实体线段存储到临时链表中,然后再按照识别外轮廓的方法将这些实体线段拼接成封闭的轮廓做为该外轮廓所包含的内轮廓。一个整轮廓识别完成。

第五步:判断图层链表是否为空,如果不为空,继续操作上述四步,直至所有轮廓识别完成。

第六步:轮廓识别后将轮廓存储到链表中,存储的方法是首先创建一个链表称之为轮廓链表,将一个外轮廓插入链表的头部,如果该外轮廓内部含有内轮廓则按顺序将内轮廓插入到所创建链表的尾部,如果该外轮廓内部不含内轮廓或该外轮廓内所有内轮廓存储完毕,则按上述存储方法重复操作,直到所有轮廓存储完毕。然后再创建一个链表记为整体轮廓链表,将所有轮廓链表按照一定的顺序插入到整体轮廓链表中。

2.2 图形移动到指定位置

此操作目的是为了实现在图形轮廓加工时将图形移动到加工刀具所在位置,直接开始加工,避免刀具空运行,提高加工效率。

首先获取鼠标左键在VC 视口屏幕上按下的坐标记为point,然后遍历轮廓链表,计算出组成轮廓的所有线段起点到point 之间的距离,计算结果与设定的有效距离相比较,如果在有效距离以内则该线段起点为所在轮廓的加工起点记为startPoint,以start-Point 为起点对轮廓中的所有线段排序,然后分别对内轮廓和整体轮廓进行排序,将点startPoint 所在内轮廓作为第一加工轮廓,该内轮廓所在的整体轮廓作为第一加工整体轮廓。

如果轮廓为单独圆,在此通过计算可以改变其起点的位置,方便从圆的任意位置进行加工。首先是计算鼠标左键按下点point 到圆心的距离记为d1,圆半径记为r,则判断|d1-r|时是否在有效距离内。如果在,则有圆心坐标、point、d1 和r,通过他们之间的比例关系可以计算出以圆心为起点过点point 的向量与圆的交点的坐标,将此点设定为圆的新起点为

startPoint。

计算获取startPoint 后,获取图形将要移动到位置的坐标记为toolPoint,计算出startPoint 到toolPoint在X 轴和Y 轴方向的距离,最后通过坐标计算将整体轮廓的加工起点移动到指定位置。

3 运行实例

本文以VC++6.0 为开发平台,在VC 视口中进行图形绘制时,所使用的坐标为设备坐标,设备坐标指的是设备空间中所使用的坐标,所谓设备空间通常是指应用窗口的客户区也包括整个桌面、完整的窗口等等。而几乎在所有的GDI(图形设备接口)函数中使用的一般是逻辑坐标,同理逻辑坐标一般在逻辑空间中使用,在逻辑空间中可以对图形进行平移、旋转等多种图形变换[5-6]。因此将逻辑坐标转化为设备坐标才能够正确的显示图形。

首先使用AutoCAD2000 绘制出包含封闭内外轮廓的图形,如图3AutoCAD2000 中绘制的图形所示,生成HPGL 图形文件,然后通过研究开发出的软件进行文件读取、轮廓识别获取图形绘制信息,最后通过逻辑坐标到设备坐标的坐标转换在VC ++6.0 中绘制图形,结果如图4VC ++6.0 运行结果图所示。结果表明本文提出的HPGL 图形文件读取方法和轮廓识别方法能够达到预期效果。

图3 AutoCAD2000 中绘制的图形

图4 VC++6.0 运行结果图

4 结束语

本文以比较直观的方法实现了HPGL 图形文件中图形信息的读取,对圆弧终点和角度的计算做了详细的描述,采用双向链表实现了数据的存储,通过轮廓识别区分出了图形的内外轮廓,通过算法实现将图形移动到指定位置,提高了轮廓加工时的简便性。通过VC++6.0 运行显示本次设计达到预期效果。

[1]Paul Bourke. Using HPGL as a drawing interchange media[EB/OL].1992.

[2]贾龙,方亮,陈太喜,等. 基于OpenGL 的HPGL 数据异形体模型三维建模[EB/OL].2009.

[3]徐东,刘建群,吴积荣,等. 外轮廓识别算法在纸箱打样机中的应用研究[J]. 广东工业大学学报,2011,28,(2):31-36.

[4]苗春葆. 点与多边形关系的射线法[J]. 电脑编程技巧与维护,2008(3):56-58.

[5]孙鑫,余安萍. VC++深入详解[M]. 北京:电子工业出版社,2006.

[6]陈建春. 矢量图形系统开发与编程[M]. 北京:电子工业出版社,2004.

猜你喜欢

链表圆弧图层
浅析圆弧段高大模板支撑体系设计与应用
为《飞舞的空竹龙》加动感
如何用链表实现一元多项式相加
外圆弧面铣削刀具
跟麦咭学编程
解密照片合成利器图层混合模式
基于MTF规则的非阻塞自组织链表
双圆弧齿同步带的载荷特性研究
六圆弧齿廓螺旋齿轮及其啮合特性
C语言中指针链表的学习探讨