【テクニカル・上級編】【大規模アセンブリの軽量化】LargeAssemblyModeとLightweightのAPI制御によるメモリ節約 – SolidWorks VBA解析バイブル

スポンサーリンク

巨大アセンブリの深淵へ:SolidWorks APIでメモリを支配する

数万点の部品で構成されるプラントや装置。それらを扱うとき、SolidWorksの「GUI操作」に頼るのはアマチュアの所業だ。我々アーキテクトが対峙するのは、メモリの限界と、OSのプロセス境界線そのものだ。

SolidWorks APIを使いこなし、大規模アセンブリを「軽量表現(Lightweight)」と「大規模アセンブリモード(Large Assembly Mode)」で飼い慣らすための、極限の知見を共有する。

1. 概念の分離:なぜ「メモリ」が枯渇するのか

まず理解すべきは、SolidWorksのオブジェクトモデルにおける「ロード」の定義だ。
`ModelDoc2`を開く際、何も考えずに実行すれば、全構成部品の全フィーチャーがメモリに展開される。これは自殺行為に等しい。

  • Lightweightモード: グラフィックスデータのみを読み込み、完全なフィーチャー定義をメモリから切り離す。
  • Large Assembly Mode: 構成部品の読み込みを動的に最適化し、外部参照や不要な更新を抑制する。

この2つをAPIレベルで強制制御することで、数GB単位のメモリ消費を数分の一に圧縮することが可能だ。

2. 禁断の制御:VBAによるロードプロセスの介入

`SldWorks.OpenDoc6`メソッドを無造作に使っていないか? それは「全ロード」を命令しているのと同義だ。以下のコードは、大規模データを扱う際の「標準装備」となるべき構成だ。

‘ 伝説的なアセンブリロードの定石
Public Function OpenAssemblyOptimized(ByVal filePath As String) As ModelDoc2
Dim swApp As SldWorks
Dim swModel As ModelDoc2
Dim errors As Long, warnings As Long

Set swApp = Application.SldWorks

‘ 【極限の知見】オプションをビット演算で制御する
‘ swOpenDocOptions_Lightweight: 強制的に軽量モードで開く
‘ swOpenDocOptions_Silent: ユーザー入力を遮断しプロセスの停止を防ぐ
Dim options As Long
options = swOpenDocOptions_Lightweight Or swOpenDocOptions_Silent

Set swModel = swApp.OpenDoc6(filePath, swDocASSEMBLY, options, “”, errors, warnings)

‘ ロード直後のメモリ断片化を防ぐため、即座にガベージコレクションを意識する
‘ VBA環境では明示的な解放が生命線
If Not swModel Is Nothing Then
Set OpenAssemblyOptimized = swModel
End If
End Function

3. ライフサイクル管理:メモリの墓場を作らない

VBAはガベージコレクション(GC)が優秀ではない。特に`Component2`オブジェクトをループ内で生成し続けると、メモリリークは必至だ。

チーフアーキテクトの掟:
1. `Set = Nothing` は呼吸をするように書け: ループ内で取得したオブジェクトは、次のイテレーションに入る前に必ず解放せよ。
2. `Dispatch`ポインタを溜め込むな: 巨大な配列にオブジェクトを格納するな。必要なのは「パス」か「ID」のみだ。
3. OSレベルの監視: `System.Diagnostics.Process`をWindows APIで監視し、メモリ使用率が80%を超えたら、一度`CloseDoc`してキャッシュをフラッシュするロジックを組み込め。

4. パフォーマンスを極める:Windows APIとの融合

SolidWorks APIの限界に直面したとき、私は迷わずWindows APIを呼び出す。例えば、プロセスのメモリワーキングセットを明示的に解放する手法だ。

If VBA7 Then
Private Declare PtrSafe Function SetProcessWorkingSetSize Lib “kernel32” _
(ByVal hProcess As LongPtr, ByVal dwMinimumWorkingSetSize As LongPtr, ByVal dwMaximumWorkingSetSize As LongPtr) As Long
End If

‘ メモリを強制的にOSに返却する禁断の儀式
Public Sub ForceMemoryCleanup()
Dim hProcess As LongPtr
hProcess = -1 ‘ 現在のプロセス
Call SetProcessWorkingSetSize(hProcess, -1, -1)
End Sub

※この命令は、OSに対して「このプロセスの使用メモリを最小化せよ」と強制するものだ。大規模アセンブリの処理終了後、これを実行することで、システム全体の安定性が劇的に向上する。

5. まとめ:アーキテクトとしての矜持

大規模アセンブリを扱うシステムにおいて、コードの美しさは「処理速度」と「生存率(クラッシュしないこと)」に現れる。

  • GUIを信じるな: APIの引数一つで、メモリ消費量は変わる。
  • レガシーを恐れるな: どんなに古いSolidWorks環境でも、メモリ管理の鉄則は不変だ。
  • 常にプロセスの外側を意識せよ: VBAはSolidWorksの中で動いている小さな歯車に過ぎない。OSとメモリの対話こそが、真の自動化エンジニアの戦場だ。

次に巨大アセンブリに挑む際、このコードが貴殿のシステムの崩壊を防ぐ盾となることを願っている。健闘を祈る。

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