【テクニカル・上級編】【上級プロフェッショナル向け】バイナリレベルでのDWGバージョン識別:AutoCADを起動せずにファイル形式を特定する – AutoCAD VBA解析バイブル

スポンサーリンク

DWGの「心臓」を読み解く:AutoCADレスでバージョンを特定する極限の手法

AutoCADを起動して`Open`メソッドを叩く? それは、ただの「作業」であり「エンジニアリング」ではない。

数千、数万の図面ファイルを扱う大規模なデータマイグレーションや、古いアーカイブから特定のバージョンのDWGを抽出するシステムにおいて、AutoCADのインスタンスを立ち上げることは、メモリと時間に対する最大の背信行為だ。AutoCADのCOMオブジェクトは重量級であり、その起動コストは無視できない。

真のアーキテクトは、ファイルシステムのバイナリを直接叩く。DWGファイルの先頭わずか6バイトに刻まれた「AC10xx」という署名こそが、ファイルの正体を暴く唯一の鍵である。

1. DWGバイナリ構造の真実

DWGファイルは、歴史的に「MC0.0」から始まるヘッダーを持ち、続くバイト列がバージョンを規定している。

  • AC1015: AutoCAD 2000/2000i/2002
  • AC1018: AutoCAD 2004/2005/2006
  • AC1021: AutoCAD 2007/2008/2009
  • AC1024: AutoCAD 2010/2011/2012
  • AC1027: AutoCAD 2013/2014/2015/2016/2017
  • AC1032: AutoCAD 2018/2019/2020/2021/2022/2023/2024/2025

このヘッダーを読み取る際、決してファイルをすべてメモリにロードしてはならない。必要なのは先頭の6バイトのみ。ストリーム入出力の極意は「最小のI/Oで最大の情報を得る」ことにある。

2. 実装:バイナリ解析による高速バージョン判別

以下のVBAコードは、ファイルを開き、ヘッダーを読み込み、即座にクローズする。`FreeFile`でバッファを確保し、`Get`ステートメントでバイナリを抽出する。このプロセスにおいてメモリリークの余地は微塵もない。

Option Explicit

‘ DWGファイルのヘッダー情報を抽出する関数
‘ AutoCADの起動を必要としないため、数ミリ秒でバージョン判別が可能
Public Function GetDwgVersion(ByVal filePath As String) As String
Dim fileNum As Integer
Dim header As String 6 ‘ 先頭6バイトのみを読み込むための固定長文字列

‘ 存在確認は必須。無駄なエラーハンドリングを避ける
If Dir(filePath) = “” Then
GetDwgVersion = “Error: File Not Found”
Exit Function
End If

fileNum = FreeFile

‘ バイナリモードでオープン(排他制御を考慮し、Readのみ)
Open filePath For Binary Access Read As #fileNum
Get #fileNum, 1, header
Close #fileNum

‘ 抽出したヘッダー(AC10xx)を返却
GetDwgVersion = Trim(header)
End Function

‘ 使用例
Sub Example_AnalyzeDwg()
Dim dwgPath As String
dwgPath = “C:\Projects\LegacyData\Sample.dwg”

Debug.Print “DWG Version Signature: ” & GetDwgVersion(dwgPath)
End Sub

3. チーフアーキテクトからの助言:パフォーマンスと保守性

このコードを見て「これだけで十分か?」と疑問に思うかもしれない。しかし、システム開発において「複雑さ」は最大の敵だ。

  • バッファの最適化: 6バイトの固定長文字列(`String 6`)を用いることで、VBA内部での文字列変換オーバーヘッドを最小化している。
  • オブジェクトのライフサイクル: COMオブジェクトを使用していないため、`Set obj = Nothing`による解放も、`On Error Resume Next`による強引な終了処理も不要である。
  • スケーラビリティ: この手法をベースに、フォルダ内の数万ファイルを再帰的に走査するスクリプトを組めば、旧来のActiveX Automationでは数時間かかっていた棚卸し作業が、わずか数分で完了する。

4. 最後に:レガシーと向き合うということ

DWGのバージョン互換は、常にエンジニアを悩ませる呪縛である。しかし、バイナリレベルでの識別をマスターすれば、貴殿はAutoCADの「外側」から図面を統制する権限を手に入れることになる。

システム管理において、最も強力なツールは常に「最も単純で、最も深いレイヤーを理解しているもの」だ。この知見を貴殿のツールキットに加え、無駄なオーバーヘッドから解放された、真に生産性の高いオートメーションを構築してほしい。

技術は裏切らない。ただ、深く潜った者だけが、その恩恵を享受できるのだ。

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