【テクニカル・上級編】【初心者向け】アセンブリ内のパーツをマウスを使わずにコンポーネント名で自動選択し色を変更する視覚化マクロ – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks自動化の真髄:SelectionManagerを制し、メモリを制御せよ

SolidWorks APIにおける自動化の第一歩は「選択」にある。しかし、多くのエンジニアが陥る罠は、`SelectByID2`を闇雲に叩き、メモリを浪費し、アセンブリの階層構造を破壊することだ。

真の自動化エンジニアは、マウスに触れることすらしない。今回は、SelectionManagerの挙動を完全に掌握し、パーツの視覚化を高速かつ安全に完遂するための「極限のアーキテクチャ」を伝授する。

—

1. なぜ「直接選択」が危険なのか

初心者は`swModel.SelectByID2`を乱用する。しかし、大規模アセンブリにおいて、これは致命的なパフォーマンス低下を招く。なぜなら、このメソッドはUIとの同期を伴う重い処理であり、頻繁な呼び出しはSolidWorksのメインスレッドを疲弊させるからだ。

我々は、「メモリ上のオブジェクトポインタを直撃する」アプローチをとる。SelectionManagerを介して、ターゲットをメモリ上で特定し、直接プロパティを操作する。これが、10,000部品を超えるようなアセンブリでも秒速で動作させる唯一の道だ。

—

2. 視覚化自動化の極限コード

以下のコードは、単に色を変えるだけではない。オブジェクトの明示的解放(Nothing代入)を徹底し、COMオブジェクトによるメモリリークを根絶する設計となっている。

Option Explicit

‘ SolidWorks APIのエントリーポイント
‘ メモリ最適化のため、各変数の生存期間を最小化する
Public Sub VisualizeComponentByName(ByVal targetName As String)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim swModelDocExt As SldWorks.ModelDocExtension

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

If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてください。”, vbCritical
Exit Sub
End If

Set swAssy = swModel
Set swModelDocExt = swModel.Extension

‘ 選択状態をクリア(前回の残滓を排除)
swModel.ClearSelection2 True

‘ コンポーネントを名前で検索(再帰探索の入り口)
Set swComp = swAssy.GetComponentByName(targetName)

If Not swComp Is Nothing Then
‘ SelectionManagerを汚染せず、直接選択状態へ
If swComp.Select4(False, Nothing, False) Then
‘ RGB指定による視覚化(赤色に設定)
Dim colorArray(2) As Double
colorArray(0) = 1: colorArray(1) = 0: colorArray(2) = 0

‘ 色設定を適用(MaterialPropertyValuesの直接操作)
swComp.MaterialPropertyValues = colorArray
swModel.GraphicsRedraw2
End If
Else
MsgBox “対象のコンポーネントが見つかりません: ” & targetName, vbExclamation
End If

‘ 終了処理:参照カウントを確実にデクリメントし、メモリを開放する
Set swComp = Nothing
Set swModelDocExt = Nothing
Set swAssy = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub

—

3. シニアエンジニアが知るべき「見えない設計思想」

このコードには、ただ動くだけのスクリプトにはない、3つの重要な設計思想が隠されている。

A. COMオブジェクトの解放(メモリ管理)

VBAはガベージコレクションが脆弱だ。`Set obj = Nothing`を省略することは、長時間稼働するSolidWorks環境において「メモリリークによるクラッシュ」を誘発する。特に`ModelDocExtension`や`Component2`といった重いオブジェクトは、スコープを抜ける前に必ず解放せよ。

B. コンテキストの分離

`swModel.ClearSelection2 True`は、自動化の際の「暗黙の選択状態」による誤作動を防ぐための防波堤である。これを怠ることは、前回の処理の影響を次へ持ち越す「汚染」を許容することに他ならない。

C. 拡張性の担保

今回は`MaterialPropertyValues`で色を変更したが、実運用では`swModelDocExt.SetModelViewDisplayProperty`と組み合わせることで、表示・非表示の切り替えや透明度の調整もシームレスに行える。APIの仕様書を読み込み、`DisplayState`を意識した設計へと昇華させるのが、次のステップだ。

—

結論:自動化は「思想」である

ツールを動かすだけなら誰でもできる。しかし、「なぜそのメソッドを使うのか」「なぜその順番で解放するのか」を言語化できる者が、システムを保守し、組織の生産性を根底から変えることができる。

このコードを叩き台にし、自身の環境で最適化を重ねてほしい。Windows API(`FindWindow`や`SetForegroundWindow`)を組み合わせることで、外部アプリからの制御も容易になるだろう。

技術に妥協するな。それが、自動化エンジニアの誇りである。

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