【入門編】【実務中級者向け】図面を開く前に、図面内のオブジェクト数をカウントし、処理負荷を予測 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの荒波を航海中の皆さん、先輩エンジニアの私です。

「マクロの記録」から一歩踏み出し、自分の手でCADを自在に操れるようになると、業務の景色が一変しますよね。特に、複数の図面を一括処理する「バッチ処理」の自動化は、エンジニアにとって一つのロマンであり、強力な武器です。

しかし、ここで一つ、現場でよくある悲劇を思い出してください。
「深夜に何百枚もの図面を一括処理するバッチを回したら、途中で数ギガバイトある超巨大図面を踏んでAutoCADがフリーズ。翌朝、絶望した……」

こんな経験、ありませんか?
AutoCAD VBAでバッチ処理を組むとき、一番やってはいけないのは「中身の重さを確かめずに、とりあえず図面を開くこと」です。

今回は、図面を画面に描画して開く(重たい処理)というコストを払う前に、「図面ファイルの中に、一体いくつのオブジェクト(図形)が眠っているか」をノーリスクで先読みし、処理の負荷を予測するという、実務で絶対に役立つ極限の知見を授けましょう。

ここをクリアすれば、あなたの作ったマクロは「ただ動くもの」から「プロの現場に耐えうる頑健なシステム」へと進化します。さあ、一緒に扉を開けましょう!

—

1. なぜ「開く前」にオブジェクト数を数える必要があるのか?

AutoCADの図面(DWG)は、見た目の線画の美しさとは裏腹に、内部では膨大な数の「データベース(オブジェクト)」の集合体です。

人間が図面を開くときは、AutoCADが画面を描画(グラフィックス処理)するため、オブジェクトが多いほど激重になります。しかし、VBAの裏側(バックグラウンド)であっても、重い図面を毎回 `Open` メソッドで開き、メモリに展開して処理していたら、PCのメモリはすぐパンクし、AutoCADは沈黙します。

「開かずに読む」というデータベースの裏技

実は、AutoCAD VBA(正確にはObjectDBXという技術)を使うと、図面を画面上に一切表示させず、メモリ上だけでDWGファイルのデータベースにアクセスすることができます。

これにより、以下のメリットが生まれます。

  • 爆速の事前スキャン: 画面描画のオーバーヘッドがないため、一瞬で図面の中身を把握できる。
  • 負荷の事前予測: 「あ、この図面はオブジェクトが10万個あるから、今日のバッチ処理では後回しにしよう」「メモリを解放しながら慎重に回そう」といったリスクヘッジ(計画的なバッチ制御)が可能になる。

—

2. 実装コード:オブジェクト数を先読みするプロの作法

それでは、実際に図面を開かずにオブジェクト数をカウントし、処理負荷を予測するVBAコードを公開します。

このコードは、AutoCADの標準機能だけではアクセスできない裏の領域(ObjectDBX)を叩くため、少しだけ高度に見えますが、一行ずつ意味を噛み砕けば怖くありません。

Option Explicit

‘ ==============================================================================
‘ テーマ: 図面を開かずにオブジェクト数をカウントし、処理負荷を予測する
‘ 対象読者: マクロの記録を卒業し、実務でバッチ処理を組みたい中級者
‘ ==============================================================================

Sub PredictDrawingLoad_Click()

‘ 1. 対象となる図面ファイルのパスを指定(ご自身の環境に合わせて変更してください)
Dim targetDWG As String
targetDWG = “C:\AutoCAD_Data\Sample_HeavyDrawing.dwg”

‘ ファイルの存在確認
If Dir(targetDWG) = “” Then
MsgBox “指定されたファイルが存在しません: ” & targetDWG, vbCritical, “エラー”
Exit Sub
End If

‘ 2. ObjectDBXのデータベースオブジェクトを生成
‘ ※画面を開かずにDWGをメモリ上にロードするための魔法のインターフェースです
Dim dbxDoc As Object

‘ AutoCADのバージョンに応じたDBXホストを生成(AutoCAD 2004以降に対応)
Dim cadVersion As String
cadVersion = Left(Application.Version, 2)

On Error Resume Next
‘ バージョン違いによるエラーを防ぐため、動的に生成を試みる
Set dbxDoc = AcadApplication.GetInterfaceObject(“ObjectDBX.AxDbDocument.” & cadVersion)
If dbxDoc Is Nothing Then
‘ フォールバックとして一般的なProgIDを指定
Set dbxDoc = AcadApplication.GetInterfaceObject(“ObjectDBX.AxDbDocument”)
End If
On Error GoTo 0

