【実務・中級編】【数式・グローバル変数】EquationMgr.SetEquationによるパーツ間寸法リンクの動的書き換えと再構築の自動トリガー – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBAを掌握する極限の知見】数式マネージャーの完全掌握:`EquationMgr.SetEquation`によるパーツ間寸法リンクの動的書き換えと再構築制御

SolidWorksのマクロ開発において、最も避けて通れない、そして最も「沼」にハマりやすい領域の一つが数式(Equation)とグローバル変数の動的操作だ。

Excel設計表や外部データベースからパラメータを読み込み、パーツの寸法を瞬時に書き換えて自動生成する――。
一見、簡単そうに見えるこの要件だが、安易に `EquationMgr` を叩くだけでは、「数式構文エラー」「再構築(Rebuild)のタイミングズレ」「モデルの破綻(トポロジーの崩壊)」という三重大罪によって、あなたの開発したツールは必ず爆発する。

今回は、数式マネージャーのライフサイクルとAPIの挙動を完全に制御し、実務の現場で「一発で確実に動く」堅牢なプロダクションコードの設計思想を伝授する。

1. なぜ「力技の寸法変更」では破綻するのか?

実務でよく見かけるアンチパターンが、スケッチの寸法やフィーチャーの寸法値(`Dimension.SystemValue`)を直接VBAからゴリゴリ書き換える手法だ。

‘ 【悪夢のアンチパターン】直接数値を叩く手法
Dim swDim As SldWorks.Dimension
Set swDim = swModel.Parameter(“D1@sketch1”)
swDim.SystemValue = 0.05 ‘ ミリメートル指定のつもりがメートル単位で狂う

このアプローチが実務で破綻する理由は明確だ。
1. 単位系の罠: APIの内部値は常にSI単位(メートル・ラジアン)。ミリメートル単位の感覚で値を代入すると、モデルがミクロサイズか宇宙サイズになる。
2. コンフィギュレーションの迷子: どのコンフィギュレーションの寸法を指しているのかが曖昧になり、意図しない設定値が書き換わる。
3. 設計意図の喪失: 「板厚 = 基準幅 / 10」といった数式的なリレーションシップ(設計意図)がコード上に表現できず、ハードコーディングの塊と化す。

これを解決するのが、`EquationMgr`(数式マネージャー)を通じた数式・グローバル変数の動的インジェクションである。

2. `EquationMgr` 制御の3大鉄則

SolidWorksの `EquationMgr`(`IMathUtility` ではない、パーツやアセンブリが持つ `GetEquationMgr` の方だ)を扱う際、プロフェッショナルとして守るべき絶対のルールが3つある。

鉄則①:インデックスの変動に依存するな

数式マネージャー内の数式は、配列のインデックス(0, 1, 2…)で管理されているが、ユーザーが手動で数式を追加・削除すると、インデックスは平気で変動する。
数式を操作する際は、必ず「数式文字列全体を走査して目的のグローバル変数名や寸法名が含まれているか」を判定し、存在すればそのインデックスに対して操作を行うか、`Add` / `SetEquation` を適切に使い分ける必要がある。

鉄則②:数式構文の厳密性

SolidWorksの数式パーサーは非常にシビアだ。

  • 文字列としてのダブルクォーテーションの扱い
  • 単位の記述(例: `”10mm”`, `”15deg”`)
  • 参照する寸法名やグローバル変数の正確性(例: `”D1@スケッチ1″`)

これらが欠けていると、APIは容赦なくエラーを返す。

鉄則③:自動再構築(Auto-Rebuild)の封殺と明示的実行

数式を1行書き換えるたびにSolidWorksが勝手に再構築(Rebuild)走るのを許してはならない。巨大なアセンブリや複雑なパーツであれば、処理が重すぎてマクロがフリーズするか、中間状態でエラーを起こす。
数式マネージャーの自動再構築を無効化し、すべての数式を流し込んだ「最後」に、一括して強制再構築をかけるのが鉄則だ。

3. 【プロダクションコード】安全・確実な数式インジェクション実装

以下に、外部から受け取ったパラメータ(今回は簡単のためDictionaryや配列を想定)をパーツの数式マネージャーに流し込み、確実に再構築を完了させる実用的なVBAコードを提供する。

Option Explicit

‘ ==============================================================================
‘ 処理名 : UpdateGlobalVariablesAndEquations
‘ 概要 : 外部からのパラメータに基づき、SolidWorksパーツの数式・グローバル変数を
‘ 安全に動的書き換えし、モデルを完全再構築する。
‘ ==============================================================================
Public Sub ExecuteParameterInjection()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swEqMgr As SldWorks.EquationMgr

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

‘ 1. ドキュメントの存在・タイプチェック
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType() <> swDocPART Then
MsgBox “このマクロはパーツファイルでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If

‘ 2. 数式マネージャーの取得
Set swEqMgr = swModel.GetEquationMgr
If swEqMgr Is Nothing Then
MsgBox “数式マネージャーを取得できませんでした。”, vbCritical, “エラー”
Exit Sub
End If

