AutoCADの「死」を看取る:破損図面の自動検知とRecoverパイプラインの深淵
AutoCADの運用において、最も忌むべき存在は「致命的なエラー(Fatal Error)」だ。数千枚の図面をバッチ処理する際、一つでも壊れたDWGが混入していれば、システムは停止し、ログは断絶する。
多くのエンジニアは、`Documents.Open` のエラーハンドラで逃げるか、手作業での修復に頼っている。だが、真の自動化を志すアーキテクトにとって、それは敗北を意味する。本稿では、AutoCADの内部メモリを保護しつつ、破損図面を検知し、Recoverコマンドをパイプラインに組み込む「防衛的図面処理アーキテクチャ」の核心を解説する。
—
1. 破損検知のパラドックス
通常の`Open`メソッドは、図面が破損していると例外を投げる前にAutoCADそのものを不安定にさせる。ここで重要なのは、「開く前に検知する」ことと、「開く際の挙動を制御下におく」ことの二段構えだ。
図面のヘッダー情報を読み取る、あるいはファイルロックの状態を監視することも一つの手だが、最も確実なのは、`ObjectARX`の初期化を最小限に抑えた「隔離環境」での試行だ。
2. 実装の要諦:Recoverパイプラインの構築
単に `SendCommand “_RECOVER”` を発行するだけでは、ダイアログが立ち上がり、プロセスは停止する。これを防ぐには、システム変数 `FILEDIA` を `0` にし、`CMDECHO` を抑制した上で、非モーダルな制御フローを構築する必要がある。
【極限の実装例】自動修復プロセス
以下のコードは、VBAから図面をクリーンに修復するためのテンプレートだ。
‘ @description: 破損図面を安全に修復し、正常なDWGとして再保存するプロシージャ
Public Sub RobustRepairPipeline(ByVal filePath As String)
Dim acadApp As Object
Dim doc As Object
‘ 1. システム環境の事前退避(メモリの汚染を防ぐ)
Dim oldFileDia As Integer: oldFileDia = ThisDrawing.GetVariable(“FILEDIA”)
ThisDrawing.SetVariable “FILEDIA”, 0
On Error GoTo ErrorHandler
‘ 2. Recoverの実行(SendCommandは非同期のため、タイミング制御が必要)
‘ 注意:この処理は現在のドキュメントを閉じる前に行う必要がある場合、
‘ 別インスタンスまたは専用のオートメーションコントローラー経由が望ましい
ThisDrawing.SendCommand “_RECOVER ” & Chr(34) & filePath & Chr(34) & vbCr
‘ 3. 修復後のクリーンアップと保存
Set doc = Application.ActiveDocument
doc.SaveAs filePath, 36 ‘ 36はac2018_dwg等の定数。環境に合わせて最適化せよ
GoTo Cleanup
ErrorHandler:
‘ 致命的破損の場合、ログを吐き出して次のタスクへスキップする
Debug.Print “Critical Failure: ” & filePath
Cleanup:
ThisDrawing.SetVariable “FILEDIA”, oldFileDia
‘ 明示的なオブジェクト解放(VBAのメモリ管理は気まぐれであるため、NULL代入は必須)
Set doc = Nothing
End Sub
—
3. レガシー環境とWindows APIによる「死の監視」
大規模なバッチ処理を行う際、AutoCADが「応答なし」になることは珍しくない。VBA単体でこれを検知することは不可能だ。ここで`User32.dll`の出番となる。
`GetWindowThreadProcessId` を使用してAutoCADのウィンドウハンドルを監視し、`IsHungAppWindow` APIを定期的にポーリングすることで、ハングアップしたプロセスを強制終了(`TerminateProcess`)し、パイプラインを再起動させる「ウォッチドッグ・タイマー」を外部プロセス(VB.NETのコンソールアプリ等)で実装することを強く推奨する。
4. チーフアーキテクトからの忠告
1. メモリリークの温床を断つ: `SendCommand` は強力だが、使用後は必ず `ThisDrawing.Utility.Prompt` などでコンソールに制御を戻し、内部スタックをクリアさせること。
2. バージョン互換の罠: `SaveAs` 時のバージョン指定は、常に「現在のAutoCADがネイティブで扱う形式」に固定せよ。DXFへの変換は、データ構造の損失を招くため、最後の手段と心得るべきだ。
3. オブジェクトのライフサイクル: VBAのオブジェクト変数は `Set Nothing` をしても、即座にメモリが解放されるわけではない。数千ファイルの処理を行う場合は、一定数処理ごとにAutoCADプロセス自体を再起動させる「再循環アーキテクチャ」が、結局は最も安定したパフォーマンスを生む。
結びに
図面修復の自動化とは、単なるコード記述ではない。AutoCADという巨大で不安定な「生き物」の呼吸を読み、そのエラーを先回りして捌く、一種の対話である。
これ以上の洗練を求めるのであれば、VBAの殻を破り、C#を用いたObjectARX(.NET API)によるDatabaseプログラミングへ移行せよ。しかし、そこに至るまでの土台として、本稿の防衛的なパイプラインは、貴方のシステムを「止まらない自動化」へと導くはずだ。
健闘を祈る。
