實戰(zhàn):COM對象模型、宏錄制與批量參數(shù)化)
簡介SolidWorks二次開發(fā)全教程系列面向需要借助API與VBA實現(xiàn)建模自動化的工程師以及剛接觸SolidWorks宏開發(fā)的初學(xué)者幫助讀者掌握從錄制宏到編輯、調(diào)試宏的完整流程。教程先從“錄制一個宏”講起說明錄制后代碼通常不能直接使用需要依據(jù)經(jīng)驗做調(diào)整隨后給出編輯或調(diào)試宏的操作路徑并提醒處理.swp與.swb文件時會出現(xiàn)自動轉(zhuǎn)換。針對新宏還具體列出三類需要刪除的冗余代碼未用到的變量聲明、切換視圖的代碼、以及緊鄰ClearSelection2的無效選擇調(diào)用。更進一步教程結(jié)合代碼示例講解SelectByID2和GetSelectedObject5兩個API演示如何按特征名稱選擇對象并通過索引獲取選中特征。整份內(nèi)容為1個doc文檔壓縮后僅276KB篇幅精煉但關(guān)鍵點覆蓋到位。目前已有6199人學(xué)習(xí)下載適合作為SolidWorks二次開發(fā)入門和避坑參考。1. SolidWorks二次開發(fā)全教程系列靠譜在解決什么從錄宏到插件的實際路線網(wǎng)上能找到的 SolidWorks 二次開發(fā)資料并不少但大多數(shù)是“給你一段能跑的宏跑完就沒了”沒有版本說明沒有對象模型講解也沒告訴你怎么處理打開失敗、批量卡死、換機器加載不出來的問題。真正靠譜的路線是先理解 SolidWorks 對外暴露的 COM 接口再從宏錄制拿到第一段可回放代碼最后把它擴展成帶日志、帶回歸測試、能交給同事用的工具。這篇就是按這條路線寫的面向機械結(jié)構(gòu)工程師、工藝工程師和 CAD/PLM 集成開發(fā)目標(biāo)是讓讀者讀完能動手做批量屬性、參數(shù)化改尺寸、自動導(dǎo)出并對常見翻車點有心理準備。2. SolidWorks二次開發(fā)的API底層為什么所有語言都繞不開COM對象模型2.1 SolidWorks進程外COM服務(wù)器拿到Application之后一切才開始SolidWorks 本身不是一個獨立 SDK而是一個 COM 自動化服務(wù)器。你用 C#、VB.NET、Python、C 寫二次開發(fā)本質(zhì)都是連到同一個 SldWorks 實例上調(diào)用接口。這就是為什么時間長了你會發(fā)現(xiàn)不同語言寫的代碼長得完全不一樣但接口名、枚舉值、調(diào)用順序幾乎一致。典型調(diào)用順序是創(chuàng)建或連接SldWorks.Application用OpenDoc6或ActiveDoc拿到當(dāng)前模型順藤摸瓜從ModelDoc2往下找到ModelDocExtension、Feature、Dimension操作完成后保存并關(guān)閉文檔用 Python 做最小連接常見寫法是import win32com.client swApp win32com.client.Dispatch(SldWorks.Application) swApp.Visible True這里的Dispatch會啟動或連接正在運行的 SolidWorks 實例。Visible True表示把 SolidWorks 主窗口顯示出來在批量腳本里我一般會讓它顯示因為窗口隱藏時如果 API 彈出對話框進程會一直等到超時看起來就像假死。需要特別留意SolidWorks 是單進程應(yīng)用不要用CoCreateInstance的方式反復(fù)創(chuàng)建新實例更不要指望“多開 SolidWorks 就能并行跑腳本”。我見過有人為了提升批量處理速度循環(huán)里每次都用CreateObject去拿新實例結(jié)果拿到的還是同一個進程反而把命令行搞出一堆僵尸窗口。2.2 開發(fā)語言怎么選VBA、C#、Python和C各自的硬邊界不用一上來就糾結(jié)“到底學(xué)哪種語言”先看你的使用場景。我的經(jīng)驗如下寫法啟動成本適合場景主要風(fēng)險VBA 宏最低個人提效、原型驗證、錄宏改參數(shù)難發(fā)布、難做日志和錯誤恢復(fù)Python低批量文件處理、后臺服務(wù)、測試腳本需要裝 pywin32位數(shù)要匹配C# Add-in中企業(yè)級插件、菜單、事件回調(diào)、日常駐留版本綁定、COM 注冊和清理C高性能極敏感、深度內(nèi)核集成開發(fā)成本高絕大多數(shù)項目用不上如果只是給自己寫小工具Python 是劃算的選擇。pywin32可以直接調(diào) SolidWorks 的 COM 接口代碼量比 C# 少遇到問題也容易在命令行里試。pip install pywin32就能裝。如果要做成公司里所有人都能用的插件我會選 C# Add-in。它能把功能掛到 SolidWorks 菜單欄能訂閱文檔打開、保存、重建事件也能把日志寫到 Windows 事件日志或文件里。C# 的代價是“部署時踩坑”DLL 的位數(shù)、SolidWorks 版本、.addin 文件路徑只要其中一個不對插件就加載不出來。這個后面會具體講。VBA 宏也不是沒用。新手第一次接觸 API 時最好的入口就是宏錄制錄制一段操作看它生成了什么代碼再反查每個接口在對象模型里的位置。這個習(xí)慣比多看十遍教程都管用。2.3 先背下這張對象關(guān)系圖Application→ModelDoc→Feature→DimensionSolidWorks 二次開發(fā)的對象模型本質(zhì)上是一棵樹SldWorks應(yīng)用入口。負責(zé)打開文檔、獲取當(dāng)前文檔、設(shè)置系統(tǒng)選項。ModelDoc2所有零件、裝配體、工程圖文檔的基類。你拿到ActiveDoc后首先會得到一個ModelDoc2。ModelDocExtension從ModelDoc2.Extension拿到。屬性寫入、配置操作、參考引用等高級功能都掛在這里。PartDoc、AssemblyDoc、DrawingDoc分別對應(yīng)三種文檔類型的接口很多操作需要把ModelDoc2轉(zhuǎn)換成具體類型再做。ConfigurationManager管理配置讀取配置名稱、激活配置。Feature特征樹里的節(jié)點。通過FirstFeature()和GetNextFeature()可以遍歷所有特征。Dimension尺寸對象。改參數(shù)化尺寸時最常用的是ModelDoc2.Parameter(D1Sketch1)。CustomPropertyManager自定義屬性也就是標(biāo)題欄、BOM、ERP 集成里寫入的那些字段。很多人從錄宏開始學(xué)錄完以后不知道哪里改就是因為沒把這棵樹記到心里。比如錄制“在零件里添加自定義屬性”錄出來的代碼里會出現(xiàn)ModelDoc2、Extension、AddCustomProperty3如果你知道Extension是高級操作的掛載點就知道以后查找“屬性、配置、附加數(shù)據(jù)”都要往這里找。反過來如果你錄了一段“拉伸凸臺”錄出來的代碼會是一大串SketchManager和FeatureManager調(diào)用這兩者對應(yīng)的是草圖繪制和特征創(chuàng)建和屬性寫入完全是兩個分支。所以遇到問題先問自己我現(xiàn)在是在操作文檔對象、特征對象還是尺寸對象這一步想清楚照著對象模型圖去查 API 就沒那么難。3. 用宏錄制進入SolidWorks二次開發(fā)從錄制到批量屬性寫入3.1 最簡單的SolidWorks API跑通宏錄制一段“寫自定義屬性”第一次接觸 SolidWorks 二次開發(fā)不建議直接建工程、引 DLL、寫類。先打開 SolidWorks點“工具 → 宏 → 錄制”然后手動完成一次操作在自定義屬性里寫一個值。操作結(jié)束后停止錄制SolidWorks 會生成一段 VBA 宏這段代碼就是你第一份可運行的 API 程序。錄出來的代碼核心邏輯通常長這樣Dim swApp As SldWorks.SldWorks Set swApp Application.SldWorks Dim swModel As SldWorks.ModelDoc2 Set swModel swApp.ActiveDoc Dim ok As Boolean ok swModel.Extension.AddCustomProperty3(材料, 0, , Q235)邏輯說明Application.SldWorks拿到當(dāng)前 SolidWorks 應(yīng)用對象swApp.ActiveDoc拿到當(dāng)前激活的模型文檔然后調(diào)Extension.AddCustomProperty3寫入名為“材料”的自定義屬性。參數(shù)說明材料是屬性名稱會出現(xiàn)在文件的自定義屬性列表里。0表示寫到所有配置。SolidWorks 的swCustomPropertyConfigurationOptions_e枚舉里0 代表所有配置1 代表僅當(dāng)前配置2 代表其他配置。如果裝配體的 BOM 要按配置區(qū)分材料這個參數(shù)就要重新考慮。是配置名。傳空字符串表示不限定單一配置和前面的 0 配合使用。Q235是屬性值。ok是返回值寫入成功返回 True。別忽略它很多詭異問題都是因為寫入失敗但代碼繼續(xù)跑最后保存了一個沒有屬性的文件。順帶說明如果AddCustomProperty3在你手頭的老版本 SolidWorks 里報“方法不存在”可以換成老接口AddCustomInfo2。兩者用途一樣但新版接口對多配置的支持更好返回值也更明確。3.2 批量工具落地Python遍歷目錄處理零件和裝配體宏錄制解決了“會不會”的問題但實際工作里很少只改一個文件。常見的需求是這樣的一個外購件目錄下有一百多個零件要根據(jù)文件名規(guī)則寫入“圖號”“檢查人”“日期”等屬性然后統(tǒng)一另存為 STEP 給下游。這種批量任務(wù)用 Python 寫更順手。下面是能直接跑的目錄遍歷版本import os import win32com.client swApp win32com.client.Dispatch(SldWorks.Application) swApp.Visible True type_map { .sldprt: 1, .sldasm: 2, } folder rD:\part_library\standard_parts for root, _, files in os.walk(folder): for name in files: ext os.path.splitext(name)[1].lower() if ext not in type_map: continue path os.path.join(root, name) # 文件已經(jīng)打開時OpenDoc6 不會返回新對象先查重 opened swApp.GetDocumentByName(name) if opened: continue model swApp.OpenDoc6(path, type_map[ext], 0, , 0, 0) if model is None: print(打開失敗, path) continue try: ok model.Extension.AddCustomProperty3( 檢查人, 0, , 張三 ) if ok: model.Save() finally: swApp.CloseDoc(model.GetTitle())邏輯說明代碼先遍歷目錄下所有.sldprt和.sldasm文件用OpenDoc6逐個打開寫入“檢查人”屬性后保存最后關(guān)閉文檔。try/finally保證不管寫入是否成功文檔都會被關(guān)閉避免 SolidWorks 里的打開文檔越積越多。參數(shù)說明OpenDoc6的第二個參數(shù)是文檔類型.sldprt傳 1.sldasm傳 2工程圖是 3。第三個參數(shù)是打開選項0表示默認方式1表示靜默打開。我一般先不用1因為靜默打開會把錯誤彈窗也屏蔽掉出問題更難定位。最后兩個0, 0在 C# 里必須用ref傳錯誤和警告變量在 Python 里如果只關(guān)心結(jié)果可以傳占位值。這里有一個比較容易被忽略的問題如果目標(biāo)文件已經(jīng)在 SolidWorks 中打開OpenDoc6再調(diào)用一次并不會真的“重新打開”也不會返回你想要的ModelDoc2。所以我在打開前先用GetDocumentByName做了檢查名字匹配就直接跳過。這樣能防止腳本把用戶在用的重要模型關(guān)掉。3.3 新老屬性接口的取舍AddCustomProperty3與AddCustomInfo2寫自定義屬性是一個非常高頻的操作但網(wǎng)上很多老帖子里用的是AddCustomInfo2。這個接口在舊版 SolidWorks 沒有問題只是對“配置”的支持不夠直觀。新版里我更推薦AddCustomProperty3因為它把配置選項作為一個明確參數(shù)寫成(材料, 0, , Q235)一眼能看懂。如果你維護的是老項目代碼里大量用了AddCustomInfo2也不必全部重寫。只要確認寫入后的屬性能在“配置特定”標(biāo)簽下正確顯示就可以繼續(xù)用。但新代碼、新插件建議統(tǒng)一用AddCustomProperty3避免未來 SolidWorks 升級時接口行為變化帶來的批量返工。另外要注意自定義屬性不是寫進去就萬事大吉。SolidWorks 的“文件屬性”和“配置特定屬性”是兩套體系BOM 取哪個字段取決于你的材料明細表模板里綁定了哪個屬性名。二次開發(fā)寫入的內(nèi)容如果和工程圖模板里的屬性名不一致就算值寫對了標(biāo)題欄照樣是空的。所以做批量寫入之前先打開一個模板文件確認它讀取的屬性名到底叫“材料”還是“Material”這個動作比寫代碼還重要。4. SolidWorks二次開發(fā)的四個高頻場景參數(shù)化、裝配、導(dǎo)出與事件回調(diào)4.1 參數(shù)化改尺寸D1Sketch1與EditRebuild3的配合機械設(shè)計里最常聽到的需求是“根據(jù)輸入的參數(shù)自動改模型”。這類需求本質(zhì)不是畫圖而是把已有模型的尺寸參數(shù)暴露給外部程序。SolidWorks 里每個標(biāo)注尺寸都有一個完整名稱比如D1Sketch1其中D1是尺寸編號Sketch1是尺寸所屬草圖或特征。獲取和修改尺寸的典型代碼是def set_primary_dimension(model, dim_name, new_value): try: param model.Parameter(dim_name) param.SystemValue float(new_value) model.EditRebuild3() return True except Exception as e: print(改尺寸失敗, dim_name, e) return False邏輯說明model.Parameter用來按完整名稱獲取尺寸參數(shù)SystemValue是尺寸的系統(tǒng)值單位是米不是毫米。所以如果你輸入的是 25 毫米你要給它0.025或者傳入之前先做單位換算。EditRebuild3是重建模型讓新尺寸真正生效。這里有個很折磨人的坑尺寸完整名稱會隨建模語言變化。中文版 SolidWorks 里D1Sketch1往往顯示成D1草圖1如果使用者改過尺寸名稱還可能出現(xiàn)長度草圖1這樣的自定義名稱。所以硬編碼D1Sketch1的代碼換臺電腦可能直接失效。我的做法是先錄一段宏在模型里手動改一次目標(biāo)尺寸然后從宏代碼里復(fù)制完整的尺寸名而不是靠猜。EditRebuild3也不是每次都必須調(diào)用。如果只是改一個參考尺寸且不關(guān)心模型實時更新可以攢到最后一起重建。批量參數(shù)化時最好先關(guān)掉“自動重建”等全部尺寸都寫完再統(tǒng)一EditRebuild3否則改十個尺寸會重建十次時間全部花在等待上。4.2 自動裝配與配合用組件添加API時需要留意什么自動裝配是看起來很美、實際坑最多的方向。從 API 層面看核心是兩步往裝配體里插入零件然后加配合。插入零件對應(yīng)AssemblyDoc.AddComponent5或它的歷史版本AddComponent4加配合對應(yīng)AddMate5這一族接口。問題是這兩個接口的參數(shù)都非常長而且配合方向、對齊方式、配置選擇稍微傳錯SolidWorks 就會生成完全不同的約束。我給新手的建議是不要一開始就手寫裝配代碼。先錄制一段“插入零件 → 添加重合配合 → 添加同心配合”的宏把錄到的代碼原樣搬進你的工程再逐步把路徑和名稱參數(shù)替換成變量。這樣至少能保證調(diào)用參數(shù)格式是對的你只需要理解每個參數(shù)是干什么的。自動裝配真正要處理的不是“加配合”而是“重復(fù)插入”和“配合失敗”。裝配體里已經(jīng)有同一個零件時AddComponent5會再一次插入新實例不會自動幫你按名稱去重。所以插入前要遍歷GetComponents或者用Component2.GetName2做名稱比對。加配合失敗時AddMate5通常不會直接拋異常而是返回失敗狀態(tài)配合關(guān)系不產(chǎn)生但零件已經(jīng)放進來了這時候裝配體就會處于一種“多了一個零件、卻少一組約束”的中間狀態(tài)。我一般會先把配合放到最后一起加加之前記錄當(dāng)前組件數(shù)量如果失敗就撤銷整批操作。4.3 文件導(dǎo)出PDF、STEP、STL/OBJ給Unity前處理導(dǎo)出這批需求最常見的入口是SaveAs3。擴展名決定輸出格式路徑給全SolidWorks 會按擴展名走轉(zhuǎn)換邏輯export_path rD:\export\part1.STEP model.SaveAs3(export_path, 0, 0, 0, 0, 0)參數(shù)說明第一個參數(shù)是完整導(dǎo)出路徑第二個是版本0表示當(dāng)前 SolidWorks 版本一般不建議改第三個是選項0用默認導(dǎo)出設(shè)置第四個是導(dǎo)出數(shù)據(jù)對象傳0表示不附加額外配置最后兩個是錯誤和警告占位。如果導(dǎo)出 PDF想控制線寬、顏色、圖紙大小需要構(gòu)造ExportPdfData對象后再傳給SaveAs3。導(dǎo)出 STEP 時如果下游是 Siemens NX 或 Creo最好先問一句對方要 AP203 還是 AP214這會影響面曲面和顏色的保留方式。被問得越來越多的需求是把 SolidWorks 模型給 Unity 用。Unity 不認.sldprt也不擅長直接解析龐大的 STEP 文件。穩(wěn)妥路線是先用SaveAs3導(dǎo)出 STL 或 OBJ再通過 Blender 或 3D Max 轉(zhuǎn)成 FBX順便做減面和材質(zhì)拆分。不要在 SolidWorks 里死磕貼圖級別的東西那不是它的強項。如果你的模型只是用來做外觀展示把單位統(tǒng)一成米再導(dǎo)出能省掉 Unity 里縮放一百倍的麻煩。4.4 事件回調(diào)Add-in長期駐留的必需品腳本型工具一般是“打開 SolidWorks → 跑一次 → 退出”它天然不需要關(guān)心事件。但企業(yè)級插件往往要求“用戶在 SolidWorks 里打開模型時插件自動記錄日志保存時插件自動把屬性寫入數(shù)據(jù)庫”。這時候就要做事件回調(diào)。C# Add-in 的常見做法是實現(xiàn)ISwAddin接口在連接方法里訂閱 SolidWorks 的文檔事件。SolidWorks 暴露的事件接口里比較常用的是文檔打開、文檔保存、文檔重建這幾個。訂閱成功后用戶每次打開零件插件都能拿到ModelDoc2然后走你寫好的屬性檢查邏輯。這塊我要給一句實際忠告事件回調(diào)里不要做重操作。用戶打開文件只想趕緊編輯如果你的事件回調(diào)在文檔打開之后馬上遍歷幾百個特征、寫幾十個屬性SolidWorks 界面會被卡住體驗非常差。正確做法是事件回調(diào)里只記錄“發(fā)生了什么、在哪發(fā)生的”然后把真正的批量操作放到后臺線程或者等文檔空閑時再執(zhí)行。這也解釋了為什么很多 Add-in 做到后期核心問題不再是調(diào)用 API而是任務(wù)調(diào)度和異常隔離。5. SolidWorks二次開發(fā)避坑排查四個最常翻車的運行現(xiàn)場5.1 OpenDoc6返回None但目錄里明明有文件現(xiàn)象路徑?jīng)]錯文件也在硬盤上但OpenDoc6返回None代碼直接跳過繼續(xù)處理下一個文件最后發(fā)現(xiàn)一批文件都沒被寫入。原因多數(shù)情況是文檔類型枚舉傳錯了。.sldprt傳 1.sldasm傳 2.sldrw傳 3這里傳錯會讓 SolidWorks 找不到對應(yīng)的打開器。另一個常見原因是文件已經(jīng)在 SolidWorks 里打開了OpenDoc6不會重復(fù)返回新對象。還有可能是 SolidWorks 正在顯示一個模態(tài)對話框比如“是否重建”“是否保存”這時外部調(diào)用會一直得不到結(jié)果。解決先用GetDocumentByName檢查文件是否已經(jīng)打開再按后綴名正確映射類型打開后立刻判斷返回值不要盲目往后走。如果仍然失敗把OpenDoc6的 options 參數(shù)從 0 改成 0 加上靜默標(biāo)記并把錯誤參數(shù)打印出來看具體錯誤碼。錯誤碼比None本身有價值得多。5.2 尺寸被改到別的特征上FullName和自定義名稱的坑現(xiàn)象用Parameter(D1Sketch1)修改尺寸結(jié)果模型重建后改的值出現(xiàn)在了一個完全無關(guān)的特征上或者是模型彈出“無法找到該尺寸”的提示。原因SolidWorks 的尺寸編號不是永久不變的。當(dāng)你刪掉草圖里的某個約束或者在另一個特征前插入新的草圖D1這個名字可能會被重新編號。中文版和英文版的名稱差異更是讓硬編碼方案雪上加霜。解決不要在代碼里硬編碼尺寸名稱??梢杂煤赇浿葡却_認當(dāng)前模型里的真實尺寸名稱或者通過Feature遍歷拿到尺寸對象再判斷它的幾何意義。如果只是做固定模板的參數(shù)化建議給系列模型里每個關(guān)鍵尺寸先手動改成可讀名稱比如“長度主要草圖”這樣代碼可讀性和穩(wěn)定性都會高很多。5.3 批量跑太久SolidWorks假死或崩潰把視圖效果和模型重建分開現(xiàn)象腳本開始的前兩分鐘正常五分鐘后 SolidWorks 窗口無響應(yīng)cpu 占用居高不下嚴重時直接閃退彈窗都來不及保存。原因批量打開模型后SolidWorks 默認會在圖形區(qū)做陰影、反射、邊線渲染每一個模型都觸發(fā)一次完整刷新再加上循環(huán)里頻繁EditRebuild3畫面邊改邊刷新資源很快就頂不住了。這也常被誤認為是 API 不穩(wěn)定其實是繪圖線程被拖垮。解決處理大批量文件前先在 SolidWorks 的系統(tǒng)選項里關(guān)閉陰影和反射顯示效果從“上色帶陰影”改成普通“上色”腳本運行時把圖形區(qū)最小化或縮到托盤能不重建就不重建。需要批量改屬性的文件完全不需要進入重建流程需要改尺寸的只對最后結(jié)果來一次EditRebuild3。另外每個文檔處理完都及時CloseDoc不要讓幾十個模型同時開在后臺。5.4 換一臺機器Add-in加載失敗Interop和安裝路徑問題現(xiàn)象插件在開發(fā)機上一切正常拷到同事電腦上后SolidWorks 插件列表里看不到或者顯示加載錯誤甚至 SolidWorks 啟動時彈出和 CEF、運行時組件相關(guān)的報錯。原因C# Add-in 編譯出來的是一個帶 Interop 引用的托管 DLL它和 SolidWorks 版本、目標(biāo)平臺、COM 注冊狀態(tài)都強相關(guān)。常見具體原因有三個一是 DLL 或 .addin 文件路徑不對二是 C# 項目的目標(biāo)平臺和 SolidWorks 位數(shù)不一致三是開發(fā)機上安裝過 SolidWorks SDK 而目標(biāo)機器沒有對應(yīng)運行時。解決發(fā)布時把插件 DLL 放到固定目錄.addin文件指向的路徑和實際路徑保持一致目標(biāo)平臺改成 x64和現(xiàn)在主流 SolidWorks 保持一致在目標(biāo)機器上用 “以管理員身份運行” 的命令行執(zhí)行注冊命令確認 DLL 被正確登記。遇到啟動時 CEF 報錯的機器先修復(fù)或重裝對應(yīng)版本的 SolidWorks 基礎(chǔ)組件再檢查插件問題順序別搞反。5.5 批量處理后的文件再次打開屬性丟失現(xiàn)象腳本跑完用 SolidWorks 打開文件屬性確實能看到但把文件發(fā)給客戶或者導(dǎo)入 PDM 后屬性字段變空了。原因常見原因不是寫入失敗而是保存時機不對。AddCustomProperty3執(zhí)行后如果不調(diào)用保存相關(guān)接口文件只是內(nèi)存中被修改另外有些批量工具把文件以只讀方式打開保存動作無效。還有一種情況是寫到了配置特定屬性而對方讀取的是“文件屬性”標(biāo)簽下對應(yīng)的字段兩邊不在一處。解決寫入后先判斷返回值再調(diào)用ModelDoc2.Save或Save3確保磁盤文件被刷新。如果是配置特定屬性要確認 BOM 和工程圖讀取的是同一層級的屬性。保存成功后重新打開文件手工去自定義屬性里看一眼這一步最好加到腳本結(jié)尾作為驗證。6. 從能跑到可靠給SolidWorks二次開發(fā)加日志、回歸與“后悔藥”6.1 每個COM調(diào)用都記錄返回值寫 SolidWorks 二次開發(fā)最忌諱的是“代碼執(zhí)行完沒有報錯但結(jié)果不對”。幾乎每個 API 都有返回值或錯誤參數(shù)但很多人懶得管。我現(xiàn)在的習(xí)慣是凡是寫入、保存、重建、導(dǎo)出這一類有副作用的方法返回值全部記錄下來至少記錄到內(nèi)存日志里。拿屬性寫入舉例我會這樣記錄ok model.Extension.AddCustomProperty3(檢查人, 0, , code) logger.info(%s | 檢查人%s | result%s, model.GetTitle(), code, ok)運行結(jié)束后用日志過濾resultFalse的行而不是靠眼睛一個個打開模型看屬性。這對幾百個文件的批量任務(wù)尤其重要否則最后你根本不知道哪些成功、哪些失敗。6.2 復(fù)制件回歸測試在大量修改自己的二次開發(fā)工具之前我會先復(fù)制一份零件和裝配體副本在副本上跑新邏輯。原因很簡單SolidWorks 的 API 行為會隨版本和模型狀態(tài)變化你覺得“肯定沒問題”的代碼換一個新版本可能就有問題。回歸測試可以很簡單跑完腳本后用CustomInfo2把屬性讀出來和目標(biāo)清單比對輸出不一致的記錄。我會把這一步固化到腳本里不能省。特別是改尺寸和自動裝配這類不可逆操作副本方案的保底價值極大相當(dāng)于給自己留了一顆后悔藥。6.3 只做“完成時”寫入的操作習(xí)慣還有一個我踩過多次的坑不要讓代碼“邊做邊寫”。比如批量改屬性時每改一個文件就立刻保存如果中途 SolidWorks 崩潰前面已經(jīng)保存的文件已經(jīng)污染完畢還沒跑到的文件保持原樣最后兩邊狀態(tài)不一致?,F(xiàn)在我的做法是先只讀地打開所有需要處理的文件把操作全部在內(nèi)存里準備好最后統(tǒng)一保存。凡是不能保證中途失敗的就不急著落盤。我年少輕狂時寫過一次自動裝配的腳本直接在原裝配體上邊插入零件邊保存。跑到一半遇到一個壞參考文件SolidWorks 直接崩掉原裝配體結(jié)構(gòu)損壞靠備份才救回來。從那以后所有不安全的批量改動都在副本上做代碼里加日志保存前先備份。希望幫到你。本文還有配套的精品資源點擊獲取