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

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押して出てきたコードを眺めるだけの階段は、もう登り終えましたね。ここからは、SolidWorksの心臓部である「API」を直接叩き、数千行の設計変更をも一瞬で終わらせる「本物の自動化エンジニア」への扉を開きます。

今回は、実務で最も要望が多く、かつ多くのエンジニアが「なぜか再構築が追いつかない」「数式エラーで固まる」と悶絶するテーマ、【数式・グローバル変数】`EquationMgr.SetEquation`によるパーツ間寸法リンクの動的書き換えと再構築の自動トリガーについて、魂を込めて解説します。

ここをクリアすれば、あなたもSolidWorks VBAの裏の仕組みを完全に掌握したと言えます。さあ、一緒に深淵を覗いてみましょう!

1. なぜ「数式マネージャーの動的書き換え」で現場はつまずくのか?

エクセルに入力された寸法やパラメータを読み込み、SolidWorksのパーツへ流し込む――。
一見、簡単そうに見えますよね。しかし、素朴なVBAコードを書いただけだと、こんな現象に直面したことはありませんか?

  • 「数式は書き換わったのに、グラフィックスの形が変わらない!」
  • 「エラー:数式に構文エラーがあります、でマクロが強制終了する」
  • 「アセンブリや外部パーツを参照している寸法リンクが外れて参照切れを起こす」

これらはすべて、SolidWorksの「オブジェクトのライフサイクル」と「再構築(Rebuild)のタイミング」をコントロールできていないことが原因です。

SolidWorksのAPIにおいて、`EquationMgr`(数式マネージャー)は非常に強力ですが、「書き換えただけではモデルのジオメトリを即座に再計算しない」という厳然たるルールがあります。この裏の仕組みを知る者だけが、一発で完璧にモデルを連動制御できるのです。

2. 基礎知識:EquationMgrと再構築のメカニズム

数式マネージャーをVBAから操作する際、私たちは以下の3つのステップを踏む必要があります。

1. アクティブなドキュメントから「EquationMgr(数式マネージャー)」のインターフェースを取得する
2. `SetEquation`メソッドを使って、インデックスまたは数式文字列を指定して書き換える
3. 強制的に再構築(`ForceRebuild3`)のシグナルを送り、ジオメトリを最新化する

特に重要なのが3番目です。ここを手抜きすると、画面上の見た目と内部データが乖離し、次に手動で触ったときにモデルが盛大に爆発(破綻)します。

3. 実践!パーツ寸法を動的に書き換えるプロフェッショナル・コード

それでは、エクセルや外部データから受け取った数式(あるいは寸法値)を安全にインジェクトし、確実に再構築を走らせる実用的なVBAコードを公開します。

ご自身の開発環境(VBAエディタ)にそのまま貼り付け、パーツを開いた状態で実行してみてください。

Option Explicit

Sub UpdatePartEquationAndRebuild()
‘ — 1. オブジェクトの宣言 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swEqMgr As SldWorks.EquationMgr
Dim longStatus As Long
Dim eqIndex As Long

‘ — 2. Ứプリケーションとアクティブドキュメントの取得 —
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ ドキュメントが開かれているか、それがパーツファイルかチェック
If swModel Is Nothing Then
MsgBox “SolidWorksのパーツファイルを開いてから実行してください。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイル専用です。”, vbExclamation, “対象外”
Exit Sub
End If

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

‘ — 4. 既存の数式を検索または追加・書き換え —
‘ ※注意: SolidWorksの数式インデックスは 0 から始まります。「”D1@ボス-押出し1″ = 50mm」のような形式です。
‘ ここでは例として、インデックス 0 の数式を動的に書き換えます。

eqIndex = 0 ‘ 書き換えたい数式の行番号(0始まり)

‘ 念のため、現在の数式総数を超えていないか確認
If eqIndex >= swEqMgr.GetCount Then
MsgBox “指定されたインデックスの数式が存在しません。”, vbExclamation, “範囲外エラー”
Exit Sub
End If

