当前位置:   article > 正文

C#批量提取DXF文件中的尺寸,公差和形位公差_c# 读取cad 尺寸标注

c# 读取cad 尺寸标注

背景

在制造业中,工艺资料,测量报告,实验报告等资料中,需要用到工程图纸中的尺寸,形位公差等信息。而这些工程图由于是不同的辅助软件生成。如 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();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

输出结果及与工程对纸的关系如下图:
在这里插入图片描述
输出最终字符串如下。
\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文件的控制码。可以通过字符串处理方式最终实现下图所示的效果,在这里我就不再加以说明。希望对需要的人有一定的帮助。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/114309
推荐阅读