【SolidWorks API極致】アセンブリ依存の「ゴースト再構築」を撲滅せよ:コンテキスト同期の強制実行術
SolidWorksのコンテキスト設計(In-Context)において、パーツ単体を編集した後、アセンブリに戻ると「形状が追従していない」「外部参照がエラーを吐く」という事態に直面したことはないだろうか。
これは、SolidWorksの計算モデルが「要求された時にしか計算しない(On-Demand Evaluation)」という特性を持っているからだ。特に大規模アセンブリでは、意図的に再構築の連鎖を断ち切る挙動を取るため、VBAで強制的に「親の文脈」を更新するロジックを組み込むことは、自動化エンジニアにとって必須の教養である。
本稿では、パーツ側から親アセンブリを特定し、安全かつ強制的にジオメトリを同期させる「同期マクロ」の極意を伝授する。
—
1. なぜ「ForceRebuild」だけでは不十分なのか
多くのエンジニアは `swApp.ForceRebuildAll` を連打すれば解決すると勘違いしている。だが、これは大きな間違いだ。
このコマンドは単なる再生成フラグの強制に過ぎず、外部参照(External References)の依存関係グラフを確実に追跡・評価させるためには、パーツから親アセンブリのインターフェースを直接叩く必要がある。
堅牢な自動化を実現するための設計指針は以下の3点だ。
1. 依存関係の階層構造を把握する: パーツから `IModelDoc2::GetComponentsWhereUsed` を使い、親アセンブリのポインタを確実に取り出す。
2. 文脈の強制更新: 親アセンブリの `IModelDoc2::EditRebuild3` を呼び出し、内部の依存解決エンジンを叩き起こす。
3. エラーハンドリングの徹底: 参照が切れている場合や、アセンブリが読み取り専用で開かれている場合の例外処理を怠らない。
—
2. 実装コード:コンテキスト強制同期プロシージャ
以下に、パーツから親アセンブリを特定し、再構築を強制する実戦用のコードを示す。このロジックは、開発ツールに組み込むことでヒューマンエラーを完全に排除できる。
Option Explicit
‘ パーツから親アセンブリを強制再構築するメインプロシージャ
Public Sub SynchronizeWithParentAssembly()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim vAssyPaths As Variant
Dim i As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocPART Then
MsgBox “パーツファイルを開いて実行してください。”
Exit Sub
End If
‘ 親アセンブリのパスを取得(依存関係の特定)
vAssyPaths = swModel.GetDependencies(False)
If IsEmpty(vAssyPaths) Then
MsgBox “このパーツはアセンブリに依存していません。”
Exit Sub
End If
‘ アセンブリを探索し、再構築をトリガーする
For i = LBound(vAssyPaths) To UBound(vAssyPaths)
If Right(vAssyPaths(i), 7) = “.SLDASM” Then
ForceAssemblyRebuild vAssyPaths(i)
End If
Next i
MsgBox “コンテキストの同期処理が完了しました。”
End Sub
‘ 指定されたアセンブリを裏でアクティブ化し再構築する堅牢な実装
Private Sub ForceAssemblyRebuild(ByVal assyPath As String)
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.ModelDoc2
Dim errors As Long, warnings As Long
Set swApp = Application.SldWorks
‘ アセンブリが既に開かれているか確認し、無ければ開く
Set swAssy = swApp.ActivateDoc3(assyPath, True, swOpenDocOptions_Silent, errors)
If Not swAssy Is Nothing Then
‘ コンテキスト内の外部参照を強制的に再評価させる
‘ EditRebuild3(True) はすべての構成部品に対して再構築を試みる
swAssy.EditRebuild3
‘ 必要であれば保存(プロジェクトの運用に合わせてコメントアウト解除)
‘ swAssy.Save
End If
End Sub
—
3. 開発現場で生き残るための「保守の技術」
このコードをプロダクション環境に導入する際、以下の設計上の注意点を守ってほしい。
- コンテキストの「壊れ」を検知する:
`swModel.GetExternalReferences` を使用して、ステータスが「OutOfDate(期限切れ)」になっているか事前に調査するコードを前段に置くべきだ。不要な再構築は、大規模アセンブリにおいてはパフォーマンスを著しく低下させる。
- ファイルアクセスの排他制御:
PDM環境やネットワーク共有フォルダで運用する場合、他者が開いていると `ActivateDoc3` が失敗する。エラーコードを読み取り、`swApp.OpenDoc6` のオプションで「読み取り専用」として開くフォールバック処理を実装すること。
- DB連携時の注意:
もしこの同期結果をデータベース(ExcelやPdmWorks等)に記録する場合、必ず `swModel.GetPathName` で取得した絶対パスで一意性を担保すること。ファイル名だけでは同名ファイルが別ディレクトリに存在した際に致命的なミスを招く。
最後に:エンジニアとしてのマインドセット
「なぜ動かないのか」と悩む時間を減らすためには、SolidWorksの内部オブジェクトツリーを頭の中で可視化する能力が必要だ。今回のコードは、その「依存関係の闇」に直接アクセスするための鍵となる。
このスクリプトを単なる「ツール」として使うのではなく、「設計の整合性を守るための自動防衛システム」として、自社の設計フローに組み込んでほしい。それが、世界最高峰の業務自動化エンジニアを目指す諸君に求められる姿勢である。
