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

背景

在制造业中,工艺资料,测量报告,实验报告等资料中,需要用到工程图纸中的尺寸,形位公差等信息。而这些工程图由于是不同的辅助软件生成。如 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文件的控制码。可以通过字符串处理方式最终实现下图所示的效果,在这里我就不再加以说明。希望对需要的人有一定的帮助。
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值