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();
- Halcon导出dxf文件转换至不同的图层
- Houdini导出DXF文件的方法
- CAM350 导出DXF文件
- PROE导出DXF文件
- 常用的SCH和PCB设计软件导出DXF图
- shp文件转换到CAD dwg,dxf
- DXF文件中将多段线凸度转换成圆弧
- 判断dxf文件的版本
- cad图层dwg,dxf转shp
- AutoCAD dxf 文件保存图元的顺序
- PADS如何导出GERBER文件以及DXF文件
- 求PADS如何导出GERBER文件以及DXF文件?
- GE Smallworld开发(003dxf文件导入导出问题)
- 20161016-Allegro16.6中将板框导出DXF文件
- iShare·AD小技巧--如何导出dxf文件
- 关于CAD文件 DXF格式的理解
- 关于CAD文件 DXF格式的理解
- 一个周完成dxf文件的解析
- Are virtual interfaces supported on Quagga v0.98.3 (on Debian GNU/Linux 2.6.16)?
- Android View体系(九)自定义View
- Win7 64位系统打开 chm 文件右侧窗口显示空白的解决方法
- zabbix3.2监控Esxi5.5主机
- ycb去接水
- Halcon导出dxf文件转换至不同的图层
- “图解服务器端网络架构”小结
- CentOS7中配置NFS服务
- 网络编程知识总结 之 NSURL网络请求
- 初识安卓
- 使用php解决约瑟夫问题
- “图解基础设施设计模式”小结
- 数据库写法小错误
- 关于int整数转换存储到字符数组