SolidWorks自動化の真髄:EquationMgrによる「動的設計」の完全掌握
SolidWorksでの設計自動化において、最も強力かつ「取り扱いが難しい」機能の一つが数式(Equation Manager)だ。多くのエンジニアが手動での数式管理に限界を感じ、VBAでの自動化を志す。しかし、公式ドキュメントをなぞるだけでは、大規模なアセンブリや複雑なパーツで必ず「再構築エラー」と「追跡不能なデッドロック」に直面することになる。
本稿では、`IEquationMgr`を使いこなし、堅牢で保守性の高い「動的パラメータ設計」を実装するための極意を伝授する。
—
1. なぜ「直接操作」は危険なのか
`ModelDocExtension.GetEquationMgr`を通じて数式を書き換える際、単に文字列を入れ替えるだけのコードを書く者がいるが、それは自殺行為だ。
- インデックスの変動: 数式の順序はUI上の並び順に依存する。行番号で直接指定するのはバグの温床だ。
- 再構築のタイミング: 数式書き換え直後に`ForceRebuild3`を叩き忘れると、メモリ上の整合性とグラフィックスが乖離する。
- 構文チェックの欠如: 不正な文字列を代入した際のエラーハンドリングがなければ、ツールは即座にクラッシュする。
「常に名前(Global Variable)で参照し、検証プロセスを挟む」。これがプロの設計だ。
—
2. プロダクションコード:堅牢な数式更新ルーチン
以下のコードは、指定したグローバル変数の値を安全に更新し、モデルを再構築する実用的なモジュールである。
Option Explicit
‘ グローバル変数の値を安全に更新する関数
Public Sub UpdateGlobalVariable(ByVal swModel As ModelDoc2, ByVal varName As String, ByVal newValue As Double)
Dim swEqMgr As IEquationMgr
Dim i As Long
Dim found As Boolean
Set swEqMgr = swModel.Extension.GetEquationMgr
‘ インデックスではなく名前で検索する(保守性の確保)
For i = 0 To swEqMgr.Count – 1
‘ 数式名(”var@model”形式)から変数名部分を抽出して比較
If InStr(swEqMgr.Equation(i), varName & ” =”) > 0 Then
‘ 数式を更新(単位系に注意:ここではメートル法を想定)
swEqMgr.Equation(i) = “”” ” & varName & ” “” = ” & newValue & “mm”
found = True
Exit For
End If
Next i
If Not found Then
Err.Raise vbObjectError + 1001, “UpdateGlobalVariable”, “変数 ‘” & varName & “‘ が見つかりませんでした。”
End If
‘ モデルの再構築を強制(最も重要なステップ)
swModel.ForceRebuild3 False
Debug.Print “Update Success: ” & varName & ” -> ” & newValue
End Sub
—
3. 堅牢性を高めるための「3つの鉄則」
① 単位系の明示(Units Matter)
SolidWorksのAPIは内部的にメートル単位で処理されることが多いが、数式マネージャに文字列を渡す際は必ず `mm` や `deg` などの単位を付与せよ。これを怠ると、ドキュメントのテンプレート設定に依存した誤計算を招く。
② 再構築の階層管理
`ForceRebuild3`は強力だが、アセンブリ全体に影響を与えるため、計算コストが高い。もしパーツ単体で閉じた設計であれば、`EditRebuild3`を使用し、不要な全再構築を避ける設計を心がけるべきだ。
③ データベースとの疎結合
Excelや外部DBから値を読み込む際は、必ず「バリデーション関数」を通すこと。
- 負の値が入力されていないか?
- 極端な数値(ゼロ除算を誘発するもの)ではないか?
これらをVBA側でフィルタリングしてから`UpdateGlobalVariable`に渡すのが、システム全体の生存率を高める。
—
4. アーキテクトからの助言:次に進むべき道
この手法をマスターすると、次にぶつかる壁は「モデルの形状破綻(フィーチャ失敗)」だ。数式で寸法を極端に変更すると、スケッチが自己交差したり、面が消失したりする。
この問題を解決するには、`IModelDoc2::CheckForRebuildErrors` を用いて、更新後にエラーが発生していないかを監視するモニタリングロジックを実装する必要がある。
「自動化とは、ただ動くコードを書くことではない。失敗するリスクを予見し、あらかじめガードレールを敷いておくことだ。」
このコードをベースに、君の設計現場で「数式による自動生成」を極めてほしい。質問があればいつでも歓迎する。ただし、基本に忠実かつ、メモリのライフサイクルを意識した実装を忘れるな。
