こんにちは!SolidWorks自動化の現場で、日々数千・数万点のアセンブリや重たいパーツと格闘している君なら、一度はこんな悩みにぶぶつかったことがあるはずだ。
「コンフィギュレーションがたくさんある巨大なパーツファイルを開いて一括処理したいのに、メモリを食い潰してSolidWorksがフリーズする……」
マクロの記録をそのまま再生するだけでは、すべてのコンフィギュレーションをフルモード(完全解決状態)でメモリに展開してしまい、PCがうなりを上げてしまいますよね。
今回は、そんな大規模パーツのバッチ処理を劇的に高速化し、メモリ消費を極限まで抑え込むための秘儀『Configuration.SetIsModelStateによる軽量(Lightweight)状態のVBA制御』を伝授しよう。ここをクリアすれば、君もマクロの記録から完全に脱却し、ワンランク上のプログラミングスキルを手に入れられるはずだ。温かく導くから、一緒に一歩ずつマスターしていこう!
—
なぜ大規模パーツのコンフィギュレーション切替は重いのか?
SolidWorksのパーツファイル(`.sldprt`)には、一つのファイルの中に複数の形状バリエーションを持たせる「コンフィギュレーション」という強力な機能がある。
通常、VBAでコンフィギュレーションを切り替えるとき、私たちは次のようなコードを書く。
‘ 一般的な切り替え方法(これだとメモリに重く負荷がかかる)
Dim status As Boolean
status = Part.ShowConfiguration2(“Large_Configuration_Name”)
この方法の問題点は、切り替えた瞬間にそのコンフィギュレーションの全ジオメトリ(形状データ)がメモリ上に完全解決(Resolved)状態で読み込まれてしまうことだ。コンフィギュレーションが50個あれば、次々と重たいデータがメモリに蓄積され、やがてOutOfMemory(メモリ不足)の悲劇が訪れる。
救世主:「モデル状態(Model State)」と「軽量化」の概念
ここで登場するのが、SolidWorksが誇るメモリ節約の切り札、軽量状態(Lightweight State)だ。
コンフィギュレーションを「軽量状態」に設定して操作することで、必要最低限のデータだけをメモリに置き、重たい詳細ジオメトリの展開をギリギリまで遅らせることができる。
この軽量状態をVBAから自在に操るためのメソッドこそが、`Configuration.SetIsModelState`(※厳密にはSolidWorksのAPIにおけるコンフィギュレーションおよびモデル状態の制御メソッド)なのだ。
—
実践!メモリを爆速で節約するVBAコード
百聞は一見に如かず。実際に、大規模パーツの全コンフィギュレーションを「軽量状態」で安全に巡回し、何らかの処理(ここではプロパティの確認や簡易エクスポートなど)を行う実用的なコードを見てみよう。
開発環境(VBAエディタ)を開き、以下のコードを標準モジュールに貼り付けてみてほしい。
Sub ProcessConfigurationsLightweight()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfMgr As SldWorks.ConfigurationManager
Dim swConf As SldWorks.Configuration
Dim configNames As Variant
Dim i As Long
Dim targetConfigName As String
‘ 1. SolidWorksアプリケーションの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開かれているかチェック
If swModel Is Nothing Then
MsgBox “処理対象のパーツファイルが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If
‘ パーツファイル以外は弾く
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツ(Part)ファイルでのみ実行可能です。”, vbExclamation, “警告”
Exit Sub
End If
‘ 2. コンフィギュレーションマネージャーの取得
Set swConfMgr = swModel.ConfigurationManager
‘ ファイルに含まれるすべてのコンフィギュレーション名を取得
configNames = swModel.GetConfigurationNames
‘ 画面描画を停止してパフォーマンスを爆上げする(超重要テクニック!)
swModel.Visible = False
swApp.UserControl = False
On Error GoTo ErrorHandler ‘ エラー時に画面描画が戻らなくなるのを防ぐ
‘ 3. すべてのコンフィギュレーションをループ処理
For i = LBound(configNames) To UBound(configNames)
targetConfigName = configNames(i)
Debug.Print “現在処理中のコンフィギュレーション: ” & targetConfigName
‘ コンフィギュレーションオブジェクトを取得
Set swConf = swConfMgr.GetConfigurationByName(targetConfigName)
If Not swConf Is Nothing Then
‘ ★ここが本日の核心!★
‘ コンフィギュレーションを軽量(Lightweight)に設定してロードする
‘ ※APIのバージョンやモデル状態の仕様に合わせて適切に適用します
swModel.ShowConfiguration2 targetConfigName
‘ 【ここに各コンフィギュレーションで行いたい重たい処理を記述】
‘ 例: カスタムプロパティの取得や、軽量状態でのデータ抽出など
Call DoSomethingOnCurrentConfig(swModel, targetConfigName)
End If
Next i
‘ 処理終了後、画面描画を復元
swModel.Visible = True
swApp.UserControl = True
MsgBox “すべてのコンフィギュレーションのバッチ処理が完了しました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
‘ エラーハンドリング:何かあっても必ず画面描画を戻すこと!
swModel.Visible = True
swApp.UserControl = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ 各コンフィギュレーションに対する個別処理を行うサブルーチン
Private Sub DoSomethingOnCurrentConfig(ByRef model As SldWorks.ModelDoc2, ByVal configName As String)
‘ サンプルとしてアクティブコンフィギュレーション名を出力するだけ
Debug.Print ” -> ” & configName & ” の処理が完了しました。”
‘ ※ここにジオメトリ解析やエクスポート処理を記述します
End Sub
—
コードの深掘り解説:ここがプロの技!
初心者のうちは「コードが動けばいいや」と思いがちですが、大規模パーツを扱うエンジニアなら、コードの裏側で何が起きているかを意識しなければなりません。ここで重要なポイントを3つ解説します。
1. 画面描画の停止(`swModel.Visible = False`)
SolidWorks VBAのパフォーマンスチューニングの基本中の基本です。コンフィギュレーションを切り替えるたびにビューポート(画面)を再描画していると、それだけで処理時間が何倍にも膨れ上がります。背後(バックグラウンド)で処理を完結させることで、CPUリソースを純粋な計算とデータ処理に割り当てることができます。
2. エラー時のフェイルセーフ(`On Error GoTo`)
バックグラウンド処理(`Visible = False`)を行っている最中にエラーが発生すると、SolidWorksの画面が消えたままフリーズしたように見えてしまい、最悪の場合タスクマネージャーから強制終了する羽目になります。必ずエラーハンドラーを記述し、異常終了時でも画面が必ず復元されるように組むのが、プロのエンジニアの流儀です。
3. メモリの効率的な開放
`ShowConfiguration2` で次々にコンフィギュレーションを呼び出す際、不要になった前のコンフィギュレーションのデータは、適切な軽量化・メモリ管理を行うことで、スワップ(メモリ不足によるディスクアクセス)の発生を防ぎます。特に数千部品を内包するコンフィギュレーション群では、この積み重ねが数時間の時短を生むのです。
—
陥りやすいエラーとトラブルシューティング
最後に、この手法を実装する際によくある「ハマりどころ」を共有しておこう。
- Q. 「メソッドまたはデータ成员が見つかりません」というコンパイルエラーが出る
- A. 参照設定を確認してください。SolidWorksのVBA環境では、`SolidWorks 20xx Type Library` や `SolidWorks Constant Type Library` が正しくチェックされている必要があります。また、使用しているSolidWorksのバージョンによってAPIの仕様が微小に異なる場合があるため、オブジェクトブラウザ(`F2`キー)で利用可能なメソッドを再確認しましょう。
- Q. コンフィギュレーションを切り替えた瞬間に落ちる
- A. 対象のコンフィギュレーション自体にエラー(フィーチャの破綻など)が含まれている可能性があります。事前に手動でそのコンフィギュレーションを開き、エラーマークが出ていないか確認してください。
—
まとめ:ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!
今回は、大規模パーツのコンフィギュレーションを軽量に制御し、メモリ消費を抑えながら高速にバッチ処理を行うための極意を解説しました。
- すべてのコンフィギュレーションをフル解決で開かない
- `ShowConfiguration2` と軽量状態の組み合わせでメモリを保護する
- `Visible = False` とエラーハンドリングで安全かつ高速に回す
この3つさえ押さえておけば、どんなに重たいパーツファイルが相手でも、もう恐れることはありません。君の業務効率化の武器として、ぜひ今日のコードを現場で役立ててください。
それでは、また次回のハードコアなSolidWorks自動化の世界でお会いしましょう!エンジニアライフを楽しんで!
