Halcon中可以通过concat_obj合并多个XLD,并且可以通过write_contour_xld_dxf再将XLD保存为.dxf文件。但是,保存后的.dxf文件用AutoCAD打开后发现,它们都是位于一个图层上的(0号图层),并且颜色都是白色(颜色代号7)。

如下所示:

 1 read_image (Image, '未标题-1.png')
 2
 3 threshold_sub_pix (Image, Border, 30)
 4
 5 select_shape_xld (Border, defectsXLD_Skin, 'area', 'and', 30000, 99999)
 6 select_shape_xld (Border, defectsXLD_H, 'area', 'and', 2000, 9999)
 7 select_shape_xld (Border, defectsXLD_I, 'area', 'and', 200, 999)
 8 select_shape_xld (Border, defectsXLD_J, 'area', 'and', 10, 150)
 9
10 write_contour_xld_dxf (defectsXLD_Skin,'dxfs/defectsXLD_Skin.dxf')
11 write_contour_xld_dxf (defectsXLD_H,'dxfs/defectsXLD_H.dxf')
12 write_contour_xld_dxf (defectsXLD_I,'dxfs/defectsXLD_I.dxf')
13 write_contour_xld_dxf (defectsXLD_J,'dxfs/defectsXLD_J.dxf')
14
15 concat_obj (defectsXLD_Skin, defectsXLD_H, XLDs)
16 concat_obj (XLDs, defectsXLD_I, XLDs)
17 concat_obj (XLDs, defectsXLD_J, XLDs)
18 write_contour_xld_dxf (XLDs,'dxfs/XLDs.dxf')

有时候,我们要求这些轮廓线条位于不同的图层上,并且对线条的颜色也有要求

那么应该怎么做呢?

dxf是一种通用的绘图交换文件格式,很多通用的交换文件都可以用记事本程序打开,例如dxf文件、xml文件等,我们用记事本打开后,就能看到它的数据结构,从而为修改它们提供了思路——即可以通过流的方式读取、写入,从而改变它们的内容。

下面是两篇很好的参考资料:

https://baike.baidu.com/item/DXF/364192?fr=aladdin

http://m.blog.csdn.net/Chailiren/article/details/72861045

请先阅读完上面两篇资料再往下阅读。

LAYER70
10
LAYER2
0               //图层名70
062
7                //图层颜色6
CONTINUOUS

上面第二篇资料较好地解决了这个问题,但是在通用性上还有完善的空间,其实方法可以封装得更完善一些。即:

① 用于合并的文件个数可能是不定的,可以是2个、3个、4个、5个或者更多。(方法传入参数个数可变)

② 每个文件所占据的图层号可能是不定的,并且对应的线条颜色也可能是不定的。

