| ||||||||||||
| ||||||||||||
但直到现在,线切割机的应用范围还主要限制在机械零部件及模具的加工上,在线切割机上实现切割汉字可以说是一个空白。针对我国的国情,实现对汉字的切割既有现实的市场需求,又有广阔的应用前景。 在线切割机上进行加工,首先要通过编程系统将待加工零件转化为切割指令。为此要实现切割汉字的功能,也必须将要切割的汉字字形轮廓转化为切割指令。本文将从几个方面具体讲述在Windows操作系统的PC平台上,从TrueType字库中提取汉字字形轮廓,并将其转化为切割指令的自动编程技术。 2字形轮廓的提取 要实现切割汉字首先要获得汉字字形轮廓,这涉及到如何从字库中提取汉字字形轮廓的问题。汉字的字体根据其实现形式的不同可分为点阵字体、矢量字体及TrueType字体等几种。其中使用最广泛的为TrueType字体,与其他字体相比,TrueType字体具有明显的优点: (1)它使用直线和曲线对字符进行描述,具有放大和缩小不变形的特点; (2)具有处理速度快及与设备无关的特点; (3)它是Windows系统所使用的最广泛的字体,因而Windows提供了大量的API函数来支持和处理这种字体,利用这些函数可方便地对TrueType字符进行各种处理,如旋转、变形等。 在TrueType字体中,字形轮廓是由一些直线和曲线的集合及一些对字体的描述信息所组成,这些直线和曲线定义了TrueType字体及符号的外形轮廓,而那些字体的描述信息则用来控制和调整直线的长度和曲线的形状,主要用来调整字形轮廓尺寸,使用这些描述信息可对TrueType字体或符号在保持其原始形状的情况下进行放大、缩小等处理 Windows提供了许多函数来处理TrueType字体,其中与提取字形轮廓有关的最主要的函数为GetGlyphOutline,它可用来提取被选择到指令设备环境(如内存、显示设备等)的字符的轮廓或位图。在Windows API中,GetGlyphOutline函数声明如下: UINT uChar,∥所要查询的字符 UINT uFormat,∥所要返回的数据类型 LPGLYPHMETRICS lpgm,∥指向字符规格结构的地址 DWORD cbBuffer,∥数据缓冲区的大小 LPVOLD lpvBuffer,∥数据缓冲区的地址 CONST MAT2*lpmat2,∥变换矩阵结构的地址); 其中的主要参数说明如下: uChar:指定所要查询的字符,对汉字来说是指汉字的编码,如:GB-2312和Unicode等编码。 typedef struct_TTPOLYGONHEADER{//ttph DWORD cb; DWORD dwType; POINTFX PfxStart; }TTPOLYGONHEADER,FAR.LPTTPOLYGONHEADER; 其中成员cb指定描述字形轮廓的TTPOLYGONHEADER结构和TTPOLYCURVE结构所需的字节数;dwType字符的轮廓类型;pfxStart指定轮廓的起始点。 TTPOLYCURVE结构中包含了TrueType字符中有关字形轮廓曲线的信息。其定义为: typedef struct tagTTPOLYCURVE { // ttpc WORD WType; WORD Cpfx; POINTFX apfx [1]; } TTPOLYCURVE,FAR*LPTTPOLYCURVE; 其中成员wType指定TTPOLYCURVE结构所描述的曲线类型,可有两个取值;TT_PRIM_LINE和TT_PRIM_OSPLINE,分别代表曲线是折线和B样条曲线;cpfx指定数组中POINTFX结构的数目;apfx指定一个确定折线或者B样条曲线的POINTFX结构类型的数组。 POINTFX结构中包含用来描述TrueType字符字形轮廓的点的坐标,其定义为: typedef struct tagPOINTFX { // ptfx FIXED X; FIXED Y; } POINTFX, 其中X和Y分别代表点的横、纵坐标。 在调用GetGlyphOutline函数得到描述字形轮廓的数据后,要将其描绘出来还需调用绘制直线和曲线的函数。一个TrueType字符由折线和二次样条曲线描绘而成,调用GetGlyphOutline函数返回了描绘这些折线和曲线所需的点的有关信息,这些信息存储在TTPOLYGONHEADER和TTPOLYCURVE结构中,根据其中的成员wType所指定的不同值,来调用Windows API所提供的相关绘制折线和样条曲线的函数,即可绘制出字符的字形轮廓。在绘制时还可根据需要对字形轮廓进行各种处理,如放大、缩小、旋转及改变字符的纵横比等。图1显示了采用以上方法提取的“电”字的字形轮廓。 还有一个需解决的问题是如何获得汉字编码的问题。通常汉字是以字符串的形式输入计算机的,要调用GetGlyphOutline函数得到某一汉字的字形轮廓,还须得到该汉字的编码(一般指GB-2312编码,在Windows NT和Windows 2000下可使用Unicode编码),用来指定GetGlyphOutline函数中的uChar参数,这就需进行由字符串到汉字编码的转换。下面给出了用Delphi实现的由汉字字符串到汉字的GB-2312编码的转换函数,该函数的输入参数为字符串的形式的单个汉字,返回值为输入参数汉字的GB-2312编码。 function CodeConvert(s:string):interger; beginresult:=ord(WORD(s[1]shl 8)+WORD(s[2])); end; 3 字形轮廓二值图象的转化及其编辑处理 因为我们只需标识字形的边界轮廓,因此将其转化为二值图象即可。将字形轮廓转化为二值图象,也就是将其转化为一个用矩阵表示的象素点图象,矩阵中的每一位都是二进制数,当该位为1时表示字符的笔划经过此位,该位为0时表示字符的笔划不经过此位。因为只要分辨出某点为0还是1,因此每个点只要用一位二进制数表示即可,这样1个字节就可以表示8个象素点,但为方便叙述本文采用以1个字节表示1个点来进行说明。 要将字形轮廓转化为二值图象,首先根据需要(如字体、尺寸大小、纵横比、是否旋转、变形等)在屏幕上绘制出所要切割字符的字形轮廓;然后对图形进行扫描,将有笔划通过的点(对应于与字符颜色相同象素的位)的值置为1,而其它的点则置为0,扫描完毕后便将字形轮廓转化为二值图象了。 生成二值图象后还需对图象进行适当的修改,以满足线切割加工的需要。对图象进行编辑处理,可用一个小方块代替一个放大了的象素,通过建立网格编辑区,每一网格小方块都是一个放大了的象素,这样可对每个象素进行编辑处理,控制鼠标在相应的网格眼内填入字符或背景颜色,同时填入字符颜色所对应的位置为1,填入背景颜色所对应的位置为0。 4 切割指令的生成 由于线切割机所能切割的图形具有一定的特殊性(即需能以一笔画完),因此只需采用某种算法对图进行一次遍历便可得到加工轨迹。 要对图象进行遍历,首先需确定搜索策略。由于能被切割的图形具有特殊性,采用改进了的深度优先搜索方法来对图象进行遍历。主要思想为:先确定图象的起始点,然后沿逆时针方向在该点周围寻找下一点,找到后沿着这两点确定的方向继续搜索,直至将该方向上的点搜索完毕,然后回溯,以回溯得到的点为基础重复以上搜索,直至所有点都被搜索过,在搜索过程中将经过的点的值从1置为0,同时记录所经过的直线。 下面介绍一下所要用到的主要数据结构。 记录直线所用结构为TLineRecord,它用来记录每段直线的起点和终点坐标,其定义如下: TLineRecord=record StartPoint, EndPoint: TPoint; //直线起始点,终止点 end; PLineRecord=^TLineRecord; 其中StartPoint, EndPoint分别为直线的起点和终点。 图象采用二维数组进行表示,首先按照行、列从小到大的顺序找到图象的起始点,然后再采用逆时针方向来搜索下一点。搜索方向的定义为: SearchDirection:array[0..7,0..1] of interger=((1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1),(0,1),(1,1)); 遍历算法如下: (1)扫描图象寻找起始点,将其坐标记为(k,1);用FirstPointX、FirstPointY记录第一点横、纵坐标的值; (2)初始化记录直线的指针,建立记录直线的链表;将起始点的k,1值作为直线起点和终点的横、纵坐标,将该直线加入到直线纪录的链表中去; (3)以第一点为基准点沿逆时针方向寻找下一点,如果搜索到值为1的点则记搜索方向为i,该点的横、纵坐标记为(k,1),将记录直线的终点横、纵坐标设置为k,1; (4)置是否搜索完毕标志SearchCompleted为False; (5)如果SearchCompleted不为True则重复作6-13步; (6)置SearchCompleted为True; (7)置是否同一条线标志SameLine为True; (8)如果SameLine为True则重复作9-12步; (9)置SameLine为False; (10)沿i方向进行搜索,即k:=k+SearchDirection [i][0];1:=1+SearchDirection [i][1]; (11)如果点(k,1)为1,则置SameLine为True;将直线的终点坐标设置为(k,1);将点(k,1)的值设置为0; (12)如果点(k,1)为0,则置SameLine为False; (13)以点(k,1)为基准点沿逆时针方向寻找下一点,如果搜索到值为1的点,则记搜索方向为i;在直线记录列表中增加一条新的直线,k,1值作为直线起点的横、纵坐标;将搜索到的点的横、纵坐标记为(k,1),将直线终点的横、纵坐标设置为(k,1);置Searhcompleted为False,置SameLine为True;将点(k,1)的值设置为0; (14)进行图形封闭化处理,在直线记录列表中增加一条直线,将k,1值作为直线起点的横、纵坐标,FirstPointX、FirstPointY作为直线终点的横、纵坐标值。 这样当遍历完成后,遍历的轨迹就保存在直线记录列表中了,也就是说已实现将汉字的字形轮廓用直线段进行描述了。需指出的是,由于汉字字形本身或者编辑处理的原因,在进行图象遍历的过程中,可能存在一些不和谐的点,使遍历不能完成(如存在断点、尖点及多余点的情况),需在遍历之前运用图象处理的技术将这些点补足或者剔除掉,以使遍历能顺利完成,有关这方面的算法不再赘述。 至此要实现切割汉字就只剩下如何生成切割指令的问题了。由于已将汉字的字形轮廓用直线进行描述,且这些直线还首尾相接组成一个封闭轮廓,要生成线切割机的切割指令,只需按切割指令的要求将这些直线进行转换即可。 线切割放电间隙与电极丝走丝速度分析 | ||||||||||||
| 联系方式:0769-82029497 85841197(华南) 0512-57805485(华东)Email:info@wirecut-edm.com 版权所有:东莞市琛扬数控机械有限公司 公司地址:广东东莞市樟木头镇塘吓埔景福路8号 | ||||||||||||