【実務・中級編】【実務中級】アセンブリ内のすべての非表示部品のインスタンス名を一時保存し、特定の検査モード後にワンタッチで復元する – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks API】アセンブリの「非表示状態」を完全制御せよ:ステート管理による自動検査の極意

現場のエンジニア諸君、SolidWorksのアセンブリ構成が数千点を超えるような大規模設計において、「一時的に特定の部品だけを表示させ、確認後に元の状態へ戻す」という作業に時間を浪費していないか?

手動でツリーをポチポチ操作するのは、もはやエンジニアの仕事ではない。今回は、アセンブリの現在の表示状態をメモリ上にスナップショットとして退避させ、処理後に完璧に復元する「ステート管理マクロ」の設計思想を伝授する。

なぜ「単純なループ」では失敗するのか

多くの初心者が陥る罠は、「構成部品を全探索して、表示設定を直接書き換える」という安直なアプローチだ。

1. コンフィギュレーションの不整合: アクティブなコンフィギュレーションとリンクしていない表示状態は、単なる一時的な上書きに過ぎない。
2. 再構築(Rebuild)のコスト: 大規模アセンブリで安易に `ForceRebuild` を叩けば、処理は重くなり、最悪の場合メモリリークやクラッシュを誘発する。
3. 非表示状態の永続化: 処理終了後に「元に戻せない」事態は、設計ミスに直結する。

我々が目指すべきは、「現在のツリーの状態を一度抽象化し、メモリ上の配列に閉じて管理する」という堅牢な設計だ。

—

ステート管理のアーキテクチャ

今回の実装では、`Component2` オブジェクトの `Visible` プロパティを走査し、その情報を「コンポーネントのパス(または名前)」と「表示状態」のペアとして辞書(Dictionary)に格納する。

実装のポイント

  • Dictionaryの活用: 配列(Array)で持つよりも、コンポーネント名をキーにした辞書型の方が、検索および復元時のパフォーマンスが圧倒的に高い。
  • 再帰処理の回避: 基本的に `GetComponents(False)` を使い、フラットなリストとして扱うことで、ツリー階層を意識した複雑な再帰ロジックを排除する。

—

プロダクションコード:StateManagerクラスの原型

このコードは、モジュールにそのままコピペして使えるように設計している。

Option Explicit

‘ 必要な参照設定: Microsoft Scripting Runtime
‘ 役割: アセンブリの表示状態をキャプチャし、復元するステートマネージャー
Public Sub ToggleInspectionMode()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim stateDict As Object

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

If swModel.GetType <> swDocASSEMBLY Then Exit Sub
Set swAssy = swModel

‘ 1. 現在の状態をキャプチャ
Set stateDict = CaptureAssemblyState(swAssy)

‘ — ここに検査ロジックを記述 —
Debug.Print “検査モード実行中…”
‘ 例: すべての部品を一度非表示にして、特定部品だけ表示する等の処理
‘ —————————-

‘ 2. 状態を復元
RestoreAssemblyState swAssy, stateDict
swModel.ForceRebuild3 False
End Sub

Private Function CaptureAssemblyState(swAssy As SldWorks.AssemblyDoc) As Object
Dim stateDict As Object
Dim comps As Variant
Dim i As Long
Dim swComp As SldWorks.Component2

Set stateDict = CreateObject(“Scripting.Dictionary”)
comps = swAssy.GetComponents(False)

For i = 0 To UBound(comps)
Set swComp = comps(i)
‘ コンポーネントのIDまたはパスをキーにして表示状態を保存
stateDict.Add swComp.Name2, swComp.Visible
Next i

Set CaptureAssemblyState = stateDict
End Function

Private Sub RestoreAssemblyState(swAssy As SldWorks.AssemblyDoc, stateDict As Object)
Dim comps As Variant
Dim i As Long
Dim swComp As SldWorks.Component2

comps = swAssy.GetComponents(False)

For i = 0 To UBound(comps)
Set swComp = comps(i)
If stateDict.Exists(swComp.Name2) Then
‘ 状態を元の値に書き戻す(0: 非表示, 1: 表示, 2: 抑制)
swComp.Visible = stateDict(swComp.Name2)
End If
Next i
End Sub

—

現場のリーダーからの一言:運用上の注意点

このコードをプロダクション環境に投入する際、以下の3点だけは心に刻んでおいてほしい。

1. コンポーネント名のユニーク性: `Name2` はアセンブリ内での一意性を保証するが、巨大なサブアセンブリを多用する場合、パス名と組み合わせてキーを作成するとより堅牢になる。
2. データベース連携: もし表示状態を「設計基準」として保存したいなら、`stateDict` の内容を JSON 形式に変換し、外部テキストファイルやSQLデータベースにエクスポートするロジックを追加せよ。これにより、翌日以降の作業再開もワンタッチで可能になる。
3. エラーハンドリング: 大規模アセンブリでは、ファイルを開く過程でコンポーネントが未解決(Lightweight)の状態になることがある。`SetSuppression2` メソッドを併用し、確実に部品をメモリにロードした状態で走査することを強く勧める。

このマクロをあなたのツールキットに加えれば、手作業という「人間による無駄」は排除される。次回のリリースでは、これをクラスモジュール化し、イベント駆動(部品追加時に自動で状態を監視する等)へ昇華させる設計を検討してほしい。

健闘を祈る。

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