我针对如上两个问题进行了重新封装。封装后的方法的使用demo完整程序如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Diagnostics;
  6 using System.Drawing;
  7 using System.IO;
  8 using System.Linq;
  9 using System.Text;
 10 using System.Windows.Forms;
 11
 12 namespace WindowsForm_dxf分层
 13 {
 14     public partial class Form1 : Form
 15     {
 16         public Form1()
 17         {
 18             InitializeComponent();
 19         }
 20
 21         private void button1_Click(object sender, EventArgs e)
 22         {
 23             string path_Skin = @"I:\666\dxfs\defectsXLD_Skin";
 24             string path_H = @"I:\666\dxfs\defectsXLD_H";
 25             string path_I = @"I:\666\dxfs\defectsXLD_I";
 26             string path_J = @"I:\666\dxfs\defectsXLD_J";
 27             string path_combine = @"I:\666\dxfs\combine----";
 28
 29             CombineDxfs(path_combine, path_Skin, path_H,path_I);
 30
 31             MessageBox.Show("dxf混合成功 !");
 32         }
 33
 34
 35
 36
 37         public void CombineDxfs(string path_combine, params string[] path_parts)
 38         {
 39
 40             int _count = path_parts.Length;  //获得需合并的各个.dxf文件的个数
 41             List<string> dxfsTextList = new List<string>();  //存储各个.dxf文件中的文本的List
 42             List<StreamReader> streamReaders = new List<StreamReader>();  ////存储各个StreamReader实例的List
 43
 44             for (int i = 0; i < _count; i++)
 45             {
 46                 //将各个.dxf文件中的文本依次添加到dxfsTextList的item中
 47                 StreamReader streamDxf = new StreamReader(path_parts[i] + ".dxf");
 48                 streamReaders.Add(streamDxf);
 49                 dxfsTextList.Add(streamDxf.ReadToEnd());
 50
 51                 //指定各个.dxf文件所在的图层数和线条颜色代号
 52                 switch (i)
 53                 {
 54                     case 0:
 55                         dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 5, 3);
 56                         break;
 57
 58                     case 1:
 59                         dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 2, 4);
 60                         break;
 61
 62                     case 2:
 63                         dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 3, 7);
 64                         break;
 65
 66                     case 3:
 67                         dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 4, 4);
 68                         break;
 69
 70                     case 4:
 71                         dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 5, 5);
 72                         break;
 73
 74
 75                     default:
 76                         dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 7, 7);
 77                         break;
 78
 79                 }
 80
 81
 82             }
 83
 84             //将所有.dxf文件的文本合并到第一个文件中
 85             for (int i = 0; i < _count -1 ; i++)
 86             {
 87                 dxfsTextList[0] = dxfsTextList[0].Replace("EOF", "\r\n" + dxfsTextList[i + 1]);
 88             }
 89
 90             //将dxfsTextList[0]的文本写入到路径为path_combine的.dxf文件中。
 91             StreamWriter combineText = new StreamWriter(path_combine + ".dxf");
 92             combineText.Write(dxfsTextList[0]);
 93             combineText.Flush();
 94             combineText.Close();
 95
 96             //依次关闭各个streamReader
 97             foreach (var streamDxf in streamReaders)
 98             {
 99                 streamDxf.Close();
100             }
101
102
103         }
104
105
106         //指定各个.dxf文件所在的图层数和线条颜色代号
107         private  string SetDxfLayer_Color(string text,int Layer_Num, int Color_Num)
108         {
109             text = text.Replace("\r\n", "#");  //为增强文本可读性,将\r\n替换为#
110             text = text.Replace("8#0#", "8#" + Layer_Num + "#");  //指定.dxf文件所在的图层数
111             text = text.Replace("0#LAYER#  2#0# 70#0# 62#7#", "0#LAYER#  2#" + Layer_Num + "# 70#0# 62#" + Color_Num + "#");  //在.dxf文件开头指定其所在的图层数和线条颜色
112             text = text.Replace("#", "\r\n");  //将#恢复为\r\n
113
114             return text;
115         }
116     }
117 }

观察“图层号——颜色代号”分别是(0, 7)、(2, 4)、(3, 7)、(5, 3),与代码中的设置相符。

转载于:https://www.cnblogs.com/xh6300/p/7429898.html

