【入門編】【実務中級】アセンブリ内の非表示部品や抑制(Suppressed)状態のコンポーネントをVBAでスマートに除外する効率的走査フィルター – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは。いつも自動化への挑戦、お疲れ様です。
私は、数万点の部品がひしめく巨大アセンブリと日々格闘し、それをミリ秒単位のVBAコードで制御することに魂を捧げてきたチーフアーキテクトです。

マクロの記録から一歩踏み出し、「もっと速く、もっと安定したコードを書きたい」と考え始めたあなた。素晴らしい視点です。その「欲」こそが、一流のエンジニアへの入り口ですから。

今日は、アセンブリを扱うマクロで誰もが直面する壁「重い、止まる、エラーが出る」を打破するための、究極のフィルター技術を伝授します。

非表示の部品や、抑制(Suppressed)されたコンポーネントを賢くスキップして、必要なデータだけを最短ルートで抜き出す。この「選別の美学」をマスターすれば、あなたのSolidWorks VBAは劇的に進化しますよ。

—

1. なぜ「選別」が必要なのか?:ゾンビ・コンポーネントの罠

SolidWorksのアセンブリ構造は、目に見えるものだけが全てではありません。
設計の検討過程で「抑制(Suppressed)」された部品は、ツリー上には存在しますが、実体(ジオメトリデータ)はメモリから切り離された「半分眠っている状態」です。

また、「非表示(Hidden)」の部品は、画面には映りませんがメモリには居座っています。

これらを区別せずに全走査(ループ処理)してしまうと、以下のような悲劇が起こります。

1. 処理速度の低下: 無意味なデータにアクセスし、時間を浪費する。
2. 実行時エラー: 抑制された部品に対して「面の面積を測れ」「合致を付けろ」と命令しても、実体がないため「オブジェクト参照が設定されていません」と怒られてしまう。

「今、そこに本当に存在し、処理すべきものか?」を問いかけるフィルターが必要です。

—

2. 走査の核心:コンポーネントの状態を見極めるAPI

SolidWorks APIにおいて、コンポーネントの状態を判定する最も重要なプロパティはこの2つです。

① 抑制状態を判定する:`GetSuppression2`

コンポーネントが「抑制(Suppressed)」されているか、「ライトウェイト(Lightweight)」か、「解決済み(Resolved)」かを返します。
特に抑制状態にあるものは、ほとんどの操作が受け付けられないため、真っ先に除外すべき対象です。

② 表示状態を判定する:`Visible`

画面上で「非表示」になっているかどうかを判定します。レンダリングや干渉チェックの対象から外したい場合に重用します。

—

3. 実戦コード:洗練されたアセンブリ走査フィルター

それでは、再帰処理(フォルダ構造を奥深くまで辿る手法)を用いた、実用的なコードを見ていきましょう。このコードは、現在開いているアセンブリの全階層をチェックし、「抑制されておらず、かつ表示されている部品」の名称だけをイミディエイトウィンドウに出力します。

Option Explicit

‘ =========================================================
‘ 目的: 抑制・非表示コンポーネントを除外してアセンブリを高速走査する
‘ ターゲット: 実務中級(マクロ記録からの脱却を目指す方)
‘ =========================================================

Sub AssemblyTraverseMaster()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swRootComp As SldWorks.Component2

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

‘ アセンブリファイルが開かれているかチェック
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリドキュメントを開いてから実行してください。”, vbExclamation
Exit Sub
End If

Set swAssy = swModel
‘ アセンブリの最上位(ルート)コンポーネントを取得
Set swRootComp = swAssy.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)

Debug.Print “— 走査開始: ” & Now & ” —”

‘ 再帰読み出しの開始
TraverseComponent swRootComp, 0

Debug.Print “— 走査完了 —”
End Sub

‘ ———————————————————
‘ 再帰関数: コンポーネントを階層的に処理する
‘ ———————————————————
Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)
Dim vChildComps As Variant
Dim swChildComp As SldWorks.Component2
Dim i As Long
Dim suppressionState As Long
Dim isHidden As Boolean

‘ — 【ここが極限の知見: フィルター処理】 —

‘ 1. 抑制状態のチェック
‘ GetSuppression2 は swComponentSuppressionState_e 列挙型を返す
suppressionState = swComp.GetSuppression2

If suppressionState = swComponentSuppressionState_e.swComponentSuppressed Then
‘ 抑制されている場合は、その配下も含めて一切処理しない(即リターン)
Exit Sub
End If

‘ 2. 非表示状態のチェック (Visibleプロパティ)
‘ ※ swComp.IsHidden(False) でも判定可能だが、Visibleの方が直感的
If swComp.Visible = swLowLevelComponentVisible_e.swComponentHidden Then
‘ 非表示部品を除外したい場合はここで抜ける
‘ 必要に応じて「Debug.Print “Skipped Hidden: ” & swComp.Name2」など
Exit Sub
End If

‘ — 【メイン処理エリア】 —
‘ フィルターを通過した「生きたコンポーネント」に対する処理をここに書く

‘ 階層がわかりやすいようにインデントを付けて出力
Debug.Print String(nLevel 2, ” “) & “Active: ” & swComp.Name2

‘ ——————————————-

‘ 子コンポーネント(サブアセンブリの中身)を取得して再帰
vChildComps = swComp.GetChildren

If Not IsEmpty(vChildComps) Then
For i = 0 To UBound(vChildComps)
Set swChildComp = vChildComps(i)
‘ 自分自身を呼び出して次の階層へ
TraverseComponent swChildComp, nLevel + 1
Next i
End If

End Sub

—

4. プロが教える「ここをクリアすれば完璧」なポイント

1. `GetSuppression2` の戻り値に注意

抑制状態には「抑制(Suppressed)」「解決済み(Resolved)」「ライトウェイト(Lightweight)」があります。
ライトウェイト状態の部品は、メモリ節約のためにモデルデータが簡略化されていますが、APIで詳細なジオメトリ(面やエッジ)にアクセスしようとするとエラーになるか、強制的に「解決(Resolved)」に切り替わり、動作が重くなります。
大規模アセンブリを扱うなら、`swComponentLightweight` も考慮に入れるのが「中級者」の証です。

2. `Visible` プロパティの落とし穴

コンポーネントの表示・非表示は、「コンポーネントレベル」での設定と、「表示状態(Display State)」での設定が絡み合います。
基本的には `swComp.Visible` で判定できますが、稀に「親のアセンブリが非表示だから子も見えない」というケースがあります。今回のコードのようにルートから順番に走査して抑制を弾いていれば、効率的に処理できます。

3. 再帰処理のスタックオーバーフロー

アセンブリの階層があまりにも深い(100階層など)場合、再帰呼び出しはメモリを消費します。しかし、通常の機械設計の範囲(10〜20階層程度)であれば、この書き方が最も読みやすく、メンテナンス性に優れています。

—

最後に:マクロの向こう側へ

今回のフィルター処理を導入するだけで、あなたのマクロは「ただ動くもの」から「現場の巨大データに耐えうるプロ仕様」へと昇華します。

「動かない部品は最初から相手にしない」。
このシンプルな哲学が、数千点の部品を数秒で処理する魔法のようなツールを生み出します。

もしコードを書いていて「特定の条件の時だけエラーが出る」といった壁にぶつかったら、それは成長のチャンスです。その時はいつでも、この「選別のロジック」に立ち返ってみてください。

あなたの自動化ライフが、より創造的でエキサイティングなものになることを願っています。次は、合致(Mate)の深淵でお会いしましょう!

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