If dbxDoc Is Nothing Then
MsgBox “ObjectDBXの初期化に失敗しました。AutoCADが正しくインストールされているか確認してください。”, vbCritical
Exit Sub
End If

‘ 3. 画面を開かずにファイルをバックグラウンドで読み込み
On Error GoTo ErrorHandler
dbxDoc.Open targetDWG

‘ 4. モデル空間(ModelSpace)のオブジェクト数をカウント
Dim entityCount As Long
entityCount = dbxDoc.ModelSpace.Count

‘ ※もしペーパー空間やブロック定義も含めたい場合は、さらに走査を拡張できますが、
‘ まずは一番負荷の大部分を占める「モデル空間の図形数」を指標にします。

‘ 5. オブジェクト数に基づく「処理負荷予測」の判定
Dim loadLevel As String
Dim estimatedTime As String

If entityCount < 1000 Then loadLevel = "【軽負荷】一瞬で処理可能です。" estimatedTime = "約 1秒未満" ElseIf entityCount < 10000 Then loadLevel = "【中負荷】通常のバッチ処理ルートで問題ありません。" estimatedTime = "約 3秒〜10秒" ElseIf entityCount < 50000 Then loadLevel = "【重負荷】注意が必要です。メモリ解放を挟んでください。" estimatedTime = "約 30秒〜1分" Else loadLevel = "【超絶ヘビー級】警告:自動処理中にフリーズの危険性あり!" estimatedTime = "数分以上(または手動確認推奨)" End If ' 6. 結果の出力 Dim msg As String msg = "■ 図面事前診断レポート" & vbCrLf & _ "ファイル名: " & Dir(targetDWG) & vbCrLf & _ "モデル空間オブジェクト数: " & Format(entityCount, "#,

0″) & ” 個” & vbCrLf & _

“—————————————-” & vbCrLf & _
loadLevel & vbCrLf & _
“予想処理時間: ” & estimatedTime

MsgBox msg, vbInformation, “負荷予測完了”

‘ 7. クリーンアップ(メモリの解放はエンジニアの美学です)
Set dbxDoc = Nothing
Exit Sub

ErrorHandler:
MsgBox “図面の読み込み中にエラーが発生しました。” & vbCrLf & Err.Description, vbCritical, “致命的エラー”
Set dbxDoc = Nothing
End Sub

—

3. コードのキモ:初心者が陥りがちな罠と解説

このコードには、実務で生き抜くための知見がいくつも詰まっています。ポイントを整理しておきましょう。

① `GetInterfaceObject` という「裏技」

通常、VBAで図面を操作するときは `ThisDrawing` や `Documents.Open` を使いますが、これらは「AutoCADの画面に図面を表示する」という重い処理を伴います。
一方、`ObjectDBX.AxDbDocument` を使うと、AutoCADのUIをバイパスして、純粋なデータ(データベース)だけを裏でメモリに読み込めます。これが「画面を開かずに数える」ことの正体です。

② バージョン依存問題への配慮

コード内で `Left(Application.Version, 2)` とやっている部分があります。AutoCADはバージョン(2021, 2022, 2023など)によって内部のライブラリ名が微妙に変わることがあるため、現在の実行環境のバージョンを動的に取得して安全にObjectDBXを呼び出しています。こういう細かな配慮が、現場で壊れないマクロを作ります。

③ メモリの解放(クリーンアップ)を忘れない

VBAで `GetInterfaceObject` や外部オブジェクトを扱う際、処理の最後に `Set dbxDoc = Nothing` でメモリをきれいスッキリ掃除してあげるのがプロの作法です。これをサボると、大量の図面をループ処理したときにメモリリーク(メモリが徐々に食いつぶされる現象)を起こし、途中でAutoCADが落ちる原因になります。

—

4. ここをクリアすれば、あなたももう中級者!

いかがでしたでしょうか?
「図面を開く」という当たり前の手順を疑い、「開く前に中身を覗き見る」というアプローチを取ることで、業務自動化の信頼性は劇的に向上します。

  • 大量図面の一括印刷バッチ
  • 夜間バッチでの属性データ一括抽出
  • 異常に重い不良図面の事前フィルタリング

これらはすべて、今回紹介した 「ObjectDBXによる事前スキャン」 をベースに応用可能です。

「ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ」と言った意味が、少し伝わったのではないでしょうか。ぜひご自身の開発環境にこのコードを貼り付け、手元の重たい図面で試してみてください。

あなたのAutoCAD自動化ライフが、より快適で知的なものになることを応援しています!それではまた、次回の極限知見でお会いしましょう。

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