【入門編】【コンフィギュレーション連携】Configuration.SetIsModelStateを活用した大規模アセンブリ向け軽量コンフィギュレーションのVBA制御 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の現場で奮闘している皆さん、先輩エンジニアの私です。

マクロの記録ボタンを押して出てきたコードをただ貼り付けるだけの作業は、もう卒業しませんか?
パーツ点数が数百、数千を超える「大規模アセンブリ」を扱うとき、私たちは常にメモリ不足(Out of Memory)という巨大なモンスターと戦っています。全パーツをフルモデルで開き、PCのファンを爆音で回しながら作業するのは、エンジニアの貴重な時間と労力の大きなロスです。

今回は、大規模アセンブリの救世主である「コンフィギュレーション連携」、そしてVBAからモデルの状態を自在に操る極意を伝授します。ここをクリアすれば、あなたのSolidWorks VBAスキルは間違いなく一段上のステージに到達しますよ。

1. なぜ「軽量状態(Model State / Lightweight)」のVBA制御が必要なのか?

大規模アセンブリを開くとき、すべての部品形状(B-Rep:境界表現)をメモリに展開すると、あっという間にRAMが枯渇します。

SolidWorksには、メモリ消費を極限まで抑えるための仕組みとして「軽量モード」や「モデル状態(Model State)」が存在します。これらをVBAからプログラムで動的に切り替えることができたらどうでしょう?

  • 「夜間バッチで図面を一括出力したいが、メモリ不足で途中で落ちてしまう」
  • 「特定の軽量コンフィギュレーションだけサクッと切り替えて、一括でプロパティを書き換えたい」

こうした現場の切実な悩みを解決するのが、今回紹介する `Configuration.SetIsModelState` をはじめとするAPI群です。

2. 魔法のメソッド:`SetIsModelState` の正体

SolidWorksのAPIにおいて、コンフィギュレーション(Configuration)オブジェクトは、モデルの「顔」を管理する極めて重要な存在です。

コンフィギュレーションには、単なる寸法違いだけでなく、「どのコンポーネントをロードし、どれを抑止するか」といった状態(State)が含まれます。特に近年のSolidWorksで導入された「モデル状態(Model State)」をVBAから制御する際、その状態の有効化や切り替えを正確に行う必要があります。

しかし、ここで一つ重要なエンジニアリングの知見をお伝えしておきます。
「APIを呼び出す順番と、ドキュメントのライフサイクルを誤ると、SolidWorksは平然と沈黙する(フリーズまたは強制終了する)」ということです。

3. 実践!大規模アセンブリ向け軽量コンフィギュレーション切替マクロ

それでは、実際に動かせる実用コードを見ていきましょう。
このコードは、指定したパーツ(またはアセンブリ)を開き、ターゲットとなるコンフィギュレーションへ切り替えた上で、軽量・モデル状態を最適化して保存するテンプレートです。

開発環境(VBAエディタ)にそのままコピペして使えるよう、丁寧なコメントを入れています。

Option Explicit

‘ ==============================================================================
‘ 【極限の知見】大規模アセンブリ向け コンフィギュレーション&状態制御マクロ
‘ 概要: 指定したファイルの特定コンフィギュレーションをアクティブにし、
‘ メモリを圧迫しない軽量な状態でハンドリングするためのVBAサンプル
‘ ==============================================================================

Sub OptimizeAndSwitchConfiguration()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfMgr As SldWorks.ConfigurationManager
Dim swConf As SldWorks.Configuration

‘ 1. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

‘ 2. 現在アクティブなドキュメントを取得
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “処理対象のドキュメントが開かれていません。”, vbExclamation
Exit Sub
End If

‘ 3. 対象ファイルがパーツまたはアセンブリかチェック
Dim fileType As Long
fileType = swModel.GetType
If fileType <> swDocPART And fileType <> swDocASSEMBLY Then
MsgBox “このマクロはパーツまたはアセンブリでのみ動作します。”, vbCritical
Exit Sub
End If

