SOLIDWORKS
SOLIDWORKS 錄製的巨集,換個零件就失效?原因與改法
用 SOLIDWORKS 的「錄製巨集」把一連串操作錄下來,在原本的檔案上執行很正常, 換一個零件、換一台電腦就出錯或沒有反應?原因通常不是巨集壞了, 而是錄製的程式碼本來就只描述了「那一次」的操作。
本文目錄(7 節)
錄製器記下的是「這一次」的點選
錄製巨集時,SOLIDWORKS 會把你的每個動作轉成 VBA 程式碼。選取物件的動作, 通常會變成類似這樣的一行:
boolstatus = Part.Extension.SelectByID2("Boss-Extrude1", "BODYFEATURE", 0, 0, 0, False, 0, Nothing, 0)SelectByID2 是依「名稱+類型」(有時再加上座標)去找物件。 錄製當下的特徵名稱、面的位置都被原封不動寫進程式,換到另一個檔案時, 名稱或位置不同,選取就會失敗,後續的步驟跟著出錯。
名稱寫死:換檔案、換語系就找不到
- 特徵名稱:同一種特徵在不同零件的編號不同(A 零件是第 1 個伸長,B 零件是第 3 個),或已被重新命名
- 基準面名稱:中文版錄製的是「前基準面」,同一個巨集拿到英文版 SOLIDWORKS 的範本上,名稱是 Front Plane,就找不到
- 組合件元件:錄到的是「零件名稱-1@組合件名稱」這類完整路徑,換個組合件就不存在
數值看起來很怪:API 使用公尺與弧度
錄製出來的程式裡,常看到 0.01、0.025 這種數字, 這是因為 SOLIDWORKS API 內部一律使用公尺與弧度, 不受文件設定的單位影響。
| 介面上輸入 | 程式中的值 |
|---|---|
| 10 mm | 0.01 |
| 25 mm | 0.025 |
| 90° | 1.5707963(π/2) |
直接修改巨集裡的尺寸時,忘了換算單位,結果就會差 1000 倍。
路徑與檔名寫死
錄製「另存新檔」或「開啟檔案」時,完整路徑會被寫進程式,例如C:\Users\某人\Desktop\零件1.SLDPRT。換一台電腦、換一個使用者,路徑就不存在。 輸出 PDF 的檔名也是固定的,連續執行只會一直覆蓋同一個檔案。
沒有判斷:遇到不同狀況就中斷
錄製的巨集是一條直線,不會判斷目前的狀況,常見的中斷情形:
- 沒有開啟任何文件就執行,出現「物件變數或 With 區塊變數未設定」(執行階段錯誤 91)
- 在工程圖上執行了只適用於零件的巨集
- 選取失敗後沒有停下來,後面的步驟對著空的選取繼續做
有些操作錄不到
並不是所有操作都會被錄製器轉成程式碼,部分對話框或屬性管理員裡的設定不會完整出現在錄製結果中。 錄完之後建議先在另一個檔案上測試一次,確認每個步驟都有被記錄下來。
改法:把「錄製」改寫成「規則」
錄製巨集適合用來「查出某個操作要呼叫哪個 API」,要能重複使用,需要改寫成依規則判斷的程式:
- 先確認環境:有沒有開啟文件、文件類型對不對
- 用規則找物件,不用名稱:例如依特徵類型逐一尋找、依自訂屬性判斷,而不是寫死特徵名稱
- 路徑從文件本身推算:輸出位置以目前檔案所在的資料夾為基準,檔名由屬性組合
- 每一步檢查結果:選取或輸出失敗時,停止並告訴使用者原因
第一步的寫法大致如下:
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Sub main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox "請先開啟零件"
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox "這個巨集只適用於零件"
Exit Sub
End If
' 以下依規則處理…
End Sub功能少、只有自己用時,改寫過的巨集就很夠用;要給整個部門長期使用、需要統一安裝與更新時, 再考慮做成 Add-in。