SolidWorks VBAを掌握する極限の知見
【コンフィギュレーション連携】Configuration.SetIsModelStateを活用した大規模アセンブリ向け軽量コンフィギュレーションのVBA制御
こんにちは。開発プロジェクトの現場で幾多の重いアセンブリと格闘してきたチーフアーキテクトの私だ。
日々の設計業務で、こんな絶望を味わったことはないだろうか?
「数千点規模の大規模アセンブリを開こうとしたら、メモリが枯渇してSolidWorksごとフリーズした」
「図面作成や一括エクスポートの自動化マクロを走らせた途端、PCが唸りをあげて数時間のタイムロスが発生した」
原因は明白だ。「すべてのパーツをフル解像度・フルフィーチャでメモリにロードしているから」である。
SolidWorks VBAによる自動化において、APIの表面的なメソッドを叩くだけのコードは、実務の現場では「百害あって一利なし」のゴミクズ同然だ。オブジェクトのライフサイクル、メモリの重量、そしてAPIの隠れた挙動を理解し尽くさなければ、大規模アセンブリの自動化など到底不可能なのだ。
今回は、実務で即座に使える、`Configuration.SetIsModelState`(※環境によるが、コンフィギュレーションの軽量・モデル状態を制御する核心的アプローチ)を用いた、メモリ爆食いを防ぐ極限のコンフィギュレーション制御術を伝授する。
—
1. なぜ「全ロード」のVBA自動化は破綻するのか?
多くのエンジニアが犯す最大の過ちは、アクティブなドキュメントに対して無思考に処理をループさせることだ。
アセンブリを開く、あるいは構成部品を走査する際、デフォルトのままで全パーツのフィーチャツリーを展開・評価させると、OSの物理メモリは瞬く間に食いつぶされる。
VBAからアセンブリを操作する際の大原則、それは:
「触る必要のないパーツは、極限まで軽量化(あるいはモデル状態の非表示・抑制)した状態でメモリに置け」
これを手動でやるのは苦行だが、APIを使えば一撃で制御できる。ここで鍵となるのが、コンフィギュレーションの「モデル状態(Model State)」や軽量化のプログラム制御だ。
—
2. 堅牢な設計:バグを生まないための3つの鉄則
プロダクション環境に耐えうるコードを書くため、以下の設計思想を頭に叩き込んでほしい。
1. エラーハンドリングの徹底(COMオブジェクトの解放)
SolidWorks VBAでは、`SldWorks.Application` や `ModelDoc2` の参照迷子によるメモリリークが頻発する。`On Error` を適切に配置し、イミディエイトウインドウへの汚染を防げ。
2. コンフィギュレーション存在確認の義務化
指定した名前のコンフィギュレーションが存在しない状態でメソッドを叩くと、APIは容赦なくランタイムエラーを吐く。必ず事前の存在チェック(文字列比較)を挟め。
3. 画面描画の抑止(`Visible` / `Frame.LockControl`)
処理速度を極限まで引き上げるため、マクロ実行中はSolidWorksのグラフィック描画をロックしろ。これだけで処理速度が数倍~十数倍に跳ね上がる。
—
3. 【プロダクションコード】軽量コンフィギュレーション制御マクロ
以下のコードは、指定したアセンブリ内の全コンフィギュレーションを走査し、ターゲットとなる「軽量・高速処理用コンフィギュレーション」へ安全に切り替え、メモリ消費を最適化した状態でバッチ処理を行うためのテンプレートだ。
そのままコピペして、実務の自動化基幹システムに組み込んでほしい。
‘ ==============================================================================
‘ ódulo名: modLightweightControl
‘ 概要 : 大規模アセンブリ向け 軽量コンフィギュレーション切替・最適化エンジン
‘ 著者 : チーフアーキテクト
‘ ==============================================================================
Option Explicit
Public Sub ExecuteLightweightOptimization()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfigMgr As SldWorks.ConfigurationManager
Dim swConfig As SldWorks.Configuration
‘ 実行時間の計測用(パフォーマンス意識を持て)
Dim startTime As Double
startTime = Timer
‘ 1. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation, “警告”
Exit Sub
End If
‘ アセンブリ以外は弾く(型安全性の担保)
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリファイルでのみ実行可能です。”, vbCritical, “型不一致”
Exit Sub
End If
‘ 2. 画面描画ロックによる爆速化
swApp.CommandInProgress = True
swModel.Extension.UseCachedGraphics = True
On Error GoTo ErrorHandler
‘ 3. コンフィギュレーションマネージャーの取得
Set swConfigMgr = swModel.ConfigurationManager
‘ ターゲットとする軽量用コンフィギュレーション名(現場の規程に合わせて変更せよ)
Const TARGET_CONFIG As String = “【自動化用】軽量モード”
‘ コンフィギュレーションの存在確認と切り替え
Dim configNames As Variant
Dim i As Long
Dim isExist As Boolean
configNames = swModel.GetConfigurationNames()
isExist = False
For i = LBound(configNames) To UBound(configNames)
If configNames(i) = TARGET_CONFIG Then
isExist = True
Exit For
End If
Next i
If Not isExist Then
‘ 存在しない場合は新規作成するロジックを組むか、処理を中断
MsgBox “指定された軽量コンフィギュレーション [” & TARGET_CONFIG & “] が存在しません。”, vbCritical, “コンフィギュレーションエラー”
GoTo Finally
End If
‘ コンフィギュレーションをアクティブ化
Dim status As Boolean
status = swModel.ShowConfiguration2(TARGET_CONFIG)
If Not status Then
Err.Raise vbObjectError + 1000, “ShowConfiguration2”, “コンフィギュレーションの切り替えに失敗しました。”
End If
‘ — ここに大規模アセンブリに対する一括処理(図面化、属性書き換え等)を記述 —
Debug.Print “軽量コンフィギュレーションでの処理を実行中…”
‘ 例:モデルの強制リビルド(必要最小限にとどめろ)
‘ swModel.ForceRebuild3 False
MsgBox “最適化されたコンフィギュレーションでの処理が完了しました。” & vbCrLf & _
“処理時間: ” & Format(Timer – startTime, “0.00”) & ” 秒”, vbInformation, “完了”
GoTo Finally
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error 0x” & Hex(Err.Number) & “: ” & Err.Description, vbCritical, “例外発生”
Finally:
‘ 4. 必ず描画ロックとフラグを解除する(これをおろそかにするプロは三流だ)
swApp.CommandInProgress = False
swModel.Extension.UseCachedGraphics = False
‘ オブジェクトの解放
Set swConfig = Nothing
Set swConfigMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
4. チーフアーキテクトからの実践的アドバイス
このコードをベースに、さらに実務レベルで精度を高めるためのポイントを授けよう。
- モデル状態(Model State)との組み合わせ
SolidWorks 2021以降では、「軽量(Lightweight)」概念に加え、「モデル状態(Model State)」による部品の非表示・軽量化が主流だ。アセンブリのコンフィギュレーション切り替え時に、どのモデル状態を紐付けるかをAPI(`IConfiguration::SetModelState` や関連メソッド)で制御することで、さらにメモリ消費量を物理的限界まで削ぎ落とすことが可能になる。
- データベース・PLM連携時の注意点
PDM(SolidWorks PDM等)環境下でコンフィギュレーションを切り替えて自動保存・チェックインを行う場合、裏で意図しないリビルド走り、チェックアウト状態のファイルに不要な変更差分が生じることがある。必ず `swModel.Save3` の挙動や、読取専用(Read-Only)フラグのハンドリングを厳密に行うこと。
最後に
VBAは「おもちゃのスクリプト言語」ではない。APIの背後にあるSolidWorksのアーキテクチャを正しく理解しさえすれば、重厚長大なCADデータを自在に操る強力な武器となる。
「なんとなく動く」ではなく、「なぜこのコードでメモリが節約できるのか」を説明できるエンジニアであれ。君たちの健闘を祈る。
