C#批量提取DXF文件中的尺寸,公差和形位公差

您所在的位置:网站首页 CADA5图纸的尺寸 C#批量提取DXF文件中的尺寸,公差和形位公差

C#批量提取DXF文件中的尺寸,公差和形位公差

2024-04-03 11:36| 来源: 网络整理| 查看: 265

背景

在制造业中,工艺资料,测量报告,实验报告等资料中,需要用到工程图纸中的尺寸,形位公差等信息。而这些工程图由于是不同的辅助软件生成。如 AutoCAD, UG,Catia等。需得到这些尺寸标注现实中比较常见的方式有: 1、根据图纸标注,人工手动输入到EXCEL当中。 2、通过辅助软件自身的二次开发功能,自动提取到EXCEL中。 第1项缺点明显,首先是效率低,其次容易出错,最头疼的是一旦,图纸变更,容易遗漏变更项,还必须得手动再次输入。 第2项,优点是效率高不易出错,缺点是不同公司采用的辅助软件可能不一样。要想高效的实现数据通用,学习曲线比较高。

我的解决方案

通过读取DXF文件来批量获取标注和形位公差。 DXF文件是AutoDesk公司用来与其它辅助设计软件,进行数据交换的文档格式。具体文件构架可参阅AutoDesk官网。它可以将不同的辅助设计软件的图纸另存为DXF格式,以实现通用性。对DXF文件读取的方式如下:

1、采用AutoCad二次开发来读取dwg文件的块结构来获取标注和形位公差。 缺点是:这种方式必须安装AutoCad软件,企业中实际设计时用到UG或Catia工具较多,涉及到版权之类的,这类方式实用性不强,最终放弃。 2、采用第三方控件(组件)。 优点是可独立AutoCad环境。缺点是基本上都是要收费的。有破解的对高版本DXF文件支持不友好,还有就是开发说明文档较少。最终放弃。 3、通过开源项目。 优点是可独立AutoCad环境,不收费(根据许可而定)。缺点就是有的项目编译成功率不高(视情况而定,可能跟我是一个菜鸟有关)。我本次采用的方案是一个名为NetDxf的开源项目。可从下面的连接获取。

https://github.com/haplokuon/netDxf.git 源码中有开发文档帮助和实例,但我要实现的功能实例中没有。 我将在下面的具体说明中展示。

具体的实现

有工程图纸(1.dxf)如下: 在这里插入图片描述 实现批量提取尺寸,尺寸公差和形位公差的代码如下: 1、首先需要编译这个开源项目在debug目录中会生成一个netdxf.dll的库文件。 2、新建C#控制台程序。 3、在项目引用中导入netdxf.dll库。

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using netDxf; using netDxf.IO; using netDxf.Entities; using netDxf.Tables; using netDxf.Blocks; namespace Mdxf { static class Program { /// /// 应用程序的主入口点。 /// [STAThread] static void Main() { DxfDocument dxfDocument = DxfDocument.Load("1.dxf"); //载入1.dxf文件 List Dimlist = new List(); //声明一个Dimlist列表,用于存放dxf文件中尺寸标注。 List TolList = new List(); //声明一个TolList列表,用于存放形位公差。 foreach (Block block in dxfDocument.Blocks) { //遍历dxf文档中的块。 if (block.Name.Contains("*D")) {//*D为dxf文件架构中用于存储标注的匿名块。 foreach (EntityObject entityObject in block.Entities) { Dimlist.Add(entityObject); //将获取到的标注块添加到Dimlist列表中。 } } else if (block.Name.Contains("*Model_Space")) {//*Model_Space指AutoCAD软件的模型界面。只有从这里才能获取到形位公差。 foreach (EntityObject entityObject in block.Entities) { TolList.Add(entityObject); //将获取到的形位公差添加到TolList列表中。 } } } //下面是批量输出尺寸及公差。 Dimlist.ForEach((i) => { if (i.GetType() == typeof(MText)) //首先要判断,列表中的类型是不MText(多行文本类型) { MText DimText = (MText)i; //由于EntityObject是一个抽象类,所以这里要强制转换具体的实现类MText)i。 Console.WriteLine(DimText.Value); //控制台输出尺寸及公差。 }; }); //下面是批量输出形位公差。 TolList.ForEach((i) => { if (i.GetType() == typeof(Tolerance)) //首先要判断,列表中的类型是不Tolerance(公差类型) { Tolerance TolText = (Tolerance)i; //由于EntityObject是一个抽象类,所以这里要强制转换具体的实现类(Tolerance)i。 Console.WriteLine(TolText.ToStringRepresentation()); //控制台输出尺寸及公差。 }; }); Console.ReadKey(); } } }

输出结果及与工程对纸的关系如下图: 在这里插入图片描述 输出最终字符串如下。 \A1;12.8721 \A1;?4.4818 \A1;90°±1° \A1;7.9439±0.2000 \A1;R2.2409\S+0.1000^ -0.0000; \A1;12.8721\S+0.0000^ -0.1000; \A1;90°\S+0°^ -1°; \A1;90°\S+1°^ -0°; \A1;14.6007 \A1;11.2820 {\Fgdt;j}%%v0.1%%v%%vA%%v%%v {\Fgdt;r}%%v0.2%%v%%vA%%vB%%v {\Fgdt;j}%%v0.3%%v%%vA%%vB%%vC {\Fgdt;j}%%v{\Fgdt;n}0.4{\Fgdt;m}%%v%%vA%%vB%%vC {\Fgdt;j}%%v{\Fgdt;n}0.5{\Fgdt;m}%%v%%vA{\Fgdt;m}%%vB{\Fgdt;m}%%vC {\Fgdt;j}%%v{\Fgdt;n}0.6{\Fgdt;m}%%v%%vA%%vB%%vC^J{\Fgdt;j}%%v{\Fgdt;n}0.7%%v%%vA%%vB%%v {\Fgdt;j}%%v{\Fgdt;n}0.8{\Fgdt;m}%%v%%vA{\Fgdt;m}%%vB{\Fgdt;m}%%vC{\Fgdt;m}^J{\Fgdt;a}%%v0.9%%v%%vA%%v%%v

这些输出是DXF文件的控制码。可以通过字符串处理方式最终实现下图所示的效果,在这里我就不再加以说明。希望对需要的人有一定的帮助。 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3