SolidWorks VBA極意:アセンブリの「文脈依存」を強制同期させる究極の自動化術
こんにちは。現場の最前線でCAD自動化を極めるエンジニアです。
SolidWorksを使っていて、こんな経験はありませんか?
「パーツ単体で設計変更したのに、アセンブリに戻るとモデルが更新されず、古い形状のまま止まっている…」
「再構築ボタンを連打しても、親子関係の参照がうまく伝播しない…」
これは、SolidWorksの「外部参照(External References)」の更新サイクルが、大規模アセンブリや複雑なインコンテキスト設計において、時として「サボる」ことがあるためです。
今日は、パーツ側から親アセンブリを強制的に呼び起こし、確実に同期させるための「同期マクロ」の設計思想を授けます。マクロの記録ボタンを押すだけでは到達できない、APIの深淵を一緒に覗いてみましょう。
—
1. なぜ「同期」に失敗するのか?
SolidWorksのモデルには「再構築(Rebuild)」の優先順位があります。パーツ単体を開いているとき、SolidWorksは「親アセンブリの文脈」を完全に読み込んでいないことがあります。
これを解決するには、パーツファイルから「自分を内包している親アセンブリを特定し、そのアセンブリに対して再構築のトリガーを引く」という一連のAPI操作が必要です。
—
2. 実装の設計図:APIの選定
今回の核となるのは、`IModelDocExtension::Rebuild2` メソッドと、アセンブリの構成要素をたどる `IAssemblyDoc` です。
- ポイント: パーツ単体から親を探すには、`GetUsedIn` を使うのが定石です。これが「どこで使われているか」を教えてくれる唯一の鍵です。
—
3. 実践コード:強制同期マクロ
このコードは、現在アクティブなパーツが、どのアセンブリで使われているかを検索し、その親アセンブリを強制的に再構築(Force Rebuild)するものです。
Option Explicit
‘ 伝説のチーフアーキテクトによる、強制同期マクロ
Sub ForceSyncAssemblyReference()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.ModelDoc2
Dim vParents As Variant
Dim i As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. 現在のドキュメントがパーツか確認
If swModel Is Nothing Or swModel.GetType <> swDocPART Then
MsgBox “パーツファイルを開いた状態で実行してください。”
Exit Sub
End If
‘ 2. パーツが使われている親アセンブリを特定
vParents = swModel.GetUsedIn()
If IsEmpty(vParents) Then
MsgBox “このパーツはどのアセンブリにも依存していません。”
Exit Sub
End If
‘ 3. 取得した親アセンブリをループして再構築
For i = LBound(vParents) To UBound(vParents)
‘ 親アセンブリをバックグラウンドで開く
Set swAssy = swApp.OpenDoc6(vParents(i), swDocASSEMBLY, swOpenDocOptions_Silent, “”, 0, 0)
If Not swAssy Is Nothing Then
‘ 強制再構築(Rebuild2の引数1は「強制再構築」を意味する)
swAssy.Extension.Rebuild2 swRebuildAll
‘ 更新が完了したら保存して閉じる(必要に応じて設定)
swAssy.Save
swApp.CloseDoc swAssy.GetTitle
End If
Next i
MsgBox “全親アセンブリの同期が完了しました!”
End Sub
—
4. 開発現場で陥りやすい罠と解決策
Q1. 「ファイルが開けません」というエラーが出る
原因: ネットワークドライブ上のパスや、ファイル名に日本語が含まれる場合、パスの認識がうまくいかないことがあります。
解決策: `OpenDoc6` を使う際、パスが正しいか、ドキュメントが既にセッション内に開かれていないかを確認するロジック(`swApp.GetDocumentManager`など)を前段に入れると堅牢になります。
Q2. 動作が重すぎてPCが固まる
原因: 大規模アセンブリに対して `Rebuild2` を連打しているからです。
解決策: 不要なウィンドウの表示を抑える `swApp.Frame.KeepAlive` や、バックグラウンド処理の定石である `swOpenDocOptions_Silent` を活用してください。
—
5. 初学者から「自動化エンジニア」へ進むために
このマクロの本質は、単なる「更新」ではなく、「CADのデータ構造(親子関係)をAPI経由で操作している」という点にあります。
- ステップアップ: 次は、単に再構築するだけでなく、特定のアセンブリ構成内の「コンテキスト部品のステータス(エラーの有無)」をチェックするロジックを組んでみてください。`IComponent2::GetSelectByIDString` などを使いこなせれば、君ももう初心者ではありません。
SolidWorks VBAは、単なる「作業の短縮」ではありません。「設計の整合性を守るための防波堤」です。
今日から、君が書くコードが、誰かの設計ミスを未然に防ぐ「守護神」になるはずです。もし行き詰まったら、またいつでもここへ来てください。エンジニアの道は、常にここから始まります。
さあ、コードを書いて、設計現場の「同期ズレ」を根絶やしにしましょう!
