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

スポンサーリンク

AutoCAD VBAの限界を超えろ:図面を開かずに「DWGヘッダー」を瞬殺する極意

AutoCADの業務自動化において、最も愚かな行為の一つが「図面を一つずつ開いてプロパティを取得する」ことだ。1000枚の図面に対してこれを実行すれば、PCは熱暴走し、エンジニアの寿命は削られる。

プロフェッショナルは「ファイルを開かない」。DWGのバイナリ構造を理解し、最短距離で情報を引き抜く。今日は、VBA(およびWindows API/COM)を駆使して、AutoCADエンジンを起動せずに図面のメタデータを抽出する「真の自動化術」を伝授する。

なぜ「Open」は悪手なのか

`Documents.Open` を多用するコードは、以下の地雷を踏み抜く。

  • メモリリーク: AutoCADのCOMオブジェクトは複雑で、大量のOpen/Closeはメモリを確実に食いつぶす。
  • 表示負荷: `Visible = False` にしても、バックグラウンドでのグラフィックス処理や外部参照(Xref)のロードは避けられず、無駄なI/Oが発生する。
  • 互換性リスク: 壊れた図面や、プロキシ図形が大量に含まれるファイルを開くと、ダイアログで処理がストップする。

我々が求めるのは、「ファイルヘッダー」のみをバイナリとして読み取る、あるいはOSのプロパティを直接叩くというアプローチだ。

—

1. 最速の手段:Windows「Shell.Application」を利用したメタデータ抽出

実は、Windowsのシェル(エクスプローラー)は既にDWGのプロパティ(作成日時、更新日時、バージョン等)を解析する機能を持っている。これをVBAから叩くのが最も堅牢だ。AutoCADへの依存度をゼロにする。

実装コード:MetadataExtractor

‘ 参照設定: Microsoft Shell Controls And Automation
Public Sub GetDwgMetadata(ByVal folderPath As String, ByVal fileName As String)
Dim shellApp As Object
Dim folder As Object
Dim folderItem As Object

Set shellApp = CreateObject(“Shell.Application”)
Set folder = shellApp.Namespace(folderPath)
Set folderItem = folder.ParseName(fileName)

‘ インデックス番号はOSによって変わる可能性があるため注意
‘ 276: 作成日時, 277: 更新日時, 280: 作成者 等
Debug.Print “ファイル名: ” & folder.GetDetailsOf(folderItem, 0)
Debug.Print “更新日時: ” & folder.GetDetailsOf(folderItem, 277)
Debug.Print “作成者: ” & folder.GetDetailsOf(folderItem, 280)

‘ 後処理は必須
Set folderItem = Nothing
Set folder = Nothing
Set shellApp = Nothing
End Sub

注意点: この方法はOSのインデックス機能に依存する。インデックスが構築されていないネットワークドライブ上では精度が落ちることがある。

—

2. 究極の手段:バイナリ・シグネチャによるバージョン判定

図面の「バージョン(AutoCAD 2018形式か、2010形式か)」を知りたいだけなら、ファイルの先頭6バイトを読めばいい。AutoCADのDWGファイルには、必ず特定のシグネチャ(マジックナンバー)が刻まれている。

| バージョン | シグネチャ (ASCII) |
| :— | :— |
| AutoCAD 2018- | `AC1032` |
| AutoCAD 2013-2017 | `AC1027` |
| AutoCAD 2010-2012 | `AC1024` |

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

Public Function GetDwgVersion(ByVal filePath As String) As String
Dim fileNum As Integer
Dim header As String 6

fileNum = FreeFile
Open filePath For Binary Access Read As #fileNum
Get #fileNum, 1, header
Close #fileNum

Select Case header
Case “AC1032”: GetDwgVersion = “AutoCAD 2018+”
Case “AC1027”: GetDwgVersion = “AutoCAD 2013-2017”
Case “AC1024”: GetDwgVersion = “AutoCAD 2010-2012”
Case Else: GetDwgVersion = “Unknown”
End Select
End Function

このコードは極めて高速だ。1万ファイルのバージョン仕分けであっても、数秒で完了する。AutoCADの起動は一切不要だ。

—

3. 大規模運用に向けたアーキテクチャ設計

もし、あなたがこのデータをデータベース(SQL Server/SQLite)に溜め込み、資産管理ツールを作ろうとしているなら、以下の設計指針を遵守せよ。

1. 非同期処理の検討: VBA単体では限界がある。データ抽出をVBAの「Job Runner」とし、実際にファイルを開いて詳細な図面情報を取得する「重い処理」は、CLI(コマンドライン)から実行可能なC#などのコンソールアプリを呼び出す設計にせよ。
2. エラーログのデータベース化: 読み込みに失敗したファイルは、`ERROR_LOG`テーブルに記録し、後で手動チェックするフローを作る。決して`On Error Resume Next`で隠蔽してはならない。
3. トランザクションの分離: 1ファイルずつコミットするのではなく、50〜100件単位でバッチコミットすることで、DBのオーバーヘッドを最小化する。

まとめ:エンジニアの誇り

「AutoCADを自動化する」とは、AutoCADという巨大なソフトウェアを「言いなりにする」ことではなく、「AutoCADという重い鎧を脱ぎ捨てて、必要な情報だけを最短で抜き出す」ことだ。

今回のバイナリ解析のアプローチを習得すれば、あなたのコードは従来の数倍から数十倍のパフォーマンスを叩き出すはずだ。技術は目的ではない。業務を止めないための手段だ。さあ、今すぐ非効率な`Open`メソッドを消し去れ。

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