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

read_image (Image, '未标题-1.png') threshold_sub_pix (Image, Border, ) select_shape_xld (Border, defectsXLD_Skin, 'area', 'and', , )
select_shape_xld (Border, defectsXLD_H, 'area', 'and', , )
select_shape_xld (Border, defectsXLD_I, 'area', 'and', , )
select_shape_xld (Border, defectsXLD_J, 'area', 'and', , ) write_contour_xld_dxf (defectsXLD_Skin,'dxfs/defectsXLD_Skin.dxf')
write_contour_xld_dxf (defectsXLD_H,'dxfs/defectsXLD_H.dxf')
write_contour_xld_dxf (defectsXLD_I,'dxfs/defectsXLD_I.dxf')
write_contour_xld_dxf (defectsXLD_J,'dxfs/defectsXLD_J.dxf')
concat_obj (defectsXLD_Skin, defectsXLD_H, XLDs)
concat_obj (XLDs, defectsXLD_I, XLDs)
concat_obj (XLDs, defectsXLD_J, XLDs)
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
请先阅读完上面两篇资料再往下阅读。
LAYER LAYER 0 //图层名 7 //图层颜色 CONTINUOUS
上面第二篇资料较好地解决了这个问题,但是在通用性上还有完善的空间,其实方法可以封装得更完善一些。即:
① 用于合并的文件个数可能是不定的,可以是2个、3个、4个、5个或者更多。(方法传入参数个数可变)
② 每个文件所占据的图层号可能是不定的,并且对应的线条颜色也可能是不定的。
我针对如上两个问题进行了重新封装。封装后的方法的使用demo完整程序如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace WindowsForm_dxf分层
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
string path_Skin = @"I:\666\dxfs\defectsXLD_Skin";
string path_H = @"I:\666\dxfs\defectsXLD_H";
string path_I = @"I:\666\dxfs\defectsXLD_I";
string path_J = @"I:\666\dxfs\defectsXLD_J";
string path_combine = @"I:\666\dxfs\combine----"; CombineDxfs(path_combine, path_Skin, path_H,path_I);
MessageBox.Show("dxf混合成功 !");
} public void CombineDxfs(string path_combine, params string[] path_parts)
{ int _count = path_parts.Length; //获得需合并的各个.dxf文件的个数
List<string> dxfsTextList = new List<string>(); //存储各个.dxf文件中的文本的List
List<StreamReader> streamReaders = new List<StreamReader>(); ////存储各个StreamReader实例的List for (int i = ; i < _count; i++)
{
//将各个.dxf文件中的文本依次添加到dxfsTextList的item中
StreamReader streamDxf = new StreamReader(path_parts[i] + ".dxf");
streamReaders.Add(streamDxf);
dxfsTextList.Add(streamDxf.ReadToEnd()); //指定各个.dxf文件所在的图层数和线条颜色代号
switch (i)
{
case :
dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 5, 3);
break; case :
dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 2, 4);
break; case :
dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], 3, 7);
break; case :
dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], , );
break; case :
dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], , );
break; default:
dxfsTextList[i] = SetDxfLayer_Color(dxfsTextList[i], , );
break; } } //将所有.dxf文件的文本合并到第一个文件中
for (int i = ; i < _count - ; i++)
{
dxfsTextList[0] = dxfsTextList[0].Replace("EOF", "\r\n" + dxfsTextList[i + 1]);
} //将dxfsTextList[0]的文本写入到路径为path_combine的.dxf文件中。
StreamWriter combineText = new StreamWriter(path_combine + ".dxf");
combineText.Write(dxfsTextList[]);
combineText.Flush();
combineText.Close(); //依次关闭各个streamReader
foreach (var streamDxf in streamReaders)
{
streamDxf.Close();
} } //指定各个.dxf文件所在的图层数和线条颜色代号
private string SetDxfLayer_Color(string text,int Layer_Num, int Color_Num)
{
text = text.Replace("\r\n", "#"); //为增强文本可读性,将\r\n替换为#
text = text.Replace("8##", "8#" + Layer_Num + "#"); //指定.dxf文件所在的图层数
text = text.Replace("0#LAYER# 2## 70#0# 62##", "0#LAYER# 2#" + Layer_Num + "# 70#0# 62#" + Color_Num + "#"); //在.dxf文件开头指定其所在的图层数和线条颜色
text = text.Replace("#", "\r\n"); //将#恢复为\r\n return text;
}
}
}


