【実務・中級編】【実務中級】距離合致(Distance Mate)のオフセット値を条件分岐で動的に変更し、スライド機構の可動範囲を検証するVBA – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks自動化】スライド機構のストローク解析を極める:距離合致をプログラムで制御する堅牢なアーキテクチャ

SolidWorks APIを触り始めたエンジニアの多くが、最初の壁として突き当たるのが「合致(Mate)の制御」だ。特にスライド機構のような可動範囲を検証する際、手動で値を入力して再構築(Rebuild)を繰り返すのは、エンジニアの仕事ではない。

今回は、距離合致の値をプログラムから動的に制御し、干渉チェックまでを自動化する「実務レベルのコード」を伝授する。単に動くコードを書くのではない。「なぜ、その実装でなければならないのか」を理解してほしい。

—

1. なぜ「力技のループ」ではいけないのか

多くの初学者は、`MateFeature.Name` を指定して、力技で `Dimension` オブジェクトを書き換えようとする。しかし、大規模アセンブリやコンフィギュレーションが絡む現場では、それはバグの温床だ。

堅牢な自動化のために、以下の「3つの鉄則」を遵守せよ。

  • 名前への依存を避ける: 合致名はユーザーが変更可能である。`Name` ではなく、合致の定義(Feature)のポインタを直接捕捉せよ。
  • 再構築(Rebuild)のタイミングを制御する: 毎回 `ModelDoc2.ForceRebuild3` を呼ぶのは重すぎる。変更が必要な最小単位で制御せよ。
  • 例外処理とクリーンアップ: 異常終了時にプログラムで変更した値が残ると、設計意図と異なる状態で保存されるリスクがある。必ず `Try-Catch` 的な構造で初期値復元を組み込むこと。

—

2. 実装コード:スライド可動範囲検証ツール

以下は、選択した距離合致の値を動的に変化させ、検証を行うためのテンプレートである。保守性を高めるため、処理を関数(Sub)に分割している。

Option Explicit

‘ 伝説的なエンジニアの設計:必要な情報を構造体や定数で管理し、責務を分離する
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMate As SldWorks.Feature

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

‘ 1. 現在選択されている距離合致を取得
Set swMate = swModel.SelectionManager.GetSelectedObject6(1, -1)

If swMate Is Nothing Or swMate.GetTypeName2 <> “Mate” Then
MsgBox “距離合致を選択してください。”, vbCritical
Exit Sub
End If

‘ 2. 可動範囲の検証(例:0mmから100mmまで10mm刻みで移動)
Call ExecuteStrokeTest(swModel, swMate, 0, 100, 10)
End Sub

Sub ExecuteStrokeTest(swModel As SldWorks.ModelDoc2, swMate As SldWorks.Feature, _
startVal As Double, endVal As Double, step As Double)
Dim swDim As SldWorks.Dimension
Dim i As Double

‘ 合致の寸法(D1@距離合致など)を捕捉
Set swDim = swMate.GetDimension2(“D1”)

On Error GoTo ErrorHandler

For i = startVal To endVal Step step
‘ メートル単位系への変換を忘れないこと (SolidWorks APIはメートル固定)
swDim.SystemValue = i / 1000

‘ 再構築と干渉チェック
swModel.ForceRebuild3 False

‘ ここで干渉チェックAPIを呼び出すか、スクリーンショットを保存する処理を入れる
Debug.Print “Current Offset: ” & i & “mm”
DoEvents ‘ UIのフリーズを防ぐ
Next i

Exit Sub

ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub

—

3. プロダクション環境へ向けての深掘り

データベース連携の注意点

検証結果をExcelやCSVに書き出す際、「合致名と検証日時、その時の干渉有無」をペアでログに残せ。アセンブリファイルは「いつ時点の検証か」が不明瞭になりがちだ。ファイル名にタイムスタンプを付与する習慣をつけるだけで、後から設計意図を追跡するコストが激減する。

なぜ `SystemValue` なのか

`Value` プロパティではなく `SystemValue` を使う理由は、単位系の混乱を避けるためだ。APIは常にメートル法(m)で動作する。ミリメートル(mm)の感覚で `Value` に数値を突っ込むと、1000倍の誤差が生じる。この「単位の落とし穴」を回避するのが、プロのエンジニアの流儀である。

パフォーマンスの最適化

アセンブリの干渉チェックは重い。検証中に画面描画を停止させる `swModel.ViewZoomtofit2` などを多用すると、処理速度が劇的に落ちる。`swApp.Visible = False`(必要に応じて)や、画面更新の抑制を検討せよ。

—

最後に:自動化は「設計の質」を上げるためにある

自動化ツールを作ることが目的になってはいけない。このスクリプトの真の価値は、「これまで手動で検証を躊躇していた境界条件を、プログラムが数秒で洗い出してくれる」という点にある。

人間は思考し、機械は反復する。その分業を明確にせよ。君たちのコードが、明日からの設計現場を少しでも「エンジニアらしい創造的な場所」に変えることを願っている。

質問があればいつでもコメントしてほしい。更なる高みを目指すなら、次は「合致エラーを捕捉して自動的にサプレッションを解除する」ロジックの構築に挑戦してみるといい。

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