【実務・中級編】【数式・グローバル変数】EquationMgr.DeleteEquationを用いた不要なパーツ内数式の動的クリーンアップと最適化 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限解説】EquationMgr.DeleteEquationの罠を断つ!不要数式・グローバル変数の動的クリーンアップとモデル防衛術

こんにちは。チーフアーキテクトの私だ。
これまで数々の大規模設計自動化プロジェクトを統括してきたが、現場から最も多く寄せられる悲鳴の一つがこれだ。

「設計変更のたびに、古い数式やグローバル変数がゴミとして残り、突然の再構築エラー(Rebuild Error)でCADが沈黙する」

パーツファイルをプログラムで動的に生成・改変する際、フィーチャを削除しても、それに紐づいていた数式(Equation)やグローバル変数がゾンビのように残存する現象に直面したことはないだろうか?

今回は、SolidWorks APIの心臓部である `EquationMgr` (数式マネージャー)、特にその削除メソッドである `DeleteEquation` の致命的なトラップを完全回避し、実務の現場で絶対に破綻しない「動的クリーンアップと最適化」の極意を授けよう。

1. なぜ「インデックスのズレ」でマクロは崩壊するのか?

まず、SolidWorksの数式管理の仕様を直視してほしい。
`IEquationMgr` における数式やグローバル変数の管理は、データベースの主キーのようなユニークなIDではなく、単なる配列のインデックス(0始まりの通し番号)で行われている。

ここに、開発者が陥る最大の罠がある。

❌ やってはいけない実装:前から順番に消すループ

‘ 【絶対にいけないアンチパターン】
Dim i As Long
For i = 0 To eqMgr.GetCount – 1
If IsTarget(eqMgr.Equation(i)) Then
eqMgr.DeleteEquation i ‘ <-- これをやるとインデックスが狂い、配列外参照や意図しない数式が消える! End If Next i 配列の要素を削除した瞬間、後ろにあったすべての要素のインデックスが「1つずつ前方に詰まる」。 この仕様を無視して前方からループを回すと、削除スキップが発生するか、最悪の場合は意図しない重要寸法を破壊し、モデルが完全に崩壊する。

2. 堅牢なクリーンアップのための2大鉄則

プロダクション環境(現場の設計者が毎日使うツール)において、数式クリーンアップロジックを実装する際は、以下の2点を絶対に遵守せよ。

1. 「逆順ループ(降順)」の徹底
配列やコレクションの要素を削除する場合は、常に末尾(`GetCount – 1`)から先頭(`0`)に向かってデクリメント(`i = i – 1`)させながらループを回す。これにより、未処理の要素のインデックス番号が変動するのを防げる。
2. プレフィックスやキーワードによる厳密なフィルタリング
「不要なものすべて」を消すのではなく、自動生成プロセスで付与した特定のプレフィックス(例: `”Auto_”` や `”Temp_”`)を持つもの、あるいは特定の文字列を含むものだけを安全にターゲットとして特定する。

3. 【コピペ即実戦投入可】安全・確実な数式一括クリーンアップ・エンジン

それでは、実務でそのまま使えるプロダクションコードを公開しよう。
このコードは、アクティブなパーツドキュメントから、指定したキーワードを含むグローバル変数・数式を安全に逆順検索し、完全にクリーンアップした上で、モデルの再構築を強制実行する優れものだ。

Option Explicit

‘ ==============================================================================
‘ 担当者向け: 不要な数式・グローバル変数を安全に動的削除するプロフェッショナル関数
‘ ==============================================================================
Sub ExecuteEquationCleanup()
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 And swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロはパーツまたはアセンブリでのみ実行可能です。”, vbExclamation, “対象外”
Exit Sub
End If

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

Dim totalCount As Long
totalCount = swEqMgr.GetCount

If totalCount = 0 Then
MsgBox “削除対象の数式・グローバル変数は登録されていません。”, vbInformation, “情報”
Exit Sub
End If

‘ 3. 削除対象を識別するためのキーワード(必要に応じて変更してください)
Const TARGET_KEYWORD As String = “Temp_”

Dim deletedCount As Long
deletedCount = 0

‘ 4. 【極意】インデックスズレを防ぐため、必ず「逆順(降順)」でループを回す
Dim i As Long
For i = totalCount – 1 To 0 Step -1
Dim eqString As String
eqString = swEqMgr.Equation(i)

‘ デバッグ用(イミディエイトウィンドウに出力)
‘ Debug.Print “Checking Index ” & i & “: ” & eqString

‘ キーワードが含まれているか判定
If InStr(1, eqString, TARGET_KEYWORD, vbTextCompare) > 0 Then
‘ 削除実行
Dim result As Long
result = swEqMgr.DeleteEquation(i)

If result = 0 Then
deletedCount = deletedCount + 1
Else
Debug.Print “Warning: インデックス ” & i & ” の削除に失敗しました(エラーコード: ” & result & “)”
End If
End If
Next i

‘ 5. モデルの強制再構築(ForceRebuild3)でジオメトリを最新化
If deletedCount > 0 Then
Dim boolstatus As Boolean
boolstatus = swModel.ForceRebuild3(False)

MsgBox “クリーンアップ完了:” & vbCrLf & _
“合計 ” & deletedCount & ” 件の不要な数式/グローバル変数を削除しました。”, _
vbInformation, “最適化成功”
Else
MsgBox “条件に一致する不要な数式は見つかりませんでした。”, vbInformation, “完了”
End If

End Sub

4. チーフアーキテクトからの実務アドバイス:データベース連携時の注意点

外部データベース(ExcelやPDM、社内ニッチな生産管理DBなど)からパラメータを読み込み、SolidWorksの数式を動的に生成・上書きするシステムを構築している現場も多いだろう。

その場合、以下のフローを徹底してほしい。

1. 全消しアプローチの危険性
データベース側で「不要になったから出力しない」としたパラメータが、SolidWorks側ではそのまま残るケースが多々ある。
2. 世代管理と同期
自動生成の冒頭で、一度今回のプロセスで付与するプレフィックスを持つ数式群を上記コードのロジックで一度すべてパージ(全削除)し、その後にデータベースの最新値から数式を再構築(`Add2`)する。
これにより、CADモデル内部に「前回の設計の残骸」が一切残らなくなり、バージョン間のコンフリクトや予期せぬエラーを根絶できる。

最後に

SolidWorks APIプログラミングにおいて、「ただ動くコード」を書くことと、「現場の運用に耐えうる堅牢なコード」を書くことの間には、深い溝がある。
今回解説した `DeleteEquation` の逆順処理とライフサイクル管理は、その溝を埋めるための必須の知見だ。

あなたの開発する自動化ツールが、日々の設計業務から無駄なストレスを排除し、真のエンジニアリングに集中できる環境をもたらすことを期待している。

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