‘ 【重要】自動再構築を一時停止(パフォーマンス最適化とエラー防止)
Dim originalAutoRebuild As Boolean
originalAutoRebuild = swEqMgr.AutomaticRebuild
swEqMgr.AutomaticRebuild = False

On Error GoTo ErrorHandler

‘ 3. 更新・追加する数式(グローバル変数)の定義
‘ 実務ではここでExcelのセルやDBから値を動的に取得する
Dim paramList(1 To 3) As Variant
paramList(1) = “”\”PlateThickness\” = 12.5mm””
paramList(2) = “”\”PocketDepth\” = “”PlateThickness”” / 2″”
paramList(3) = “”\”HoleDiameter\” = 8mm””

Dim i As Long
For i = LBound(paramList) To UBound(paramList)
Call UpsertEquation(swEqMgr, CStr(paramList(i)))
Next i

‘ 4. 自動再構築設定を戻し、モデルを強制再構築
swEqMgr.AutomaticRebuild = originalAutoRebuild

‘ ジオメトリの整合性を保つための完全再構築 (ForceRebuild3)
Dim boolstatus As Boolean
boolstatus = swModel.ForceRebuild3(False)

If boolstatus Then
MsgBox “数式の更新とモデルの再構築が正常に完了しました。”, vbInformation, “完了”
Else
MsgBox “再構築中に警告またはエラーが発生しました。モデルを確認してください。”, vbExclamation, “警告”
End If

Exit Sub

ErrorHandler:
‘ 異常終了時も必ず自動再構築フラグを復元する
swEqMgr.AutomaticRebuild = originalAutoRebuild
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub

‘ ==============================================================================
‘ 補助関数 : 指定された数式(グローバル変数名等)が存在すれば上書き、
‘ 存在しなければ新規追加を行うロジック
‘ ==============================================================================
Private Sub UpsertEquation(ByRef eqMgr As SldWorks.EquationMgr, ByVal targetEquation As String)
Dim eqName As String
eqName = ExtractEquationName(targetEquation)

If eqName = “” Then Exit Sub

Dim count As Long
count = eqMgr.GetCount()

Dim foundIndex As Long
foundIndex = -1

Dim i As Long
For i = 0 To count – 1
Dim currentEq As String
currentEq = eqMgr.Equation(i)

‘ 既存の数式名が含まれているかチェック
If InStr(1, currentEq, eqName, vbTextCompare) > 0 Then
foundIndex = i
Exit For
End If
Next i

Dim res As Long
If foundIndex >= 0 Then
‘ 既存の数式を更新
res = eqMgr.SetEquation(foundIndex, targetEquation)
If res <> 0 Then
Debug.Print “数式の更新に失敗しました (Index: ” & foundIndex & “): ” & targetEquation
End If
Else
‘ 新規追加
res = eqMgr.Add(count, targetEquation)
If res <> 0 Then
Debug.Print “数式の追加に失敗しました: ” & targetEquation
End If
End If
End Sub

‘ ==============================================================================
‘ 補助関数 : ” “”VariableName”” = 10mm ” のような文字列から変数名/寸法名を抽出する
‘ ==============================================================================
Private Function ExtractEquationName(ByVal equationStr As String) As String
Dim eqClean As String
eqClean = Replace(equationStr, “”””, “”) ‘ ダブルクォーテーション除去

Dim parts() As String
parts = Split(eqClean, “=”)

If UBound(parts) >= 0 Then
ExtractEquationName = Trim(parts(0))
Else
ExtractEquationName = “”
End If
End Function

4. チーフアーキテクトが教える、現場で生き残るための実装ティップス

1. エラーハンドリングの徹底:
上記のコードの通り、`On Error` を使った場合でも、例外発生時に `AutomaticRebuild` フラグが `False` のまま取り残されないよう、必ずクリーンアップ経路(ErrorHandler)を確保すること。これが抜けると、ユーザーが手動で数式を入力した際にも再構築が走らなくなり、ヘルプデスクに駆け込まれることになる。
2. ダブルクォーテーションのエスケープ:
SolidWorksのAPIに渡す数式文字列は、内部で `” “VariableName” = 10mm “` のように、変数名や式の一部をダブルクォーテーションで囲む必要がある(特にスペースが含まれる場合)。VBAのコード上でこれを記述する際は、エスケープ表現に細心の注意を払うこと。
3. 外部DB・Excel連携時のトランザクション的思考:
複数のパラメータを流し込む際、途中で構文エラー(例えば存在しない寸法名を参照した等)が起きると、モデルが半端な状態で固まる。外部からの入力データは、APIに流し込む前にあらかじめ妥当性検証(バリデーション)を行うのが、プロのエンジニアの作法である。

総括

SolidWorks VBAにおける数式マネージャーの操作は、単なる「値の代入」ではない。「CADモデルの設計意図(Design Intent)を外部システムからプログラムによって再定義する」という極めて高度なエンジニアリング行為だ。

今回紹介した設計パターンをあなたのプロジェクトに組み込むことで、手作業による入力ミスを根絶し、秒速でバリエーションモデルを生成する真の自動化基盤が完成する。
泥臭いコードから脱却し、ロジカルで堅牢なSolidWorksアーキテクチャを構築してほしい。

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