巨大アセンブリを「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のメモリが悲鳴を上げない、スマートな自動化ライフを応援しています!
