【実務・中級編】【上級プロ】アセンブリ構築プロセス全体を安全に巻き戻すカスタムトランザクション管理と、例外発生時の自動ロールバック実装 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの「死の淵」から生還せよ:アセンブリ構築におけるカスタム・トランザクション管理の極意

SolidWorks APIを触る多くのエンジニアが陥る罠がある。それは、「コードを走らせ、エラーで止まり、半端に配置された部品が散乱したアセンブリをCtrl+Zで必死に戻す」という不毛な作業だ。

アセンブリの自動構築は、単なる部品の配置ではない。「エンジニアリング・データの整合性維持」という極めて高いハードルを越える必要がある。本記事では、一連の構築プロセスを「不可分な一単位(トランザクション)」として扱い、失敗時には確実に原状回復する、プロフェッショナルのための防御的設計手法を伝授する。

—

1. なぜ「そのまま」書くと死ぬのか?

SolidWorksのAPIは、実行順序に極めて敏感だ。`AddComponent`で部品を投入し、`AddMate`で拘束をかける。この途中で例外が発生すれば、アセンブリ内には「親のない部品」や「エラーを吐いた合致」が残り、ファイルはゴミ屋敷と化す。

我々が目指すべきは、「全か無か(All or Nothing)」の原則だ。
成功すればアセンブリは完成し、失敗すれば「最初から何もなかったこと」にする。これを実現するには、APIの戻り値チェックだけでなく、SolidWorksの「セッション制御」をハックする必要がある。

—

2. 実装のキモ:セッション・スナップショット戦略

最も堅牢な手法は、処理開始直前にアセンブリの「状態」を保持し、例外発生時に`ISldWorks::CloseDoc`で強制クローズ、あるいは「破棄」を行うことだ。

しかし、単純に閉じるだけではパフォーマンスが悪い。ここで紹介するのは、「処理前の変更フラグを管理し、エラー発生時は Undo ではなくドキュメントの再ロード(または破棄)を選択する」という設計だ。

堅牢な自動構築テンプレート(VBA)

Option Explicit

‘ 構築処理のメインエントリー
Public Sub BuildAssemblyRobustly()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim assemblyPath As String

Set swApp = Application.SldWorks
assemblyPath = “C:\Projects\Target.SLDASM”

‘ 1. 安全なドキュメントの初期化
Set swModel = swApp.OpenDoc6(assemblyPath, swDocASSEMBLY, swOpenDocOptions_Silent, “”, 0, 0)

‘ 2. トランザクション開始:Undoログのマーカーを打つ
swModel.Extension.BeginCommandGroup 1, “AssemblyBuild_Transaction”, 0

On Error GoTo ErrorHandler

‘ — ここに構築ロジックを展開 —
Call PerformComplexAssembly(swModel)
‘ —————————-

‘ 正常終了時
swModel.Extension.EndCommandGroup
MsgBox “構築完了”
Exit Sub

ErrorHandler:
‘ 3. エラー時の緊急ロールバック
swModel.Extension.CancelCommandGroup

‘ 重要:半端な状態のファイルを保存せずに破棄する
swApp.CloseDoc swModel.GetTitle

MsgBox “致命的なエラーが発生。変更は破棄されました。” & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical
End Sub

—

3. プロの視点:なぜこの設計が必要なのか

① `BeginCommandGroup` の活用

SolidWorksは `BeginCommandGroup` を使うことで、一連の操作を一つの Undo スタックにまとめることができる。しかし、致命的な例外発生時にはこれが機能しないこともある。そのため、「エラー時はファイルを保存せず閉じる」という物理的な退路を確保するのが、最も低コストで確実なリカバリだ。

② データベース連携の注意点

アセンブリ生成時に外部DB(SQL ServerやExcel等)と連携する場合、「アセンブリの構築」と「DBの更新」を同期させてはならない。

  • 正しい設計:アセンブリ構築が完全に成功したことを確認した後に、DBを更新する。
  • NGな設計:部品を配置するたびにDBを書き換える。

アセンブリ側のAPIでエラーが起きた瞬間、DBだけが更新された状態になる。これを防ぐため、DB更新は必ずプロセスの最終段階、あるいは外部トランザクションとして切り離すべきだ。

—

4. 開発リーダーからの提言:クリーンなコードのために

1. 部品配置は常に「フルパス」で:
カレントディレクトリに依存するコードは、環境移動で必ず壊れる。全てフルパスで管理せよ。
2. 合致の重複を許すな:
`AddMate` の実行前に必ず既存の合致を走査し、再構築時に重複が起きないアルゴリズムを組むこと。
3. インターフェースを分離せよ:
「ファイルを開く」「部品を追加する」「合致を計算する」という関数を分け、それぞれが独立した `Boolean` の成功フラグを返す設計にせよ。

結びに代えて

SolidWorks VBAは、使いこなせば強力な自動化兵器になるが、扱いを誤ればデータ破壊の元凶となる。今回紹介したトランザクション管理は、単なるエラーハンドリングではない。「システムがいつ死んでも、元の美しい状態に戻れる」という安心感こそが、攻めた自動化を可能にする唯一の基盤だ。

さあ、恐れずにコードを書こう。ただし、退路(ロールバック)を確保することだけは忘れるな。

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