【テクニカル・上級編】【実務中級】アセンブリ内の全コンポーネントのファイル名・パスを一括チェックし、外部参照切れ(Broken References)を事前診断 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks API】アセンブリの「外部参照切れ」を屠る:エンジニアリングの死角を突く事前診断術

設計の現場において、ネットワークドライブの再編やフォルダのリネームは、静かに、しかし確実に「爆弾」を仕掛ける。SolidWorksアセンブリを開いた瞬間に飛び出す「ファイルが見つかりません」のダイアログ。あれほどエンジニアの生産性を削ぐものはない。

多くの人間はこれを「運用の不備」で片付けるが、我々アーキテクトにとって、それは「検知可能なエラーを許容しているシステム設計の怠慢」に過ぎない。

今日は、SolidWorks APIを叩き、アセンブリの全コンポーネントを網羅的かつ高速にスキャンし、参照の正当性を事前診断する「堅牢な防壁」の構築法を伝授する。

—

1. なぜ「単純なループ」では不十分なのか

アセンブリ内のコンポーネントを辿る際、再帰的に `GetChildren` を呼び出すのが定石だが、大規模アセンブリではメモリ効率と実行速度が致命的なボトルネックとなる。

ここで重要なのは、「SolidWorksのメモリ管理をAPI側で制御する」という意識だ。COMオブジェクトのラッパーを無造作に生成し続ければ、大規模データ構造においてVBAは確実にスタックの境界で喘ぐことになる。

アーキテクトの戒律:メモリ管理

  • 明示的な `Nothing` の代入: ループ内でのオブジェクト生成は最小限に。
  • 早期バインディングの徹底: `Object` 型の使用は禁忌。`SldWorks.Component2` や `SldWorks.ModelDoc2` を直接指定することで、型推論のオーバーヘッドを排除する。

—

2. 外部参照診断エンジンの実装

以下のコードは、アセンブリを開いた瞬間に全コンポーネントをスキャンし、実在しないパスを持つコンポーネントを特定する実戦的スクリプトだ。

Option Explicit

‘ 参照設定: SolidWorks 20xx Type Library
‘ 参照設定: Scripting.FileSystemObject

Public Sub DiagnoseAssemblyReferences()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim fso As Object

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

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

Set swAssy = swModel
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ コンポーネントツリーの再帰的走査を開始
Call ScanComponents(swAssy.GetComponents(False), fso)

MsgBox “診断完了。詳細はイミディエイトウィンドウを参照。”
End Sub

Private Sub ScanComponents(components As Variant, fso As Object)
Dim i As Long
Dim swComp As SldWorks.Component2
Dim compPath As String

If IsEmpty(components) Then Exit Sub

For i = LBound(components) To UBound(components)
Set swComp = components(i)
compPath = swComp.GetPathName

‘ 非表示/抑制状態を問わず、パスが存在しない場合は警告
If compPath <> “” Then
If Not fso.FileExists(compPath) Then
Debug.Print “[Broken Reference]: ” & swComp.Name2 & ” -> ” & compPath
End If
End If

‘ サブアセンブリへの再帰呼び出し
If swComp.GetChildrenCount > 0 Then
Call ScanComponents(swComp.GetChildren, fso)
End If

‘ オブジェクトの明示的解放(VBAのガーベジコレクションを待たない)
Set swComp = Nothing
Next i
End Sub

—

3. 実務運用へのトランスフォーム:システム連携の極意

このコードはただのデバッグツールではない。ここから先は、あなたの設計環境に合わせて以下のいずれかを実装せよ。

1. 自動修復プロンプト: `FileExists` が `False` の場合、`swApp.ReplaceComponents` を自動発火させ、あらかじめ定義されたマッピングテーブル(JSONやSQL Server経由)から正しいパスを再割り当てするロジックを組む。
2. イベント駆動診断: `Class Module` を使用し、`DAssemblyDocEvents_FileSaveNotify` イベントをフックする。上書き保存の直前に診断を走らせ、「リンク切れを含むアセンブリをサーバに送らせない」ゲートキーパーを構築できる。
3. Windows APIの活用: ネットワークドライブが切断されているケースでは、`WNetGetConnection` APIを用いてマウント状態をチェックし、VBAのタイムアウトエラーを未然に防ぐ。

—

4. 最後に:エンジニアへの提言

技術の進歩により、近年はPDM(SolidWorks PDM等)の導入が進んでいる。しかし、どれほど高度な管理ツールを導入しようとも、APIレベルで「何がどこにあり、状態はどうなっているか」を把握する能力は、トラブルシューティングの最終防衛線となる。

自動化とは、単にコードを書くことではない。「発生しうるエラーの確率を0に収束させるための、計算された構造」を設計することだ。

このコードをあなたの環境に組み込み、二度と「ファイルが見つかりません」という無意味な対話で時間を浪費することのないよう願う。

設計せよ、自動化せよ、そして支配せよ。

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