Halcon导出dxf文件转换至不同的图层

来源:互联网 发布:qt 编程 编辑:程序博客网 时间:2024/05/22 20:08

dxf文件时欧特克公司开发的一种CAD文件格式,在轻工业生产中许多二维图的绘制是通过dxf文件进行操作。为了便于机器对皮料、布匹等进行一次性智能操作,需要在dxf文件的不同图层上绘制相应的切割路径。
同理,视觉检测则需要将缺陷轮廓、皮料等级轮廓等输入至dxf不同的图层以提高后续设备的自动化等级。
视觉检测软件Halcon确实可以将检测轮廓输出至dxf文件中,但是Halcon输出的轮廓都位于dxf的默认图层,不能满足检测要求。为了解决这个问题对dxf文件进行了深入研究。
前期主要思路是通过现有的库进行dxf文件操作,现在有的库有CadLib、dxfLib等,这些库功能较为强大,但是由于对dxf文件进行操作的需求较少,因此这些库的函数使用说明不太全面,另外大部分库为商业库,需要收费而且个别库价格不菲。
现在只需要对Halcon导出的文件进行分层即可,因此对dxf文件的格式进行了研究,采用记事本打开dxf文件便可以清晰的看到dxf的数据结构。通过资料查询得知dxf的主要数据结构如下:
ASCII 格式的 DXF 可以用文本编辑器进行查看。DXF 文件的基本组成如下所示:
●HEADER 部分 - 图的总体信息。每个参数都有一个变量名和相应的值。
●CLASSES 部分 - 包括应用程序定义的类的信息,这些实例将显示在 BLOCKS、ENTITIES 以及
OBJECTS 部分。通常不包括用于充分用于与其它应用程序交互的信息。
●TABLES 部分 - 这部分包括命名条目的定义。
Application ID (APPID) 表
Block Recod (BLOCK_RECORD) 表
Dimension Style (DIMSTYPE) 表
Layer (LAYER) 表
Linetype (LTYPE) 表
Text style (STYLE) 表
User Coordinate System (UCS) 表
View (VIEW)表
Viewport configuration (VPORT) 表
●BLOCKS 部分- 这部分包括 Block Definition 实体用于定义每个 Block 的组成。
●ENTITIES 部分 - 这部分是绘图实体,包括 Block References 在内。
●OBJECTS 部分 – 包括非图形对象的数据,供 AutoLISP 以及 ObjectARX应用程序所使用。
●THUMBNAILIMAGE 部分 – 包括 DXF 文件的预览图。
●END OF FILE

打开Halcon导出的dxf文件找出LAYER表,并尝试了对部分参数修改得知参数功能如下:

LAYER 701  0LAYER  20               //图层名 700 627                //图层颜色  6CONTINUOUS

数据点
VERTEX
8
0 //改点所在图层名称
10
666.93701172
20
-0.76819998
30
0.0

图层名和图层颜色便可以成功对Halcon导出的dxf文件所在的图层以及颜色进行修改。

如何便捷的将Halcon导出的缺陷轮廓与总体轮廓以存在不同图层的方式整合到一起?
最简单的方法是采用记事本的形式打开两个dxf,然后将第二个dxf复制替换第一个dxf的文件结尾标志EOF即可。
需要注意的需要加一个回车如下,否侧dxf闪退,具体原因不明。

ENDSEC  0999DXF file created by HALCON

最终采用C#对Halcon导出的四个dxf文件合成一个dxf文件,且四个个轮廓分别以不同颜色位于不同的图层。

 StreamReader one = new StreamReader(@"G:\one.dxf");            StreamReader two = new StreamReader(@"G:\two.dxf");            StreamReader three = new StreamReader(@"G:\three.dxf");            StreamReader quexian = new StreamReader(@"G:\quexian.dxf");            String a = one.ReadToEnd();            String b = two.ReadToEnd();            String c = three.ReadToEnd();            String d = quexian.ReadToEnd();            //将a.hhp文件中bb替换为cc。            //a = a.Replace("VERTEX\r\n 8\r\n0\r\n 10\r\n", "VERTEX\r\n 8\r\n1\r\n 10\r\n");            a = a.Replace("\r\n", "clr");            a = a.Replace("8clr0clr", "8clr1clr");            a = a.Replace("0clrLAYERclr  2clr0clr 70clr0clr 62clr7clr", "0clrLAYERclr  2clr1clr 70clr0clr 62clr1clr");            a = a.Replace("clr", "\r\n");            ////a.hhp重命名为b.hhp            ////防止文本字符中有特殊字符。必须用Encoding.Default            b = b.Replace("\r\n", "clr");            b = b.Replace("8clr0clr", "8clr2clr");            b = b.Replace("0clrLAYERclr  2clr0clr 70clr0clr 62clr7clr", "0clrLAYERclr  2clr2clr 70clr0clr 62clr2clr");            b = b.Replace("clr", "\r\n");            c = c.Replace("\r\n", "clr");            c = c.Replace("8clr0clr", "8clr3clr");            c = c.Replace("0clrLAYERclr  2clr0clr 70clr0clr 62clr7clr", "0clrLAYERclr  2clr3clr 70clr0clr 62clr3clr");            c = c.Replace("clr", "\r\n");            d = d.Replace("\r\n", "clr");            d = d.Replace("8clr0clr", "8clr4clr");            d = d.Replace("0clrLAYERclr  2clr0clr 70clr0clr 62clr7clr", "0clrLAYERclr  2clr4clr 70clr0clr 62clr4clr");            d = d.Replace("clr", "\r\n");            a = a.Replace("EOF", "\r\n" + b);            a = a.Replace("EOF", "\r\n" + c);            a = a.Replace("EOF", "\r\n" + d);            StreamWriter readTxt = new StreamWriter(@"G:\机器视觉\20170509皮料缺陷检测\皮料样品缺陷\red.dxf");            readTxt.Write(a);            readTxt.Flush();            readTxt.Close();            one.Close();            two.Close();            three.Close();            quexian.Close();
原创粉丝点击