【SolidWorks APIの深淵】外部参照の断絶を許すな:EnumExternalFileReferencesによる堅牢なリンク監視術
SolidWorksのアセンブリ管理において、最もエンジニアを疲弊させるのは「突然のリンク切れ」だ。設計変更の果てに、意図せず埋め込まれたコンテキスト参照や、ネットワークドライブの再編で迷子になった外部パーツ。これらがアセンブリを開くたびに発生させるダイアログボックスは、ただの「時間の浪費」である。
今回は、`PartDoc.EnumExternalFileReferences`というSolidWorks APIの「深部」にアクセスし、パーツ内部に潜む外部参照を網羅的にスキャンしてCSVレポート化する、実務レベルのソリューションを伝授する。
—
なぜ「手動チェック」では不十分なのか
多くの現場で「ファイルを開いてチェックすればいい」という甘い考えが蔓延している。しかし、参照関係はパーツの階層が深くなればなるほど可視化が困難になる。APIによる自動スキャンこそが、設計の整合性を担保する唯一の防壁だ。
`EnumExternalFileReferences`は、モデルに含まれるすべての外部参照を配列として引き出す。このAPIを正しく扱うための鉄則はただ一つ。「参照が解決されているか(IsResolved)」と「パスが有効か(FileExists)」を峻別することだ。
—
実装の極意:プロダクションコード
このコードは、単なる参照の列挙ではない。ネットワークドライブの切断や、廃止されたパスを即座に特定するための「エラー検知器」として設計している。
Option Explicit
‘ 外部参照をスキャンし、CSVに出力するメインプロシージャ
Public Sub ExportExternalReferencesLog()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim vRefs As Variant
Dim i As Long
Dim logPath As String
Dim fileNum As Integer
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then Exit Sub
‘ 外部参照を配列として取得
‘ PartDocまたはAssemblyDocから取得可能
vRefs = swModel.EnumExternalFileReferences
If IsEmpty(vRefs) Then
MsgBox “外部参照は存在しません。”
Exit Sub
End If
‘ レポート出力先のパス(デスクトップを指定)
logPath = Environ(“USERPROFILE”) & “\Desktop\RefLog_” & _
Replace(Replace(swModel.GetTitle, “.”, “_”), ” “, “”) & “.csv”
fileNum = FreeFile
Open logPath For Output As #fileNum
Print #fileNum, “ファイル名,フルパス,ステータス”
‘ 配列は [0]がファイル名, [1]がパス の形式で格納されている
For i = LBound(vRefs, 2) To UBound(vRefs, 2)
Dim fileName As String
Dim filePath As String
Dim status As String
fileName = vRefs(0, i)
filePath = vRefs(1, i)
‘ ファイル存在チェック(FSOを使用推奨)
If Dir(filePath) <> “” Then
status = “OK”
Else
status = “MISSING”
End If
Print #fileNum, fileName & “,” & filePath & “,” & status
Next i
Close #fileNum
MsgBox “スキャン完了: ” & logPath
End Sub
—
設計の注意点:エンジニアが陥る罠
1. ファイルシステムオブジェクト(FSO)への移行
上記のコードでは`Dir`関数を使っているが、より大規模な環境では`Scripting.FileSystemObject`を使用することを強く推奨する。UNCパス(`\\Server\Folder\…`)へのアクセスにおいて、`Dir`関数は時に予期せぬ動作をすることがあるからだ。
2. コンテキスト参照と仮想構成部品
`EnumExternalFileReferences`は、アセンブリ内の「インコンテキスト参照」も拾い上げる。設計者は、これが「単なる部品の参照」なのか「設計意図の依存関係(In-Context)」なのかを区別するフィルターをコードに追加すべきだ。
3. パフォーマンスとメモリ管理
数千パーツのアセンブリでこの処理を走らせる場合、`swModel.EnumExternalFileReferences`を呼び出す前に、必ず「そのモデルが読み込み済みか」を確認すること。未ロードの構成部品まで深追いすると、SolidWorksはバックグラウンドでファイルを順次開き始め、メモリが枯渇する。
—
結論:保守とは「先制防御」である
このマクロを毎朝のビルド前や、設計完了後のレビューフローに組み込むだけで、アセンブリのリンク切れに起因する手戻りは限りなくゼロに近づく。
APIを使いこなすことは、単なるコーディングではない。「SolidWorksがどのようにファイルを管理しているか」という本質的な挙動を理解し、それを制御下に置くことだ。この知見をあなたの武器にし、ツールを作って終わりではなく、組織の設計品質を底上げするエンジニアであれ。
何か実装上の課題があれば、いつでも相談してほしい。君のコードが、堅牢なプロダクトを生み出す一助となることを期待している。
