機構設計の「破綻」を未然に防ぐ:SolidWorks合致自動制御によるストローク検証の極意
設計現場で「マウスで合致を動かして干渉を確認する」作業に時間を溶かしてはいないだろうか。特に、複雑なリンク機構や高精度のストロークを持つアセンブリにおいて、手動の検証はヒューマンエラーの温床だ。
今日は、SolidWorks APIを駆使して、距離・角度合致をプログラム制御し、ストローク全域を自動スキャンして「破綻」を記録する検証自動化ツールの設計思想を伝授する。これは単なるコードの提供ではない。君たちが明日から「手戻りゼロ」の設計者になるための技術的指針だ。
—
1. なぜ「手動」ではいけないのか?
アセンブリの検証において、最も恐ろしいのは「設計者が無意識のうちに特定の姿勢だけで干渉を避けている」ことだ。プログラムによる自動スキャンには以下の3つの圧倒的なアドバンテージがある。
1. 網羅性: ステップ幅を0.1mm単位で制御すれば、手動では見逃す微小な干渉も検知できる。
2. 再現性: 誰がやっても同じ条件で検証できるため、評価基準がブレない。
3. 資産化: 検証ログとスクショを自動保存することで、設計根拠としてそのまま報告書に添付できる。
—
2. 堅牢な設計のためのアーキテクチャ
VBAでアセンブリを動かす際、初心者が陥る罠が「再構築(Rebuild)のタイミング」だ。APIを叩いた直後に即座に状態が更新されるとは限らない。
- 鉄則1:`swApp.DocumentManager`に頼るな。操作は常にアクティブな`ModelDoc2`オブジェクトを介して行い、処理の区切りで必ず`ForceRebuild3`を実行せよ。
- 鉄則2:イベント待ちの工夫。大規模アセンブリでは再構築に時間がかかる。`DoEvents`を挟みつつ、SolidWorksの計算が終わるのを待つロジックが必要だ。
- 鉄則3:合致の特定は「名前」で行うな。手作業で変更される可能性のある「合致名」に依存してはいけない。Featureのタイプや、参照しているコンポーネントのGUID(または名前)から動的に特定せよ。
—
3. 実装:ストローク検証自動化エンジン
以下は、距離合致をステップ移動させ、各位置で画面キャプチャを保存するプロダクションレベルのコードだ。
‘ SolidWorks APIを使用したストローク検証自動化スクリプト
Option Explicit
Sub RunStrokeVerification()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swMate As SldWorks.Feature
Dim swDistMate As SldWorks.DistanceMateFeatureData
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swAssy = swModel
‘ 合致の取得(事前にFeature名を特定しておく、またはSelectByID等で取得)
Set swMate = swModel.FeatureByName(“距離合致1”)
Set swDistMate = swMate.GetDefinition
Dim startVal As Double: startVal = 0.00 ‘ ストローク開始
Dim endVal As Double: endVal = 0.05 ‘ ストローク終了
Dim stepVal As Double: stepVal = 0.005 ‘ ステップ刻み
Dim currentVal As Double
For currentVal = startVal To endVal Step stepVal
‘ 1. 合致値の更新
swDistMate.Distance = currentVal
swMate.ModifyDefinition swDistMate, swModel, Nothing
‘ 2. 強制再構築(重要:これをしないと表示が更新されない)
swModel.ForceRebuild3 False
‘ 3. スクリーンショット保存
Dim filePath As String
filePath = “C:\Temp\Verification_” & Format(currentVal 1000, “000”) & “mm.jpg”
swModel.Extension.SaveAs filePath, swSaveAsVersion_e.swSaveAsCurrentVersion, _
swSaveAsOptions_e.swSaveAsOptions_Silent, Nothing, 0, 0
‘ 4. OSへの制御権譲渡(フリーズ防止)
DoEvents
Next currentVal
MsgBox “検証完了:ストローク全域の記録が終了しました。”
End Sub
—
4. 現場で生き残るための「保守性」の極意
このスクリプトを単なる「使い捨て」にしないための設計思想を共有する。
- データベース連携を想定せよ:
コード内に数値をハードコーディングしてはならない。検証条件(ストローク幅やステップ数)は外部のCSVやExcelシートから読み込む設計にすべきだ。これにより、検証対象が変わるたびにコードを書き換える不毛な作業から解放される。
- エラーハンドリングの徹底:
`On Error Resume Next`で誤魔化すのは三流だ。`swMate`が取得できなかった場合、`swModel`がアセンブリではない場合に、即座にユーザーへアラートを出す「ガード節」を書くことが、開発者としての矜持である。
- キャプチャの自動整理:
単にファイルを吐き出すだけでなく、実行日時とアセンブリのリビジョンを含めたフォルダを自動作成するルーチンを追加せよ。これが後の「品質保証」の要となる。
最後に
諸君、エンジニアの価値は「どれだけ速く書けるか」ではなく、「どれだけ手戻りを減らす仕組みを構築できるか」にある。このコードをベースに、自社の製品の特性に合わせた「最強の検証ツール」を組み上げてほしい。
もし、さらに高度な「干渉チェックAPI(`swModel.Extension.GetInterferences`)」と組み合わせたいという欲求が湧いてきたら、その時はまた相談してくれ。次なるステージへと導こう。
