【入門編】【上級プロフェッショナル向け】図面を開かずにプロパティ情報を取得:DWG/DXFヘッダー情報の解析 – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA極意】図面を開かずに「魂(ヘッダー情報)」を抜き取る技術

AutoCAD VBAを操るエンジニアの皆さん、こんにちは。
普段、図面を開くために`Documents.Open`を連発していませんか? 100枚の図面を開いてプロパティを調べる……それはエンジニアとしては「原始的」と言わざるを得ません。

AutoCADを起動して、重いDWGファイルをロードする。このプロセスには膨大なメモリと時間がかかります。「開かずに、中身を知る」。 これこそが、業務効率を劇的に引き上げるための「プロの視点」です。

今日は、AutoCADを背後で動かさず、あるいは開かずに図面のヘッダー情報を直接解析する、極めて「スマート」なアプローチを伝授します。

—

なぜ「開かない」ことが重要なのか?

AutoCADのAPIは強力ですが、その分、実行コストが非常に高い。`Document`オブジェクトを生成することは、CADという巨大なエンジンを回すことを意味します。

もしあなたが「図面の作成者を知りたい」「どのバージョンで保存されたか確認したい」というだけの目的であれば、ファイルバイナリの先頭部分(ヘッダー)を覗き見るだけで十分です。

—

核心技術:ファイルI/Oによるヘッダー解析

DWGファイルは、実は先頭の数バイトに「どのバージョンで作成されたか」というDNA情報が刻まれています。VBAの`FileSystemObject`とバイナリ読み込みを使い、この情報を抽出しましょう。

実装例:DWGバージョン判定コード

‘ 必要な参照設定: Microsoft Scripting Runtime
Sub GetDWGVersion()
Dim fso As Object
Dim ts As Object
Dim filePath As String
Dim header As String

filePath = “C:\Projects\Sample.dwg”
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ファイルをバイナリとして開く(最初の6バイトを読み取る)
‘ ※VBAのTextStreamはバイナリには弱いため、低レベルAPIを使うのが真の最適解ですが
‘ 今回は概念理解のために直感的な手法を紹介します

Dim fileNum As Integer
fileNum = FreeFile
Open filePath For Binary Access Read As #fileNum
header = Input(6, #fileNum)
Close #fileNum

‘ AC1027 = AutoCAD 2013/2014
‘ AC1032 = AutoCAD 2018
Select Case header
Case “AC1027”: MsgBox “これは AutoCAD 2013-2014 形式です。”
Case “AC1032”: MsgBox “これは AutoCAD 2018-2024 形式です。”
Case Else: MsgBox “未知のバージョンです。ヘッダー値: ” & header
End Select
End Sub

このコードが教えてくれること

  • `FreeFile`: システムが管理する空きファイル番号を取得する、VBAの「作法」です。
  • `Binary Access Read`: これが重要。ファイルをテキストとしてではなく、生のデータとして扱うことで、巨大な図面をロードせずに「頭の数文字」だけを瞬時に切り取れます。

—

応用編:より深い情報を取得するなら「ObjectDBX」

ヘッダー情報だけでは足りない(レイアウト名や属性値が欲しい)場合でも、まだ`Documents.Open`をしてはいけません。

ここで登場するのが「ObjectDBX (AxDbDocument)」です。これはAutoCADのUIをレンダリングせずに、メモリ上だけで図面を操作する魔法のエンジンです。

Sub ReadDrawingPropertiesWithoutOpening()
‘ ObjectDBXインターフェースの生成
Dim dbxDoc As Object
Set dbxDoc = CreateObject(“ObjectDBX.AxDbDocument.24”) ‘ 24はAutoCAD 2021以降用

‘ バックグラウンドで図面を読み込む
dbxDoc.Open “C:\Projects\Sample.dwg”

‘ 図面を開かずにプロパティを取得
Debug.Print “図面タイトル: ” & dbxDoc.SummaryInfo.Title
Debug.Print “作成者: ” & dbxDoc.SummaryInfo.Author

Set dbxDoc = Nothing
End Sub

なぜこれを使うのか?

  • 圧倒的な速度: 画面の描画処理をスキップするため、通常のOpenよりも数倍から数十倍高速です。
  • 安定性: UIが絡まないため、予期せぬダイアログ(「フォントが見つかりません」等)にプログラムが停止させられるリスクが皆無です。

—

読者へのアドバイス:陥りやすい罠

1. バージョン番号の不一致: `AxDbDocument`の末尾の数字(`24`など)はインストールされているAutoCADのバージョンに依存します。汎用的なツールを作るなら、レジストリからバージョンを取得する工夫が必要です。
2. メモリリーク: `dbxDoc`を明示的に `Nothing` にしないと、バックグラウンドプロセスが残り続け、PCが重くなる原因になります。必ず `Finally` ブロック相当の処理(エラーハンドラ内での解放)を行ってください。

—

最後に:エンジニアとしての矜持

「マクロの記録」は便利ですが、それはあくまで「AutoCADに操作をさせる」ための入り口に過ぎません。今日紹介した「ファイルそのものを解析する」「バックグラウンドで処理する」という考え方は、あなたが「AutoCADを操作する人」から「AutoCADを制御するエンジニア」へ進化するための第一歩です。

自動化の極意は「いかにコンピュータを働かせるか」ではなく、「いかにコンピュータの無駄な負荷を削ぎ落とすか」にあります。

さあ、次はどの無駄なプロセスをコードで消し去りましょうか? 応援していますよ。

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