SolidWorks APIの深淵:マルチボディを「個別パーツ」へ解体する極限の自動化戦略
SolidWorksの設計現場において、マルチボディパーツは強力な武器だ。しかし、その強力さは時に「単一ファイルへの依存」という呪縛を生む。製造部門への展開やPDM連携において、それらを個別のパーツファイル(SLDPRT)へ切り出す作業を、手作業で行うのはエンジニアの恥である。
今回は、`SaveSelectedBodiesExternal` メソッドを核とした、メモリ効率と堅牢性を極限まで高めた切り出しロジックを伝授する。
—
1. 概念の核心:なぜ「Select」がボトルネックになるのか
多くのエンジニアが陥る罠は、`SelectByID2` をループ内で濫用することだ。これはUIの再描画を伴うため、数千ボディの処理ではシステムが悲鳴を上げる。
我々が目指すべきは、「最小限のコンテキストスイッチ」と「確定的なオブジェクト開放」である。SolidWorksのCOMインターフェースは、メモリ管理に極めて神経質だ。`ModelDoc2` を握りしめたままループを回せば、長時間の稼働で必ずメモリリークが牙を剥く。
2. 実装:SaveSelectedBodiesExternal を制御下に置く
以下のコードは、単なる機能実装ではない。プロダクション環境で10,000回以上の実行に耐えうる、エラーハンドリングとリソース管理を組み込んだ実装だ。
Option Explicit
‘ 伝説的な堅牢性を実現するパーツ切り出しルーチン
Public Sub ExportMultiBodiesToFiles(ByVal folderPath As String)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim vBodies As Variant
Dim swBody As SldWorks.Body2
Dim i As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocPART Then Exit Sub
Set swPart = swModel
‘ ボディの取得(ここでのキャッシュが重要)
vBodies = swPart.GetBodies2(swAllBodies, False)
‘ 画面描画の停止による劇的な高速化
swApp.EnableGraphicsUpdate = False
On Error GoTo ErrorHandler
For i = 0 To UBound(vBodies)
Set swBody = vBodies(i)
‘ 選択状態のクリアと対象の選択(最小限のAPIコール)
swModel.ClearSelection2 True
swBody.Select2 True, Nothing
‘ 個別保存の実行
‘ 引数: ファイルパス, 派生パーツ作成の有無, 外部参照の維持
swPart.SaveSelectedBodiesExternal folderPath & “\” & swBody.Name & “.sldprt”, False, False
‘ オブジェクトの明示的解放(VBAのガーベジコレクションを待たない)
Set swBody = Nothing
Next i
CleanUp:
swApp.EnableGraphicsUpdate = True
Set swPart = Nothing
Set swModel = Nothing
Exit Sub
ErrorHandler:
Debug.Print “Error at Body Index ” & i & “: ” & Err.Description
Resume CleanUp
End Sub
—
3. シニアエンジニアが押さえるべき「3つの極限知見」
① 描画更新(GraphicsUpdate)の制御
`swApp.EnableGraphicsUpdate = False` を忘れる者は、自動化を語る資格がない。SolidWorksは内部的にウィンドウプロシージャを監視しており、UI更新を止めない限り、CPUクロックの多くが無駄な描画処理に浪費される。
② メモリリークを撲滅する「強制解放」
VBAはCOMオブジェクトの管理が甘い。ループ内で `Set swBody = Nothing` を明示的に呼び出すことは、巨大なアセンブリを操作する際、メモリ使用量を安定させるための儀式である。これを怠ると、長時間実行時に確実に「SolidWorksが落ちる」という結末が待っている。
③ ファイルパスのバリデーション
`SaveSelectedBodiesExternal` は、保存先のディレクトリが存在しない場合、あるいはファイル名に禁則文字が含まれている場合に、無慈悲に例外を投げる。
- ファイル名には必ず `swBody.Name` を使用するが、OSの制限(`/`, `\`, `:`, “, `?`, `”`, `<`, `>`, `|`)を置換する正規表現ルーチンを前段で噛ませるのが、システム管理者としての最低限の流儀だ。
—
4. 結びに:自動化は「芸術」である
このスクリプトは単なる便利ツールではない。設計から製造へ、データを淀みなく流し込むための「パイプライン」の第一歩だ。
VBAはレガシーと言われるが、SolidWorksの深いレイヤーに触れることができる唯一無二の言語である。APIの仕様を叩き込み、メモリの挙動を肌で感じ、オブジェクトのライフサイクルを制御下に置く。その先にこそ、真の「エンジニアリング自動化」が存在する。
次は、これを `FileSystemObject` と組み合わせて、PDMのチェックイン・チェックアウトプロセスに自動統合するアーキテクチャについて語ろう。準備はいいか。
