SolidWorks VBAを掌握する極限の知見
【実務中級】距離合致のパラメータインクリメントによる機構動作範囲の連続検証
SolidWorks VBAの自動化において、単なる「部品の配置」や「固定的な合致(Mate)の付与」にとどまるうちは、初級者の領域を出ない。真に実務で使える高度な自動化とは、「物理挙動のパラメトリックなシミュレーション」をコードの支配下に置くことである。
今回は、アセンブリ内の可動部における距離合致(Distance Mate)のオフセット値をVBAのループによって微小変更し、機構部品が干渉せずにスムーズに動くかをプログラム上で連続検証する実践的アーキテクチャを解説する。
—
1. 根幹を支える技術的課題とアーキテクチャの要点
距離合致の値をインクリメントしながらアセンブリを動かす際、開発者が直面する最大の壁は以下の3点である。
1. 合致オブジェクトの永続性と再取得のコスト
ループのたびにモデルツリーから合致フィーチャーを文字列検索しているようでは、パフォーマンスは地に落ちる。ポインタの保持と適切なライフサイクル管理が不可欠。
2. SolidWorksの再計算(Rebuild)のタイミング制御
APIで数値を書き換えただけでは、グラフィックス領域および物理演算エンジンは追従しない。明示的な`ForceRebuild3`の制御が必須となる。
3. COMオブジェクトのメモリリーク対策
VBAの背後でうごめくCOMラッパーは、解放を怠ると確実にメモリリークを引き起こし、長時間のシミュレーション中にSolidWorksごとクラッシュする。
これらをクリアする、実務レベルのコードベースを以下に提示する。
—
2. 実装コード:機構動作範囲連続検証マクロ
以下のコードは、指定した距離合致の値を初期値から終了値までステップ幅ごとに変化させ、都度アセンブリを再計算・検証するプロシージャである。
Option Explicit
‘ ——————————————————————————–
‘ 権威あるチーフアーキテクトによる機構検証エンジン
‘ ——————————————————————————–
Sub ExecuteMechanismValidation()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssDoc As SldWorks.AssemblyDoc
Dim swMateFeature As SldWorks.Feature
Dim swMateDim As SldWorks.DisplayDimension
Dim swParam As SldWorks.Parameter
‘ イテレーション制御変数
Dim dblStart As Double
Dim dblEnd As Double
Dim dblStep As Double
Dim dblCurrent As Double
‘ 処理時間計測用
Dim lngStartTime As Long
lngStartTime = TickCount()
‘ 1. アプリケーションおよびドキュメントの安全な取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub
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 swAssDoc = swModel
‘ — パラメータ設定(実務ではUIや外部CSVから読み込むことを推奨) —
Const MATE_NAME As String = “距離合致1” ‘ 検証対象の合致フィーチャー名
dblStart = 0.0 ‘ 開始距離 (m)
dblEnd = 0.05 ‘ 終了距離 (0.05m = 50mm)
dblStep = 0.001 ‘ ステップ幅 (0.001m = 1mm)
‘ 2. 合致フィーチャーおよび寸法パラメータのバインド
Set swMateFeature = swModel.Extension.GetFeatureByName(MATE_NAME)
If swMateFeature Is Nothing Then
MsgBox “指定された合致が見つかりません: ” & MATE_NAME, vbCritical
GoTo CleanUp
End If
‘ フィーチャーからディメンション(パラメータ)を取得
‘ 注: 距離合致の内部パラメータ名(例: D1@距離合致1)を直接操作する手法
Set swParam = swMateFeature.GetParameter(“D1”)
If swParam Is Nothing Then
MsgBox “合致の距離パラメータを取得できませんでした。”, vbCritical
GoTo CleanUp
End If
‘ 3. 高速化のための画面描画・自動再計算の抑制
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, True
swModel.EditRebuild3 ‘ 事前ビルド
‘ 4. インクリメント・ループによる動作検証シミュレーション
dblCurrent = dblStart
Do While dblCurrent <= dblEnd
' パラメータ値の設定 (SetValue2の引数: 世代, 値)
' swSetValue_InBothConfigurations 等のスコープ指定を適切に行う
Dim lRet As Long
lRet = swParam.SetSystemValue3(dblCurrent, swSetValue_InBothConfigurations, Nothing)
If lRet <> 0 Then
Debug.Print “パラメータ設定エラー (Value: ” & dblCurrent & “)”
End If
‘ アセンブリの強制再計算(物理・干渉解決を含む)
‘ ForceRebuild3(False) でアセンブリ全体を強制更新
swModel.ForceRebuild3 False
‘ —————————————————————-ッド
‘ 【実務上のポイント】
‘ ここに干渉チェック(CollisionDetectionManager)のAPI呼び出しを挿入し、
M
‘ 干渉検出時はログを残してループを抜けるなどの拡張を行う。
‘ —————————————————————-ッド
Debug.Print “Validated at Distance: ” & (dblCurrent 1000) & ” mm”
‘ 次のステップへ
dblCurrent = dblCurrent + dblStep
Loop
CleanUp:
‘ 5. 環境の復元とメモリの明示的解放(オブジェクト参照の破棄)
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, False
swModel.ForceRebuild3 False
Set swParam = Nothing
Set swMateFeature = Nothing
Set swAssDoc = Nothing
Set swModel = Nothing
Set swApp = Nothing
MsgBox “シミュレーション完了。処理時間: ” & (TickCount() – lngStartTime) & ” ms”, vbInformation
End Sub
‘ 処理時間計測用の簡易Windows APIラッパー
Private Declare PtrSafe Function GetTickCount Lib “kernel32” () As Long
Private Function TickCount() As Long
TickCount = GetTickCount()
End Function
—
3. チーフアーキテクトが指摘する「極限の知見」
① `SetSystemValue3` とコンフィギュレーションの罠
距離合致の数値を書き換える際、`ISldWorks`や`IParameter`のメソッド選定を誤ると、意図しないコンフィギュレーションが書き換わったり、コンパイルエラーや実行時例外を引き起こす。
特に大規模アセンブリにおいては、`swSetValue_InBothConfigurations` や `swSetValue_CurrentConfiguration` のスコープを明確にコードで指定し、モデルの意図しないコンフィギュレーション汚染を防ぐことがプロの条件である。
② 画面描画の完全なブロック(パフォーマンスの最大化)
ループ内でアセンブリを再計算(`ForceRebuild3`)させるたびにSolidWorksがビューポートを再描画していると、シミュレーション完了までに数十分を要することになる。
コード内で行っている `swUserPreferenceToggle` による表示抑制に加え、大量の処理を行う場合は `swModel.GraphicsRedraw2` の制御を組み合わせることで、処理速度を劇的に(場合によっては10倍以上に)向上させることが可能だ。
③ 厳格なメモリ管理とCOM解放
VBAはガベージコレクションの挙動がブラックボックスである。SolidWorks APIを叩くマクロにおいて、ローカル変数として宣言された `SldWorks` 系のオブジェクト(`ModelDoc2`, `Feature`, `Parameter` 等)は、スコープを抜けても即座にCOM参照カウントがゼロになるとは限らない。
プロシージャの終端(`CleanUp` ラベル)で、必ず `Set obj = Nothing` を明示的に実行し、メモリリークによるSolidWorksのメモリ肥大化・強制終了(Fatal Error)を構造的に防がなければならない。
—
総括
距離合致のインクリメントによる機構検証の自動化は、単なる「手作業の代替」ではない。人間の目では見逃す微小な干渉領域や、設計限界値を数理的にあぶり出すための「攻めのエンジニアリング」である。
ここに示したコードとアーキテクチャの思想をあなたの開発環境にインストールし、レガシーな手動検証の時代に終止符を打ってほしい。
