【テクニカル・上級編】【上級プロフェッショナル向け】図面破損(Corruption)の自動検知とRecoverコマンドの擬似実行による自動修復 – AutoCAD VBA解析バイブル

スポンサーリンク

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プログラミングへ移行せよ。しかし、そこに至るまでの土台として、本稿の防衛的なパイプラインは、貴方のシステムを「止まらない自動化」へと導くはずだ。

健闘を祈る。

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