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

スポンサーリンク

【SolidWorks API】大規模アセンブリを瞬殺する:メモリ枯渇を回避する「軽量表現」の極意

大規模アセンブリ(LAA: Large Assembly)を扱う際、何千もの部品をフルロードしてメモリを食いつぶし、突如としてクラッシュする……そんな開発現場を何度見てきたか分かりません。

「とりあえず開いて、全フィーチャーを走査して…」という素人じみた実装は、プロフェッショナルな自動化エンジニアとしては即刻捨てるべき悪習です。SolidWorksにおけるメモリ管理の肝は、「どれだけロードせず、どれだけ必要な情報にだけアクセスするか」に集約されます。

本稿では、APIレベルでアセンブリのロード挙動を完全に制御し、メモリ消費を最小化する極限の設計手法を伝授します。

—

1. なぜ「フルロード」が開発者の敵なのか

SolidWorksの `OpenDoc6` をデフォルトオプションで叩くことは、巨大なプラント設計において「地雷を踏むこと」と同義です。フルロードされた部品は、グラフィックスデータだけでなく、すべてのフィーチャー定義、寸法、拘束関係がメモリに展開されます。

私たちが目指すべきは、軽量表現(Lightweight)と大規模アセンブリモード(LargeAssemblyMode)のAPIによる強制介入です。これにより、メモリ消費量を劇的に抑えつつ、必要な計算処理だけを確実に遂行できる環境を整えます。

—

2. 堅牢なファイルオープン戦略:プロダクションコード

以下のコードは、単にファイルを開くだけではなく、システムの設定を一時的に退避させ、メモリ負荷を極小化した状態でアセンブリをロードする「実戦用」のテンプレートです。

‘ ————————————————————————-
‘ 大規模アセンブリを安全に開き、軽量モードを強制するプロフェッショナルな関数
‘ ————————————————————————-
Function OpenAssemblySafe(filePath As String) As ModelDoc2
Dim swApp As SldWorks.SldWorks
Dim swModel As ModelDoc2
Dim docOpenError As Long
Dim docOpenWarning As Long

Set swApp = Application.SldWorks

‘ 1. システム設定を制御してメモリとパフォーマンスを最適化
‘ 大規模アセンブリモードを強制的に有効化
swApp.SetUserPreferenceToggle swLargeAssemblyMode, True

‘ 2. ファイルを開くオプションを厳密に設定
‘ swOpenDocOptions_Silent: ダイアログを出さない
‘ swOpenDocOptions_LoadLightweight: 軽量モードでロード
Dim options As Long
options = swOpenDocOptions_Silent Or swOpenDocOptions_LoadLightweight

Set swModel = swApp.OpenDoc6(filePath, swDocASSEMBLY, options, “”, docOpenError, docOpenWarning)

If swModel Is Nothing Then
Err.Raise vbObjectError + 1, “OpenAssembly”, “アセンブリのオープンに失敗しました。”
End If

Set OpenAssemblySafe = swModel
End Function

—

3. なぜこの設計が必要なのか(アーキテクチャの知見)

A. 軽量モード vs フルロードの判断基準

もし、部品の「特定のカスタムプロパティ(図面番号など)」を取得するだけなら、フルロードは完全にリソースの無駄です。`GetDocumentDependencies` を利用して外部参照をリストアップする手法や、`GetConfigurationNames` だけを叩く手法など、「モデルを開かずに情報を抜き出す」設計を優先してください。

B. ガーベジコレクションとオブジェクトの解放

VBAにおいて、`ModelDoc2` オブジェクトを使い終わった後に `Nothing` を代入するだけでは不十分な場合があります。特に大規模処理では、`swApp.CloseDoc` を明示的に呼び出し、メインメモリから物理的に開放するシーケンスを `Finally` ブロック(VBAならエラーハンドリング内)で必ず保証してください。

—

4. プロの現場での注意点:データベース連携

大規模アセンブリの情報をDBへ書き出す際、以下の鉄則を守らないと「DB側の接続数オーバー」や「SolidWorksのフリーズ」を招きます。

  • トランザクションを小分けにする: 10,000部品あるアセンブリを一度に処理せず、100件ごとにコミットする。
  • イベント駆動の活用: SolidWorksのイベント(`AssemblyDoc_ComponentStateChangeNotify`など)を適切にキャッチし、軽量モードが解除された瞬間に検知できるようなフックを仕込んでおく。
  • 非同期的なUI更新: ループ処理中に `DoEvents` を入れすぎるとパフォーマンスが落ちます。かといって入れないとUIが固まり、ユーザーはフリーズしたと勘違いして強制終了させます。「50部品ごとに1回 `DoEvents`」といった適度な間隔を保つのが職人技です。

—

結論:自動化は「引き算」の美学である

大規模アセンブリの自動化において、最も優秀なコードは「何でもできるコード」ではなく、「何もロードしないコード」です。

必要なデータだけにアクセスし、メモリの消費をミリグラム単位で制御する。この意識を持つだけで、あなたの開発するツールはクラッシュ知らずの「工場の心臓部」として信頼されるようになるでしょう。

次は、この軽量アセンブリから、いかに効率よくBOM情報を抜き出し、PDMと同期させるか……その深い森へ足を踏み入れていきましょう。準備はいいですか?

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