观察“图层号——颜色代号”分别是(0, 7)、(2, 4)、(3, 7)、(5, 3),与代码中的设置相符。
将Halcon导出的多个dxf文件合并成一个分图层的dxf文件的更多相关文章
- windows下多个文件合并成一个文件
如果你拿到的是一堆文件,那么你想把它合并成一个文件来使用,那么按下面的步骤,轻轻松松就可以搞定. 第一步:把所有要合并的文件放到同一个文件下面 第二步:在CMD里面进入到你的文件目录 第三步:输入如下 ...
- python实现将文件夹内所有txt文件合并成一个文件
新建一个文件夹命名为yuliao,把所有txt文件放进去就ok啦!注意路径中‘/’,windows下路径不是这样. #coding=utf-8 import os #获取目标文件夹的路径 filed ...
- 将二级目录下的文件合并成一个文件的Python小脚本
这个小程序的目的是将二级目录下的文件全部合并成一个文件(其实几级目录都可以,只要做少许改动) #coding:utf8 import sys, os def process(path): new_fi ...
- 【转】Python编程: 多个PDF文件合并以及网页上自动下载PDF文件
1. 多个PDF文件合并1.1 需求描述有时候,我们下载了多个PDF文件, 但希望能把它们合并成一个PDF文件.例如:你下载的数个PDF文件资料或者电子发票,你可以使用python程序合并成一个PDF ...
- C#将制定文件夹下的PDF文件合并成一个并输出至指定路径
/// <summary> /// 将源路径下的PDF合并至目标路径下 /// </summary> /// <param name="SourcePath&q ...
- windows下将多个文件合并成一个文件,将ts文件变成MP3格式
①:先把全部的ts文件下载下来放到指定文件夹,这里我是放在桌面的ls里 ②:从cmd进去找到桌面的路径,也可以像我这样直接在桌面的路径上敲cmd进入: ③:直接合并使用命令“copy /b ls\*. ...
- 利用vs pcl库将多个PCD文件合并成一张PCD地图
主机环境:win10系统,pcl库1.11.1, vs2019 pcl库安装以及环境配置如下连接: https://www.jb51.net/article/190710.htm 代码很简单,主要是做 ...
- Hadoop MapReduce编程 API入门系列之小文件合并(二十九)
不多说,直接上代码. Hadoop 自身提供了几种机制来解决相关的问题,包括HAR,SequeueFile和CombineFileInputFormat. Hadoop 自身提供的几种小文件合并机制 ...
- excel多个文件合并
多个excel文件合并成一个需要用ms office wps是不行的 1.将所有文件放在一个文件夹里 2.在文件夹里新建一个空的excel打开 右键sheet点击查看代码->输入下面代码-> ...
随机推荐
- 多目标跟踪baseline methods
参考文献: MOTChallenge 2015: Towards a Benchmark for Multi-Target TrackingLaura Leal-Taix ´e, Anton Mila ...
- IO的概念
什么是IO: 在内存中存在数据交换的操作都可以认为是IO操作 和终端交互:input print 和磁盘交互:read write 和网络交互:recv send IO密集型程序:在程序执行过程中存在 ...
- HDU3488Tour (KM算法)
题意: 有N个点,M个单向边,现在要你设计N条路线覆盖所有的点,每个点都属于且值属于一个环.(为什么是N条边:和最小生成树为什么有N-1条边是一样的证明). 解析: 每个点都有一个喜欢对象(出度 ...
- hibernate映射对象三种状态的分析
一,首先hibernate中对象的状态有 三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate(). get().lo ...
- ambassador 学习三 限速处理
与认证类似ambassador 也是委托给三方的其他服务进行限速处理 基本的环境安装可以参考相关文档,主要还是qotm 服务 官方参考实现的简单限速服务 --- apiVersion: v1 kind ...
- ffmpeg 从内存中读取数据(或将数据输出到内存)(转)
更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...
- linux中bin与sbin目录的作用及区别介绍
linux中bin与sbin目录的作用及区别介绍 本文介绍下,linux中的二个主要目录:bin与sbin,它们的作用与区别,学习linux的朋友可以参考下 在linux系统中,有两个重要的目录:bi ...
- linux用命令行看网线物理连接状态
inux下有两个命令可以看网线状态: ethtool 和 mii-tool 竟然还都要用,由于网卡所支持的协议不同,哪个网卡能用哪个命令是不一定的. [root@rhel demo]# ethtool ...
- CentOS7.2 安装redis 3.0.6集群
1.环境确认 a.系统版本查看 [hadoop@p168 ~]$ cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) b.安装依 ...
- Repeater更具条件为每行数据背景填充颜色
后台代码 protected void RptPosterManager_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.I ...