【入門編】【実務中級】距離合致(Distance Mate)のパラメータをインクリメントさせながら機構部品の動作範囲を連続検証する – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks VBAの世界へようこそ。
マクロの記録ボタンを押して、生成された呪文のようなコードを眺めて「うっ……」となった経験はありませんか?

「ボタン一つでアセンブリの可動範囲をぜんぶ検証できたら、設計ミスなんて怖くないのに……」
そんな風に思ったあなたへ。今日は、実務で即戦力になる「距離合致のパラメータをインクリメント(自動加算)させながら、機構部品の動作範囲を連続検証するテクニック」を伝授します。

ここをクリアすれば、単なる「操作の記録係」から、設計プロセスの自動化をデザインする「エンジニア」へと一歩踏み出せますよ。さあ、一緒に本質を噛み砕いていきましょう!

—

1. なぜ「合致のループ操作」で実務が変わるのか?

アセンブリ設計で最も恐ろしい瞬間、それは「実際に動かしてみたら、どこかが干渉してストロークしなかった」という手戻りです。
これを防ぐために、画面の前でマウスをカチカチ言わせて距離合致の数値を「100mm、105mm、110mm……」と変えていませんか?

VBAを使えば、この退屈でヒューマンエラーの起きやすい作業を、わずか数秒のコンピュータ処理に置き換えられます。
しかも、単に動かすだけでなく、背後で干渉チェックや特定の位置でのキャプチャ保存まで繋げられるのが、APIを直接叩くVBAの真骨頂です。

—

2. 攻略の鍵:SolidWorks APIの「親子関係」と「再構築」

コードを書く前に、SolidWorks VBAの機序(メカニズム)における最も重要なルールを一つだけお伝えします。

> 「APIで数値を書き換えただけでは、画面は変わらない。必ず『再構築(Rebuild)』をセットで行え」

人間がプロパティを変更したときは勝手に画面が追随しますが、VBAからAPIで数値を書き換えた場合、SolidWorksの頭の中では「データが変わったけど、まだ図面を再計算してないな」という状態になっています。ここを忘れると、動かない画面を前に頭を抱えることになります。

—

3. 実装コード:機構シミュレーション・マクロ

それでは、実際にアセンブリ内の「距離合致(Distance Mate)」の値を、指定した範囲でパタパタと変化させながら検証する実用コードを公開します。
VBAエディタ(Alt + F11)を開き、標準モジュールに貼り付けてください。

Option Explicit

Sub SimulateDistanceMate()
‘ — 1. 変数の宣言 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssm As SldWorks.AssemblyDoc
Dim swMateFeat As SldWorks.Feature
Dim swMateDim As SldWorks.Dimension

‘ — 2. アプリケーションとドキュメントの取得 —
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 swAssm = swModel

‘ — 3. 操作対象となる「距離合致」のフィーチャー名を取得 —
‘ ※あらかじめFeatureManagerデザインツリー上の合致名を確認し、書き換えてください
Dim targetMateName As String
targetMateName = “距離合致1”

Set swMateFeat = swModel.FeatureByName(targetMateName)
If swMateFeat Is Nothing Then
MsgBox “指定された合致が見つかりません: ” & targetMateName, vbCritical
Exit Sub
End If

‘ — 4. 合致に紐づく「寸法(Dimension)」オブジェクトを取得 —
‘ 距離合致の数値は、フィーチャーの最初の子寸法として保持されています
Set swMateDim = swMateFeat.GetDimension2(0)
If swMateDim Is Nothing Then
MsgBox “合致から寸法を取得できませんでした。距離合致か確認してください。”, vbCritical
Exit Sub
End If

‘ — 5. インクリメントループによる動作検証シミュレーション —
‘ 例:初期値 10mm から 100mm まで、5mm刻みで検証する
Dim startVal As Double
Dim endVal As Double
Dim stepVal As Double
Dim currentVal As Double

startVal = 10.0 ‘ ミリメートル単位
endVal = 100.0
stepVal = 5.0

‘ ステータスバーに進捗を表示するための準備
swApp.SendMsgToUser “機構シミュレーションを開始します。”

For currentVal = startVal To endVal Step stepVal
‘ 寸法値を変更 (APIの単位はメートル法(MKS)なので、mmをmに変換する -> / 1000)
Dim setSuccess As Long
setSuccess = swMateDim.SetSystemValue3(currentVal / 1000#, swSetValue_InThisConfiguration, Empty)

If setSuccess = 0 Then
Debug.Print “値の設定に失敗しました: ” & currentVal & “mm”
End If

‘ 【最重要】アセンブリを再構築して合致関係を更新させる
swModel.EditRebuild3

‘ 人間の目で追えるように、わずかにウェイトを入れる(必要に応じて調整)
DoEvents

‘ ※ここに「干渉チェック (CollisionDetection)」のAPIを挟むと、完全自動検証になります!
Next currentVal

‘ — 6. 終了処理 —
swApp.SendMsgToUser “シミュレーションが正常に完了しました。”

End Sub

—

4. コードの深掘りと「陥りやすいトラップ」

このコードには、SolidWorks APIを扱う上で知っておくべき「プロの知見」がいくつも詰まっています。

① メートル法(MKS)の呪縛

APIを通じて数値を操作するとき、SolidWorksは内部的に「メートル(m)」を基準として計算しています。
コード内で `currentVal / 1000#` とやっているのはそのためです。これを忘れて `10` と指定すると、一瞬で10メートル(10,000mm)の巨大な世界が爆誕し、モデルが画面の彼方に消え去ります。絶対に気をつけましょう。

② `GetDimension2(0)` の意味

合致フィーチャーが持つパラメータは、内部的に配列として管理されています。距離合致の場合、その移動距離を司る寸法は「インデックス 0(一番最初)」に存在しています。ここを指定することで、ダイレクトに合致のオフセット値を操ることができます。

③ さらに実務を上げるためのヒント(干渉チェックの融合)

上記のコードの `For` ループの中に、SolidWorksの標準機能である「干渉チェック(CollisionDetectionManager)」のAPIを組み込むとどうなるでしょう?
「動かした先で干渉が起きた瞬間、そのときのストローク量をログに出力し、マクロをストップする」という、まさにAI時代を先取りしたような自動検証ツールへと進化させることができます。

—

5. まとめ

いかがでしたでしょうか?
「マクロの記録」では絶対にたどり着けない、変数を操るループ処理とAPIの組み合わせ。
これができるようになると、SolidWorksは単なる3Dモデラーから、あなた専用の「超優秀な検証ロボット」へと姿を変えます。

「ここはどういう仕組みなんだろう?」と疑問に思ったら、ぜひ手を動かして数値を変えたり、エラーを出したりしてみてください。その試行錯誤の数だけ、あなたのVBAスキルは確実に血肉となっていきます。

それでは、快適な自動化ライフを!次回の応用編でお会いしましょう。

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