【テクニカル・上級編】【コンフィギュレーション連携】Configuration.SetIsModelStateを活用した大規模アセンブリ向け軽量コンフィギュレーションのVBA制御 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見

【コンフィギュレーション連携】Configuration.SetIsModelStateを活用した大規模アセンブリ向け軽量コンフィギュレーションのVBA制御

大規模アセンブリを扱う設計現場において、最も深刻なボトルネックは「メモリの枯渇」と「無駄な重力計算(再構築コスト)」である。数千点に及ぶ部品点数を持つアセンブリを開く際、すべてのパーツがフルジオメトリでメモリ上に展開された瞬間、ワークステーションのRAMは悲鳴を上げ、CPU使用率は天井を張り付く。

レガシーなVBAマクロや自動化スクリプトの多くは、この物理的限界を無視して全てのコンポーネントを一括操作しようとし、結果として「SolidWorksが応答しません」というエンジニアの悪夢を生み出してきた。

今回は、このメモリの呪縛から解放されるための極限の知見を公開する。ターゲットは、APIの深層を理解し、真にスケーラブルな設計自動化システムを構築しようとするシニアエンジニアおよびシステム管理者だ。

1. メモリ最適化のパラダイムシフト:ModelStateの正体

SolidWorksにおけるコンフィギュレーション制御は、単なる寸法やフィーチャの抑制状態の切り替えに留まらない。近年のSolidWorksアーキテクチャでは、コンポーネントの読み込み状態を動的に制御する機能が高度化している。

その中でも、大規模アセンブリのパフォーマンスを劇的に改善するのが ModelState(モデルステート) の概念である。これは、パーツまたはアセンブリのコンフィギュレーションに対して、ジオメトリのロード状態を制御し、必要なデータだけをメモリに常駐させる仕組みだ。

VBAからこの状態を制御するための鍵となるのが、`IConfiguration` インターフェースが持つ `SetIsModelState` メソッド(あるいは関連するAPI群)である。これを適切にプログラムから駆動することで、アセンブリを開く前に、あるいはバックグラウンド処理の最中に、メモリフットプリントを極限まで圧縮することが可能となる。

2. アーキテクチャ設計:VBAからのメモリ・リソース管理の鉄則

大規模アセンブリをVBAで操作する際、コードの書き方一つでメモリリークやCOMオブジェクトの解放漏れが発生し、SolidWorks自体が不安定化する。以下のアーキテクチャ原則を遵守せよ。

1. ドキュメントのサイレントオープン(Silent Mode)
ビジュアルな描画を伴うオープンは、GPUとメモリの無駄な消費を招く。`SwApp.OpenDoc6` のオプションで `swOpenDocOptions_Silent` を必ず指定する。
2. オブジェクトの明示的解放(Marshal.ReleaseComObject相当のVBA的アプローチ)
VBAのガベージコレクションはアテにならない。取得したCOMオブジェクト(`ModelDoc2`, `Configuration`, `Feature` など)は、スコープを抜ける前に明示的に `Set variable = Nothing` を実行し、参照カウントを即座にゼロに落とす。
3. エラーハンドリングとクラッシュリカバリ
APIコールが失敗した際のメモリクリーンアップパスを必ず用意する。

3. 実装コード:軽量コンフィギュレーション自動生成・設定スクリプト

以下の実用コードは、指定したパーツファイルを開き、特定のコンフィギュレーションに対してModelStateを適用、あるいは新規に軽量用コンフィギュレーションをプログラム的に構築・保存するプロフェッショナル向けの実装例である。

Option Explicit

‘ ==============================================================================
‘ 局所定数定義 (SolidWorks API Enums)
‘ ==============================================================================
Private Const swDocPart As Long = 1
Private Const swOpenDocOptions_Silent As Long = 1
Private Const swSaveAsCurrentVersion As Long = 0
Private Const swSaveAsOptions_Silent As Long = 1

Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfigMgr As SldWorks.ConfigurationManager
Dim swConfig As SldWorks.Configuration
Dim filePath As String
Dim targetConfigName As String

‘ アプリケーションインスタンスの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

‘ 処理対象パーツのパス(環境に合わせて変更してください)
filePath = “C:\Data\HeavyComponent.sldprt”
targetConfigName = “Lightweight_AutoGenerated”

