尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

用ACadSharp轻松处理CAD文件:6个从零上手的实用步骤

用ACadSharp轻松处理CAD文件:6个从零上手的实用步骤 用ACadSharp轻松处理CAD文件6个从零上手的实用步骤【免费下载链接】ACadSharpC# library to read/write cad files like dxf/dwg.项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp你有没有经历过这种时刻客户丢来三百个DWG图纸要你在一夜之间把每张图里的尺寸标注全部导出来或者手上的图纸是旧版DXF而下游系统只认新版DWG又或者你只是想在程序里生成一张带几条线段的图纸结果发现商业CAD二次开发接口贵得离谱。这种被CAD文件格式卡住的痛很多.NET开发者都踩过。好消息是你不需要买昂贵的商业组件——ACadSharp这个开源库就能搞定DWG/DXF文件的读写、数据提取和格式转换它基于.NET构建跑在Windows、Linux、macOS上都没问题。接下来我用六个步骤带你从零跑通CAD文件处理的全流程。第一步拿到库的两种最快途径先用最省事的方式把ACadSharp装进项目在Visual Studio或命令行里执行Install-Package ACadSharp如果你更想读源码、看实现也可以把仓库克隆到本地构建前记得先初始化子模块git clone https://gitcode.com/gh_mirrors/ac/ACadSharp git submodule update --init --recursive克隆下来的仓库结构值得先逛一圈src/ACadSharp/是核心库本体src/ACadSharp.Examples/里全是可运行的示例代码samples/目录则放好了各种版本的测试图纸练手素材都给你备齐了。第二步版本兼容这张表动手前先看懂CAD文件最烦人的地方就是版本混乱。ACadSharp对版本的支持情况一句话总结就是读取方面从AutoCAD R12到R2021全覆盖写入方面大部分版本都行只有个别老格式不支持写出。文件版本DxfReaderDxfWriterDwgReaderDwgWriterAC1009 (R12)✔✔✘✘AC1012~AC1015 (R13~R15)✔✔✔✔AC1018 (2004)✔✔✔✔AC1021 (2007~2009)✔✔✔✘AC1024~AC1032 (2010~2021)✔✔✔✔记住两个容易踩坑的点老古董AC1009的DWG读不了AC1021的DWG目前不能写碰到这种需求先转成DXF再想办法即可。第三步第一个能跑的程序——把DWG读进内存核心概念只有一个ACadSharp会把整个图纸读成一个CadDocument文档对象图纸里的所有东西——实体、图层、线型、文字样式——都挂在这个对象下面。最小的读取程序长这样using System; using ACadSharp; using ACadSharp.IO; class Program { static void Main(string[] args) { // 一行代码把 dwg 文件读成内存里的文档对象 CadDocument doc DwgReader.Read(C:\drawings\floor_plan.dwg); // ModelSpace 就是模型空间图纸上画的东西都在这儿 Console.WriteLine($模型空间共有 {doc.ModelSpace.Entities.Count} 个实体); // 图层这类表数据也能直接遍历 foreach (var layer in doc.Layers) { Console.WriteLine($图层{layer.Name}); } } }运行后你会看到类似这样的输出先是模型空间的实体数量然后是一串图层名比如墙体标注家具之类。这一步跑通了说明环境没问题可以开始玩真的了。第四步进阶实战——批量提取CAD实体数据到CSV假设你手上有一整个目录的DWG图纸需要把每条线、每个圆的信息汇总到一张表格里。手动操作不现实用代码批量跑才是正解using System; using System.IO; using ACadSharp; using ACadSharp.Entities; using ACadSharp.IO; class BatchExtractor { static void Main(string[] args) { string[] files Directory.GetFiles(C:\drawings, *.dwg); using (var writer new StreamWriter(C:\out\entities.csv)) { writer.WriteLine(文件,类型,图层,关键信息); foreach (string file in files) { // 挂上通知回调读取过程的警告和错误都会汇聚到这里 CadDocument doc DwgReader.Read(file, onNotification); string fileName Path.GetFileName(file); // 遍历模型空间里的每个实体按类型提取几何信息 foreach (var entity in doc.ModelSpace.Entities) { string info entity switch { Line line $起点({line.StartPoint.X},{line.StartPoint.Y}) → 终点({line.EndPoint.X},{line.EndPoint.Y}), Circle c $圆心({c.Center.X},{c.Center.Y})半径{c.Radius}, _ string.Empty }; writer.WriteLine(${fileName},{entity.GetType().Name},{entity.Layer.Name},{info}); } } } Console.WriteLine(批量提取完成去打开 entities.csv 看看吧); } // 通知回调不打断流程先把问题打印出来留个底 static void onNotification(object sender, NotificationEventArgs e) { Console.WriteLine($[{e.NotificationType}] {e.Message}); } }这段代码的妙处在于实体类型判断用的是C#的switch表达式想加圆弧、多段线、尺寸标注只需要在模式列表里加几个分支。比如尺寸标注是Dimension类型它的Measurement属性直接就是测量值配合dimension.GetType().Name就能区分是线性标注还是半径标注整理成表格特别方便。如果你的图纸比较脏读取时经常遇到坏数据记得在读取前配置一下容错开关var config new DwgReaderConfiguration { Failsafe true, // 遇到异常数据尽量跳过而不是整个崩溃 IgnoreProxyGraphics true, // 跳过代理图形省内存 ReadSummaryInfo false, // 不读文件摘要读取更快 }; CadDocument doc DwgReader.Read(C:\drawings\messy.dwg, config, onNotification);第五步反向操作——新建图纸、写入文件、DWG转DXF读取练熟了试试造图。ACadSharp不仅能读还能从零创建文档并写出DWG/DXFusing ACadSharp; using ACadSharp.Entities; using ACadSharp.IO; using CSMath; class CreateDrawing { static void Main(string[] args) { // 从零创建一张新图纸默认版本 AC1032 CadDocument doc new CadDocument(); // 画一条直线从 (0,0) 到 (100,50) var line new Line(new XYZ(0, 0, 0), new XYZ(100, 50, 0)); doc.ModelSpace.Entities.Add(line); // 再画一个圆圆心 (50,25)半径 20 var circle new Circle { Center new XYZ(50, 25, 0), Radius 20 }; doc.ModelSpace.Entities.Add(circle); // 导出为 DXF第三个参数传 true 表示二进制格式 DxfWriter.Write(C:\out\shape.dxf, doc, binary: true); // 也能直接写 DWGAutoCAD 双击就能打开 DwgWriter.Write(C:\out\shape.dwg, doc); } }现在你手里多了一张一条线加一个圆的图纸。想不想验证一下把生成的DXF再读回来数数实体数量你会有种闭环了的成就感。再送一个超实用的转换场景DWG转DXF全程只需三步——读进来、建个writer、写出去CadDocument source DwgReader.Read(C:\in\old_plan.dwg); DxfWriter.Write(C:\out\old_plan.dxf, source, binary: false);反过来DxfReader.Read(...)配DwgWriter.Write(...)就是DXF转DWG双向转换就这么简单。第六步常见问题自救手册练手过程中你大概率会遇到下面几个问题提前看答案能少走弯路问题一读取某些DWG文件时直接抛异常先确认文件版本在支持范围内回头看第二步那张表。再检查配置里Failsafe是否为true它能保证遇到损坏数据时尽量跳过而不是崩溃。如果想确认文件是不是真的坏了打开CrcCheck让读取器做完整性校验代价是速度明显变慢。问题二内存占用太高图纸太大读不动DXF场景可以只读实体不构建完整文档using (var reader new DxfReader(C:\drawings\big.dxf)) { var entities reader.ReadEntities(); // 只拿实体列表表格、字典都不建 // 逐个处理 entities 里的对象 }同时把ReadSummaryInfo关掉、跳过代理图形都能省下一大块内存。问题三写出的文件AutoCAD打不开九成是版本问题先确认当前版本能写DWGAC1021就不行再检查实体是否引用了不存在的图层或线型。新建文档时如果用默认的new CadDocument()它会自动带好0图层Continuous线型等标准表项问题基本不会出现。问题四想自定义实体类型怎么下手可以继承现有实体比如Line重写InitializeDxfMapping方法把你自己的属性挂到DXF组码上再配合src/ACadSharp/Attributes/里的DxfCodeValue特性完成序列化映射。这块的完整示例可以参考src/ACadSharp.Examples/下的代码。下一步把轮子用到你的项目里六步走完你已经掌握了ACadSharp最核心的用法读取、遍历、批量提取、创建、写入、转换。接下来建议三件事一是把docs/目录下的文章翻一遍里面有不少面向特定实体尺寸标注、填充、多段线的专题二是拿src/ACadSharp.Examples/里的示例当食谱遇到什么实体不会处理就去翻对应的例子三是把samples/里的各种版本图纸当成练习材料多读几张你的容错处理经验自然就积累起来了。CAD文件处理这条路工具选对了剩下的就只是想象力的问题了。去试试吧祝你不再加班改图。【免费下载链接】ACadSharpC# library to read/write cad files like dxf/dwg.项目地址: https://gitcode.com/gh_mirrors/ac/ACadSharp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表