☰
SolidWorks二次开发入门:宏录制、特征选择与参数修改
2026/11/3 10:57:44 网站建设 项目流程

简介:这份 SolidWorks 二次开发全教程系列面向希望借助 API 与 VBA 提升建模效率的工程师和初学者,围绕宏录制、代码编辑调试及特征访问等基础能力展开,帮助读者理解如何把重复操作转化为可复用的自动化流程。压缩包共 1 个 doc 文件,大小约 276KB,内容以教程文档形式组织,适合按主题查阅并对照软件实践。已有 6208 人学习或下载,说明其在入门资料中具有一定参考热度。文档从录制宏入手,讲解停止录制后如何进入 Microsoft VBA 编辑环境,删减未使用变量声明、视图切换及多余选择调用;随后通过 SelectByID2 与 GetSelectedObject5 两个 API 示例,演示按名称选择“拉伸1”特征并读取选中对象,同时提及 .swb 旧宏文件自动转换为 .swp 的注意事项,便于读者建立二次开发的基本排错与调试思路。

1. 一个零件改十遍,为什么还要用手点

如果你每天的工作就是打开模型、点草图、标尺寸、改数值,再重复一遍同样的操作,那么 SolidWorks 二次开发这个名字听起来像“大神专属”,其实它要解决的就是这种繁琐的重复劳动。通俗地说,二次开发就是用一小段代码去指挥 SolidWorks 干活:让它自己打开文件、自己选中某个特征、自己把孔径改成 8 毫米再存盘。你不需要会写软件,只要会用键盘打字、愿意照着例子改两行数字,就能入门。它最适合三类人:天天做相似结构的设计人员、要给同事做小工具的人、以及被“这个能不能批量处理”问烦了的人。这篇指南从零起步:先弄懂它是什么,再教你录制第一个宏,最后想办法让这个宏真正在模型上生效。

2. 为什么要学,以及第一个宏怎么录出来

先别急着敲代码。新手最容易犯的错,是还没搞明白“代码能操作什么”就去找教程,结果看了一堆语法,回到软件里仍然不知道从哪下手。这一章先把动机讲清楚,再把环境准备好,最后录出一个能跑的宏,哪怕它很笨拙,也算是成功迈出了第一步。

2.1 二次开发到底替你省掉了什么

SolidWorks 里你用手能做的大部分事情,代码都能做:打开文档、切换配置、选特征、读参数、改参数、插入零件、加配合、保存重建。区别只在于,你点一次做一件事,代码可以循环一千次做一千件事,而且不会手抖点错。

举个很典型的场景。一个法兰盘上有 20 个孔,客户要求孔径从 6 毫米全部改成 8 毫米。用手点,你要双击每个孔、改数值、确认、重建,中间还要小心别漏掉。用代码,流程是:遍历所有孔特征、读当前直径、乘以一个系数、写回去、重建。二十次点击压缩成一次运行,这就是最直接的收益。

提示:二次开发不是为了替代建模能力,而是把“你已经会做但做腻了”的动作打包。先把手上的活做熟,再想着用代码加速,顺序反了会很痛苦。

还有一类收益不那么直观,但对团队更有价值:把经验固定成工具。老师傅知道某个零件必须留 2 毫米余量、某个尺寸必须取标准值,这些判断平时靠口口相传,写成宏之后新人点一下就等于老师傅出手,这也正是很多小团队做内部工具的起点。

需要说明能力边界。二次开发能做的是“调用软件已经提供的能力”,它不会替你发明 SolidWorks 里没有的功能,也不能绕过软件本身的限制。所以入门阶段的目标很朴素:先让代码替你完成一次你手动做过的操作。

2.2 动手前的三样准备

第一样是宏工具栏。在软件里右键任意工具栏区域,把“宏”勾上,你会看到一排小按钮,最常用的是“录制/暂停宏”“停止宏”“运行宏”“编辑宏”。找不到就翻一遍菜单栏里的工具项,宏相关命令都在那附近。

第二样是 VBA 编辑器。SolidWorks 自带 Microsoft VBA 环境,不需要另外安装任何东西。点“编辑宏”就能打开,界面和 Excel 里的 VBA 编辑器是同一套,左边是工程树,右边是代码窗口,下面是“立即窗口”。如果你以前录过 Excel 宏,看到这个界面会非常熟悉,当初学 Excel 就是这么干的。

第三样是一个干净的测试零件。建议新建一个空零件,画一个简单的拉伸凸台,命名为“拉伸1”,然后在同一目录下随便放几个备用零件文件。测试文件越简单越好,出问题时你能一眼看出是代码错了还是模型太复杂。

