SolidWorks VBAを掌握する極限の知見:モーションスタディをコードで支配する
SolidWorksのGUIをポチポチと操作してモーションスタディを作成しているようでは、エンジニアとは呼べない。アセンブリの運動機構を数式モデルから動的に生成し、解析結果をフィードバックする。これこそが、設計自動化の最終到達点の一つだ。
今回は、SolidWorks APIの深淵、`MotionStudy`オブジェクトをVBAから直接制御し、キーフレームをプログラムで書き込む「極限の制御術」を伝授する。
—
1. モーションスタディ制御のパラダイムシフト
`IMotionStudy`インターフェースは、SolidWorks APIの中でも特にドキュメントが不親切で、かつメモリ管理がシビアな領域だ。`MotionManager`を通じて各モーターやキーフレームにアクセスする際、安易にオブジェクトをスタックに積めば、`Access Violation`やSolidWorks自体のクラッシュを招く。
我々が目指すべきは、「計算モデルの外部化」と「APIトランザクションの最小化」である。
2. 実践:モーションキーフレームの動的生成
以下のコードは、特定モーターの回転角を外部CSVや配列から読み込み、モーションスタディ上に等間隔のキーフレームとして流し込むための骨子だ。
‘ 伝説的なチーフアーキテクトによるモーション制御の雛形
Option Explicit
Public Sub GenerateMotionSequence()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMotionMgr As SldWorks.MotionStudyManager
Dim swMotionStudy As SldWorks.MotionStudy
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ モーションマネージャの取得
Set swMotionMgr = swModel.Extension.GetMotionStudyManager
‘ 既存のスタディをターゲットにするか、新規作成するか
Set swMotionStudy = swMotionMgr.GetMotionStudy(“MotionStudy1”)
If swMotionStudy Is Nothing Then Exit Sub
‘ 描画更新を停止し、メモリ消費を抑える(重要)
swApp.UserControl = False
Dim i As Long
For i = 0 To 100
‘ 時間軸(Time)と値(Value)を定義
‘ ここで外部計算モデルの値を適用する
Call SetMotorPosition(swMotionStudy, “Motor1”, i 0.1, i 5)
Next i
‘ オブジェクトの明示的解放(VBAのGCを信用してはならない)
Set swMotionStudy = Nothing
Set swMotionMgr = Nothing
swApp.UserControl = True
End Sub
Private Sub SetMotorPosition(study As SldWorks.MotionStudy, motorName As String, time As Double, angle As Double)
‘ モーターのフィーチャを取得し、キーフレームを挿入
‘ 注意: CreateKeyFrameは内部的に複雑なリソースを消費する
Dim motorFeat As SldWorks.Feature
Set motorFeat = study.GetFeature(motorName)
‘ プロパティ定義とキー挿入のトランザクション
‘ 戻り値のチェックを怠る者は、大規模アセンブリで必ず詰む
If Not motorFeat Is Nothing Then
study.SetKeyFrame motorFeat, time, angle (3.14159265358979 / 180)
End If
Set motorFeat = Nothing
End Sub
—
3. シニアエンジニアが知るべき「見えない制約」
メモリとライフサイクルの管理
VBAの参照渡し(`Set`)は強力だが、SolidWorksのAPIオブジェクトはCOMラッパーの皮を被っている。`GetFeature`などのメソッドをループ内で繰り返すと、ヒープ領域に大量の参照残骸が溜まる。必ずループ内で参照をクリアし、スコープを最小化せよ。
Windows APIによるUIフリーズの回避
長時間にわたるキーフレーム生成中、SolidWorksは「応答なし」になりやすい。ユーザーに状況を伝えるには、`DoEvents`を乱用するのではなく、`SendMessage`等でプログレスバーを制御する別スレッド(あるいはVB.NETのラッパーDLL)を検討すべきだ。VBAのみで完結させるなら、`Sleep` APIを適宜挟み、UIメッセージキューを解放する作法を守れ。
レガシー環境とバージョン互換性
異なるSolidWorksバージョン間でAPI仕様が微妙に変わるのがこの領域だ。`GetMotionStudyManager`は比較的新しいインターフェースであり、古いバージョンでは`IMotionStudy`の取得方法が異なる。`On Error Resume Next`で逃げるのではなく、`swApp.RevisionNumber`を確認し、ビルド番号に応じて条件分岐する「アダプター・パターン」をコードに組み込むのがプロの流儀だ。
—
結論:システムは「静的な図面」から「動的な数式」へ
モーションスタディをコードで制御するということは、製品の挙動を数学的に定義するということだ。手作業で調整したキーフレームは、設計変更があった瞬間に腐る。しかし、APIで生成された機構は、計算モデルさえ更新すれば一瞬で再構築される。
この技術をマスターした君なら、単なる「CADオペレーター」を超え、製品開発のサイクルそのものを自動化する「アーキテクト」になれるはずだ。
次は、生成されたモーションデータをCSVにエクスポートし、外部の数理ソルバー(MATLABやPython)と連携するパイプラインについて語ろうか。準備ができたらまた来たまえ。
