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

スポンサーリンク

巨大アセンブリを「VBAで捌く」ための極意:メモリの断食と軽量化戦略

こんにちは。SolidWorksの自動化の世界へようこそ。

「マクロを走らせたらSolidWorksがフリーズした」「メモリ不足で強制終了した」。大規模なプラントや数千パーツの装置を扱うエンジニアなら、一度は経験する悪夢ですよね。

実は、SolidWorksのAPIを使いこなすということは、「SolidWorksにいかに楽をさせるか」というリソース管理の戦いでもあります。今日は、メモリを食いつぶす大規模アセンブリを、VBAから「軽量化」して安全に処理するための極限のテクニックを伝授します。

1. なぜ「軽量化(Lightweight)」が重要なのか?

SolidWorksには、部品をメモリにフルロードせず、グラフィックスとメタデータだけを読み込む「軽量表現(Lightweight)」というモードがあります。

API経由でアセンブリを操作する際、何も指定しなければSolidWorksは律儀に全パーツのフィーチャー情報をメモリに展開しようとします。これがクラッシュの最大の原因です。

私たちが目指すべきは、「必要な時だけ、必要なパーツだけを、軽量状態で叩く」という、いわば「外科手術のような精密なメモリ管理」です。

2. 実践:アセンブリを「軽量」で開くためのAPI

まず、ファイルを開く段階で「メモリの節約」を確定させましょう。`OpenDoc6` メソッドを使う際、オプションを適切に設定するのが第一歩です。

Sub OpenAssemblyLightweight()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim fileName As String
Dim longStatus As Long, longWarnings As Long

Set swApp = Application.SldWorks
fileName = “C:\Projects\LargePlant.sldasm”

‘ 【重要】軽量モードで開くための定数
‘ swOpenDocOptions_Silent: ダイアログを出さない
‘ swOpenDocOptions_LoadLightweight: 軽量モードで読み込む
Dim options As Long
options = swOpenDocOptions_Silent Or swOpenDocOptions_LoadLightweight

Set swModel = swApp.OpenDoc6(fileName, swDocASSEMBLY, options, “”, longStatus, longWarnings)

If swModel Is Nothing Then
MsgBox “ファイルの読み込みに失敗しました。”
Exit Sub
End If

Debug.Print “アセンブリを軽量モードでロードしました。”
End Sub

このコードのポイント

  • `swOpenDocOptions_LoadLightweight`: これが魔法の引数です。これだけで、フルロード時のメモリ消費量を劇的に抑えられます。
  • `swOpenDocOptions_Silent`: API実行中に警告ウィンドウが出てプログラムが止まるのを防ぎます。自動化の基本ですね。

3. 実行中のモデルを「軽量化」するAPIテクニック

すでに開いているアセンブリを処理する場合、あるいは特定の部品だけを軽量化したい場合は、`SetLightWeight` メソッドを使います。

Sub ForceLightweightAllComponents()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel.GetType <> swDocASSEMBLY Then Exit Sub

Set swAssy = swModel

‘ アセンブリ内の全コンポーネントを軽量化
‘ これにより、メモリ消費が抑えられ、APIの応答速度が向上します
Dim success As Boolean
success = swAssy.SetLightWeight(True)

swModel.ForceRebuild3 True ‘ 再構築して状態を確定

MsgBox “全コンポーネントを軽量化しました。”
End Sub

4. 初学者が陥りやすい「クラッシュの罠」

プロの現場でよく見る「やってはいけないこと」を教えます。

罠1:コンポーネントをわざわざ「解決済み(Resolved)」にしてしまう

APIで属性を取得したいとき、つい「フルロード(解決済み)」したくなりますよね。しかし、`Component2.GetModelDoc2` を呼び出すと、そのパーツは強制的にフルロードされてしまいます。

  • 対策: 属性値(プロパティ)が欲しいだけなら、コンポーネントの `CustomPropertyManager` を使いましょう。これならモデルをロードせずに値だけを抜き出せます。

罠2:不必要なモデルの更新(Rebuild)

大規模アセンブリでの `swModel.ForceRebuild3` は重罪級の負荷です。変更が必要な箇所にのみ、最小限の更新をかけるのが鉄則です。

5. まとめ:メモリ管理はエンジニアの品格

SolidWorks VBAを極めるということは、単にコマンドを並べることではありません。「SolidWorksのメモリマップを頭の中に描き、いかに無駄な演算を省くか」という設計思想を持つことです。

1. 開くときは軽量化(`OpenDoc6`のオプション)
2. 触るときは最小限に(`SetLightWeight`)
3. 情報取得はプロパティマネージャー経由で(フルロードを避ける)

ここをクリアすれば、あなたのマクロは数千パーツの巨大アセンブリでも、涼しい顔をして動くようになります。

さあ、恐れずにコードを書き換えてみてください。あなたのPCのメモリが悲鳴を上げない、スマートな自動化ライフを応援しています!

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