
我做机械设计出身后来转做工艺工程最烦的就是每天在Solidworks里重复装配同类型零件。项目一多几百个装配步骤全是机械操作鼠标点得手酸还容易漏约束。后来痛下决心学Solidworks二次开发选了C# .NET API这条路从最简单的“打开软件”开始做到了自动创建装配体、自动插入虚拟零件、自动添加配合。这篇文章就把我从零构建装配体的完整过程写出来包括大量API调用细节和实际踩过的坑给同样被困在重复劳动里的工程师一条能走通的路。先说清楚这篇文章的内容边界主要讲Solidworks二次开发中如何用C# .NET API在代码层面完成三件事——新建装配体、创建虚拟零件、给零件添加配合约束。适合有C#基础、对Solidworks操作很熟、但从来没碰过API的机械工程师也适合想系统了解Solidworks对象模型的软件开发者。如果你是纯小白连Visual Studio都没打开过也能跟着做但我默认你至少知道类、对象、方法这几个概念。1. 动手前的关键认知API版本与开发环境搭建不少人一上来就写代码结果连Solidworks对象都拿不到浪费一晚上。我建议你先花半小时把环境理清楚后面所有代码都是建立在这个基础上的。1.1 为什么选C# .NET而不是VBA或C早些年Solidworks二次开发的主流方案是VBA宏录一个宏改一改确实快但VBA的能力上限很低。做个简单的批量改名、批量加配合还行一旦涉及复杂逻辑、数据库联动、多文档管理VBA写起来非常痛苦。C API性能最好但开发周期长Solidworks的COM接口用C调用时需要处理大量指针和引用计数普通机械工程师很难驾驭。C# .NET API是综合最优解。Solidworks从2013版本开始对.NET支持得很成熟C#调用COM接口有运行时自动封装不需要手动管理指针代码写起来和写普通业务逻辑差别不大。而且C#的集合类、LINQ、委托事件机制正好对付装配体里几十上百个零部件的批量操作。另一个现实因素是团队协作。C#工程可以用Git管理可以写单元测试可以分模块开发。VBA宏文件本质是文本协作体验极差。如果你的目标是做一个能长期维护的自动化工具直接选C# .NET别犹豫。1.2 环境准备SDK安装与引用检查Solidworks安装目录里自带二次开发SDK主要包含两个核心互操作DLLSolidWorks.Interop.sldworks.dll核心API几乎所有功能都在这SolidWorks.Interop.swconst.dll枚举和常量定义比如配合类型、文档类型这些这两兄弟缺一不可很多新手只引了sldworks结果用到swMateCoincident这种常量时编译报错查半天发现是缺了swconst。在Visual Studio里添加引用的路径一般是C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\api\redist\注意一个细节建议在项目属性里把“嵌入互操作类型”设为False否则某些版本的COM接口会出现运行时类型转换异常。这个问题在.NET Framework 4.x下特别容易遇到我最早被坑过一次症状是代码编译通过跑到一半抛InvalidCastException查了很久才发现是这个开关的问题。另外.NET版本选择和Visual Studio版本也有讲究。Solidworks 2018及以前的版本老老实实用.NET Framework 4.6.1或4.7.2Solidworks 2020之后可以尝试.NET Framework 4.8。不建议用.NET Core或.NET 5因为Solidworks的COM互操作在.NET Core下需要额外的运行时配置稳定性不如Framework。1.3 骨架代码从外部进程获取Solidworks对象环境搭好后第一段要跑通的代码就是获取正在运行的Solidworks实例。这个代码是后面所有功能的地基核心逻辑是把两个COM对象区分开一个是Solidworks程序本身一个是当前激活的文档。using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swconst; public class SolidWorksConnector { private SldWorks _swApp; public bool Connect() { // 尝试获取正在运行的Solidworks实例 try { _swApp Marshal.GetActiveObject(SldWorks.Application) as SldWorks; } catch { _swApp null; } // 如果没获取到说明Solidworks没打开就创建一个新实例 if (_swApp null) { Type swType Type.GetTypeFromProgID(SldWorks.Application); _swApp Activator.CreateInstance(swType) as SldWorks; _swApp.Visible true; } return _swApp ! null; } public SldWorks App _swApp; }这段代码有两个关键点值得解释第一Marshal.GetActiveObject只能获取已经注册到ROTRunning Object Table的实例。如果Solidworks以管理员权限运行而你的C#程序没提升权限这里会获取失败。出现这种情况的典型症状是第一次运行能连上后来改了代码重新编译就连不上了其实不是代码问题是权限不匹配。第二Activator.CreateInstance创建新实例时Solidworks会自动弹出启动画面这是正常的。但如果你的代码是在服务程序或后台任务里运行强烈不建议在无界面环境下创建Solidworks实例很多API在后台模式下不工作比如渲染相关最好还是先手动打开Solidworks再连接。连接成功后马上用GetOpenDocuments或者遍历GetDocumentMap看看当前有哪些打开的文件这一步可以确认COM调用链路是通的var doc _swApp.ActiveDoc; if (doc null) { Console.WriteLine(当前没有打开的文档); } else { Console.WriteLine(当前文档: doc.GetTitle()); }能输出文档标题恭喜你环境已经通了可以进入下一步。2. 装配体从零创建的完整路径很多教程一上来就讲怎么操纵现有装配体但实际做自动化时更需要的是从零新建一个装配体按编程逻辑往里填东西。这条路径搞明白后面扩展到其他场景就容易得多。2.1 新建装配体文档与初始坐标系Solidworks的文档系统是这样一个层级关系SldWorks是最顶层的程序对象下面有ModelDoc2文档对象再往下根据文档类型分为PartDoc零件、AssemblyDoc装配体、DrawingDoc工程图。新建装配体最稳定的方式是用NewDocument方法它接受一个模板路径参数。不同环境里模板路径差异很大需要先查一下string templatePath _swApp.GetUserPreferenceStringValue( (int)swUserPreferenceStringValue_e.swDefaultTemplateAssembly);注意swDefaultTemplateAssembly返回的是带环境变量的完整路径比如C:\ProgramData\SolidWorks\SOLIDWORKS 2024\templates\Assembly.asmdot。有些精简版Solidworks可能会返回空字符串这时需要手动指定一个已有的装配体模板路径。拿到模板路径后调用新建方法int errCode 0; int warnCode 0; ModelDoc2 newDoc _swApp.NewDocument(templatePath, 0, 0, 0, ref errCode, ref warnCode);NewDocument的第二到第四个参数是工程图相关的纸张参数对装配体可以全部填0。创建成功后返回的ModelDoc2会被激活并出现在Solidworks界面里。这里有个很实用的判断技巧创建后立刻检查newDoc.GetType()是否等于swDocASSEMBLY。如果类型不对多半是模板路径给成了零件模板或者工程图模板这时候程序不会报错但后续调用IAssemblyDoc接口时会失败错误信息还不好理解。2.2 在指定位置加入已有零件有了空装配体下一步就是把零件插进去。Solidworks API中向装配体添加组件的方法经过了好几次迭代老版本用AddComponent4新版本更推荐AddComponent5签名如下Component2 AddComponent5( string compPath, // 零件或子装配的绝对路径 int configName, // 配置名称 int x, // 位置X int y, // 位置Y int z // 位置Z )实际调用的代码片段IAssemblyDoc asmDoc newDoc as IAssemblyDoc; string partPath D:\MyParts\Flange.SLDPRT; Component2 comp asmDoc.AddComponent5( partPath, 0, // 0代表使用默认配置 0, 0, 0 // 初始原点位置 );粗看没问题但这里有两个实战中的大坑第一个坑是配置参数的类型。configName实际是整数类型而不是字符串0表示默认配置如果要指定配置需要先通过GetConfigurationNames拿到配置索引数组再用对应索引值。很多刚开始用这个API的人想当然地往里传配置名的字符串编译报错后才发现类型不对。第二个坑是路径和文件名不能包含特殊字符。如果零件路径出现中文或空格AddComponent5偶尔会返回null但在Solidworks界面里你却能手动插入成功。这个情况没有统一的解决办法我最终是用Path.GetFullPath规范化路径后再传入并且暂停一两秒让Solidworks完成文件加载稳定性提升了不少。2.3 调整零件位置与姿态的变换逻辑零件插入后默认在原点这在真实装配场景里几乎不可能满足需求。调整位置有两种途径直接设置Component2.Transform2属性通过AddMate5配合约束间接驱动位置直接设置Transform对几何精度要求高但效率也高。Transform2是Solidworks里的数学变换对象包含9个旋转矩阵元素和3个平移元素// 构造一个将零件平移到(100, 50, 0)的变换 MathUtility mathUtil _swApp.GetMathUtility(); MathVector offset mathUtil.CreateVector(new double[] { 100, 50, 0 }); MathTransform transform mathUtil.CreateTransform(new double[] { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 50, 0, 1 }); comp.Transform2 transform;这里CreateTransform接收的16个双精度数本质是一个4x4齐次变换矩阵按行展开。前12个元素是旋转部分13到15是平移最后一个是统一的比例因子。对机械工程师来说这个矩阵最需要理解的一点是Solidworks里组件的Transform是相对于装配体原点的绝对变换不是增量变换。也就是说你设置一次Transform组件就会直接跳到目标位置而不是在当前位置基础上再移动一段距离。这个特性在批量布点的时候特别有用。比如要在圆周上均匀分布8个螺栓我可以预先算出8个位置矩阵循环调用Transform赋值不需要每个螺栓都去添加配合。速度极快装配体几十个零件秒开。3. 虚拟零件的创建与内部保存机制虚拟零件是Solidworks里一个很容易被忽略但极度实用的功能。常规零件是独立的.SLDPRT文件而虚拟零件保存在装配体文件内部没有独立的文件路径。3.1 虚拟零件解决的核心问题为什么需要虚拟零件说一个实际场景你在做方案设计需要快速画几个垫片、垫块、简易支架来验证干涉和装配关系。如果用常规方式每次都要新建零件文件、命名、选模板、保存到磁盘文件多了之后整个目录全是半成品。更重要的是这些临时零件一旦移交或者打包极容易漏掉。虚拟零件把文件系统和装配体解耦了你新建的临时零件直接“装”在装配体里。装配体保存时虚拟零件一起保存装配体移动时虚拟零件跟着走。用来做概念设计的初期验证再合适不过。另外虚拟零件也特别适合自动化场景程序生成大量中间过渡零件不需要用户参与文件管理所有数据都在装配体内部最终用户看到的只有一个装配体文件。3.2 用API创建虚拟零件的两种路径在API层面创建虚拟零件有两种常见路径取决于你的Solidworks版本。路径一插入空零件后转为虚拟使用AddComponent5插入一个没有任何特征的空白模板零件通常叫做Part_Template然后调用Component2.MakeVirtual方法Component2 comp asmDoc.AddComponent5(blankPartTemplatePath, 0, 0, 0, 0); bool success comp.MakeVirtual(virtual_plate);MakeVirtual的参数是虚拟零件在装配体中的名称。调用成功后这个组件就变成虚拟零件了Solidworks FeatureManager设计树里对应节点会出现一个特殊的“虚拟”小图标。路径二直接在装配体上下文新建虚拟零件更高版本2016以后的API提供了更直接的方法在装配体上下文里新建一个可编辑的内部零件Component2 comp asmDoc.InsertNewVirtualPart();这个方法会直接在装配体中创建一个空的虚拟零件并且自动进入编辑状态。你需要做的是切回装配体编辑状态然后给这个虚拟零件添加特征。核心意思是虚拟零件的几何创建往往要在零件编辑上下文中完成。这里有一个非常重要的实操经验无论哪种路径向虚拟零件添加特征时必须先激活编辑状态否则API调用会失败。我封装了一个通用工具方法public bool EditVirtualPart(AssemblyDoc asmDoc, Component2 comp) { // 激活该组件编辑状态 bool ok asmDoc.EditPart(); if (!ok) return false; // 拿到该组件的零件文档对象 ModelDoc2 partDoc comp.GetModelDoc2(); // 在这里对partDoc做特征操作比如拉伸凸台 // 切回装配体编辑状态 asmDoc.EditAssembly(); return true; }注意切回装配体用EditAssembly很多新手不知道这个方法直接调用InsertNewVirtualPart后又找不到回到装配体的入口最后文档状态变得乱七八糟。3.3 虚拟零件的改名、保存与导出虚拟零件用得多后必然会遇到“想把虚拟零件保存为独立文件”的需求。API层面的方法是Component2.SaveAs或者通过Extension.SaveAs实现comp.SaveAs(D:\Output\virtual_plate.SLDPRT);这里有个容易混淆的概念虚拟零件保存为独立文件后它仍然是虚拟零件只是多了一份磁盘快照。要让组件变为外部参考零件需要调用Component2.ConvertToExternal之类的方法不同版本名称略有差异。很多新手保存完就以为万事大吉结果做包络或出BOM时发现还是找不到独立路径就是这个原因。还有虚拟零件的命名规范问题。虚拟零件默认名称是虚拟零件1、虚拟零件2之类在自动化场景里必须统一改名否则BOM表会非常难看。改名用Component2.Name属性赋值即可comp.Name __Concept_Plate_A;但要注意如果虚拟零件已经被其他配合或特征引用改名可能触发Solidworks的警告弹窗。用API批量改名时建议关闭系统提示音和弹窗设置_swApp.SetUserPreferenceToggle( (int)swUserPreferenceToggle_e.swInputDimValOnCreate, false);严格来说关弹窗需要设置好几个开关上面这个是其中一个。最靠谱的办法是提前改名在几何还没被引用之前就定好名字能避免90%的麻烦。4. 用配合API把零件“装起来”创建零件只是第一步装配的本质是配合。配合API是Solidworks二次开发中逻辑最绕、坑最多的一块值得单独拆开讲。4.1 配合相关对象与枚举配合对象的层级结构是AssemblyDoc装配体文档Mate2单个配合对象Feature配合在FeatureManager里也表现为一个特征添加配合最常用的API是AddMate5签名如下Feature AddMate5( int mateType, // 配合类型枚举 int align, // 对齐方式 bool flip, // 是否反转 double distance, // 距离配合的距离值 double angle, // 角度配合的角度值 bool lockRotation, // 是否锁定旋转 object entity1, // 配合面/轴/点1 object entity2 // 配合面/轴/点2 )mateType是swMateType_e枚举常用的几个枚举值数值含义swMateCOINCIDENT0重合swMateCONCENTRIC1同轴swMatePERPENDICULAR5垂直swMatePARALLEL6平行swMateDISTANCE2距离swMateANGLE3角度align是swMateAlign_e枚举swMateAlignALIGNED表示同向对齐swMateAlignANTI_ALIGNED表示反向对齐。这个参数很容易搞混特别是重合配合的时候选错方向会导致零件跑到装配体的另一侧。4.2 常用配合的实现代码重合、同轴、距离、角度这里用一个实际案例来演示把一个轴类零件插入到孔类零件的孔里需要添加同轴配合和轴肩端面与孔端面的距离配合。先定义选择实体的辅助方法。Solidworks API里选择面用SelectByID2选择的字符串格式很特殊需要理解它的构成规则public bool SelectFace(IFeature feat, string faceName) { ModelDoc2 doc _swApp.ActiveDoc; // faceName格式举例: Face1partname-1assemblyname bool sel doc.Extension.SelectByID2( faceName, FACE, 0, 0, 0, false, 0, null, 0); return sel; }但实际开发中用坐标点更可靠。用SelectByID2时可以传入模型上的一个坐标点Solidworks会找到该点所在的面public bool SelectFaceAtPoint(IFeature feat, double x, double y, double z) { ModelDoc2 doc _swApp.ActiveDoc; bool sel doc.Extension.SelectByID2( , FACE, x, y, z, false, 0, null, 0); return sel; }这里传空字符串作为name点坐标作为定位依据。这种方式的优势是不需要去解析复杂的特征树名称只要你知道孔的中心坐标和端面坐标就能完成选面。配合添加的完整代码public Feature AddConcentricMate(IAssemblyDoc asmDoc, Face2 face1, Face2 face2) { bool sel1 SelectFaceAtPoint(face1.GetFeature(), GetFaceCenter(face1).X, GetFaceCenter(face1).Y, GetFaceCenter(face1).Z); bool sel2 SelectFaceAtPoint(face2.GetFeature(), GetFaceCenter(face2).X, GetFaceCenter(face2).Y, GetFaceCenter(face2).Z); if (!sel1 || !sel2) { throw new Exception(选择配合面失败); } Feature mateFeat asmDoc.AddMate5( (int)swMateType_e.swMateCONCENTRIC, (int)swMateAlign_e.swMateAlignALIGNED, false, 0, 0, false, null, null); // 注意AddMate5内部基于当前选中的实体生成配合 return mateFeat; }AddMate5的配合实体参数entity1、entity2在某些Solidworks版本中可以传null前提是调用前已经通过SelectByID2完成了两个面的选择。这种“先选择后配合”的模式是Solidworks API的一个传统风格跟参数化建模软件的直觉不太一样但掌握后非常灵活。距离配合和角度配合的区别在于需要传distance或angle参数Feature AddDistanceMate(IAssemblyDoc asmDoc, Face2 face1, Face2 face2, double distance) { bool sel1 SelectFaceAtPoint(face1.GetFeature(), GetFaceCenter(face1).X, GetFaceCenter(face1).Y, GetFaceCenter(face1).Z); bool sel2 SelectFaceAtPoint(face2.GetFeature(), GetFaceCenter(face2).X, GetFaceCenter(face2).Y, GetFaceCenter(face2).Z); Feature mateFeat asmDoc.AddMate5( (int)swMateType_e.swMateDISTANCE, (int)swMateAlign_e.swMateAlignALIGNED, false, distance, 0, false, null, null); return mateFeat; }4.3 配合失败的常见原因与诊断配合失败是二次开发里最让人头疼的问题。代码看着没问题编译也通过运行时Solidworks没有任何提示但装配体里就是多了个报错配合零件位置不对。我总结出三类高频原因排查时可以按这个顺序过一遍第一选择实体不稳定。Solidworks的选择操作是基于当前视图和特征树状态的如果你的程序先插入了一个零件还没有重新构建模型就急着选面很可能选到的面是过期的引用。解决方法是配对前调用_swApp.ActiveDoc.ForceRebuild3(false)强制重建。第二配合方向不对。同轴配合看起来简单但轴类零件和孔类零件的轴向方向如果相反虽然配合能生成但配合后的位置可能完全不是你想要的。API层面没有直观的“反向”参数最常见的手法是在AddMate5中改变align参数或者在配合生成后修改Mate2.Align属性。第三自由度冲突过约束。装配体自动化建模时最容易出现过约束。比如一个螺栓你已经加了同轴配合和端面重合配合理论上自由度已经约束完了如果再尝试添加一个距离配合Solidworks就会报“过定义”。API不像界面交互那样会弹出提示它只是在配合特征上显示一个红叉。诊断的方法是遍历配合特征检查Feature.GetErrorCode2的返回值public void CheckMateErrors(IAssemblyDoc asmDoc) { Feature feat asmDoc.FirstFeature(); while (feat ! null) { if (feat.GetTypeName2() MateGroup) { Feature mate feat.GetFirstSubFeature(); while (mate ! null) { int errCode mate.GetErrorCode2(); if (errCode ! 0) { Console.WriteLine($配合 {mate.Name} 错误码: {errCode}); } mate mate.GetNextSubFeature(); } } feat feat.GetNextFeature(); } }错误码是整数不同版本含义有差异最直接的办法是拿错误码去Solidworks API帮助文档里逐个查或者在界面上手动打开有问题的配合看Solidworks自己的报错提示。5. 从能跑到跑稳我踩过的坑与调试技巧经历过“程序能不能跑”的阶段后真正折磨人的是“这个程序怎么才能稳定跑”。下面这些经验是我在多次批量装配任务中积累出来的网上很少有教程会主动告诉你。5.1 对象失效问题为什么拿到对象却不能用C#调用COM对象时最常见的问题之一是“对象已失效”或者InvalidCastException。原因在于Solidworks的API对象并不是长期有效的.NET对象COM对象有引用计数生命周期管理。典型场景是你循环遍历装配体里的组件把每个组件存到一个List里等循环结束再统一修改这些组件的属性结果抛异常。原因Solidworks在某些操作如重建模型、压缩特征后会让旧的COM对象失效你持有的引用已经指向一个被释放的COM对象。对策是不要长期持有Solidworks API对象用完后尽快释放如果必须缓存缓存组件名称而不是组件对象用的时候重新去模型里获取。// 推荐缓存名称 Liststring compNames new Liststring(); foreach (Component2 comp in allComps) { compNames.Add(comp.Name2); } // 使用时重新获取 foreach (string name in compNames) { Component2 comp asmDoc.GetComponentByName(name); // 安全操作 }5.2 模型重建时机与性能拐点装配体自动化中模型重建Rebuild是最消耗时间的操作。重建时机选择不当会导致两个极端重建太早模型还没就绪就强行更新白耗时间重建太晚下一次操作依赖的几何数据还是旧的出错。我的经验是在一批配合添加完成后统一重建一次不要每加一个配合就重建一次。比如一个装配体需要添加20个配合如果每加一次就重建可能要跑几十秒甚至几分钟如果全部加完再重建通常只需要一两秒。// 低效做法 foreach (var mateInfo in mateList) { asmDoc.AddMate5(...); _swApp.ActiveDoc.ForceRebuild3(false); } // 高效做法 foreach (var mateInfo in mateList) { asmDoc.AddMate5(...); } _swApp.ActiveDoc.ForceRebuild3(false);第二个性能相关的问题是视图刷新。Solidworks的COM API默认每次模型变化都会刷新视图这在高频操作时非常拖慢速度。可以临时关闭视图刷新_swApp.ViewDisplayMode (int)swViewDisplayMode_e.swViewDisplayWireframe; _swApp.SetUserPreferenceToggle( (int)swUserPreferenceToggle_e.swViewReflectanceMode, false);严格来说Solidworks没有专门的总开关“关闭所有视图刷新”但把显示模式切到线框、关闭阴影和反射能让性能提升至少30%。批量任务跑完后恢复默认显示模式。5.3 日志、批处理与无界面运行的边界做自动化工具一定要有日志系统。Solidworks API不像Web开发那样有成熟的调试工具程序崩了你往往不知道崩在哪一步。我的方案是三步走每个关键动作记录日志包含操作目标、参数、时间捕获异常时输出完整堆栈并标记是哪个组件、哪个配合导致的任务结束后输出统计信息成功数、失败数、每步耗时一个简单可用的日志封装public static class Logger { private static StreamWriter _writer; public static void Init(string path) { _writer new StreamWriter(path, true); _writer.WriteLine($ Task Start: {DateTime.Now} ); } public static void Log(string message) { string line ${DateTime.Now:HH:mm:ss.fff} [INFO] {message}; Console.WriteLine(line); _writer?.WriteLine(line); } public static void Error(string message, Exception ex null) { string line ${DateTime.Now:HH:mm:ss.fff} [ERROR] {message}; if (ex ! null) line $ | {ex.Message} | {ex.StackTrace}; Console.WriteLine(line); _writer?.WriteLine(line); } }关于无界面运行我要给一个明确的劝告不要强行走无界面模式至少不要在生产环境里强行走。Solidworks的很多API依赖界面上下文比如GetSmartSelection、某些配合枚举功能一旦窗口隐藏就会返回意外结果。我最后采用的方案是“最小化不关闭”——启动Solidworks后立即最小化程序控制它批量执行任务执行完成后自动保存并关闭文档。这种半无界面模式兼顾了稳定性和自动化程度。6. 从装配体到产品级的扩展建议把前面的基础能力打通后你手里就有了一张“自动化装配”的王牌。但真正到产品级还需要考虑一些扩展问题。6.1 批量处理与参数化设计的结合第一类扩展是批量处理读取Excel或CSV里的装配BOM表自动创建装配体、插入零件、添加配合。这需要把业务数据和API调用解耦。我建议把每个“装配动作”抽象成一个命令对象包含组件路径、目标位置、配合类型、配合对象等信息程序就是一个命令解释器逐条执行。public class AssemblyCommand { public string ComponentPath { get; set; } public double PosX, PosY, PosZ; public int MateType; // 与哪个已有组件配合 public string MateTargetFace; // 配合目标面 }这种方式最大的好处是业务人员不需要懂代码只需编辑表格就能定义装配流程。程序加一个Excel解析器和API执行器就是一个完整的“所见即所得”的自动化装配平台。第二类扩展是参数化设计。虚拟零件特别适合参数化设计了因为不需要文件系统同步。你可以在代码里创建虚拟零件然后通过Parameter接口修改草图尺寸和特征尺寸再重建模型。这相当于把整个零件设计流程搬到了代码里。// 修改尺寸的例子 ModelDoc2 partDoc comp.GetModelDoc2(); string dimName D1Sketch1; double newValue 500.0; bool ok partDoc.Parameter(dimName).SetValue2( newValue, (int)swSetValueInConfiguration_e.swSetValueInAllConfigurations); partDoc.EditRebuild3();用这种方式你能写一个程序批量生成几十种不同规格的垫片每个都是一个虚拟零件配套不同尺寸的拉伸特征最后自动完成全部装配配合。6.2 虚拟零件与工程图、BOM的联动产品设计不可能只停留在装配体阶段。虚拟零件一个常被讨论的问题是它能不能出工程图能但需要先把虚拟零件另存为独立文件否则工程图引用的是装配体内部数据文件管理上会混乱。BOM表方面虚拟零件默认也会出现在BOM中但有一个特点它的零件号在未改名的情况下是空白的。所以在使用虚拟零件做批量设计时规范化命名是铁律。我一般用这样的命名规则类型代码_项目号_序列号 例如PLATE_PRJ001_001 例如BRACKET_PRJ001_002这套规则要硬编码在自动化程序里从创建虚拟零件的第一刻就按规则命名后面所有环节都不会乱。6.3 我最终沉淀的自动化装配工作流最后分享一个我用了很久的整体工作流在这个流程里Solidworks二次开发不是零散的几个脚本而是一套完整可复用的工具链输入层Excel定义装配任务包含所有零件路径、配置、位置和配合信息逻辑层C#程序解析Excel生成AssemblyCommand命令队列执行层连接Solidworks按命令队列创建装配体、插入组件、处理虚拟零件、添加配合校验层遍历配合特征检查错误码遍历组件检查是否有未固定的零件输出层保存装配体导出BOM和PDF图纸生成执行报告这个流程跑下来原本一个需要半天到一天的装配工作压缩到了几分钟内。更重要的是程序不会疲劳不会漏装不会搞错配合方向。说一个实际体会我和同事最后用这套工具处理从ERP系统导出的物料清单三天内完成了两百多个装配体的自动化建模任务输出的装配体可以直接进入仿真流程不需要人工二次修正。这就是Solidworks二次开发真正的价值——它不是帮你画某一个零件而是帮你建立一套持续产出、不犯错的“数字化装配手”。如果你也想做类似的自动化我的建议是老老实实从最简单的“连接Solidworks实例”开始一次只做一个功能点每一步都加日志、做验证。把基础打牢后面再复杂的装配任务都是这些基本操作的组合。