【テクニカル・上級編】【初心者】AcadDocument.FullNameから「図面番号」と「リビジョン」を正規表現で切り分けるファイル管理術 – AutoCAD VBA解析バイブル

スポンサーリンク

迷宮の図面管理をコードで統治せよ: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)と同期させる手法について語ろう。準備はいいか?

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