资讯动态

SolidWorks工程图转DWG:C#实现批量导出、1:1比例与映射模板

发布时间:2026/10/5 4:27:07 来源:尧图企业网站定制
做 CAD/CAM 集成的人基本都遇到过这个事SolidWorks 工程图画完了下游车间或外协厂只要 DWG你右键另存为图能打开但要么尺寸不对、要么图层全挤在 0 层。第一版自动化导出工具我直接用默认参数跑完结果 20 张图纸有 15 张被工艺那边打回来。后来老老实实研究映射模板和比例参数用 C# 调用 SolidWorks API 把整套流程固定下来才真正消停。这篇文章就是把我验证过的方案整理出来重点讲三件事自定义映射模板怎么准备、C# 怎么把它交给 SOLIDWORKS 导出流程、怎么保证输出结果是 1:1 而不是按图纸比例缩放。适合要做批量图纸转换、或者正在被下游逼着交付规范 DWG 的朋友参考。1. 为什么默认导出 DWG 总在比例和图层上翻车1.1 图纸比例和 DWG 模型空间比例是两套逻辑SOLIDWORKS 工程图里的图纸比例本质上只是一个显示逻辑。图框里写 1:2意思是视图元素按实际尺寸的一半画在图纸空间里标题栏里的比例栏只是给看图人看的。你在这张图上标注一条 400mm 的边视图里那条线的长度显示为 200mm但标注的数值仍然是 400。导出 DWG 时就出现了一个关键选择模型空间里的图元是按实际尺寸摆放还是按图纸显示比例摆放默认情况下SOLIDWORKS 会受图纸比例影响所以 1:2 的图纸导进 DWG 之后用 DI 命令去量那条边量出来的结果很可能是 200 而不是 400。这个问题在单张图纸导出时还不致命因为下游拿到图之后可以整体缩放回来。但在批量交付场景里没有人愿意每天帮你猜比例。图纸上明明标着 400量出来是 200谁会放心用这张图去下料所以一比一导出的真实含义是把图纸比例对输出几何的干扰彻底去掉让 DWG 模型空间里的单位就是零件的实际尺寸单位。1.2 默认图层映射离企业制图标准差得太远第二个翻车点是图层。SOLIDWORKS 默认导出 DWG 时有自己的基本映射规律但那是给能打开图设计的不是给能直接进生产流程设计的。一线做工艺、加工的人打开一张 DWG 首先干的事就是开图层面板看尺寸层、文字层、中心线层、剖面线层是不是分得清清楚楚。如果所有图元都堆在一两个层里线型颜色一团糟那这张图在车间手里就是一张废图。更麻烦的是每家企业的图层标准不一样。有的用中文图层名有的用英文编号有的把尺寸和公差放一层有的必须分开。默认映射不可能满足所有企业的图纸规范所以必须有自定义映射模板把哪类 SOLIDWORKS 图元落到哪个 DWG 图层、什么颜色、什么线型这个对应关系固定下来。1.3 人工操作根本没法保证一致性可能有人会说导出对话框里不是有映射和比例选项吗手动勾一下不就行了。单张图当然可以但问题是批量。一个项目三四十张工程图每张都手动设置一次映射模板、手动确认比例不但效率低而且人只要分神一次就会漏设置或选错交付结果完全不可控。用 C# 写自动化导出核心价值不在于把单张图导得多漂亮而在于把每次导出的质量用代码锁死。同样的代码、同样的映射模板、同样的比例参数跑一百张图的结果是一致的。下游拿到的每一张图都是同一个标准这个价值在大批量交付场景里是纯手工操作完全比不了的。2. C# 工程准备连接 SOLIDWORKS 并打开图纸文档2.1 三种连接方式与推荐选择C# 调用 SOLIDWORKS API连接实例的方式大致有三种附加到正在运行的 SOLIDWORKS 实例通过Marshal.GetActiveObject(SldWorks.Application)获取适合工程师本地手动打开软件后再跑工具。用Activator.CreateInstance(Type.GetTypeFromProgID(SldWorks.Application))创建一个新实例适合服务端或无人值守批处理。通过 ROTRunning Object Table更精确地定位实例适合开了多版本 SOLIDWORKS 的场景。我实际做项目的最常用第一种。批处理工具通常是工程师自己电脑上跑的SOLIDWORKS 已经打开直接拿到当前实例就可以操作当前图纸和工作目录。这个方案简单出问题时也方便人工介入。有一个容易忽略的坑SOLIDWORKS 2019 之后的版本普遍是 64 位C# 工程的目标平台一定要设置成 x64否则运行时加载 Interop 程序集会出现类型不匹配或者直接报无法加载的错误。我第一次跑批量工具时就卡在这个问题上代码本身没问题就是平台目标忘了改。2.2 打开工程图文档的推荐方式连接上实例之后需要定位到要导出的工程图文档。如果是批处理推荐用OpenDoc6打开文件而不是依赖当前活动文档。因为当前活动文档受人为操作影响批量跑的时候可能正好有人切换到了零件窗口导出就会出错。using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swconst; using System.Runtime.InteropServices; int errors 0; int warnings 0; ModelDoc2 doc (ModelDoc2)swApp.OpenDoc6( filePath, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, , ref errors, ref warnings); if (doc null) { Console.WriteLine($打开失败文件{filePath}错误码{errors}); continue; }OpenDoc6的参数里第一个是文件路径第二个是文档类型第三个是打开选项我这里用了swOpenDocOptions_Silent作用是抑制大部分重建和提示类弹窗让批处理不会因为一个对话框卡死。路径建议都用完整绝对路径不要用相对路径。SOLIDWORKS 对工作目录的理解和命令行程序不一样相对路径非常容易出幺蛾子。2.3 打开文档后的必要检查图纸一旦打开先别急着导出建议做一个基础校验判断文档类型是否是工程图、有没有激活的图纸、是否处于只读状态。只读状态下导出有时候会生成只读属性或弹权限提示这个提前用doc.GetTitle()打印日志就能排查。还需要注意一个细节打开文档后SOLIDWORKS 界面会真的把这个文件窗口显示出来。如果机器性能不行批处理同时开了几十张图纸内存占用会明显上涨。解决方案有两个一是每处理完一张就立刻关闭二是不要用Silent打开而是用更严格的只读模式把文件加载到后台。实际测试下来最稳定的还是打开-导出-关闭三步循环后面会给出完整代码。3. 映射模板的构成逻辑与自建要点3.1 映射模板到底在管什么映射模板要解决的核心关系是 SOLIDWORKS 图元类型与 DWG 图层的对应关系。你希望尺寸出现在哪个图层文字出现在哪个图层中心线、剖面线、图框标题栏各在哪个图层都由模板决定。下面是我习惯的一张对照表不同企业可以按自己的标准调整SOLIDWORKS 图元类型建议目标图层原因尺寸标注DIM尺寸层独立方便打印时控制线宽与颜色文本注释TEXT技术要求、备注文字统一管理中心线/中心符号线CENTER加工基准参考必须独立显示剖面线/区域填充HATCH剖视图管理方便与普通线区分图框/标题栏BORDER图纸成套打印时按图框统一处理粗糙度/形位公差符号SYMBOL工艺符号需要单独开关和颜色控制这只是一个起点实际项目里还要考虑隐藏线、局部视图边界、零件序号等类型的落点。原则很简单下游怎么用你就怎么分。如果下游工艺人员需要批量关闭尺寸层来检查轮廓你就不应该把尺寸和轮廓线混在同一个图层里。3.2 通过 GUI 制作并导出映射模板映射模板文件不建议完全手写。最稳妥的方式是用 SOLIDWORKS 的导出对话框配置一次然后保存为模板文件具体步骤准备一张包含尺寸、文字、中心线、剖面、图框等各类图元的典型工程图。文件 → 另存为 → 选择 DWG 格式点开导出选项。在映射相关的页签里把所有出现的图元类型逐项指派到目标图层同时设置颜色和线型。确认无误后保存当前映射方案到一个独立文件比如company_dwg.map。用文本编辑器打开这个文件看一眼确认内容没有被 GC 或编码问题弄乱。后面 C# 代码里的SetMappingFile只需要填这个文件的路径。模板文件本身建议纳入版本管理跟着项目代码一起发布。下游标准要是变了只改模板文件就可以代码不用动。3.3 设计模板的实务约定模板文件本身也有不少讲究。图层命名尽量别用中文虽然 AutoCAD 能显示中文图层名但跨版本和换字体的时候容易出兼容性问题用英文加编号更稳。颜色按类型区分比如尺寸用 2 号黄色、文字用 7 号白色、中心线用 1 号红色线型区分实线和虚线。还有一个容易被忽略的点图框和视图轮廓线可以放在独立图层这样下游打印时可以把图框层单独关闭。模板做出来之后一定要让下游 CAD 标准化的人确认一次。我自己吃过亏弄了一套自认为很合理的映射结果加工那边说量尺寸时习惯把标注和公差分成两层只好返工重新调模板。所以映射模板不是写代码的人自己拍脑袋定的它本质上是一个跨部门约定。4. C# 核心导出代码映射模板与 1:1 比例一起生效4.1 构建导出选项的正确姿势SOLIDWORKS 从很早就提供了ExportOptionsData对象通过它可以配置 DWG 导出时的各种选项。关键是在触发保存之前先把这个对象设置完整。private ExportOptionsData BuildDwgOptions(SldWorks swApp, string mapFile) { ExportOptionsData exportData (ExportOptionsData)swApp.CreateExportOptionsData(); ExportDwgData dwgData exportData.DwgData; if (dwgData null) { throw new Exception(当前 SOLIDWORKS 版本不支持 ExportDwgData 接口); } // 指定自定义映射模板 dwgData.SetMappingFile(mapFile); // 启用 1:1 比例第一个参数表示按自定义比例输出第二个参数是比例值 dwgData.SetExportScale(true, 1.0); return exportData; }这里有个地方要特别说明不同 SOLIDWORKS 版本的 API 接口细节有差异。SetExportScale和SetMappingFile我在 2018 和 2020 版本上验证过可用但如果你用的是很老的版本或特别新的版本编译报错时去 SDK 帮助里查一下ExportDwgData的成员列表方法名可能带后缀或重载参数不同。这种版本差异不是代码问题是 SDK 迭代导致的封装一层适配就好。4.2 触发保存并处理错误警告配置好导出选项之后用ModelDocExtension.SaveAs触发保存。注意导出格式是由文件扩展名决定的所以输出路径必须显式写成.dwg。int saveErrors 0; int saveWarnings 0; ModelDocExtension ext doc.Extension; bool saved ext.SaveAs(outputPath, ref saveErrors, ref saveWarnings, exportData); if (!saved) { Console.WriteLine($导出失败错误码{saveErrors}警告码{saveWarnings}); }SaveAs的参数顺序在不同 SDK 版本里可能不太一样但(string, ref int, ref int, ExportOptionsData)这个组合在近几个主流版本里都能跑通。如果发现重载报错就翻一下当前版本的ModelDocExtension.SaveAs文档把参数顺序对齐。4.3 一个可直接改用的批量导出方法把前面几部分合在一起就是一个能直接落地的批处理核心方法。下面的方法遍历指定目录下的所有工程图逐个打开、导出、关闭并释放 COM 对象。public void BatchExportDwg(string sourceFolder, string outputFolder, string mapFile) { SldWorks swApp (SldWorks)Marshal.GetActiveObject(SldWorks.Application); string[] files Directory.GetFiles(sourceFolder, *.slddrw); foreach (string file in files) { int openErrors 0; int openWarnings 0; ModelDoc2 doc (ModelDoc2)swApp.OpenDoc6( file, (int)swDocumentTypes_e.swDocDRAWING, (int)swOpenDocOptions_e.swOpenDocOptions_Silent, , ref openErrors, ref openWarnings); if (doc null) { Console.WriteLine($打开失败{file}错误码{openErrors}); continue; } try { string outputFile Path.Combine( outputFolder, Path.GetFileNameWithoutExtension(file) .dwg); // 先删除旧文件避免触发覆盖确认对话框 if (File.Exists(outputFile)) { File.Delete(outputFile); } ExportOptionsData exportData BuildDwgOptions(swApp, mapFile); int saveErrors 0; int saveWarnings 0; bool saved doc.Extension.SaveAs( outputFile, ref saveErrors, ref saveWarnings, exportData); Console.WriteLine(${(saved ? 导出成功 : 导出失败)}{file} - {outputFile}); Marshal.FinalReleaseComObject(exportData); } finally { swApp.CloseDoc(doc.GetTitle()); Marshal.FinalReleaseComObject(doc); } } }这段代码里有几个细节值得注意。第一导出前先删除已存在的同名文件是为了防止 SOLIDWORKS 弹文件已存在是否覆盖的确认框。批处理一旦遇到这种弹窗整个任务会停在原地等人点按钮非常讨厌。第二Marshal.FinalReleaseComObject必须成对出现COM 对象不及时释放SOLIDWORKS 进程的内存会一路涨上去跑三四十张图之后就可能卡死。4.4 关于静默和后台运行的建议很多人写这类工具时喜欢把 SOLIDWORKS 窗口隐藏掉觉得这样像正规后台任务。我在实际项目里反而推荐保持窗口可见至少在调试阶段是这样。窗口可见时出问题你能第一时间看出是哪一张图卡住了、是弹窗还是崩溃如果隐藏了窗口一旦批量任务中断排查起来只能靠日志盲猜。真正稳定之后再考虑swApp.Visible false。还有一个必须提前做的设置打开文档时抑制自动重建消息。有些工程图关联的模型改动过打开时 SOLIDWORKS 会问要不要重建这个弹窗出现在批处理里就是死结。建议用SetUserPreferenceToggle在任务开始时关掉这类提示任务结束后再恢复。具体开关项在不同版本里名称有差异搜swUserPreferenceToggle_e里的 ReadOnly 或 Rebuild 相关枚举即可。5. 导出后怎么自测比例、图层、线型逐个确认5.1 比例验证用 DI 命令量实际长度导出之后第一件事永远是验证比例这一步做不好后面全白搭。我的习惯是在 SOLIDWORKS 工程图里找一条标注尺寸很明确的边比如一块板的长边标注 400然后在导出的 DWG 里用 AutoCAD 的 DI 命令打开对象捕捉点这条边的两个端点看命令行读出的数值。如果读数是 400说明 1:1 生效。如果读数是 200 或者 80说明比例参数没有真正作用到输出上优先检查SetExportScale是否被正确调用以及映射文件是否影响了导出设置。注意测量时一定要开对象捕捉否则鼠标点歪一点点读数不对你会误判比例问题白白排查半天。5.2 图层验证打开图层管理器逐项对照比例没问题之后再验证图层。AutoCAD 里按 LA 打开图层管理器对照映射模板里定义的目标图层逐个确认已经出现在图层列表中。然后再用 QSELECT 或者直接点选图元看属性面板里的图层归属。比如你在映射模板里把尺寸标注指到了 DIM 层那么图纸里点上任何一个尺寸属性面板的图层栏应该显示 DIM。如果显示的还是 0 层说明映射模板没有生效。优先检查映射文件路径是否正确编码是否为 ANSI 或 UTF-8 with BOM某些版本的模板文件对编码很敏感。5.3 容易被忽略的单位与线型检查比例和图层都对之后还有一个容易被忽略的点DWG 的单位设置。SOLIDWORKS 工程图默认毫米但 DWG 文件有自己的单位系统打开后如果单位被识别成英寸整个图虽然几何尺寸对但下游导入其他软件时会出偏差。在 AutoCAD 里用UNITS命令查看然后确认INSUNITS系统变量设置为 4代表毫米。线型问题也常见。中心线导出来变成实线虚线比例不对导致显示成实线这通常是线型全局比例LTSCALE的问题。理论上这不是导出环节的锅但下游如果只看屏幕会以为导出错了。自测时随手检查一下中心线和隐藏线的线型能让交付少很多来回沟通。6. 真实项目里踩过的坑与后续建议6.1 映射文件没生效代码却一声不吭这是最坑的一个情况代码所有调用都成功SaveAs 返回 trueDWG 也生成了但打开一看图层完全没按映射模板走。最初我以为是 API 调用顺序问题折腾半天才发现是映射文件路径写错了而 SOLIDWORKS API 在映射文件无效时不报错只是静默忽略直接用默认映射导出。排查建议就一条先在 GUI 里手动加载同一个映射文件看 SOLIDWORKS 会不会报错或提示。如果 GUI 里也加载异常那就是模板文件格式有问题如果 GUI 正常而 API 无效再检查代码里的路径是否真的指向了那个文件尤其是文件放在网络路径或带权限限制的目录里时最容易出现这种静默失败。6.2 覆盖确认弹窗让批处理卡在半夜前面代码里我写了导出前先删除旧文件这是被坑出来的经验。第一次做无人值守批处理时输出目录里已经有一批同名 DWG程序跑到第一个重名文件时SOLIDWORKS 弹了一个覆盖确认框整个任务就停在那里等我第二天早上看日志才发现所有文件只导出了前两张。从那以后我养成了铁律任何批处理里的保存操作都要先处理目标文件冲突。6.3 大批量循环必须显式释放 COM 对象写给 SOLIDWORKS 的 C# 工具内存问题几乎都是 COM 引用没释放导致的。OpenDoc6、SaveAs、CreateExportOptionsData返回的每一个对象用完都要Marshal.FinalReleaseComObject。我见过同事写的批量导出工具跑二十张图就出现 GDI 崩溃原因就是循环里所有 COM 对象都引用着不释放SOLIDWORKS 只能不停累积进程句柄。实际情况中释放完对象之后最好再加一句GC.Collect()和GC.WaitForPendingFinalizers()虽然听起来有点暴力但对长循环的稳定性帮助非常大。6.4 版本差异需要适配层兜底SOLIDWORKS 二次开发的普遍痛点是版本迭代频繁API 接口经常有小幅调整。ExportOptionsData这套东西总体稳定但SetExportScale这类方法在不同年份版本里签名可能不同。做商业工具的话建议封装一个导出适配层把映射模板、比例、保存三个动作包成独立方法内部用反射探测方法是否存在找不到就回退到 GUI 导出默认配置。这个层写一次能省掉未来每一次升级 SOLIDWORKS 时的返工。我在实际工作中最后做成的方式很简单批处理主程序只负责遍历图纸和记录日志所有导出策略都放在一个独立的类里映射模板文件放固定目录。每次下游提新要求我只需要改映射模板文件偶尔微调适配层主程序几乎不动。如果你也要做类似的工具强烈建议把模板文件、导出代码、验证脚本三件事分开管理这样不管是调试还是交接都比写在一坨代码里舒服得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