【テクニカル・上級編】【SolidWorks VBA入門】テンプレートファイル内のカスタムプロパティを継承したパーツ新規作成コードの書き方 – SolidWorks VBA解析バイブル

スポンサーリンク

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環境を安定稼働させるための唯一の道である。コードをただ書くのではなく、環境そのものを「制御」せよ。それこそが、我々エンジニアに求められる責務である。

タイトルとURLをコピーしました