SolidWorks VBAを掌握する:テンプレート継承による堅牢なパーツ生成アーキテクチャ
SolidWorks APIを扱う際、多くのエンジニアが陥る罠がある。「とりあえず動くコード」で構築されたシステムは、数年後のレガシー化と共にメモリリークや意図しないプロパティの混入を招き、組織の設計資産を汚染する。
今日は、社内規格を強固に守り、テンプレートのカスタムプロパティを「確実に」継承したパーツファイルを生成するための、アーキテクト視点での実装論を説く。
—
1. なぜ「NewDocument」ではなく「OpenDoc6」なのか
多くの初学者は `ISldWorks::NewDocument` を選択するが、これには大きな落とし穴がある。テンプレートファイルのパスが環境設定(レジストリ)に依存し、ネットワークドライブの切断やテンプレートの配置ミスによって容易に破綻するからだ。
真に堅牢なシステムを構築するなら、テンプレートファイルを「ドキュメント」として明示的に開き、それを `SaveAs` するアプローチが正解である。これにより、テンプレート側のカスタムプロパティ(図番、設計者、材料など)を確定した状態でコピーを生成できる。
2. メモリ最適化とオブジェクトのライフサイクル管理
VBAはガベージコレクションが甘い。特にSolidWorksのCOMオブジェクトは、明示的に解放しなければプロセスがメモリ上に残留し、数千回の自動生成後にシステムがクラッシュする。
以下のコードでは、`Nothing` による解放だけでなく、必要最小限のAPI呼び出しに留めることで、COMブリッジのオーバーヘッドを極限まで排除している。
実装コード:テンプレート継承パーツ生成ロジック
Option Explicit
‘ 伝説的アーキテクトの作法: オブジェクトを使い捨てず、スコープを最小化する
Public Sub CreatePartFromTemplate(ByVal templatePath As String, ByVal savePath As String)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim errors As Long, warnings As Long
Set swApp = Application.SldWorks
‘ テンプレートファイルを「読取専用」で開き、テンプレートそのものの汚染を防ぐ
Set swModel = swApp.OpenDoc6(templatePath, swDocPART, swOpenDocOptions_ReadOnly, “”, errors, warnings)
If swModel Is Nothing Then
Err.Raise vbObjectError + 1000, “AutoEngine”, “テンプレートファイルの読み込みに失敗しました。”
End If
‘ 【極意】名前をつけて保存することで、カスタムプロパティの継承を保証する
‘ swSaveAsOptions_Silent: ダイアログを出さずシステム連携を阻害しない
‘ swSaveAsVersion_Current: 常に最新のバージョンで保存
swModel.Extension.SaveAs savePath, swSaveAsVersion_Current, swSaveAsOptions_Silent, Nothing, errors, warnings
‘ メモリ最適化の鉄則: 処理が終わったドキュメントは即座に閉じる
swApp.CloseDoc swModel.GetTitle
‘ 参照の明示的解放
Set swModel = Nothing
Set swApp = Nothing
End Sub
3. シニアエンジニアが知るべき「カスタムプロパティ」の深淵
ただファイルをコピーするだけでは、真の自動化とは呼べない。SolidWorksのカスタムプロパティは、 `ICustomPropertyManager` を介して操作するが、ここで重要なのは 「設定特有(Configuration-Specific)」と「ユーザー定義(Custom)」の混同を避けること だ。
社内規格で運用する場合、テンプレート側で「ドキュメント情報」と「コンフィギュレーション情報」がどのように定義されているかを精査する必要がある。
‘ 特定のプロパティを更新する際の実装例
Public Sub UpdateCustomProperty(swModel As SldWorks.ModelDoc2, propName As String, propValue As String)
Dim swCustPropMgr As SldWorks.CustomPropertyManager
‘ 全コンフィギュレーションで共有されるプロパティを操作する場合
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)
‘ 値が既に存在すれば上書き、なければ追加される
swCustPropMgr.Add3 propName, swCustomInfoText, propValue, swCustomPropertyReplaceValue
End Sub
4. レガシー環境とシステム間連携への提言
- エラーハンドリング: `swApp.OpenDoc6` の `errors` 引数を無視してはいけない。ネットワーク遅延によるファイルロックや、テンプレートの破損を検知する `Select Case` 分岐を必ず実装せよ。
- Windows APIの活用: ファイルの存在確認には `Dir()` ではなく、 `GetFileAttributes` (Kernel32) を使うべきだ。ネットワークパスのUNC表記に対しても挙動が安定する。
- システム間連携: JSONやXMLで設計データを受け取る場合、VBA単体で完結させようとせず、一旦中間データ(中間プロパティファイル)に落とし込んでから、この生成スクリプトを回す。これが、疎結合で保守性の高いアーキテクチャの基本である。
—
最後に:自動化の真髄
自動化とは「人間がやっていることをそのままプログラムにする」ことではない。「人間が犯すミスを、システム的な構造(テンプレートとAPIの制約)で物理的に排除する」ことだ。
テンプレートに正しいメタデータを埋め込み、それを継承するプロセスを固定化する。このアプローチこそが、複雑なCAD環境を安定稼働させるための唯一の道である。コードをただ書くのではなく、環境そのものを「制御」せよ。それこそが、我々エンジニアに求められる責務である。