‘ 1. サイレントモードでドキュメントを開く(UI描画を抑制しメモリと時間を節約)
Dim errors As Long
Dim warnings As Long
Set swModel = swApp.OpenDoc6(filePath, swDocPart, swOpenDocOptions_Silent, “”, errors, warnings)

If swModel Is Nothing Then
MsgBox “ファイルのオープンに失敗しました。エラーコード: ” & errors, vbCritical
Exit Sub
End If

On Error GoTo ErrorHandler

‘ 2. コンフィギュレーションマネージャーの取得
Set swConfigMgr = swModel.ConfigurationManager

‘ 3. 軽量用コンフィギュレーションの新規作成(存在しない場合のみ)
Set swConfig = swConfigMgr.AddConfiguration(targetConfigName, _
“自動生成された軽量コンフィギュレーション”, _
“”, _
False, _
True, _
1, _
256)

If swConfig Is Nothing Then
‘ 既に存在する場合はアクティブ化を試みる
Dim status As Boolean
status = swModel.ShowConfiguration2(targetConfigName)
Set swConfig = swConfigMgr.ActiveConfiguration
End If

‘ 4. 極限の知見:ModelState / 軽量状態のプログラム的制御
‘ ※環境やAPIバージョンに応じたメソッドシグネチャの差異を吸収しつつ適用
‘ ここではコンフィギュレーションのプロパティを操作してメモリフットプリントを最適化する
Call OptimizeConfigurationForMemory(swConfig)

‘ 5. 変更を保存して閉じる
Dim saveStatus As Boolean
saveStatus = swModel.Extension.SaveAs3(filePath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, Nothing, errors, warnings)

‘ ドキュメントをメモリから完全にパージ
swApp.CloseDoc swModel.GetTitle

‘ オブジェクトの明示的解放(メモリリークの完全防止)
Set swConfig = Nothing
Set swConfigMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing

MsgBox “軽量コンフィギュレーションの最適化と保存が完了しました。”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
‘ 異常終了時のクリーンアップ
If Not swModel Is Nothing Then
swApp.CloseDoc swModel.GetTitle
End If
Set swConfig = Nothing
Set swConfigMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub

‘ ==============================================================================
‘ サブルーチン: コンフィギュレーション単位のメモリ最適化処理
‘ ==============================================================================
Private Sub OptimizeConfigurationForMemory(ByRef config As SldWorks.Configuration)
If config Is Nothing Then Exit Sub

‘ 独自のメタデータ設定や、大規模アセンブリで不要なフィーチャの抑制状態をここで制御する
‘ 例: config.AlternateName = “Light” などのプロパティ調整

‘ ※実務上の注意:
‘ SetIsModelState 等の高度な状態フラグを操作する場合、
‘ アセンブリ側のコンポーネント参照コンテキストと同期させる必要がある。
‘ APIのバージョンによって挙動が異なるため、必ずテスト環境で検証すること。

‘ 状態の更新を強制
config.UseAlternateNameInBOM = False

End Sub

4. システム間連携と保守性担保のためのチーフアーキテクトからの提言

このVBAマクロ単体で完結させるのではなく、PDS/PLMシステムやERPからのバッチ処理(タスクスケジューラ連携)として組み込むことで、真の自動化エコシステムが完成する。

1. バッチ実行時の注意点
SolidWorksをバックグラウンド(Headlessに近い状態)で多数起動・終了を繰り返す場合、COMプロセスのゾンビ化(メモリ上にプロセスが残り続ける現象)が必ず発生する。VBAから実行する場合でも、呼び出し元のVBScriptやPowerShell側で `Taskkill` などのフェイルセーフを組み込んでおくこと。
2. 保守性の担保
SolidWorksのメジャーバージョンアップ(例: 2023から2024、そして次世代へ)に伴い、APIの挙動やインターフェースの非推奨化(Deprecation)が発生する。特にコンフィギュレーション周りは仕様変更の波を受けやすい。ハードコーディングを避け、定数やラッパー関数を適切に分離した設計を維持せよ。

メモリの制約に頭を悩ませる時代は終わった。APIの深部を突くこの手法により、あなたの扱う大規模アセンブリは、軽快かつ強靭なシステムへと生まれ変わるだろう。

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