SolidWorks VBAを掌握する:アセンブリ初期配置の「固定(Fix)」を支配せよ
SolidWorks APIを扱うエンジニア諸君。アセンブリの自動生成において、最初の一歩で躓くのが「初期コンポーネントの強制固定」だ。
`InsertComponent4` を実行した直後、SolidWorksは親切心から最初の部品を原点に固定する。だが、自動化ツールを組む我々にとって、この「勝手な固定」は時として設計意図を阻害するノイズでしかない。
今日は、この「固定(Fix)」と「浮動(Float)」の状態をコードで完全に掌握し、堅牢なアセンブリ構築プロセスを実現する方法を伝授する。
—
なぜ「固定の解除」が重要なのか
自動化ツールにおいて、部品を配置した後に合致(Mate)を付加する際、部品が固定されたままだとどうなるか。
SolidWorksは「固定された部品には合致を付加できない(またはエラーを吐く)」という制約を持つ。無理に合致を入れれば、過定義エラーの温床となる。
実務レベルのツールでは、以下のフローが鉄則だ。
1. 部品挿入
2. (必要に応じて)固定解除
3. 合致付加
4. 最終的な位置決定
この手順を自動化できなければ、あなたのツールは「動くが、すぐ壊れる」という最低の品質に成り下がる。
—
堅牢な「固定解除」の実装コード
SolidWorks APIにおいて、コンポーネントの状態(固定/浮動)を制御するのは `SelectByID2` で対象を選択し、`Part.UnfixComponent` を実行する手法が一般的だが、ここではよりモダンで確実なアプローチを提示する。
‘ ———————————————————
‘ コンポーネントの固定を解除し、合致可能な状態にする関数
‘ @param swModel : 現在のアセンブリドキュメント
‘ @param compName : コンポーネント名(ファイル名)
‘ ———————————————————
Public Sub ReleaseComponentFix(ByVal swModel As SldWorks.ModelDoc2, ByVal compName As String)
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp As SldWorks.Component2
Dim status As Boolean
Set swAssy = swModel
‘ コンポーネントを取得
Set swComp = swAssy.GetComponentByName(compName)
If swComp Is Nothing Then
Err.Raise vbObjectError + 1, “ReleaseComponentFix”, “コンポーネントが見つかりません”
End If
‘ 重要: コンポーネントを選択状態にする
‘ API操作の鉄則として「操作対象を選択してからコマンドを投げる」のが最も安定する
status = swModel.Extension.SelectByID2(compName, “COMPONENT”, 0, 0, 0, False, 0, Nothing, 0)
If status Then
‘ 固定解除を実行(Float)
‘ ※固定したい場合は swModel.EditFixComponent を使用する
swModel.EditUnfixComponent
End If
‘ 再構築を行い状態を確定させる
swModel.EditRebuild3
End Sub
—
現場で差がつく「設計の極意」
1. 「名前」への過信を捨てよ
`GetComponentByName` は便利だが、同一名称のコンポーネントが複数ある場合、意図しない挙動を引き起こす。大規模アセンブリを扱う場合は、`ComponentID` やファイルパスのフルパス管理を検討すべきだ。
2. 再構築(Rebuild)のタイミング
VBAは非同期的な処理が混じることがある。`EditUnfixComponent` の直後に合致を付加しようとすると、SolidWorks側の計算が追いつかず失敗することがある。必ず `EditRebuild3` を挟み、計算を完了させてから次のステップに進むのが「通」のやり方だ。
3. エラーハンドリングの徹底
「部品が最初から浮動状態だった場合」にエラーを出すのではなく、状態をチェックしてから処理を分岐させるのが、真に堅牢なコードである。
‘ 状態チェックのロジック
If swComp.IsFixed Then
‘ ここで固定解除を実行
End If
—
最後に:自動化ツールは「保守性」が全て
コードが動くのは当たり前だ。重要なのは「明日、仕様変更があっても3分で修正できるか」である。
今回のコードは、関数化(カプセル化)を意識している。メインの処理ルーチンに直接書き込むのではなく、このようなユーティリティ関数を別モジュールに切り出しておくことで、将来的に他のプロジェクトでも資産として活用できる。
SolidWorks VBAは、決してレガシーな言語ではない。APIという「強大な力」を正しく御すことができれば、手作業で数時間かかっていたアセンブリ構築が、数秒で完了するようになる。
諸君、まずはこのコードを実装し、アセンブリの固定状態を自在に操るところから始めてみてほしい。次に会うときは、さらに深いメモリ管理や、データベース連携の領域で語り合おう。