注意:练习用的文件路径尽量别太深,也别带特殊符号。装在不同语言版本的软件上,特征名会不一样,中文版叫“拉伸1”,英文版叫“Extrude1”,这一点后面还会遇到。

准备工作到此结束。三样东西加起来不超过五分钟,不需要装插件,不需要配环境变量,这也是 SolidWorks 二次开发对新手友好的地方:门槛全在理解上,不在安装上。

2.3 第一个例子:录一段宏,然后让它跑起来

录制的思路和学 Excel 完全一样:让软件把你手上的动作翻译成代码。操作顺序是:

  1. 打开测试零件,确认里面有“拉伸1”这个特征。
  2. 点“录制宏”,随便起个名字,比如test01.swp,保存到桌面。
  3. 在模型树上双击“拉伸1”,把深度改成一个新数值,确认,重建。
  4. 点“停止宏”。

这时你已经有了一个.swp文件。点“编辑宏”打开它,会看到类似下面这样的内容:

' 录制得到的原始宏,能看懂大意,但杂质很多 Dim swApp As Object Dim Part As Object Dim boolstatus As Boolean Dim longstatus As Long, longwarnings As Long Dim FeatureData As Object Dim Feature As Object Dim Component As Object Sub main() Set swApp = Application.SldWorks Set Part = swApp.ActiveDoc ' 下面这句是录制时拖动视角留下的,和业务无关 Part.ActiveView().RotateAboutCenter 0.0662574, 0.0346621 boolstatus = Part.Extension.SelectByID2("拉伸1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0) Part.ClearSelection2 True Part.EditRebuild3 End Sub

先别急着改,读一遍。开头那七行Dim是录制器自动加上去的变量声明,涵盖了它可能用到的所有对象类型,实际用不上这么多。中间Set swApp拿到软件本身,Set Part拿到当前打开的文档,这是每段宏都要走的两步。再往下就是选择特征、清空选择、重建模型这几个动作。

SelectByID2那一行是本例的核心,也是后面章节的主角。它的第一个参数是对象名字,第二个参数是对象类型,中间三个 0 是选择点坐标,后面的False表示不追加选择,0是标记值,Nothing是标注指针。你现在不用全部记住,只要知道“这句话的意思是:把名叫‘拉伸1’、类型是实体特征的那个东西选中”。

现在点运行按钮。如果模型没有变化,说明录制进去的只是“选择”和“重建”,并没有真正改数值,因为录制器对某些对话框操作记录得不完整。这很正常,录制的宏本来就不能直接用,下一章就专门处理这件事。

3. 录出来的宏为什么不能直接用:清理与调试

上一章那个宏跑完没反应,很多新手到这一步就卡住了,怀疑自己操作错了。其实不是操作的问题,而是录制器的工作方式决定的:它忠实记录了你每一个鼠标动作,包括拖动视角、无意义的点选、清空选择,也漏掉了一些在弹出的对话框里完成的修改。留下来的那一堆东西,需要人来挑选和剪裁。

3.1 先分清哪些是业务,哪些是杂音

打开代码,逐行问自己一个问题:如果删掉这一行,最终效果会变吗?不会变的就是杂音。

录制器自动声明的那些变量,绝大多数是杂音。FeatureData、Feature、Component这三个变量在简单的选择场景里根本没被赋值,留着只会让人误以为哪里用到了它们。视图切换那一句RotateAboutCenter也是杂音,它记录的是你录制时随手转了一下模型,跟改尺寸毫无关系。

还有一类是选择顺序上的杂音。录制器经常产生“先选中、再清空、再选中”这种来回折腾的序列,如果前一次选择紧接着就被清空,那前一次就是白做,可以整段删掉。判断方法是看两个选择相关调用之间有没有别的有效操作,没有就连着删掉。

真正属于业务的部分通常只有几行:拿到软件、拿到文档、找到特征、改数据、重建。剩下的都是可以修剪的枝叶。

3.2 删完还要补两样东西

只删不够,还要补。第一样是容错判断,第二样是明确的变量类型。

录制出来的代码通常没有任何保护。如果当前没打开文档,swApp.ActiveDoc会是空的,下一行就会直接报错,而报错信息往往很难懂。手动加一个判断,出错时给一句人话提示,调试效率会高很多。变量类型也建议从Object改成具体类型,比如ModelDoc2、feature,因为编辑器会有代码补全提示,写错属性名能立刻发现。

清理之后的版本大概是这样:

Option Explicit Dim swApp As SldWorks.SldWorks Dim swModel As ModelDoc2 Dim boolstatus As Boolean Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc ' 没开文档就直接退出,别让它往下跑 If swModel Is Nothing Then MsgBox "请先打开一个零件再运行" Exit Sub End If ' 按名字选中名为 拉伸1 的实体特征 boolstatus = swModel.Extension.SelectByID2("拉伸1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0) ' 选不中说明模型里没有这个特征,给提示后退出 If boolstatus = False Then MsgBox "没找到名为 拉伸1 的特征,检查一下名字" Exit Sub End If swModel.EditRebuild3 End Sub

和原始版本相比,这里做了三件事:去掉了没用的变量和视图动作,加了两处If判断,把变量声明换成了具体类型。代码行数少了一半,读起来反而清楚。Option Explicit放在第一行是要求所有变量必须先声明,能帮你抓出拼写错误,初学阶段强烈建议一直开着。

3.3 改一处、跑一次,别攒着改

调试习惯比语法重要。新手常犯的毛病是一次改十行,然后一运行就崩,最后不知道是哪一行出的问题。正确做法是改一行跑一行,每次只验证一个变化。

跑不出预期时,有三个很好用的手段。第一个是Debug.Print,把想看的变量打进“立即窗口”,比如Debug.Print swModel.GetTitle就能确认当前操作的是哪个文档。第二个是断点,在代码窗口左侧灰边上点一下会出现红点,运行到这里会暂停,鼠标悬停在变量上就能看到它的值。第三个是直接看返回值,SelectByID2返回True还是False就说明了选没选中,比靠猜快得多。

提示:报错对话框里那句英文别急着关,先看清是哪一行被高亮。高亮行往往不是真正的错误源头,真正的源头常常在它上一两行。

把这些理顺,你手上就有一个干净、能读、有保护的小宏了。它现在还只会“选中并重建”,不会改任何东西,但骨架已经搭好,接下来往里填动作就行。

4. 从选中到改写:两个必学 API 和访问特征的四步

选特征这件事,用手点是点模型树,用代码点就要靠接口。这一章讲两个最高频的接口,一个负责“按名字选中”,一个负责“把选中的取回来”。它们的组合几乎贯穿了所有二次开发代码,理解这一层,后面改参数、改装配体都是同一套思路的延伸。

4.1 SelectByID2:给它一个名字,它帮你选中

这个接口的全名是ModelDocExtension.SelectByID2,参数不算少,但真正需要你填的只有前两个。

参数类型一般怎么填
Name字符串对象名字,例如 “拉伸1”
Type字符串对象类型,大写,例如 “BODYFEATURE”
X / Y / Z双精度选择点坐标,按名字选时填 0
Append布尔是否追加到现有选择集,通常 False
Mark长整型选择标记,普通选择填 0
Callout对象标注指针,一般填 Nothing
SelectOption长整型选择选项,一般填 0

第二个参数容易让人卡住。类型必须大写,而且要用软件内部定义的字符串,特征用"BODYFEATURE",面用"FACE",边用"EDGE",草图用"SKETCH"。写错了不会报错,只会返回False,然后你会莫名其妙地以为模型里没这个东西。

Append这个参数值得单独说一下。它填False时,会先清空当前选择集,再把目标放进去,相当于“只选它一个”;填True时是往已有的选择集里追加。所以很多示例代码里那句ClearSelection2其实是多余的,因为下一句SelectByID2传False就已经清过了。

4.2 GetSelectedObject5:按索引把选中的取回来

选中只是把东西标出来,要拿到这个对象的属性,还得把它取回来。SelectionMgr.GetSelectedObject5就是干这个的,参数只有一个索引值,从 1 开始,最大不超过当前选择集里对象的数量。

索引 1 表示选择集里的第一个对象。如果你只用SelectByID2选了一个东西,那就取索引 1。如果一次选了多个,就要配合GetSelectedObjectCount拿到总数再循环,这一点在做批量处理时会用到。

把两个接口串起来,就是一段最小可运行的代码:

Option Explicit Dim swApp As SldWorks.SldWorks Dim swModel As ModelDoc2 Dim swSelMgr As SelectionMgr Dim swFeat As feature Dim ok As Boolean Sub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If swModel Is Nothing Then Exit Sub ' 拿到当前文档的选择管理器,后面取值都靠它 Set swSelMgr = swModel.SelectionManager ' 第一步:按名字选中 ok = swModel.Extension.SelectByID2("拉伸1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0) If Not ok Then Debug.Print "选择失败,检查特征名" Exit Sub End If ' 第二步:按索引 1 取回对象 Set swFeat = swSelMgr.GetSelectedObject5(1) If swFeat Is Nothing Then Exit Sub ' 第三步:打印它的名字,确认拿对了 Debug.Print swFeat.Name End Sub

这段代码跑完,立即窗口里应该会输出“拉伸1”。别小看这一步,它证明你已经完整走通了“告诉软件找什么”和“把找到的东西交给我”这两件事,后面的读写操作都建立在这个基础上。

4.3 访问特征数据的固定四步

拿到特征对象只是拿到了一张身份证,它的具体参数还锁在另一个对象里。访问这些参数有固定四步,顺序不能乱:

  1. 声明一个特征数据对象,比如简单直孔用SimpleHoleFeatureData2,拉伸用ExtrudeFeatureData2。
  2. 调用GetDefinition拿到定义对象。
  3. 调用AccessSelections申请访问权限,这一步不成功后面全都白搭。
  4. 读属性或者写属性。

用简单直孔举例,读孔深和孔径:

Dim featData As SimpleHoleFeatureData2 Set featData = swFeat.GetDefinition ' 申请访问,第二个参数在单零件环境下传 Nothing If Not featData.AccessSelections(swModel, Nothing) Then MsgBox "无法访问该特征的数据" Exit Sub End If ' 读参数 Debug.Print "直径 " & featData.Diameter & " 深度 " & featData.Depth ' 用完一定要释放 featData.ReleaseSelectionAccess

第三步最容易忘,也最容易出问题。AccessSelections相当于向软件申请一把锁,申请到了才能改数据,改完必须ReleaseSelectionAccess把锁还回去,否则下一次操作可能被拒绝。这个习惯从一开始就要养成,不然以后写复杂脚本会莫名其妙失败。

4.4 修改数据:把拉伸长度翻一倍

有了访问权限,改数据就是赋值加一个提交动作。以拉伸凸台为例,完整流程是:选中特征、拿定义、申请访问、读当前深度、写新深度、提交修改、释放访问。

Sub doubleDepth() Dim featData As ExtrudeFeatureData2 Dim d As Double Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swSelMgr = swModel.SelectionManager ' 确保选中的是拉伸特征 If Not swModel.Extension.SelectByID2("拉伸1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0) Then Exit Sub Set swFeat = swSelMgr.GetSelectedObject5(1) If swFeat Is Nothing Then Exit Sub Set featData = swFeat.GetDefinition If Not featData.AccessSelections(swModel, Nothing) Then Exit Sub ' 读当前深度 d = featData.GetDepth(True) ' 写回两倍深度 featData.SetDepth True, d * 2 ' 提交修改,这一步不做的话前面的赋值全部作废 If Not swFeat.ModifyDefinition(featData, swModel, Nothing) Then MsgBox "修改失败" featData.ReleaseSelectionAccess Exit Sub End If ' 重建模型让变化显示出来 swModel.EditRebuild3 End Sub

关键在ModifyDefinition这一句。前面SetDepth只是改了内存里的一个副本,必须通过它提交才算真正生效。很多人改完发现模型没反应,十有八九是漏了这句,或者漏了最后的EditRebuild3。

注意:修改之后如果特征处于退回状态,模型可能看不到变化。稳妥做法是在结尾补一次保存和重建,把状态刷新回来。

顺便说一句装配体。往装配体里插零件用的是AddComponent4,参数依次是文件全路径、配置名、三个坐标;加配合用的是AddMate2,流程是清空选择、选中配合面、调用函数、再清空。这些已经属于下一个台阶,但底层逻辑和上面完全一致:选中、取回、访问、操作、提交。

5. 新手最容易翻车的五个地方:现象、原因和补救

写到这里,你已经能跑通一个改参数的宏了。但真正动手时,卡住你的往往不是语法,而是一些看起来莫名其妙的失败。下面这几条都是新手阶段最常遇到的,按“看到什么、为什么、怎么办”整理,遇到时对着查就行。

5.1 宏跑完,模型纹丝不动

现象:点运行,没有任何报错,代码也执行完了,但模型尺寸一点没变。

原因通常有两个。一是只做了选择没做修改,比如把改数值那一步漏掉了;二是改了数据但没有提交,SetDepth之后少了ModifyDefinition。

解决办法:在关键位置插Debug.Print,把读到的旧值和要写的新值都打出来。如果打印出的新值是对的但模型没变,问题就在提交环节;如果连新值都没打出来,问题在前面读取环节。

5.2 报“要求对象”或“对象变量未设置”

现象:运行到某一行直接弹错误,提示需要对象。

原因:往一个还是空的对象上调用方法。最常见的是软件里根本没打开文档,ActiveDoc返回空,下一行就崩了;其次是GetSelectedObject5没取到东西,因为没有选中任何对象。

解决办法:每个可能为空的地方前面都加一次判断,特别是ActiveDoc和GetSelectedObject5的返回值。养成“先判断再使用”的习惯,比事后看错误提示快得多。

5.3 枚举常量找不到,直接编译报错

现象:写swDocPART、swTnExtrusion这类常量时,编辑器报“变量未定义”。

原因:这是类型库引用的问题,和代码写得对不对无关。某些环境里这些常量没有被正确识别,尤其是从网上抄来的示例,作者的环境和你不一样。

解决办法:用数值或者字符串代替。文档类型里,零件是 1,装配体是 2,工程图是 3;特征类型名可以直接用字符串"Extrusion"去比。实在不确定某个常量该填什么数,就先用MsgBox把实际返回的值打出来,看清楚了再写死。

5.4 上一次的选择没清掉,第二次就选错了

现象:单独跑没问题,连跑两次结果就不对了,或者取回的对象不是想要的。

原因:选择集是有状态的,上一次运行留下的选择会影响下一次。GetSelectedObject5(1)取的是当前选择集的第一个,如果集合里混进了别的东西,取到的就不是你期望的那个。

解决办法:每次选择前先调用ClearSelection2清空,或者确保SelectByID2的Append参数传False。取回对象之后也可以顺手再清一次,让下次运行从干净状态开始。

5.5 换了台电脑,特征名对不上

现象:在自己机器上跑得好好的宏,换到同事电脑上就选不中。

原因:代码里写死的是特征名字,而中文版和英文版的默认名字不一样,中文是“拉伸1”,英文是“Extrude1”。同事如果改了模型树里的名字,同样会失效。

解决办法:不要死磕名字。可以改成遍历特征、按类型判断,或者用GetTypeName比对类型后再处理。如果非要用名字,就在代码开头统一改一遍,并把这个位置注释清楚,别让它成为以后找半天的隐患。

6. 下一步学什么:从单个零件走到装配体

单个零件上的读写练熟之后,很自然会想往前走一步:能不能让代码自己开文件、自己插零件、自己加配合?可以,而且用的还是同一套思路,只是多了“先把文件加载进内存”这个前置动作。

这条路建议按下面的顺序推进,一步一个台阶,别跳。

阶段练什么对应接口判断标准
一选中并读取单特征参数SelectByID2、GetSelectedObject5能打印出孔径和孔深
二修改参数并提交GetDefinition、ModifyDefinition模型上能看到尺寸变化
三遍历同类特征批量处理GetFirstFeature、GetNextFeature一次改完所有孔
四打开外部文件并插入装配体OpenDoc6、AddComponent4零件出现在装配体里
五自动添加配合AddMate2两个零件自动对位

到第四阶段会撞上一个坑,值得提前说清楚。往装配体里插零件时,如果直接调AddComponent4,很可能失败,因为这个接口要求指定的文件必须已经在内存里加载过。所以正确顺序是先打开、再插入:

' 先打开零件文件,让它进入内存 Dim errs As Long, warns As Long Dim partDoc As ModelDoc2 partDoc = swApp.OpenDoc6("D:\test\零件1.SLDPRT", 1, 0, "", errs, warns) ' 再插入到当前装配体,坐标放在原点 swModel.AddComponent4 "D:\test\零件1.SLDPRT", "配置1", 0, 0, 0

OpenDoc6第二个参数是文档类型,1 表示零件、2 表示装配体、3 表示工程图;第三个参数是打开模式,填 0 表示静默打开,不弹窗口打扰你。打开后如果不想看到那个零件窗口跳出来,可以把它设成不可见。

加配合会比插入零件复杂,因为要选到具体的面。面通常没有规律的名字,靠SelectByID2拼名字很不靠谱。比较稳的做法是遍历零部件的所有面,找到符合条件的那个,而不是硬写名字。这一块内容多,建议单独花时间啃。

我第一次写这类脚本的时候,想当然地以为打开文件和插入零件是一回事,结果脚本跑了十几遍都是空的,日志里什么也没留下,折腾到半夜才发现是文件压根没加载。从那以后我每次写涉及外部文件的宏,都强制先打印一句文件是否打开成功的日志,再往下走。前面这些坑看着琐碎,真踩过一遍就记住了。

希望这些能帮你少走点弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询