【テクニカル・上級編】【実務中級】距離合致と角度合致のパラメータを連動させ、機構の限界位置(ストローク端)まで自動でステップ移動させるシミュレーション補助 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBA極限技術:アセンブリ機構シミュレーションの自動化とメモリ管理の深淵

エンジニア諸君。SolidWorksの「合致」は単なる拘束条件ではない。それは物理挙動の数理モデルであり、我々自動化エンジニアにとっての制御対象だ。

アセンブリ内で機構を動かし、その瞬間の干渉や破綻を自動でキャプチャする。これを手作業で繰り返すのは、エンジニアの時間をドブに捨てる行為に等しい。本稿では、VBAを用いて機構のストローク端までをステップ移動させ、検証を行うための「極限の自動化手法」を授ける。

—

1. 破綻なき自動化のための「合致制御」の真髄

合致をプログラムで操作する際、多くの者が `MateFeatureData` のプロパティを直接変更しようとして失敗する。SolidWorksのAPIは、フィーチャーの更新サイクル(Rebuild)を正しくハンドリングしなければ、メモリリークや不正な状態遷移を引き起こすからだ。

実装の勘所

  • Rebuildの最小化: `IModelDocExtension::Rebuild2` をループ内で多用してはならない。必要最小限のタイミングで呼び出すことが、処理速度の鍵となる。
  • 合致の再定義: 距離合致や角度合致の値を変更した際は、必ず `IModelDoc2::EditRebuild3` を呼び出し、解決済み状態を確実に保証すること。

—

2. 実装コード:機構ステップ移動シミュレーション

以下は、距離合致をパラメータ駆動でステップ移動させ、その都度スクリーンショットを保存するプロトタイプだ。`DoEvents` を使い、OS側の描画処理と同期させるのが「プロの作法」である。

‘ 伝説的なチーフアーキテクトによる合致制御モジュール
Option Explicit

Public Sub ExecuteMechanismSimulation()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMate As SldWorks.Feature
Dim swMateData As SldWorks.DistanceMateFeatureData
Dim i As Long
Dim stepCount As Integer: stepCount = 10
Dim startVal As Double: startVal = 0.01 ‘ 10mm
Dim endVal As Double: endVal = 0.1 ‘ 100mm
Dim currentVal As Double

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 合致フィーチャーの取得(事前に名前を固定しておくのが運用の鉄則)
Set swMate = swModel.FeatureManager.FeatureByName(“DistanceMate1”)
Set swMateData = swMate.GetDefinition

For i = 0 To stepCount
currentVal = startVal + (endVal – startVal) (i / stepCount)

‘ パラメータ更新
swMateData.Distance = currentVal
swMate.ModifyDefinition swMateData, swModel, Nothing

‘ 再構築と描画の同期(重要)
swModel.EditRebuild3
DoEvents ‘ OSに描画処理を託す

‘ スクリーンショット保存
swModel.Extension.SaveAs “C:\Temp\Capture_” & i & “.png”, _
swSaveAsVersion_e.swSaveAsCurrentVersion, _
swSaveAsOptions_e.swSaveAsOptions_Silent, _
Nothing, 0, 0
Next i

‘ メモリ解放の儀式
Set swMateData = Nothing
Set swMate = Nothing
Set swModel = Nothing
End Sub

—

3. 現場で生き残るための「メモリ管理と安定化」の知見

Windows APIによる「描画待ち」の強制

VBAの `DoEvents` だけでは、巨大なアセンブリでは描画が追いつかないことがある。極限環境では `Sleep` APIを併用し、確実にSolidWorksのグラフィック更新を待機させるのが定石だ。

If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
End If

ループ内に `Sleep 500` を挟むだけで、異常なメモリ負荷を防ぎ、システムの安定性は劇的に向上する。

オブジェクトの明示的解放(Disposeの代用)

VBAのガベージコレクションを信用してはならない。ループ内で作成した `FeatureData` オブジェクトなどは、必ず `Set obj = Nothing` で解放せよ。大規模アセンブリでは、この数行の怠慢が数時間の処理の末のクラッシュを招く。

—

4. 最後に:なぜ「VBA」なのか

最新のC# APIの方が強力なのは認めよう。しかし、社内のレガシーシステムや、非エンジニア層が保守を行う環境において、ExcelをホストとしたVBAは依然として最強のプラットフォームだ。

「コードの複雑さは、システムの脆さに直結する」

この格言を忘れないでほしい。自動化の目的は技術的な自己満足ではなく、設計者が設計そのものに集中できる時間を創出することにある。

君たちが書くその一行が、明日誰かの残業をゼロにするかもしれない。健闘を祈る。

タイトルとURLをコピーしました