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は、使いこなせば強力な自動化兵器になるが、扱いを誤ればデータ破壊の元凶となる。今回紹介したトランザクション管理は、単なるエラーハンドリングではない。「システムがいつ死んでも、元の美しい状態に戻れる」という安心感こそが、攻めた自動化を可能にする唯一の基盤だ。
さあ、恐れずにコードを書こう。ただし、退路(ロールバック)を確保することだけは忘れるな。
