SolidWorks APIの深淵:外部参照(In-Context)の呪縛を解き放つ自動化アーキテクチャ
SolidWorksの設計現場において、「外部参照(In-Context)」は諸刃の剣である。アセンブリとの動的な連携は初期設計の生産性を高めるが、大規模アセンブリにおいては、参照の連鎖がメモリを侵食し、再構築(Rebuild)時間を増大させ、最終的には「参照切れ」という致命的な設計の断絶を招く。
本稿では、シニアエンジニアの視点から、`PartDoc.ExternalFileReferences`を制御し、安全かつ堅牢に外部参照を断ち切るためのVBAアーキテクチャを提示する。
—
1. 外部参照の「構造」を理解する
SolidWorks APIにおいて、外部参照は単なるプロパティではない。`ModelDoc2.ExternalFileReferences`は、そのドキュメントが依存しているすべての外部ファイルへのパスと状態を保持する配列だ。
しかし、実務において重要なのは「参照のパス」そのものではなく、「その参照が現在どの状態(解決済み、未解決、ロック、ブレイク)にあるか」というメタデータである。この管理を怠ると、マクロ実行中にSolidWorksがCOMサーバーとしてハングアップし、プロセスがゾンビ化する。
2. メモリとCOMの生命線:明示的解放の哲学
VBAはガベージコレクションを備えていない。特にSolidWorks APIのようなCOMベースのライブラリでは、`Set obj = Nothing`を単なる作法として扱うのは素人である。
- 循環参照の回避: `swApp`から`ModelDoc2`、そして`Feature`へと辿るポインタは、必ずスコープの終了時に逆順で解放する。
- エラーハンドラとの統合: 外部参照の切断はファイルシステムへの書き込みを伴う。予期せぬエラーでプロセスが残れば、次回のファイルロックを引き起こす。必ず`On Error GoTo`でカプセル化せよ。
—
3. 実装コード:外部参照の監視と強制ブレイク
以下のコードは、アクティブなパーツドキュメントをスキャンし、外部参照が存在する場合にそれを「ブレイク(固定化)」する実戦的なプロシージャである。
Option Explicit
‘ 外部参照を断ち切り、スタティックなモデルへ変換するメインロジック
Public Sub BreakExternalReferences_Professional()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim vRefs As Variant
Dim i As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントチェック:パーツ以外は弾く
If swModel Is Nothing Or swModel.GetType <> swDocPART Then
MsgBox “パーツドキュメントを開いてください。”, vbCritical
Exit Sub
End If
Set swPart = swModel
‘ ExternalFileReferencesの取得
‘ 戻り値は [0]Path, [1]Status の配列
vRefs = swPart.ExternalFileReferences
If IsEmpty(vRefs) Then
Debug.Print “外部参照は存在しません。”
Exit Sub
End If
‘ 参照が存在する場合の処理
‘ 注意: BreakAllExternalReferencesはドキュメントを「保存」するのと同等の負荷がある
On Error GoTo ErrorHandler
‘ コンテキストの切断 (BreakAllExternalReferences)
‘ ※慎重を期すなら、個別のフィーチャに対してBreakReferenceを実行する
swPart.BreakAllExternalReferences
swModel.ForceRebuild3 False
swModel.Save
Debug.Print “外部参照をすべてブレイクしました。”
Cleanup:
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume Cleanup
End Sub
4. チーフアーキテクトからの助言:システム間連携の注意点
この自動化を社内システム(PDM連携やPDM外のファイルサーバー管理)に組み込む際、以下の3点に注意せよ。
1. コンフィギュレーションの罠: `BreakAllExternalReferences`は、現在アクティブなコンフィギュレーションに対してのみ作用する場合が多い。全コンフィギュレーションをループして切り替え、都度ブレイクを行う実装が、真に「参照を根絶する」唯一の道である。
2. 読み取り専用属性: PDM環境では、ファイルがチェックアウトされていない場合、参照のブレイクは失敗する。APIで`FileIsReadOnly`を事前にチェックし、運用フローと突き合わせるガード節を必ず実装せよ。
3. パフォーマンス: 大規模アセンブリの下位パーツでこれを行うと、再構築の連鎖が発生する。`swApp.UserControl = False`とし、バックグラウンドでサイレントに実行することで、ユーザー体験を損なわない配慮が必要だ。
—
結論
外部参照の管理は、SolidWorksという巨大なシステムの「整合性」を保つための防波堤である。VBAはレガシーな言語と見なされがちだが、COMインターフェースを深く理解した者が書くコードは、現代のどの高レベル言語よりもSolidWorksの心臓部に肉薄できる。
このマクロをあなたの保守ツールボックスに加え、設計データの「沈黙の爆弾(意図しない参照更新)」を排除せよ。技術とは、自動化することではなく、システムをより予測可能にすることに他ならない。
