一、前言

需求:
项目要求识别CAD图纸(图纸内容与现实事物比例是1:1)中的内容,并提取出一些关键信息。

这里的CAD图纸是指CAD文件,包含多种格式,dwg/dxf/dwf/stl/pdf等等。
识别其中内容,主要指文件中的图元信息(也叫实体Entity),指线段、圆弧、矩形等图形元素。
得到图元基础信息(比如长度、坐标、粗细)后,进一步做处理(如得到交点、得到线段间间隔、圆弧与线段切点等)。

分析:
听起来有点难,因为作为软件工程师,对CAD相关事物并不了解,它是未知的;但同时也挺有意思,因为它确实是一个活的需求,并且有一定可行性。

  1. 图像识别
    拿到需求后,我第一反应是用图像识别(视觉)的相关技术去做,对特征图形生成模型,做匹配。
    但是,

    • 由于图的实际尺寸很大,比例是1:1,如果生成大图,用图像处理那套去做,估计消耗计算资源会相当大。
    • 如果做一定比例缩小,生成缩小图,可能会因为缩的太小(缩太小有些图元可能就不好识别),没法用模板匹配了。

    而且如何将各种格式的文件转成图片也是一个问题(总不能要求别人都用CAD打开另存为吧)。
    总之,图像识别的方法有一定可行性,但也存在许多不确定性。

  2. 文件内容识别
    换个角度想,CAD图纸其实是某种格式的文件,用AutoCAD可以打开它们,并将内容呈现出来。
    文件肯定是按一定的文件结构存放内容的。我要是能知晓CAD存放结构,按结构解析其内容就能得到其中的图元信息。
    于是,第二种方式,就是找CAD文件解析库或者得到CAD的文件结构自己动手解析。
    这种方法在CAD文件内容提取阶段的优势很明显:

    • 解析出来的内容是原始数据,不存在精度问题;
    • 解析也不需要消耗大量资源,只是按一定格式/协议读取并解析文件。

对比&总结:
两种方式对比下来,
图像识别/处理的方法在前期不太好实施。
但在后期内容处理阶段,不考虑效率的情况下,图像识别是有优势的,它可以借助图像处理算子,如通过模板匹配直接得到目标。
而解析CAD文件结构得到的信息,需要通过数学运算+逻辑判断来做处理。虽可控度较高,但是逻辑处理多,容易出错。

综合来讲,个人还是倾向于解析文件结构的方式。因为它整体比较可控。


二、调研过程

明确了大方向后,下一步就是看看网上有没有类似案例。
看了一圈下来,发现相关的CAD解析案例挺多的。
解析的格式集中在dxf和dwg这两种,其中dxf尤其多。

现在,有必要对CAD的主流格式以及相关知识进行了解。

2.1 CAD相关

之前只知道CAD是画图的,
其实CAD是计算机辅助设计(CAD-Computer Aided Design)的缩写。

而说到CAD软件,首先提到的必定是其鼻祖——AutoCAD

AutoCAD是国际上著名的二维和三维CAD设计软件,是美国 Autodesk(欧特克) 公司首次于1982年生产的自动计算机辅助设计软件,用于二维绘图、详细绘制、设计文档和基本三维设计。

AutoCAD这个软件并不是免费的,但是网上有大量破解版。

题外话,
经常会听到一些公司,收到了Autodesk的告知/律师函,就是公司有人用了盗版/破解版的AutoCAD被Autodesk发现了,Autodesk给你公司发函要求更换正版。然后公司it会找到设计人员、技术人员,让他们删软件。通常软件删了就没事了,如果一直不删,也不买正版,闹到最后可能会有巨额罚款。当然这也跟你公司规模有关,小公司或个人,Autodesk是懒得给你发函和打官司的。
据说Autodesk靠着告人打官司,每年也能盈利不少钱。(主要这软件太流行了,用的人确实多;国内版权意识相对较弱,于是到处都用破解版)

看得出来,Autodesk是非常注重版权的。

2.2 DWG

dwg是AutoCAD和基于AutoCAD的软件保存设计数据所用的一种专有文件格式,始于1970年代的一套Interact CAD软件。

Autodesk于1982年取得版权开始使用这种文件格式。Autodesk公司拥有、开发并且更新DWG文件格式,通常每隔几年DWG就会随着该公司在AutoCAD中添加新的特性从而进行更新。

换言之,dwg是Autodesk专用的格式

所以很长一段时间里,dwg是Autodesk特有的,不允许别人使用。
后来,一个漂亮国组织ODAOpen Design Alliance,开放设计联盟),破解了dwg格式。于是Autodesk和该组织打起了官司…

