迷宮の図面管理をコードで統治せよ:AcadDocumentのメタデータ抽出とメモリ管理の深淵
AutoCADのプロジェクトにおいて、ファイル命名規則という名の「無法地帯」を放置していないか?
`Drawing_001_RevA.dwg` のような文字列から、泥臭く `Left` や `Mid` を繰り返して切り出すのは、VBAエンジニアとしては三流の所業だ。
今日は、`AcadDocument.FullName` を起点に、正規表現(RegExp)を用いて図面番号とリビジョンを抽出し、属性情報へマッピングする。さらに、その背後でいかにメモリを汚さず、堅牢なシステムを構築するかという「アーキテクトの視座」を伝授する。
—
1. なぜ正規表現(VBScript.RegExp)なのか
ファイル命名規則は往々にして揺らぐ。「ハイフンがアンダースコアに変わった」「リビジョンが2桁になった」。
泥臭い文字列操作は、仕様変更のたびにコードを破壊する。正規表現は、これらの「パターン」を宣言的に定義する。
‘ VBScript.RegExpのアーリーバインディング(参照設定推奨)
‘ “Microsoft VBScript Regular Expressions 5.5”
Private Function ExtractDrawingInfo(ByVal fullPath As String) As Variant
Dim regEx As Object
Dim matches As Object
Dim results(1) As String ‘ 0:図面番号, 1:リビジョン
‘ オブジェクト生成は最小限のスコープで
Set regEx = CreateObject(“VBScript.RegExp”)
With regEx
.Global = True
.IgnoreCase = True
‘ パターン例: [図面番号(英数字)]_Rev[リビジョン(英数字)].dwg
.Pattern = “([A-Z0-9-]+)_Rev([A-Z0-9]+)\.dwg$”
End With
Set matches = regEx.Execute(fullPath)
If matches.Count > 0 Then
results(0) = matches(0).SubMatches(0)
results(1) = matches(0).SubMatches(1)
End If
‘ 明示的解放はVBAの美学
Set matches = Nothing
Set regEx = Nothing
ExtractDrawingInfo = results
End Function
—
2. メモリ最適化と「オブジェクトの寿命」
VBAはガベージコレクションが優秀ではない。特にAutoCADのオブジェクトモデル(`AcadApplication`, `AcadDocument`)を扱う際、不用意な参照の保持はメモリリークや「致命的なエラー」の温床となる。
極限の知見:オブジェクトの解放順序
コード内で `ThisDrawing` を多用するのは避けよ。関数の引数として渡し、スコープを抜ける際に確実に `Nothing` を代入する。
Public Sub UpdateTitleBlock()
Dim doc As AcadDocument
Dim info As Variant
Set doc = ThisDrawing ‘ 現在の図面を明示的に取得
info = ExtractDrawingInfo(doc.FullName)
‘ 図面番号、リビジョンの更新処理(ここはBlockReference巡回のロジックへ)
‘ …
‘ 最後に参照を断つ
Set doc = Nothing
End Sub
—
3. レガシー環境でのAPI活用:Windows APIの介入
AutoCADのVBAは、時として「ファイルパスが長すぎて取得できない」といったOSレベルの障壁に突き当たる。また、ファイルシステムの状態を正確に把握したい場合、`Scripting.FileSystemObject` だけでは力不足なケースがある。
もし、ファイル作成日時や詳細な属性を同時に管理する必要があるなら、`kernel32` の `GetFileAttributesEx` 等を呼び出し、メモリポインタを直接操作する領域へ足を踏み入れる必要がある。だが、まずは「正規表現によるメタデータの正確な分離」こそが、堅牢なシステム構築の第一歩だ。
—
4. チーフアーキテクトからの提言
システム管理において、最もコストがかかるのは「コードの修正」ではない。「仕様変更に伴う、属人化した解析ロジックの解読」だ。
1. 正規表現は「仕様書」である: パターンを定義すること自体が、命名規則をドキュメント化することと同義である。
2. 疎結合を貫け: ファイルパス解析ロジックと、AutoCADの図面枠(属性ブロック)更新ロジックを混ぜるな。必ず関数を分離し、データ構造(配列やユーザー定義型)のみで橋渡しをせよ。
3. エラーハンドリングを怠るな: `FullName` が空(未保存)の状態を考慮していないコードは、現場ではただの爆弾だ。
‘ 未保存図面への対策
If doc.FullName = “” Then
Err.Raise vbObjectError + 1001, , “図面が保存されていません。解析を中断します。”
End If
終わりに
AutoCAD VBAはレガシーと言われる。だが、AutoCADの内部オブジェクトを直接叩けるこのインターフェースは、C#やPythonを用いた外部連携においても、依然として強力な「足回り」であり続ける。
「動くコード」を書くのは新人だ。我々が書くべきは、「5年後、別のエンジニアが読んでもロジックの意図が即座に理解できる、疎結合かつ堅牢なアーキテクチャ」である。
次は、このメタデータを外部データベース(SQL Server/SQLite)と同期させる手法について語ろう。準備はいいか?
