简介:这份资料面向希望入门 SolidWorks 二次开发的工程师与设计人员,聚焦用 API 与 VBA 实现自动化建模和自定义操作,解决手工重复设计效率低的问题,属于从零起步的系列教程。包内共 1 个 doc 文档,压缩包约 276KB,以文字讲解为主,便于随时查阅与对照练习。已有 6200 余人学习,说明其在同类入门资料中具备一定参考价值。内容从录制宏讲起,说明直接录制的代码为何不能直接使用,并给出编辑与调试宏的具体建议,如删除未使用的变量声明、清理切换视图代码、处理 SelectByID2 与 ClearSelection2 调用等;随后以 SelectByID2 和 GetSelectedObject5 两个 API 为例,演示如何访问与选中特征,并附 VB 语法说明。整体适合作为二次开发的起步读物,帮助读者建立宏录制、代码精简与特征访问的基本思路。
1. 零基础也能上手的 SolidWorks 二次开发:先搞懂它到底在干什么
很多人第一次听到「SolidWorks 二次开发」,脑子里冒出来的画面是程序员对着黑屏敲代码,跟自己这种天天画图的人没关系。其实换个说法就好理解了:你每天在 SolidWorks 里重复的那些动作——打开零件、拉伸、改尺寸、插进装配体、加配合——本质上都是一串可以被记录下来的操作。二次开发就是把这些操作写成一段程序,让软件自己去做。你不需要成为程序员,你只需要学会「指挥」软件替你干活。
这份教程系列走的就是最朴素的路线:先录一个宏看看软件自己生成了什么代码,再学着改两行、读一个特征、改一个尺寸,最后往装配体里插零件、加配合。它适合完全没写过代码但天天用 SolidWorks 的画图人,也适合想把手头重复劳动压缩掉的新手。入门阶段你只需要装好 SolidWorks 自带的 VBA 环境,跟着一步步敲,不用额外配什么复杂工具链。
2. 为什么值得学:从录制一个宏开始建立信心
2.1 先弄明白宏是什么,为什么它是最好入口
宏这个词听着玄,其实就是「操作录像」。你在 SolidWorks 里点一下「录制宏」,然后正常画一个拉伸、改个尺寸、停掉录制,软件就会把刚才的动作翻译成一段 VBA 代码存成.swp文件。这段代码你能打开看、能改、能再运行。对零基础的人来说,这是唯一一个不用先学语法就能看到「程序长什么样」的入口。
我第一次接触的时候也是这么干的,跟当年学 Excel 录制宏一模一样。区别在于 SolidWorks 录出来的代码比较「脏」——它会把你切换视图、点空白处这些无关动作也记进去,直接运行经常报错。所以录制只是第一步,真正要学的是「录完之后怎么清理」。这份教程开篇就点明了这件事:直接录的宏不能直接用,需要做调整。这句话很实在,新手最容易被「录完就能跑」的预期坑到。
2.2 录制之后必须做的三件清理动作
录完一个宏,点「编辑宏」打开 VBA 编辑器,你会看到一堆自动生成的变量声明和操作语句。教程里给了明确的清理清单,我按新手能理解的方式拆开说:
第一,删掉没用到的变量声明。SolidWorks 会自动声明swApp、Part、boolstatus、FeatureData等一堆对象,但你这个宏可能只用了其中两三个。留着不影响运行,但看着乱,而且以后改代码容易搞混。用不到的整行删掉。
第二,删掉切换视图的代码。像Part.ActiveView().RotateAboutCenter 0.0662574, 0.0346621这种,是你录制时手抖转了模型被记下来的。它对自动化毫无意义,无情删掉。
第三,处理选择相关的冗余调用。SelectByID2和ClearSelection2这两个函数如果紧挨着出现、互相抵消,就按教程说的规则删:SelectByID2出现在ClearSelection2之前的可以删,之后的不要删;反过来ClearSelection2出现在SelectByID2之前的也可以删。这条规则新手容易记反,建议先照做,跑通了再回头理解为什么。
提示:在「工具 → 选项 → 系统选项 → 常规」里勾上「录制宏后自动编辑宏」,以后每次停止录制会直接弹出编辑器,省一步操作。这个设置是持久的,关掉软件再开还在。
2.3 第一个能跑的例子:选中一个特征并打印它的名字
清理完宏之后,我们正式写第一个有意义的程序。目标很简单:让程序找到模型里一个叫「拉伸1」的特征,把它选中,然后打印出它的名字。这个例子用到了教程里重点讲的两个 API:SelectByID2和GetSelectedObject5。
Option Explicit Dim swApp As SldWorks.SldWorks Dim Model As ModelDoc2 Dim feature As feature Dim boolstatus As Variant Sub main() Set swApp = Application.SldWorks Set Model = swApp.ActiveDoc ' 按名称选择叫"拉伸1"的特征,类型指定为 BODYFEATURE boolstatus = Model.Extension.SelectByID2("拉伸1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0) If boolstatus = True Then Dim SelMgr As SelectionMgr Set SelMgr = Model.SelectionManager ' 取当前选择列表里的第 1 个对象 Set feature = SelMgr.GetSelectedObject5(1) Debug.Print feature.Name Else Debug.Print "Error" End If End Sub逐段解释一下。Option Explicit强制你声明所有变量,新手建议一直开着,能提前发现拼写错误。swApp是 SolidWorks 应用本身,Model是当前打开的文档。SelectByID2的九个参数里,前两个最关键:第一个是对象名字,第二个是对象类型(大写字符串,比如BODYFEATURE表示实体特征)。中间三个0, 0, 0是选择坐标,按名字选的时候填 0 就行。False表示不追加选择,会先清空再选。倒数第二个Nothing是标注指针,最后一个0等价于swSelectOptionDefault。
GetSelectedObject5(1)里的1是索引,表示选择列表里的第一个对象。注意索引从 1 开始,不是 0,这是新手常翻车的地方。如果选择成功,feature.Name就会打印出特征名;失败则打印Error。这段代码跑通,你就已经完成了「程序能读到模型里的东西」这一步,后面所有操作都是在这个基础上加东西。
3. 从读到改:访问特征数据并修改参数
3.1 访问一个简单直孔,把深度和直径读出来
能选中特征之后,下一步是读它身上的数据。教程里用简单直孔举例,思路是:先拿到特征对象,再拿它的「定义」,然后申请访问权限,最后读属性。这三步缺一不可,顺序也不能乱。
Option Explicit Dim swApp As SldWorks.SldWorks Dim Model As ModelDoc2 Dim curfeature As feature Dim featdata As SimpleHoleFeatureData2 Dim component As Component2 Dim SelMgr As SelectionMgr Dim dep As Double Dim dia As Double Sub getselected() Set swApp = Application.SldWorks Set Model = swApp.ActiveDoc Set SelMgr = Model.SelectionManager ' 前提:运行前先在模型里手动选中一个简单直孔特征 Set curfeature = SelMgr.GetSelectedObject5(1) If curfeature Is Nothing Then MsgBox "请先选中一个简单直孔特征" Exit Sub End If Set featdata = curfeature.GetDefinition If featdata.AccessSelections(Model, component) = False Then MsgBox "无法访问特征数据" Exit Sub End If dep = featdata.Depth dia = featdata.Diameter MsgBox dia & "*" & dep featdata.ReleaseSelectionAccess Model.EditRebuild End Sub这里的关键动作是GetDefinition拿到特征定义对象,AccessSelections申请访问权限,读完数据后必须ReleaseSelectionAccess释放,否则后面再操作同一个特征可能出问题。教程原文的版本没有容错判断,我在这里补了Is Nothing和AccessSelections的返回值检查——新手写宏最容易忽略的就是「用户没选东西」这种情况,加上判断能少很多莫名其妙的报错。
Depth和Diameter是简单直孔定义对象上的属性,直接读就行。Model.EditRebuild是让模型重建一次,保证界面和数据同步。如果你读出来是 0 或者报类型不匹配,先确认你选中的确实是简单直孔,而不是拉伸孔或异型孔向导生成的特征,类型对不上是读不到属性的。
3.2 修改拉伸深度:一个带完整容错的例子
读会了,改就是反过来赋值。教程里给了一个比较完整的例子:把基础拉伸的深度翻倍。这个例子的价值不在于「翻倍」这个动作,而在于它展示了修改一个特征的标准流程和容错写法,可以直接当模板用。
Option Explicit Dim swApp As SldWorks.SldWorks Dim Model As ModelDoc2 Dim Component As Component2 Dim CurFeature As feature Dim FeatData As Object Dim Depth As Double Dim SelMgr As SelectionMgr Dim isGood As Boolean Sub doubleBE() Set swApp = CreateObject("sldWorks.application") Set Model = swApp.ActiveDoc ' 确认当前文档是零件或装配体 If Model.GetType <> 1 And Model.GetType <> 2 Then swApp.SendMsgToUser2 "只支持零件或装配体", 0, 0 Exit Sub End If Set SelMgr = Model.SelectionManager Set CurFeature = SelMgr.GetSelectedObject5(1) If CurFeature Is Nothing Then swApp.SendMsgToUser2 "请选中基础拉伸特征", 0, 0 Exit Sub End If ' 确认选中的是拉伸特征 If Not CurFeature.GetTypeName = "Extrusion" Then swApp.SendMsgToUser2 "请选中基础拉伸特征", 0, 0 Exit Sub End If Set FeatData = CurFeature.GetDefinition isGood = FeatData.AccessSelections(Model, Component) If Not isGood Then swApp.SendMsgToUser2 "无法获取访问权限", 0, 0 Exit Sub End If If Not FeatData.IsBaseExtrude Then swApp.SendMsgToUser2 "请选中基础拉伸", 0, 0 FeatData.ReleaseSelectionAccess Exit Sub End If ' 读原深度,设为两倍 Depth = FeatData.GetDepth(True) FeatData.SetDepth True, Depth * 2 ' 提交修改 isGood = CurFeature.ModifyDefinition(FeatData, Model, Component) If Not isGood Then swApp.SendMsgToUser2 "修改特征失败", 0, 0 FeatData.ReleaseSelectionAccess End If End Sub几个新手必须知道的点。第一,Model.GetType返回的是整数,零件是 1,装配体是 2,教程作者也提到他环境里枚举常量没通过、改用整数才跑通,你遇到同样情况别慌,用MsgBox Model.GetType先看一眼实际值。第二,GetTypeName判断拉伸特征时,教程里写swTnExtrusion没通过,改成字符串"Extrusion"才 OK,这类「常量不认」的情况在旧版本里很常见,遇到就退回字符串。第三,ModifyDefinition是真正让修改生效的函数,改完不调用它,界面上什么都不会变。第四,如果改完特征出现「退回」状态,教程作者的做法是在末尾补Model.Save和Model.Rebuild,这是血泪经验,先照做。
注意:
AccessSelections和ModifyDefinition成对出现,中间任何一步失败退出,都要先ReleaseSelectionAccess再退出,否则选择状态会卡住,下一次运行可能直接失败。
4. 往装配体里插零件:AddComponent4 和 OpenDoc6 的配合
4.1 为什么直接调 AddComponent4 会失败
很多人学到插零件,第一反应是找到AddComponent4这个函数,把路径、配置、坐标填进去就完事。教程里明确泼了冷水:这样写不好用。原因藏在函数的备注里——指定的文件必须已经在内存中加载过。也就是说,你不能指望这个函数帮你打开一个磁盘上没打开过的零件,它只负责把「已经打开的」零件放进装配体。
这个限制很反直觉,但没办法绕。正确顺序是三步:先拿到当前装配体文档,再用OpenDoc6把目标零件打开到内存,最后才调AddComponent4插进去。教程作者也说了他当时没找到更好的方法,只能按这个来。新手记住这个顺序就行,别在AddComponent4上死磕。
4.2 完整插入流程:先打开,再插入
Option Explicit Dim swApp As SldWorks.SldWorks Dim Model As ModelDoc2 Dim YSBmodel As ModelDoc2 Dim pth As String Dim strpath As String Dim nErrors As Long Dim nWarnings As Long Sub insertpart() Set swApp = Application.SldWorks strpath = swApp.GetCurrentWorkingDirectory Set Model = swApp.ActiveDoc pth = strpath & "零件1.SLDPRT" openpart pth ' 参数:文件全路径、配置名、x、y、z Model.AddComponent4 pth, "配置1", 0, 0, 0 End Sub Sub openpart(ByVal pth As String) Dim newswapp As SldWorks.SldWorks Set newswapp = Application.SldWorks ' 类型 1 表示零件,0 表示静默打开 Set YSBmodel = newswapp.OpenDoc6(pth, 1, 0, "", nErrors, nWarnings) YSBmodel.Visible = False End SubOpenDoc6的参数里,第二个是文档类型:0 不是 SolidWorks 文件,1 是零件,2 是装配体,3 是工程图。第三个是打开模式,填 0 对应静默打开,不弹一堆窗口。第四个是配置名,留空就用上次使用的配置。最后两个是输出参数,用来接错误和警告码,声明成Long就行。AddComponent4的四个参数依次是文件全路径、配置名、插入点的 x/y/z 坐标,成功会返回一个指向该零部件的指针。
YSBmodel.Visible = False这行是教程作者加的,目的是打开零件但不想看到它弹出来。这个习惯挺好,批量插零件的时候界面不会乱闪。如果你插进去发现位置不对,先检查坐标单位,SolidWorks API 默认用米,你填 0 没问题,填具体数值时要换算。
5. 新手避坑:这几处最容易翻车
5.1 录完宏直接运行,报错一片
现象:录制完一个宏,点运行,弹出一堆类型不匹配或对象为空的错误。原因:录制的宏里混进了切换视图、点空白处等无关操作,还带着没用的变量声明,直接跑必然出问题。解决:按第 2 章的三条清理规则先删一遍,尤其是RotateAboutCenter这类视图代码和成对出现的SelectByID2/ClearSelection2冗余调用,删完再跑。
5.2 索引从 0 开始写,取不到对象
现象:GetSelectedObject5(0)返回空,程序报错。原因:选择列表的索引从 1 开始,不是 0。解决:第一个对象用GetSelectedObject5(1),第二个用 2,以此类推。写之前先用SelectionMgr.GetSelectedObjectCount确认当前选了几个,避免越界。
5.3 枚举常量不认,编译就报错
现象:照着文档写swDocPART、swTnExtrusion,VBA 编辑器直接标红说变量未定义。原因:部分版本的 VBA 环境没有自动引入这些枚举,或者常量名有差异。解决:退回整数或字符串,零件用 1、装配体用 2,拉伸类型用"Extrusion"。不确定实际值时,用MsgBox把Model.GetType或GetTypeName打出来看一眼,比猜快得多。
5.4 改完特征没反应,模型还是老样子
现象:代码跑完没报错,但模型尺寸没变。原因:只改了FeatData上的值,没有调用ModifyDefinition提交,或者提交失败没检查返回值。解决:确认ModifyDefinition被调用且返回 True;如果特征出现「退回」状态,在末尾补Model.Save和Model.Rebuild。另外每次访问完记得ReleaseSelectionAccess,不然下一次操作可能拿不到权限。
5.5 插零件时提示文件不在内存
现象:AddComponent4返回空或报错,零件没插进去。原因:目标零件没有先用OpenDoc6打开到内存。解决:严格按「打开装配体 →OpenDoc6打开零件 →AddComponent4插入」的顺序写,路径用全路径,配置名要和零件里实际存在的配置一致,拼错配置名也会失败。
6. 下一步学什么:把宏变成能反复用的工具
跑通上面几个例子之后,你已经摸到了 SolidWorks 二次开发的主干:选择对象、读定义、改数据、提交修改、操作装配体。接下来不建议急着啃大而全的 API 文档,而是按「一个小需求一个小宏」的节奏往前推。比较顺的路径是这样:
| 阶段 | 练什么 | 对应教程位置 |
|---|---|---|
| 第一周 | 录制宏 + 清理 + 选中特征打印名字 | 第 01、02 篇 |
| 第二周 | 读简单直孔参数、改拉伸深度 | 第 03、04 篇 |
| 第三周 | 往装配体插零件、遍历面加配合 | 第 05、06 篇 |
| 之后 | 把常用宏挂到工具栏按钮上 | 自行扩展 |
具体做法上,我建议你每学一个 API,就回到自己手头的模型里找一个真实场景套进去。比如你经常要给一批孔改直径,那就写一个「选中孔 → 读直径 → 弹输入框 → 改直径 → 重建」的小宏,跑通一次,比看十页文档都管用。遍历面加配合那部分(教程第 06 篇)是难点,因为面的命名没规律,作者的做法是用GetFaces、GetFirstFace、GetNextFace去遍历,而不是靠SelectByID2猜名字。这个思路值得先记住:能遍历就别猜名字。
还有一个习惯我从踩坑里养出来的:每写完一个宏,先在一个空白零件上跑一遍,再拿到真实模型上跑。真实模型里特征多、命名乱,直接上容易把「代码问题」和「模型问题」混在一起,排查起来很痛苦。从那以后我每次改完宏,都强制先在测试文件里走一遍最小流程,确认没问题再碰正式图纸。希望这个习惯也能帮到你,少走几段弯路。
本文还有配套的精品资源,点击获取