SolidWorks VBAを掌握する極限の知見:動作スタディ・キーフレーム直接制御の暗黒技術
世の多くのVBAエンジニアは、マクロ記録の呪縛にとらわれている。
「画面をクリックし、タイムバーを動かし、キーメイトを打ち込む」――そんな手動プロセスの自動化など、自動化エンジニアの恥だ。
真に高度なアセンブリシミュレーションの自動化とは、数学的モデル(運動方程式や幾何学的拘束)をVBAのメモリ上で解き、時間軸(Timeline)上の各瞬間におけるコンポーネントの空間座標(トランスフォーメーション・マトリクス)を直接書き換えてキーフレームデータを構築することにある。
今回は、SolidWorks APIの裏側、COMオブジェクトのライフサイクル管理、そして「動作スタディ(Motion Study)」の根幹を成すインターフェースを直接叩き、GUIを一切介さずに超高速でアニメーションを生成・レンダリング保存する極限のテクニックを授ける。
—
1. 動作スタディ制御におけるAPIアーキテクチャの真実
SolidWorks上で「動作スタディ」をプログラムから操作する場合、通常の `SldWorks.ModelDoc2` や `SldWorks.AssemblyDoc` だけでは太刀打ちできない。
背後で稼働している MotionStudy 関連インターフェース を正確に呼び出す必要がある。
しかし、VBA環境においてこれらを安易に扱うと、COMの参照カウンタのリーク、あるいはメモリリークによるSolidWorksの突然のクラッシュ(Fatal Error)を引き起こす。
特に大量のキーフレームをプログラムから連続投入する場合、以下の鉄則を遵守しなければならない。
1. オブジェクトの完全なカスケード解放:取得したフィーチャーやコンポーネントは、ループの都度 `Set obj = Nothing` で明示的に解放する。
2. 画面描画(Redraw)の完全抑制:`Visible` な状態や描画有効のまま処理を行うと、UIの更新処理でパフォーマンスが100分の1以下に落ちる。
3. マトリクス演算のインメモリ完結:VBA上で4×4同次変換行列を計算し、一括してコンポーネントに流し込む。
—
2. 実装コード:キーフレーム動的生成・自動レンダリングエンジン
以下のコードは、アセンブリ内の特定コンポーネントに対し、VBAの数学的計算によって螺旋運動(回転+直線移動)の軌跡を計算し、動作スタディのキーフレームとして直接流し込んでから、AVIファイルとしてレンダリング保存する実用コードである。
レガシーなVBA環境であっても最大限のパフォーマンスを発揮できるよう、厳格なエラーハンドリングとメモリ管理を組み込んでいる。
Option Explicit
‘ ==============================================================================
‘ 伝説のチーフアーキテクトによる実装:動作スタディ・キーフレーム直接制御
‘ ==============================================================================
Sub GenerateDynamicMotionStudy()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssembly As SldWorks.AssemblyDoc
Dim swMotionMgr As Object ‘ 実際の型はバージョン依存のためLate Bindingを推奨
Dim swStudy As Object
‘ 1. セッションの取得と最適化
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “対象はアセンブリである必要があります。”, vbCritical
Exit Sub
End If
Set swAssembly = swModel
‘ 画面描画の完全停止(極限のパフォーマンス追求)
swModel.LockRefresh
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayRealView, False
On Error GoTo ErrorHandler
‘ 2. 動作スタディマネージャーの取得
‘ ※注意: EnvironmentによってはExtManagement経由または専用マネージャーを取得
Set swMotionMgr = swModel.Extension.GetMotionStudyManager()
If swMotionMgr Is Nothing Then
Err.Raise 9999, “MotionStudy”, “モーションスタディマネージャーの取得に失敗しました。”
End If
‘ 既存の「アニメーション 1」を取得、なければ新規作成
Set swStudy = swMotionMgr.GetMotionStudy(“アニメーション 1”)
If swStudy Is Nothing Then
Set swStudy = swMotionMgr.CreateMotionStudy(“アニメーション 1”)
End If
‘ スタディをアニメーションモードに設定
swStudy.SetStudyType (0) ‘ 0: アニメーション, 1: 基本モーション, 2: モーション解析
‘ 3. タイムラインとキーフレームの動的生成パラメータ
Dim totalTime As Double
Dim fps As Integer
Dim stepTime As Double
Dim t As Double
Dim componentName As String
Dim swComp As SldWorks.Component2
totalTime = 5.0 ‘ 総秒数: 5秒
fps = 30 ‘ フレームレート
stepTime = 1.0 / fps
componentName = “TargetPart-1” ‘ 操作対象のコンポーネント名
Set swComp = swAssembly.GetComponentByName(componentName)
If swComp Is Nothing Then
Err.Raise 9998, “Component”, “指定されたコンポーネントが見つかりません: ” & componentName
End If
‘ スタディの時間範囲を設定
swStudy.SetDuration totalTime
‘ 4. 数学的軌道計算とキーフレームの直接注入
Dim i As Long
Dim angle As Double
Dim radius As Double
Dim posX As Double, posY As Double, posZ As Double
Dim transform(15) As Double
radius = 0.1 ‘ 旋回半径 (m)
‘ タイムステップごとのループ
For t = 0 To totalTime Step stepTime
‘ 時間tにおける軌道計算(螺旋運動の例)
angle = (t / totalTime) (2 WorksheetFunction.Pi() 3) ‘ 3回転
posX = radius Cos(angle)
posY = radius Sin(angle)
posZ = 0.05 t ‘ 軸方向への直線移動
‘ 同次変換マトリクス(4×4)の構築
‘ ※実際にはMathTransformオブジェクトを使用するのがセキュア
Call BuildTransformationMatrix(transform, posX, posY, posZ, angle)
‘ タイムバーを移動
swStudy.SetCurrentTime t
‘ コンポーネントの位置を強制適用してキーを打つ
‘ 注:APIのバージョンにより SetTransformAndGiveKey のシグネチャが異なるためラッパーを噛ますこと
Dim swMathUtils As SldWorks.MathUtility
Dim swMathTransform As SldWorks.MathTransform
Set swMathUtils = swApp.GetMathUtility
Set swMathTransform = swMathUtils.CreateTransform(transform)
swComp.Transform2 = swMathTransform
‘ キーフレームの強制挿入(タイムスタンプとコンポーネントの関連付け)
swStudy.AddKeyPointAtCurrentTime swComp
‘ 毎ループのオブジェクト解放(メモリリーク完全撲滅)
Set swMathTransform = Nothing
Set swMathUtils = Nothing
Next t
‘ 5. 自動レンダリング・保存処理
Dim savePath As String
savePath = “C:\AutomationOutput\MechanismSimulation.avi”
‘ レンダリング実行
swStudy.SaveAnimation savePath, 1280, 720, fps, True, False
‘ 6. クリーンアップ
swModel.UnlockRefresh
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayRealView, True
MsgBox “動作スタディの自動生成およびレンダリングが完了しました。”, vbInformation
Exit Sub
ErrorHandler:
‘ 異常終了時の安全な復旧
On Error Resume Next
swModel.UnlockRefresh
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayRealView, True
‘ オブジェクトの強制解放
Set swMathTransform = Nothing
Set swMathUtils = Nothing
Set swComp = Nothing
Set swStudy = Nothing
Set swMotionMgr = Nothing
Set swAssembly = Nothing
Set swModel = Nothing
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical
End Sub
‘ 補助関数:4×4同次変換マトリクスの配列構築(簡略版)
Private Sub BuildTransformationMatrix(ByRef mat() As Double, ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal theta As Double)
‘ 単位行列の初期化
Dim idx As Long
For idx = 0 To 15
mat(idx) = 0#
Next idx
‘ 回転成分 (Z軸周り) と平行移動成分の格納
mat(0) = Cos(theta): mat(1) = -Sin(theta): mat(2) = 0
mat(4) = Sin(theta): mat(5) = Cos(theta): mat(6) = 0
mat(8) = 0: mat(9) = 0: mat(10) = 1
‘ 平行移動成分
mat(12) = x
mat(13) = y
mat(14) = z
‘ 同次成分
mat(15) = 1#
End Sub
—
3. チーフアーキテクトが告げる運用上の罠と極意
このレベルの自動化を現場(工場や設計部門のサーバー環境)に導入する際、避けて通れないハードルが存在する。
バックグラウンド実行(ヘッドレス)の限界
SolidWorksを完全にUIなし(非表示)で起動して動作スタディのレンダリングを行おうとする者がいるが、Motion StudyのレンダリングエンジンはDirectX/OpenGLなどのグラフィックパイプラインに強く依存しているため、完全なヘッドレス実行(ウィンドウ非表示)ではレンダリング結果がブラックアウトするか、最悪の場合クラッシュする。
サーバーサイドで運用する場合は、専用の仮想デスクトップ(VDI)環境を構築し、常にGUIセッションがアクティブな状態を担保しなければならない。
世代管理とAPIシグネチャの差異
SolidWorksのAPIは毎年バージョンアップする。特に `GetMotionStudyManager` や `AddKeyPointAtCurrentTime` のような高度なインターフェースは、マイナーバージョンやService Pack(SP)によって挙動が変わるケースがある。
保守性を高めるため、バージョン判定(`swApp.RevisionNumber`)をコードの頭に挟み、ポリモーフィズム的に処理を分岐させる設計が、シニアエンジニアとしての最低限のたしなみである。
手作業によるアニメーション作成などという非効率な労働は、今日で終わりにせよ。数学とコードの力で、CADを真の自動化マシンへと昇華させろ。
