【入門編】【上級プロフェッショナル向け】ObjectDBXを用いた「バックグラウンド処理」中のエラーログ自動生成 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAの深淵へ:ObjectDBXで「図面を開かずに」高速かつ安全に処理する方法

こんにちは。AutoCADの自動化を極めんとする皆さん、今日は少しハードな、しかし現場で喉から手が出るほど求められる「聖杯」のようなテクニックを授けましょう。

皆さんは「数百枚の図面を一つずつ開いて編集し、閉じる」という作業をしていませんか? それはCPUとメモリを無駄に食う、エンジニアとしては避けたい低効率なルーチンです。

今回は、「ObjectDBX」という魔法の技術を使って、図面を画面に表示せず(バックグラウンドで)処理し、万が一の図面破損時にも慌てないための「自動エラーログ生成システム」を構築します。

—

1. なぜObjectDBXなのか?(ライフサイクルの理解)

通常、AutoCADで `Documents.Open` を行うと、その図面がエディタ上に読み込まれ、グラフィックの再描画が発生します。これは非常に重い。

一方、ObjectDBX (AxDbDocument) は、図面ファイルをメモリ上に「データ構造」としてだけ読み込みます。画面表示を伴わないため、処理速度は劇的に向上します。しかし、この「画面がない」という特性が、エラーハンドリングを難しくさせます。図面が破損しているとき、ダイアログも出せずにVBAが沈黙して強制終了…なんて事態は避けなければなりません。

—

2. 実践:エラーログ自動生成エンジンの構築

以下のコードは、指定したフォルダ内のDWGを順次読み込み、処理成功・失敗をCSVに書き出すプロフェッショナルな設計です。

‘ 必要な参照設定: AutoCAD ObjectDBX Common Type Library
Public Sub BatchProcessWithLogging()
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim dbx As AxDbDocument
Dim logPath As String: logPath = “C:\Temp\ProcessLog.csv”
Dim logFile As Object

Set logFile = fso.CreateTextFile(logPath, True)
logFile.WriteLine “FileName,Status,ErrorMessage”

Dim folderPath As String: folderPath = “C:\TargetDrawings\”
Dim file As Object

‘ フォルダ内の全DWGをスキャン
For Each file In fso.GetFolder(folderPath).Files
If LCase(fso.GetExtensionName(file.Path)) = “dwg” Then
Set dbx = New AxDbDocument

‘ 【重要】エラーハンドリングの境界をここに設定
On Error Resume Next
dbx.Open file.Path

If Err.Number <> 0 Then
‘ エラー発生!詳細を記録して次へスキップ
logFile.WriteLine file.Name & “,FAILED,” & Err.Description
Err.Clear
Else
‘ ここに実際の処理(例:レイヤー削除やブロック置換)を記述
Call ProcessDrawing(dbx)

‘ 保存処理
dbx.SaveAs file.Path
logFile.WriteLine file.Name & “,SUCCESS,”
End If
On Error GoTo 0

Set dbx = Nothing ‘ メモリを確実に解放する
End If
Next

logFile.Close
MsgBox “全処理完了。ログを確認してください。”
End Sub

‘ 個別の編集ロジックを分離させるのが保守の鉄則です
Private Sub ProcessDrawing(dbx As AxDbDocument)
‘ 例:モデル空間の全エンティティをループ処理するロジックなど
End Sub

—

3. コードの解説と「陥りやすい罠」

① `On Error Resume Next` の正しい使い方

「エラーを無視する」ために使うのではありません。「エラーが起きたことを検知するために、プログラムを止めない」ために使います。`Err.Number <> 0` を判定することで、どのファイルが「開けないほど壊れているか」を正確に特定できます。

② `Set dbx = Nothing` の重要性

`AxDbDocument` は非常に強力ですが、巨大な図面を扱うとメモリ消費が激しいです。ループ内で明示的に `Nothing` を代入してメモリを解放しないと、数百枚の処理の途中でメモリ不足(メモリリーク)が発生します。これはプロとしての「作法」です。

③ 互換性の罠

ObjectDBXは、実行しているAutoCADのバージョンよりも「新しい形式」のDWGは開けません。もし2024版の図面を2020版で開こうとすると、このコードはエラーを吐きます。現場の環境に合わせて、DWG変換ツールを併用するか、例外処理に「バージョン不一致」の判定を組み込むのが賢いアーキテクトの道です。

—

4. 最後に:現場で生き残るために

このコードをベースにすれば、あなたのPCは数千枚の図面処理を裏側で黙々とこなす「最強の作業員」になります。

「プログラムが止まらないこと」こそ、自動化における最大の価値です。ログファイルさえあれば、翌朝出社したときに「どの図面が壊れていたか」を一目で把握できる。この安心感こそが、手作業から脱却したエンジニアの武器なのです。

さて、次は「レイアウトごとのPDF出力自動化」に挑戦してみますか? それとも「ブロック属性の抽出」について深掘りしましょうか。あなたの技術が、現場の未来をより良く変えていくことを期待しています。

何か不明点があれば、いつでも聞いてください。ここをクリアすれば、あなたはもう立派なAutoCAD自動化の専門家です。

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