【実務・中級編】【数式・グローバル変数】ModelDocExtension.AddEquationでパーツ内の数式を動的制御する – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks自動化の真髄:`AddEquation`で操る「動的設計」の極意

設計自動化の現場において、最も避けるべきは「固定された寸法」である。
パラメータをハードコーディングしたマクロは、設計変更という名の「荒波」が来た瞬間に瓦解する。真に堅牢な設計システムとは、SolidWorksの数式(Equation)エンジンをVBAから制御し、モデル自体を生き物のように変化させる仕組みのことだ。

今回は、`ModelDocExtension.AddEquation`を核とした、保守性の高い動的モデル制御の極意を伝授する。

1. なぜ「直接操作」ではなく「数式」を介すべきなのか

初心者は`IDimension::SystemValue`に直接値を書き込みたがる。だが、これは禁じ手だ。
数式(Global Variables)を介さない直接的な書き込みは、以下の弊害を生む。

  • 依存関係の断絶: 複数のフィーチャが関連している場合、一箇所を変えるとモデルが崩壊する。
  • 保守性の欠如: 数式マネージャを開いたとき、意図が読み取れない「謎の数値」が並ぶことになる。
  • 設計意図の消失: 何のための寸法なのか、という計算ロジックがコード内に埋もれ、後任者が修正不可能になる。

数式は「設計意図」をSolidWorks側に保存するメタデータである。APIを通じてこれを操作することは、「設計ルールをコードからモデルへ注入する」という行為に他ならない。

2. 【実戦的プロダクションコード】堅牢な数式制御

以下のコードは、単に数式を追加するだけでなく、既存の数式が存在する場合の「上書き更新」までを考慮した、プロダクション(現場)品質のテンプレートだ。

Option Explicit

‘ ————————————————————-
‘ 数式を動的に管理するプロシージャ
‘ @param swModel : SolidWorks.ModelDoc2
‘ @param eqName : 数式の名前(例: “A” または “GlobalVariable”)
‘ @param eqValue : 設定したい値(例: “50mm”)
‘ ————————————————————-
Public Sub UpdateOrAddEquation(ByVal swModel As ModelDoc2, ByVal eqName As String, ByVal eqValue As String)
Dim swEqMgr As IEquationMgr
Dim i As Integer
Dim isFound As Boolean

Set swEqMgr = swModel.GetEquationMgr
isFound = False

‘ 既存の数式を検索し、存在すれば更新する(重複登録を防ぐ)
For i = 0 To swEqMgr.GetCount – 1
‘ 数式名(等号の左側)を判定
If InStr(1, swEqMgr.Equation(i), “””” & eqName & “”””) > 0 Then
swEqMgr.Equation(i) = “””” & eqName & “”” = ” & eqValue
isFound = True
Exit For
End If
Next i

‘ 存在しない場合は新規追加
If Not isFound Then
swEqMgr.Add i, “””” & eqName & “”” = ” & eqValue, False
End If

‘ 重要: 再構築を強制して数式を反映させる
swModel.EditRebuild3
End Sub

開発のポイント

1. 名前の完全修飾: 数式名には必ずダブルクォーテーション `”` を付与すること。API内部で正しくパースさせるための鉄則だ。
2. `EditRebuild3`の重要性: APIで変更を加えただけでは、グラフィックス領域は更新されない。必ず再構築を明示的に呼び出し、モデルの状態を整合させること。
3. エラーハンドリング: 実務では `swModel.GetEquationMgr` が `Nothing` を返す可能性(ドキュメントが正しくアクティブでない等)も考慮し、`If swModel Is Nothing Then Exit Sub` といったガード節を設けるべきだ。

3. データベース連携と「設計定数」の管理

この手法の真骨頂は、ExcelやSQLデータベース、あるいはJSON形式の外部仕様書から値を読み込み、パーツを自動生成できる点にある。

  • データ構造の分離: 設計計算ロジック(VBA)と、製品仕様(JSON/CSV)を完全に分離せよ。
  • 検証のレイヤー: `AddEquation`を叩く前に、入力値が物理的にあり得ない値でないか(例:幅がマイナス、またはゼロ等)を、コードの冒頭でバリデーションすること。

4. 伝説のエンジニアからの忠告

最後に、一つだけ肝に銘じてほしい。「APIで制御する範囲を最小限にせよ」

すべての寸法をマクロで制御しようとすると、マクロが止まった瞬間に設計が凍結する。マクロで制御すべきは「製品のコアとなる主要パラメータ(幅、高さ、厚み、穴径など)」に絞るべきだ。それ以外の細かいフィレットや面取りは、モデル側の数式機能や設計テーブル(Design Table)に任せる。

「プログラムはあくまでルールを流し込むパイプであり、設計の本体はあくまでSolidWorksのモデル内にあるべきだ」

この思想を貫けば、あなたの作る自動化ツールは、プロジェクトが数年続いてもメンテナンスされ続ける、真の「資産」となるだろう。

さあ、コードを書き、設計の自動化を次のフェーズへ引き上げろ。

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