将Halcon导出的多个dxf文件合并成一个分图层的dxf文件相关推荐

  1. linux下将多个文件去除文件头合并_Linux下把多个文件合并成一个文件 - 卡饭网...

    互盾PDF分割合并工具将多个PDF文件合并成一个PDF文档 互盾PDF分割合并工具将多个PDF文件合并成一个PDF文档     互盾PDF分割合并工具将多个PDF文件合并成一个PDF文档 一.下载并安 ...

  2. 怎么让两个java文件关联,怎么把多个excel文件合并成一个【几个excle合并成一个】...

    怎么把多个excel文件合并成一个 新建一个BOOK文件,按Alt F11这二个键,VBA编辑界面,点击编辑的菜单:"插入"--"",然后在里面完整复制下面的代 ...

  3. 将一个excel多个文件合并成一个文件的多个sheet

    将一个excel多个文件合并成一个文件的多个sheet 1.在新建文件夹目录下,将需要合并的excel文档放到该目录下 2.新建一个空白文档,将鼠标移动到sheet工作表上,单击右键,选择" ...

  4. excel如何把多张表合并成一个表_如何将多个excel文件合并成一个文件-多个excel文件合并成一个excel表的方法 - 河东软件园...

    Excel是我们最常用的数据处理软件,而在我们使用Excel时,常常会处理同一类的数据,例如,我们制作月度报表,那么在年末时我们共积累了1至12月的月度报表,这时我们的Excel的文档将多达12个,实 ...

  5. 多个txt文件合并成一个文本

    如何将多个txt文件合并成一个文本 (1)将多个txt文件放在一个文件夹下. (2)编写一个批处理文件,里面的命令为type *.txt >a.txt (3)执行该批处理文件,则所有txt文件合 ...

  6. peel在Linux生成excel,如何将多个Excel文件合并成一个且保留原有数据?

    如何将多个Excel文件合并成一个且保留原有数据?事实上,我们可以借用Excel宏命令来处理该操作,并且保留原有数据,建立多个Sheet页,具体操作请看下文多个Excel文件合并成一个的方法. 如何将 ...

  7. 将多个月的nc数据文件合并成一个(月平均)

    将多个月的nc数据文件合并成一个(月平均) 最近在处理nc数据,希望可以获得多年的月平均数据.但是ERA这个产品从网站上下载到的是每个月的日数据,所以我希望可以把他合成一个,以每个月月平均数据存储的n ...

  8. CDR文件怎么转换为PS分图层文件

    做平面设计时为了作图需要我们经常要把cdr的文件转换为psd格式的分图层文件,CorelDRAW是常用的矢量图形制作工具,Photoshop是功能强大的图像处理软件,在做一些设计作品的时候两款软件偏重 ...

  9. Springboot——多个pdf文件合并成一个工具类编写

    文章目录 前言 实现 依赖引入 工具类编写 前言 最近接了一个需求,客户觉得一个合同导出多项类型的pdf数据,不够直接明了,需要将多个pdf文件 合并 成一个pdf. 实现 依赖引入 编写工具类之前, ...

最新文章

  1. 同时上哈佛,还一起一作发Nature!这对95后学霸情侣让人慕了……
  2. C++知识点62——模板实参推断与函数模板的特化
  3. 1.为什么使用spring boot
  4. html5如何传递值,如何将var中的值传递到另一个var
  5. linux之修改dns以及用netmask修改ip和网关
  6. CEPH FILESYSTEM
  7. 工作274:ele-图标使用
  8. python常见的运算符有哪些_python基础知识--4常见运算符
  9. SAP License:OAYZ中的使用年限无法更改
  10. 2021-06-18 链接标签
  11. 蚂蚁课堂视频笔记+笔记对应源码+思维导图下载地址
  12. QXDM 存储log的方法
  13. 杭电1003 java_杭电ACM 1003题
  14. 在线php中文手册,JavaScript中文参考手册
  15. Kotlin知识积累——let,with,run,apply,alse的用法
  16. 类和对象11:描述符方法
  17. 对比分析折半查找与Fibonacci查找算法
  18. echarts水球图-动态波纹百分比数据显示
  19. Hadoop十年解读与发展预测
  20. CPD配准算法及代码的简单理解(Coherent Point Drift)

热门文章

  1. 学java有什么技巧?
  2. 10个最受欢迎的 JavaScript 框架,它们的主要特征和功能
  3. 华为仿苹果字体_苹果手机和华为手机,同样的网络下为何我的手机网速这么差?...
  4. python创建person类用printinfo方法_python基础练习题7
  5. 服务器需要哪些芯片,云计算的服务器需要芯片
  6. sql server 多条记录数据合并为一条_面试必备sql知识点——MySQL基础
  7. qt绘图事件(画刷的填充)
  8. python怎么弄成白色背景_使用PIL python将白色背景转换为透明背景
  9. mysql 存储引擎_MySQL存储引擎
  10. 用另一种方式来讲解代理模式~