尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

凌晨两点还在手动解析CAD文件?用ACadSharp一次搞定DWG与DXF数据提取

凌晨两点还在手动解析CAD文件?用ACadSharp一次搞定DWG与DXF数据提取 凌晨两点还在手动解析CAD文件用ACadSharp一次搞定DWG与DXF数据提取【免费下载链接】ACadSharpC# library to read/write cad files like dxf/dwg.项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp凌晨两点第127张图纸又解析失败了。你面前的脚本卡在一个老的DWG文件上抛出一长串看不懂的二进制错误而明早九点就要把全部门几百张图纸的尺寸数据交上去。手动复制粘贴那又是通宵。如果你也在做CAD文件解析相关工作这个场景大概率不陌生。ACadSharp是一个用C#编写的开源CAD数据处理库专门解决DWG/DXF文件的读取、写入与批量数据提取问题基于.NET Standard 2.0Windows、Linux、macOS都能跑而且完全免费。一、先跑起来三分钟装好包并读出第一张图纸先别研究原理把第一段代码跑通再说。用.NET CLI创建一个控制台项目并安装依赖dotnet new console -o CadDemo cd CadDemo dotnet add package ACadSharp然后粘贴下面这段最小代码它解决一个问题把一张DWG图纸里的所有实体逐个打印出来。using ACadSharp; using ACadSharp.IO; using ACadSharp.Entities; using (var reader new DwgReader(drawing.dwg)) { CadDocument doc reader.Read(); // 整张图读进内存 foreach (var entity in doc.ModelSpace) // ModelSpace 模型空间 { Console.WriteLine(${entity.GetType().Name} | 图层 {entity.Layer.Name}); } }预期输出大致是LINE | 图层 0 CIRCLE | 图层 Walls MTEXT | 图层 Text INSERT | 图层 Furniture对就这么几行。读DXF也一模一样只是把DwgReader换成DxfReader两者的API完全对称。这背后意味着你写一套逻辑就能同时兼容两种格式。二、拆开看看一份CAD图纸在内存里长什么样用了一分钟跑通接下来花两分钟理解它。CAD文件解析的难点在于DWG是二进制、DXF是带组码的文本两种格式结构差异巨大但它们共同描述同一件事一张图里有实体直线、圆、文字、表格图层、文字样式、标注样式和字典组、字段、布局。ACadSharp的做法很简单——把两种格式统一解析成同一个对象树根节点叫CadDocument。你只需要认识这棵树上最常用的几个分支doc.ModelSpace模型空间里的实体集合遍历它就能拿到所有图形元素doc.Layers图层表每个实体都挂在某个图层上doc.BlockRecords块定义表INSERT实体会引用这里说白了CadDocument就是一张CAD图的内存镜像。解析器负责把DWG和DXF各自的方言翻译成这套统一的模型之后你的业务代码只跟对象树打交道再也不碰底层字节。这也是它实现DWG转DXF等格式转换的基础——读进来是一个CadDocument再按目标格式写出去即可。上图是图纸中典型尺寸标注元素的示意这类实体在 ACadSharp 中对应Dimension及其派生类。三、实战演练用20行代码批量提取全部尺寸标注来一个真实任务把某个文件夹里所有DWG图纸的尺寸标注信息提取成一张CSV表格供下游系统核对。需求拆成三步——遍历文件、读取图纸、筛选尺寸实体。using System.IO; using ACadSharp; using ACadSharp.IO; using ACadSharp.Entities; string dir C:\drawings; // 图纸所在目录 using (var csv new StreamWriter(dimensions.csv)) { csv.WriteLine(File,Type,Value,Layer); // CSV表头 foreach (string file in Directory.EnumerateFiles(dir, *.dwg)) { try { using (var reader new DwgReader(file)) { CadDocument doc reader.Read(); foreach (var entity in doc.ModelSpace) { // Dimension 是所有标注类型的基类 if (entity is Dimension dim) { csv.WriteLine(${Path.GetFileName(file)}, ${dim.GetType().Name}, // 标注子类型 ${dim.Measurement:F2}, // 测量值只读 ${dim.Layer.Name}); } } } } catch (Exception ex) { Console.WriteLine($跳过 {file}: {ex.Message}); } } }预期输出CSV内容节选File,Type,Value,Layer floor.dwg,DimensionLinear,1200.00,DIM floor.dwg,DimensionAligned,800.00,DIM door.dwg,DimensionAngular3Pt,45.00,DIMDimension是所有尺寸标注实体的基类它有一个只读的Measurement属性直接给出测量值再配合GetType().Name就能区分线性、对齐、角度等标注子类。如果想进一步转换格式读完之后DxfWriter.Write(out.dxf, doc)一行就能把DWG转成DXF全自动完成CAD文件解析到格式输出的闭环。四、避坑指南新手最容易踩的4个坑光看文档容易踩坑这些是我实际跑项目时遇到的按坑→表现→解决列给你。坑1解析到一半抛异常就整个放弃表现个别坏文件或老版本图纸让整个批处理中断。解决CadReaderConfiguration.Failsafe默认就是true读取器会在出错时尽量跳过损坏部分继续。但如果你自定义了配置记得别把它关掉。另外给每个文件套try/catch坏一个不影响整批。坑2图纸里的实体莫名其妙变少了表现读出来缺实体尤其是一些用AutoCAD扩展开发的图纸。解决那些是未知/代理实体KeepUnknownEntities默认是false读取器会直接跳过。确认自己需要保留时打开它var config new DwgReaderConfiguration { KeepUnknownEntities true // 保留未知实体注意它们不参与几何计算 }; using (var reader new DwgReader(file, null)) { /* 无配置构造函数重载时改用下面写法 */ }更稳妥的用法是走静态入口DwgReader.Read(stream, config)把配置显式传进去。坑3怀疑文件损坏却无法确认表现读出来的图少东西但没报错。解决开启CRC完整性校验。DwgReaderConfiguration.CrcCheck true会校验文件数据块的循环冗余码有问题会明确通知你。代价是读取时间明显变长——所以它默认是关的排查问题时才开。坑4批量循环里忘释放读取器表现处理几百个文件后内存暴涨、句柄耗尽。解决DwgReader内部持有文件流务必用using包裹或者读完立即reader.Dispose()。五、让它更快3个立竿见影的优化技巧图纸批量解析的瓶颈通常不在CPU而在IO和整段读取。三个改动立刻见效技巧1关掉代理图形段少读一块数据DwgReaderConfiguration.IgnoreProxyGraphics默认为true即跳过代理图形段。如果你不关心第三方插件画的代理图形保持默认即可万一你改成了false改回来就能省下可观的读取时间。技巧2别在性能路径上开CRC校验CrcCheck一旦开启读取速度会大幅下降。生产环境默认保持false只在验收或排查文件完整性时临时开启。技巧3多文件用并行读取注意控制并发读多个互不相关的DWG时并行化收益明显Parallel.ForEach(Directory.GetFiles(dir, *.dwg), new ParallelOptions { MaxDegreeOfParallelism 4 }, file ProcessFile(file)); // ProcessFile 内部含 try/catch并发数建议4左右因为大图解析本身吃内存开太多线程反而把内存打爆。六、总结与下一步这一路下来你应该已经掌握用DwgReader/DxfReader一行读取CAD文件、用CadDocument对象树访问实体与图层、用Dimension.Measurement批量提取尺寸数据、最后再用DxfWriter完成格式转换。ACadSharp能覆盖的远不止这些——动态块、代理实体、SVG导出、表格读取都有对应的API遇到新需求先去翻 src/ACadSharp/IO 和 src/ACadSharp/Entities 目录绝大多数常见实体都找得到。想自己跑通整套流程仓库里带了一批从AC1009到AC1032各版本的示例DWG/DXF文件见 samples 目录克隆仓库git clone https://gitcode.com/gh_mirrors/ac/ACadSharp后可以直接当测试数据用。下一篇我打算写如何在服务端把DWG批量转PDF/图片有兴趣的欢迎评论区留言人多我就安排上。【免费下载链接】ACadSharpC# library to read/write cad files like dxf/dwg.项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表