こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺め、「これはいざという時、本当に使い物になるのか…?」と不安になった経験はありませんか?
今回は、一歩進んだプログラミングの世界、「トップダウン設計の自動化」に挑戦します。
テーマは【アセンブリ依存関係】親アセンブリの文脈を考慮したインプレイスパーツ自動更新です。
「アセンブリの中に組み込まれた部品(パーツ)を、他の部品の位置関係に合わせて自動で変形させたい」
そんな現場の切実な要望を、SolidWorks VBAを使ってスマートに解決する方法を、伝説のチーフアーキテクトである私と一緒に紐解いていきましょう。ここをクリアすれば、あなたのVBAスキルは間違いなくプロの領域に到達します!
—
1. そもそも「トップダウン設計」と「インプレイス編集」って何?
通常の部品設計は、パーツを単体で作り、それをアセンブリで組み上げていきますよね(ボトムアップ設計)。
しかし、複雑なメカニズムや、他の部品との取り合い(隙間や接触)がシビアな製品では、「アセンブリ全体のレイアウトを基準にして、パーツの形を決定・連動させる」トップダウン設計が不可欠になります。
SolidWorksでは、アセンブリを開いたまま中のパーツを編集する「インプレイス編集」というモードがあります。
VBAからこれを制御する場合、以下の壁にぶつかります。
- 「今、どのパーツを触っているのか?」
- 「親アセンブリから見て、他の部品はどこにあるのか?」
- 「パーツ単体(PartDoc)の視点と、アセンブリ内の部品(Component2)の視点をどう行ったり来たりするのか?」
ここを正確に把握するのが、今回の最大のキモです。
—
2. 攻略のキーテクノロジー:`Component2` と `EnumConfigurations2`
SolidWorks APIにおいて、アセンブリ内の部品は `Component2` というオブジェクトで表現されます。そして、パーツファイルそのものは `PartDoc` です。
- `Component2` :「今、どこに配置されていて、どんな向きで組まれているか」という空間的文脈を持っています。
- `PartDoc` :「穴はどこに開いているか、ボスはどこにあるか」という形状的実体を持っています。
この2つを繋ぐのが、親アセンブリの文脈を考慮したデータ操作です。さらに、複数のコンフィギュレーションを持つパーツを扱う際には `EnumConfigurations2` などのイテレーション(列挙)技術を組み合わせることで、意図した状態のパーツを正確にターゲットにできます。
—
3. 実践!親アセンブリ文脈を考慮したパーツ自動更新マクロ
それでは、実務でそのまま使えるコードを見ていきましょう。
このコードは、「アクティブなアセンブリ内にある特定のパーツを選択し、親アセンブリの他の部品の位置情報を取得して、パーツ側のスケッチやフィーチャを連動させる」というシナリオを想定したものです。
Option Explicit
Sub UpdatePartInAssemblyContext()
Dim swApp As SldWorks.SldWorks
Dim swAssm As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swComp As SldWorks.Component2
Dim swPartDoc As SldWorks.ModelDoc2
Dim vMatXform As Variant
‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swAssm = swApp.ActiveDoc
If swAssm Is Nothing Then
MsgBox “アセンブリを開いて実行してください。”, vbCritical
Exit Sub
End If
If swAssm.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリ文書でのみ動作します。”, vbCritical
Exit Sub
End If
‘ 2. 選択マネージャーからコンポーネント(部品)を取得
Set swSelMgr = swAssm.SelectionManager
Dim selType As Long
selType = swSelMgr.GetSelectedObjectType3(1)
If selType <> swSelCOSTEP Then ‘ 選択されたものがコンポーネントかチェック
MsgBox “アセンブリツリーから対象の部品(コンポーネント)を選択してください。”, vbExclamation
Exit Sub
End If
Set swComp = swSelMgr.GetSelectedObject6(1, -1)
‘ 3. コンポーネントの「トランスフォーム(空間座標・姿勢マトリックス)」を取得
‘ ※これが「親アセンブリ文脈」を理解する核心です!
vMatXform = swComp.Transform2.ArrayData
‘ 4. コンポーネントから参照されている実体(パーツドキュメント)を開く・取得する
Set swPartDoc = swComp.GetModelDoc2
if swPartDoc Is Nothing Then
MsgBox “パーツのモデルデータを取得できませんでした(軽量化されている可能性があります)。”, vbCritical
Exit Sub
End If
‘ — ここからパーツ側のジオメトリ操作・更新ロジック —
‘ 例として、パーツのコンフィギュレーションを走査してみます
Dim vConfigNames As Variant
vConfigNames = swPartDoc.GetConfigurationNames
Dim i As Long
For i = LBound(vConfigNames) To UBound(vConfigNames)
Debug.Print “検出されたコンフィギュレーション: ” & vConfigNames(i)
‘ ここで親アセンブリの位置情報(vMatXform)を基に、
‘ パーツ側のパラメータや数式(Equation)を書き換える高度な処理を記述できます。
Next i
‘ 5. 変更を反映してリビルド
swPartDoc.EditRebuild3
MsgBox “親アセンブリの文脈に基づいたパーツの更新が完了しました!”, vbInformation, “自動化完了”
End Sub
—
4. コードの解説と「陥りやすい罠」
初心者から中級者へステップアップする上で、このコードの重要なポイントと、よくあるハマりどころを解説しておきます。
① 「軽量部品(Lightweight)」の罠
アセンブリが大きい場合、SolidWorksはメモリ節約のために部品を「軽量状態」で読み込みます。この状態のまま `swComp.GetModelDoc2` を実行すると、`Nothing` が返ってきてマクロがクラッシュします。
対策: マクロを実行する前に、対象のコンポーネントが「図解的・完全解決済み(Resolved)」になっているか確認するか、API側で強制的に解決させる処理(`swComp.SetSolveMode` など)を入れるのがプロの技です。
② 座標系の変換(トランスフォーム)
パーツ単体で見ている時の「原点 $(0,0,0)$」と、アセンブリの中に組み込まれた時の「原点」は、空間的に全く異なります。
コード内の `swComp.Transform2.ArrayData` は、アセンブリ座標系におけるその部品の「位置と向きの全情報(16要素の行列)」を保持しています。他の部品との干渉計算や位置合わせを行う際は、このマトリックスを使って座標変換を行う必要があります。
—
まとめ:ここをクリアすれば、SolidWorks VBAの基本はバッチリです!
今回は、`Component2` を起点として親アセンブリの文脈を読み解き、パーツ単体のデータと行き来するという、少し歯応えのあるテーマを解説しました。
最初は難しく感じるかもしれませんが、「アセンブリという世界(空間)の中にパーツという住人がいて、その住人の位置情報を親が管理している」という構造 さえ掴んでしまえば、怖いものはありません。
この知見をベースに、社内の設計標準化や、寸法の自動アジャストツールを作ってみてください。あなたの設計業務のスピードは劇的に変わるはずです。
それでは、次回の高度なSolidWorks自動化でお会いしましょう。エンジニアライフを楽しみましょう!
