赞
踩
在制造业中,工艺资料,测量报告,实验报告等资料中,需要用到工程图纸中的尺寸,形位公差等信息。而这些工程图由于是不同的辅助软件生成。如 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 { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { DxfDocument dxfDocument = DxfDocument.Load("1.dxf"); //载入1.dxf文件 List<EntityObject> Dimlist = new List<EntityObject>(); //声明一个Dimlist列表,用于存放dxf文件中尺寸标注。 List<EntityObject> TolList = new List<EntityObject>(); //声明一个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 © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。