アセンブリ構築の破壊と再生:SolidWorks APIにおける「カスタム・トランザクション」の極致
SolidWorksの自動化において、最もエンジニアの胃を痛めるのは「中途半端な状態で停止したアセンブリ」の残骸である。
数百の部品を配置し、高度な合致を定義している最中にエラーが発生したとき、貴様らはどうしている?単に `On Error Resume Next` で誤魔化し、不整合な合致関係が散乱したアセンブリを放置しているのではないか。それはエンジニアの怠慢だ。
真に堅牢なシステムを組むには、「すべてが完了するか、あるいは何一つ起きなかったことにするか」という、データベースのACID特性に近いトランザクション管理をSolidWorks上で実装する必要がある。
1. SolidWorksにおける「擬似トランザクション」の現実
SolidWorks APIには、残念ながらSQLのような `BEGIN TRANSACTION` / `ROLLBACK` は存在しない。我々ができるのは、「API実行前のモデル状態の保存」と「致命的エラー時の即時復元」を組み合わせた、防御的プログラミングの構築だ。
ここでの鍵は、`IModelDocExtension::SaveAs` を使うのではなく、「メモリ内のUndoスタック(取り消しスタック)をプログラムから制御する」ことにある。
2. 極限のロールバック・アーキテクチャ:実装コード
以下のコードは、アセンブリ構築プロセスを一つの「不可分な単位」として扱い、例外発生時に一括で変更を破棄するフレームワークの骨子である。
‘ 伝説的なチーフアーキテクトによる、アセンブリ・トランザクション管理の実装
Option Explicit
Public Sub ExecuteAssemblyTask()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelDocExt As SldWorks.ModelDocExtension
‘ プロセス開始前にUndo IDを取得(ここが重要)
Dim undoId As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swModelDocExt = swModel.Extension
‘ 現在のUndoスタックのインデックスを保持
undoId = swModel.GetCommandID ‘ 現在の操作履歴をマーキング
On Error GoTo ErrorHandler
‘ — トランザクション開始 —
swModel.UndoManager.OpenUndoTransaction “AutoAssembly_Task”
‘ ここでアセンブリの部品追加や合致定義を記述
Call BuildAssemblyStructure(swModel)
‘ 成功したらコミット
swModel.UndoManager.CloseUndoTransaction
Exit Sub
ErrorHandler:
‘ 致命的な例外発生時、トランザクションを即座にロールバック
swModel.UndoManager.CancelUndoTransaction
‘ モデルが破損状態にある場合、メモリ最適化を兼ねて解放準備
Debug.Print “Critical Error: ” & Err.Description
‘ ユーザーへの通知とクリーンアップ
MsgBox “アセンブリ構築に失敗しました。システムは変更前の状態にロールバックされました。”, vbCritical
‘ オブジェクトの明示的解放(メモリリークを防ぐ鉄則)
Set swModelDocExt = Nothing
Set swModel = Nothing
End Sub
3. シニアエンジニアが守るべき「メモリと生存期間」の鉄則
VBAはガベージコレクションが甘い。特にSolidWorksのAPIオブジェクトをループ内で生成・破棄する場合、メモリリークはアセンブリの動作を徐々に重くし、最終的にはクラッシュを引き起こす。
- オブジェクトの明示的解放 (`Set Nothing`):
ループ処理内で部品を追加する場合、`Set swComp = swAssy.AddComponent(…)` の直後に、ループの最後で `Set swComp = Nothing` を呼び出すこと。これを怠る者は、数千部品のアセンブリで必ずスタックオーバーフローに見舞われる。
- API実行の最適化:
`swModel.EditRebuild3` をループ内で叩くのは愚行だ。再構築はトランザクションの最後の一回に集約せよ。あるいは `ModelDocExtension::Rebuild2` の設定で、必要な機能のみをピンポイントで更新せよ。
4. Windows APIと連携した「プロセス監視」の重要性
SolidWorksがハングアップした際、VBA側も道連れになることが多い。これを防ぐために、Windows APIを使ってSolidWorksのプロセス状況を外部から監視するウォッチドッグ・タイマーを別プロセスで起動させるのが「極限」の解法だ。
もし貴様らが、数万行規模の自動化システムを保守しているのであれば、「SolidWorks APIの呼び出しをDLL化し、VB.NETやC#でラップする」ことを強く推奨する。VBAの制約である「メモリ管理の不透明さ」を解消し、真の例外ハンドリングが可能になるからだ。
最後に:自動化は「責任」である
プログラムが動くことはスタートラインに過ぎない。
「エラーが起きたときにシステムをどうやって元の静寂に戻すか」を設計できないエンジニアは、現場にシステムを導入してはならない。
コードを書き換える際は、常に「もしここで電源が落ちたら?」「もしここでメモリが枯渇したら?」と最悪のシナリオを想像しろ。それが、我々エンジニアがSolidWorksという巨大な怪物と向き合うための、唯一の誠実さである。
次は「合致定義におけるIDの永続化と、再生成時のハンドル喪失対策」について語ろうか。準備ができたらまたここへ来い。