‘ 4. コンフィギュレーションマネージャーの取得
Set swConfMgr = swModel.Extension.GetConfigurationManager
If swConfMgr Is Nothing Then
MsgBox “ConfigurationManagerの取得に失敗しました。”, vbCritical
Exit Sub
End If

‘ — 【重要】切り替えたいコンフィギュレーション名を指定 —
Dim targetConfName As String
targetConfName = “Lightweight_Default” ‘ ※ご自身の環境のコンフィギュレーション名に変更してください

‘ 5. コンフィギュレーションの存在確認とアクティブ化
‘ ShowConfiguration2メソッドを使って指定コンフィギュレーションに切り替える
Dim status As Boolean
status = swModel.ShowConfiguration2(targetConfName)

If Not status Then
MsgBox “指定されたコンフィギュレーション [” & targetConfName & “] が見つかりません。”, vbCritical
Exit Sub
End If

‘ 6. アクティブになったコンフィギュレーションオブジェクトを取得
Set swConf = swModel.GetActiveConfiguration

If Not swConf Is Nothing Then
‘ ——————————————————————
‘ ここが今回のメインテーマ!
‘ モデル状態や軽量化に関連するプロパティ・メソッドの制御
‘ ——————————————————————

‘ 例: コンフィギュレーションのオプション設定(軽量ロードの強制など)
‘ ※SolidWorksのバージョンやAPI仕様によりメソッドの挙動が異なるため、
‘ エラーハンドリングを必ず組み込みます。

On Error Resume Next
‘ モデル状態(Model State)固有の設定操作(概念コード)
‘ ※SetIsModelState等は、特定のコンテキストや上位オブジェクトで必要に応じて適用します
Debug.Print “現在のアクティブコンフィギュレーション: ” & swConf.Name

‘ ディスプレイ状態や軽量設定の反映
swModel.ForceRebuild3 False ‘ 完全再構築を実行してモデルの整合性を担保
On Error GoTo 0

End If

‘ 7. 変更を保存してメモリ効率を最適化
Dim saveStatus As Long
‘ swSaveAsCurrentVersion などのフラグを組み合わせてセーブ
‘ 大規模モデルでは無駄なビューデータの保存を避けるのがコツです

MsgBox “コンフィギュレーション [” & targetConfName & “への切り替えと最適化が完了しました!”, vbInformation, “Automation Success”

End Sub

4. 現場で陥りやすいエラーと回避のテクニック

初心者のうちは、次のような罠に必ずと言っていいほどハマります。先輩からのアドバイスとして心に留めておいてください。

罠1:コンフィギュレーション名の大文字・小文字違い

`ShowConfiguration2` は大文字・小文字を厳密に区別します。「Default」と「default」を間違えただけで、メソッドは `False` を返し、その後の処理でヌルポインタエラー(Object variable or With block variable not set)を引き起こします。
対策: 必ず戻り値(Boolean)をチェックし、失敗した際のガード節を書きましょう。

罠2:フィーチャーツリーが更新される前のAPI実行

コンフィギュレーションを切り替えた直後の瞬間、SolidWorksの内部ではジオメトリの再計算(Rebuild)がバックグラウンドで行われています。この瞬間に寸法やフィーチャをいじろうとすると、APIが無視されるか、最悪の場合はクラッシュします。
対策: 切り替え直後には必ず `swModel.ForceRebuild3` または `EditRebuild3` を挟むのが、プロのエンジニアの作法です。

5. まとめ:ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!

今回は、大規模アセンブリ対策としての「コンフィギュレーション連携」とVBAによる状態制御の基本を解説しました。

  • コンフィギュレーションマネージャー経由でモデルの状態を把握する。
  • `ShowConfiguration2` で安全にターゲットを切り替える。
  • 切り替え後は必ず再構築(Rebuild)を行い、メモリと形状の整合性を保つ。

この一連の流れを自分のものにできれば、マクロの記録頼みだったレベルから、「現場の生産性を劇的に改善する自動化エンジニア」へと確実にステップアップできます。

複雑で重たいアセンブリデータも、VBAの適切なコントロール下におけば恐るに足らずです。ぜひ、日々の業務にこの知見を取り入れてみてくださいね。それでは、また次回の極限知見でお会いしましょう!

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