张向良
摘 要:激光切割程序需要将二维图形进行一系列处理后导入到专用的软件中进行编制,图形中的外缘、终孔、视口等部位的轮廓必须是封闭的,才能被激光程序识別。然而,大多数尺寸大、曲度大、形状复杂的零件,其二维图通常都含有许多肉眼难以发现的不连通位置。这些位置肉眼难以发现,而此前业内使用的一种图形处理程序SYLBDxfProcess实用性较差,性能与实际需求相差甚远。文章将探讨在AutoCAD工作环境下,激光切割图形连通性的检查方法,以期为该工作提供高效的解决方案。
关键词:激光切割;图形处理;连通性;封闭性;ObjectARX;二次开发
中图分类号:TG485 文献标志码:A 文章编号:2095-2945(2017)33-0079-02
引言
进行激光切割,需要将二维图形导入到专用软件中生成切割程序。对于零件轮廓、通孔、视口等区域需要保证其图形在激光编程程序中是连通(轮廓封闭)的,否则切割机和相关软件无法识别。然而,大多数壁板、框等尺寸大、曲度大、形状复杂的零件,其二维图形中的倾斜边、圆角、曲线结构等位置的图形质量通常都不好,含有许多肉眼难以发现的不连通位置,如断开、交叠、多余线条和端头错位等。这些图形缺陷肉眼难以发现,人工处理几乎不可能;而此前业内使用的SYLBDxfProcess每次只能检查一个链,而且运行极慢,检查结果也不可靠,对解决问题助益甚微。本文将探讨激光切割图形连通性问题及检查算法,以及如何在基于ObjectARX(VC)开发的程序中实现。该方法可以一键式地找出上述图形缺陷的精确位置,将为设计人员提供极大方便,同时也极大保证了工作质量。
1 连通性检查问题描述
用于编制激光切割程序的二维图形中所有的轮廓,包括外缘、视口、各种孔等,必须是连通的才能被识别。在投影图形质量不佳的情况下,很多肉眼看起来连通的轮廓实际上被系统认为是开放的。放大图形后可知,这是由于线与线的连接处存在着尺度极小的断开、重叠、毛刺等。如图1。
2 算法分析
图元的拓扑关系判定需要考虑一个因素——公差。假设约定的公差值为geTol(长度变量单位默认为mm,下同),则两点距离小于geTol时,认为两点重合。这个值应根据所选用的设备、设备的配套软件设置和使用的CAD软件设置来确定。
在激光切割图形中,允许存在的图元包括且限于直线、圆弧和圆。由于圆自封闭,不需要判断连通性,故只需检查直线与圆弧(以下简称曲线)。当曲线pCurve1的某一端点与曲线pCurve2的某一端点重合时,称两曲线邻接。
在一组曲线中,如果每条曲线都与其他至少1条曲线邻接,称这组曲线为一个链;如果一个链中每条曲线的每个端点最多只与其他一条曲线邻接,则称这个链为一个单链。如果一个单链首尾相接,则称该链连通。激光切割图形中的轮廓最终应达到这种状态(由于激光切割图形的特性,此处不考虑诸如8字形之类的曲线相交情形)。于是可根据以上条件设计出检查连通性的算法:(1)获得所有图形元素,分解其中的组合元素。(2)将所有元素分成若干个链。(3)对于每个链,获取一个元素,递归检查与之邻接的元素,以确定是否为连通链。(4)重复2、3步骤,检查所有链。(5)在用户界面突出显示连通的链。
3 算法的实现
考虑到业内普遍的工作方式,本文选择在AutoCAD平台上实现上述算法。由于基于VC++的ObjectARX程序运行效率最高,拥有与AutoCAD自身几乎相同的编程接口与控制能力[1],故使用ObjectARX(VC)2007开发,编译环境是Visual Studio 2005。与AutoCAD自身的功能一样,该连通性检查功能通过命令调用。如图2。
部分代码如下:
static void NITemplateAssistAutomaticChain(void)
{
std::list
std::list
AcDbObjectIdArray entIds = GlobalFunction::GetAllEntityIds();
if (entIds.isEmpty())
{
acutPrintf(_T("\nThere's no entity in this drawing!"));
return;
}
// Divide entities into several chains
TopologicalFunction::DivideIntoGroups(entIds,chainList,1);
// For each chain, check its closure and mark the ents
int count = 0;
for (iter=chainList.begin();iter!=chainList.end();iter++)
{
AcGePoint3dArray points;
if (TopologicalFunction::IsClosed(*iter,points))
{
GlobalFunction::MarkEnt(*iter);
count++;
}
}
acutPrintf(_T("\n%d loops are found."),count);
}
所述的步骤(1):获得所选择的图形元素,分解其中的组合元素:将模型空间中所有实体的ID加入查找范围数组。对获得的所有实体执行分解动作,如果分解成功,则将所得的实体依次发送至模型空间,并将其ID加入查找范围数组,然后在查找范围数组中移除该组合元素的ID,并将该组合元素从模型空间删除。
步骤(2):将所有元素分成若干个链:打开查找范围的第一个元素pEnt,确认其是直线或圆弧。将pEnt移入链,提取其两端点,在查找范围数组中查找与之邻接的元素。如果有,则将这个元素移入链,并检查这个元素;否则新建一个链继续查找。递归地执行上述过程,直至检查完所有元素,并获得一个链列表。
步骤(3):对于每个链,获取一个元素,递归检查与之邻接的元素,以确定是否为连通链:对链中的每一条曲线pEnt,检查它与其他曲线有没有公共端点,所以当所有元素都检查完毕后,结果分为三种:a.pEnt两端点均有唯一曲线邻接;b.pEnt仅在起点或终点有唯一曲线邻接;c.pEnt两端点均无唯一曲线邻接(无元素或多个元素)。
对于情形a,分为三种情况:一是pEnt两端邻接的曲线是同一个元素,则可以判定链连通,将这个元素移入链,查找结束;二是新起点与新终点重合,说明图形由分别与pEnt两端相连的两条曲线闭合,将这2个元素移入连通元素集,查找结束;否则说明该链还没有结束,对这2个元素执行(3)的步骤。
对于情形b,分为两种情况:一是新的起点与原终点相同,说明原终点处存在多于1条邻接曲线,图形在此出现分支,一定不连通,查找结束;否则应将这条曲线移入链,继续查找以确定断开位置。
对于情形c,由于查找是递归的,所以忽略该情形,查找结束。
步骤(4):重复2、3步骤,检查所有链。
步骤(5):在用户界面突出显示连通的链,如果一个链被判断为连通的,则将其中每条曲线变为红色并加粗,令使用者一目了然;否则在该链的两端绘制红色粗实线圆圈,以标明断开位置。
4 结束语
本文描述了激光切割图形连通性缺陷的成因与情形,给出了检查连通性的一般方法,并说明了如何在基于ObjectARX(VC)开发的程序中实现。解决了激光切割图形连通性缺陷肉眼难以察觉,之前业内使用的方法实用性较差的问题,为相关工作提供了快速可靠的解决方案。
参考文献:
[1]张帆,朱文俊.AutoCAD ObjectARX(VC)開发基础与实例教程[M].中国电力出版社,2014.
[2]陆桂君.激光切割的机理与机械工艺技术[J].科技创新与应用,2017(03):122.
[3]胡家兵,郭宇斌,梁依忱.图像实时检测技术在激光切割中的应用研究[J].科技创新与应用,2016(34):75.endprint