所以早期用AutoCAD打开非Autodesk生成的DWG时,会弹出 “非AutodeskDWG。此DWG文件由非Autodesk开发或许可的软件应用程序保存。将此文件与AutoCAD软件一起使用可能导致稳定性问题。”
在这里插入图片描述
不过后来也不知道啥原因,Autodesk也似乎默许了ODA的存在,也不强行弹窗了。

就结果来看,ODA确实一定程度上打破了Autodesk的垄断,现在大大小小的公司,都与该组织合作,开发自己的CAD软件。

国内比较有名的中望CAD、浩辰等,都是与该组织合作的,从ODA官网也可以看到。
在这里插入图片描述

2.3 DXF

DXF是Drawing eXchange Format(图纸交换格式)的缩写,是一种开放标准的CAD文件格式,里面包含了2D或3D CAD图形,以及相关的元数据和属性。

DWG是专有格式,只能被Autodesk公司的软件读取和编辑。而DXF是开放标准格式,可以被任何支持该格式的CAD软件读取和编辑

2.4 小结

了解了上面几点之后,也不难理解,为什么网上的案例都是针对dwg和dxf的,且以dxf居多。

因为很长时间内,CAD是被Autodesk垄断的,而dwg是Autodesk的专有格式,所以dwg在市面上居多。但dwg又是有版权的,不是你想读就能读的,所以dxf这种开放标准的格式更流行(指在网上)。

那本文主要介绍如何读取并解析这两种格式的文件。


三、解析CAD的库

找解析CAD的库时,有两种思路,一种是找开源的,另一种是找PoJie的。

本文主要介绍(免费的)开源 工具库。
网上可以搜到很多解析库,Nuget包管理器中通过dwg、cad等关键字也可以看到许多库。
它们大多是商业库(有自己的协议许可),如Aspose.CAD、CAD.NET、Atalasoft、BricsCAD等。
也有一些开源的,如ACadSharp(MIT)、netDxf(MIT)等。

商业库用法简单,但是你得买它们许可证,或者申请试用版(通常有期限,并且功能限制,总之体验一般)。

许可证价格一般一年要几千刀,规模小会便宜些,但折算RMB也是破万的。总之如果你想在程序中使用它,并不便宜。

上面提到了两个开源库,一个是ACadSharp,另一个是netDxf。
其中ACadSharp这个库还处在alpha版本,虽然已经支持了多个版本的dxf和dwg,但作者仍在完善中(部分功能在重构)。如果你打算用到项目中,现阶段可能还不是很理想。

3.1 netDxf

netDxf相对来说比较成熟,且一直在更新,但它是专用于dxf格式的。
在这里插入图片描述

3.2 Teigha

此外,还有上面提到的ODA组织,它为多平台提供了支持,.NET下的叫 Teigha for .NET

虽然它破解了dwg格式造福大众,但这并不意味着它真的不需要一分钱,正如它自己所说,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

它将自己定性为一个非营利性的技术组织,它们开发软件只为了会员的利益。
你要用它们的软件,那得成为会员,而加入会员就需要交会费。
很合理吧。
这个价格看起来并不便宜,首年6000刀,往后每年3600刀。
你可能会想,AutoCAD也就多少钱一年,你这怎么这么贵?
但两者不一样,AutoCAD是给你软件使用权,ODA是给你核心技术。
前者是买来用,后者是交钱拿技术自己开发/当然也能用。

题外话,
Autodesk不是ODA会员,而几乎所有的Autodesk竞争对手都是ODA会员。
Autodesk对ODA可谓恨之入骨,其CEO Carl Bass甚至还将ODA比喻为“敌人的军火提供商”。
虽说ODA是Autodesk的死对头,但实际上ODA对AutoCAD的成功做出了非常重要的贡献,因为它使非Autodesk客户仍然可以继续使用DWG文件作为其主要的数据交互格式,实现与AutoCAD的数据交互。目前就全球的使用比例来看,二维CAD的普及率依然远高于三维CAD,而且这种局面在未来几年仍将持续。

3.2.1 官网获取

说了这么多,怎么获取呢ODA的Teigha库呢,难道真的要成为ODA会员吗?
也不是,ODA是有提供免费试用版,
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
填个表,60天试用,并且有免费的技术支持。

3.2.2 网上获取

当然若你不想注册,百度一下也可以找到许多Teigha的库。
具体版本和使用可以参考这篇博客,

这篇博客


四、图形计算

通过上面几步,应该可以从CAD文件中读出图元了。
下一步对图元做数学运算,算出交点、距离等信息。
Teigha本身包含图形计算的功能,
此外,这里再推荐一个库——NetTopologySuite,它是专门用来处理二维线性几何的。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