【テクニカル・上級編】【コンフィギュレーション連携】VBAでパーツのコンフィギュレーションを自動切替・新規追加・寸法変更する – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの深淵:コンフィギュレーション制御を極める「ゼロ・レイテンシ」設計

SolidWorks APIを扱う多くのエンジニアが陥る罠がある。それは、「UI上の操作をそのままコードに落とし込む」という安易なアプローチだ。コンフィギュレーションの切り替えやパラメータ変更を繰り返す際、`ModelDoc2`のインスタンスを漫然と使い回せば、必ずメモリリークと再構築(Rebuild)の泥沼に足を取られる。

今日は、数千ものバリエーションを生成・制御する過酷な環境下でも、一瞬の澱みもなく動作する「高可用性コンフィギュレーション制御」の神髄を伝授する。

1. コンフィギュレーション操作の「裏側」を理解する

コンフィギュレーションは、ただの「設定の束」ではない。それは`IConfiguration`オブジェクトを頂点とし、`CustomPropertyManager`や`Dimension`オブジェクトが複雑に紐付いた「参照グラフ」だ。

安易な切り替えは、SolidWorksのドキュメントキャッシュを無効化し、再構築のフラグを立てまくる。これを避けるためには、「アクティブ化を最小限に抑え、必要なプロパティへダイレクトにアクセスする」という哲学が必要だ。

2. 【核心】コンフィギュレーションの動的生成と最適化

まずは、最も重要である「コンフィギュレーションの安全な作成と変更」の実装例だ。ここで重要なのは、`AddConfiguration3`の引数にある`options`の制御である。

‘ 伝説的アーキテクトによるコンフィギュレーション生成のベストプラクティス
Public Sub CreateOrUpdateConfig(swModel As SldWorks.ModelDoc2, configName As String)
Dim swConfig As SldWorks.Configuration

‘ 既に存在する場合は取得、存在しない場合は作成
Set swConfig = swModel.GetConfigurationByName(configName)

If swConfig Is Nothing Then
‘ swConfigOption_SuppressByDefault はリソース消費を抑えるための必須フラグ
Set swConfig = swModel.AddConfiguration3(configName, “”, “”, swConfigOption_SuppressByDefault)
If swConfig Is Nothing Then Err.Raise vbObjectError + 1000, , “コンフィギュレーションの作成に失敗しました”
End If

‘ 必要に応じてアクティブ化(※極力避けるのが鉄則)
swModel.ShowConfiguration2 configName
End Sub

3. 寸法変更:再構築のオーバーヘッドを殺す

寸法変更の際、`SetDimensionValue`を連打する者がいるが、それはパフォーマンスを殺す行為だ。コンフィギュレーションごとに値を書き換える場合、「対象のコンフィギュレーションのみに適用する」というフラグを明示せねばならない。

‘ 特定コンフィギュレーションの寸法を書き換える
Public Sub UpdateDimensionSafely(swModel As SldWorks.ModelDoc2, dimName As String, newValue As Double)
Dim swDim As SldWorks.Dimension

‘ 文字列名からDimensionを取得
Set swDim = swModel.Parameter(dimName)

‘ swSetValue_InThisConfiguration を指定することで、
‘ 不要な全コンフィギュレーションへの波及(および再構築)を防ぐ
swDim.SetSystemValue3 newValue, swSetValue_InThisConfiguration, Nothing

‘ 変更後は必ずモデルを更新(ForceRebuildは禁忌)
swModel.EditRebuild3
End Sub

4. メモリ管理とオブジェクト解放の鉄則

VBAはガベージコレクションが脆弱だ。特に`ModelDoc2`や`Feature`をループ内で取得し続けると、COM参照が解放されず、SolidWorksのプロセスは時間経過と共に肥大化する。

  • 明示的Nothing: ループ内でのオブジェクト代入後は、必ず`Set obj = Nothing`を徹底すること。
  • イベントの停止: `swApp.UserControl = False` を利用し、バックグラウンド処理中はUIの描画更新を止めることで、パフォーマンスを劇的に向上させられる。

5. シニアエンジニアへの提言

この先、SolidWorks APIを用いた大規模自動化を推し進めるなら、以下の3点を心に刻んでほしい。

1. エラーハンドリングの抽象化: API呼び出しごとに`HRESULT`を確認し、予期せぬ再構築失敗を即座に検知するラッパーを用意せよ。
2. Windows APIの併用: `FindWindow`や`SendMessage`を活用し、SolidWorksのウィンドウ状態を制御することで、バックグラウンドでの安定稼働を実現できる。
3. レガシーの呪縛: 古いマクロ記録のコードを信じるな。あれは「操作の記録」であって「エンジニアリングの解」ではない。オブジェクトモデルの階層を直接叩くことこそが、唯一の正解だ。

この技術は、単なる自動化ツールを超え、あなたの設計プロセスを「数分単位の待ち時間」から解放する。コードを書き終えた後、SolidWorksが沈黙の中で何万ものバリエーションを生成し終えるその瞬間こそが、アーキテクトが味わうべき最高の報酬である。

健闘を祈る。

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