‘ 書き込む数式文字列の定義(例: グローバル変数や寸法値のバインド)
‘ ※SolidWorksの数式構文に従う必要があります(例: “D1@Boss-Extrude1” = 120 )
Dim targetEquation As String
targetEquation = “””D1@ボス-押出し1″” = 150″ ‘ ダブルクォーテーションのエスケープに注意!

‘ エラーハンドリングを挟みつつ数式をセット
On Error GoTo ErrorHandler

‘ SetEquationの引数: (インデックス, 数式文字列)
‘ 戻り値が 0 以外の場合は何らかの構文エラーや失敗を示します
Dim setResult As Long
setResult = swEqMgr.SetEquation(eqIndex, targetEquation)

If setResult <> 0 Then
MsgBox “数式の構文または設定に失敗しました。エラーコード: ” & setResult, vbCritical, “数式エラー”
Exit Sub
End If

‘ — 5. 最重要:モデルの強制再構築(ForceRebuild) —
‘ ここをサボると形状が変わりません!
‘ True を指定することで、フィーチャーツリー全体をトップダウンで完全に再計算させます。
longStatus = swModel.ForceRebuild3(True)

‘ 画面を最新の状態に更新
swModel.GraphicsRedraw2

MsgBox “数式の書き換えとモデルの再構築が正常に完了しました!”, vbInformation, “成功”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
End Sub

4. コードの深掘りポイント(エンジニアの知見)

このコードには、現場で生き残るための「こだわり」がいくつか詰まっています。

① 文字列内のダブルクォーテーション(`””`)の罠

VBAの文字列リテラルの中でSolidWorksの寸法名(例: `”D1@ボス-押出し1″`)を指定する場合、ダブルクォーテーションを重ねて`””`と表現する必要があります。ここを間違えると、APIに渡る手前でVBAのコンパイルエラーになります。外部のCSVやエクセルから数式を読み込む場合は、このエスケープ処理を意識する必要がないため、さらにスマートに記述できます。

② `ForceRebuild3(True)` の圧倒的な重み

通常の `EditRebuild` や `ForceRebuild` ではなく、なぜ `ForceRebuild3(True)` なのか?
パーツ内の依存関係(親子関係)が複雑に入り組んだモデルの場合、通常の再構築では「変更されていない」とSolidWorksが勝手に判断し、寸法が連動しないキャッシュポルターガイスト現象が起きます。引数に `True` を渡すことで、「すべてのキャッシュを破棄し、末端のジオメトリまで強制的に強制再計算(フルリビルド)しろ」という絶対命令をAPIに下すことができます。これがプロの選択です。

5. よくあるエラーと対策(トラブルシューティング)

  • エラー: `SetEquation` が 0 以外の値を返す
  • 原因: 指定した寸法名(例: `D1@ボス-押出し1`)がパーツ内に実在しない、または日本語名と内部名が一致していません。
  • 対策: 一度手動で数式マネージャーを開き、正しい寸法名(FeatureIDとDimension名)を確認してください。
  • 数式は変わるのに、図面ビューやアセンブリが更新されない
  • 原因: パーツ単体は再構築されましたが、それを参照している親アセンブリや図面側で「外部参照の更新」がトリガーされていません。
  • 対策: アセンブリ側からこのマクロを叩く、あるいはアセンブリ全体の再構築(`swAssembly.ForceRebuild3`)をチェーンさせる設計にする必要があります。

6. おわりに:ここをクリアすれば、基本はバッチリ!

お疲れ様でした!
パーツファイルの数式をプログラムから意のままに操り、確実にモデルを再構築させる一連の流れ、いかがでしたでしょうか。

「マクロの記録」では絶対にたどり着けない、APIのライフサイクルと再構築の制御。ここをマスターしたあなたなら、エクセル設計表と完全連動した「完全自動・一品一様設計システム」の構築も、もう夢ではありません。

明日からの設計自動化ライフを、ぜひ楽しんでください。それでは、次のステージでお会いしましょう!

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