図面を「開かずに」書き換える。ObjectDBXと正規表現で極める、超高速・大量図面一括処理の極意
こんにちは。今日も設計現場の最前線で、膨大なデータと格闘しているあなたへ。
「マクロの記録」ボタンを押し、画面上の操作を記録することからAutoCAD VBAの世界に入った皆さん。まずはそこから一歩踏み出した自分を褒めてあげてください。でも、もしあなたが今、「数百枚の図面ファイルの画層名を、一括でルール通りに変更したい。でも、一つずつ図面を開いていたら日が暮れてしまう……」という壁にぶつかっているなら、今日、その壁は崩れ去ります。
今日は、プロのエンジニアが現場で使う「真の自動化」の技術、ObjectDBXと正規表現(RegEx)を組み合わせた、図面を「開かない」超高速置換術を伝授しましょう。
1. なぜ「図面を開いて」はいけないのか?
通常、VBAで図面を操作するときは `Documents.Open` を使いますよね。これはAutoCADの画面上に図面をドーンと表示させ、グラフィックスエンジンを起動させ、スタイルを読み込み、ユーザーインターフェースを準備する……という、非常に「重い」プロセスです。
数百枚の図面に対してこれを行うと、PCは悲鳴を上げ、メモリを食いつぶし、処理時間は膨大なものになります。
ここで登場するのが ObjectDBX です。
ObjectDBXとは「図面の設計図(データベース)だけを抜き出す技術」
ObjectDBXは、AutoCADのGUI(画面)を一切介さず、DWGファイルという「データベース」の中身に直接アクセスするためのインターフェースです。
- GUI方式: レストランに行って、料理(図面)をテーブルに並べ、ウェイター(AutoCAD)を呼び、フルコースを楽しむ。
- ObjectDBX方式: キッチンに直接入り、食材(データ)だけを素早く加工して、袋に詰めて持ち帰る。
この違いが、処理速度に数十倍の差を生むのです。
2. 「正規表現」という名の精密なメス
次に、画層名の書き換えに使う「正規表現(Regular Expressions)」について。
単なる「文字の置き換え(Replace)」では、複雑なルールに対応できません。
例えば、こんなルールがあったとします。
- ルール: `OLD_WALL_01` や `OLD_WINDOW_02` のような名前を、接頭辞を `NEW-` に変えて `NEW-WALL-01` にしたい。
単純な置換だと「OLD_」を「NEW-」に変えるだけですが、正規表現を使えば「『OLD_』で始まり、その後に『何か文字』が続き、最後に『数字』が来るパターン」をスマートに捕まえ、その構造を維持したまま一部だけを書き換えることができます。
3. 実践:全画層名一括置換プログラム
それでは、魂を込めたコードを見ていきましょう。このコードは、指定したフォルダ内のすべてのDWGファイルに対し、画層名のパターンを検知して一括置換を行います。
事前準備:参照設定
このコードを動かすには、VBAエディタの [ツール] -> [参照設定] から以下にチェックを入れてください。
1. Microsoft VBScript Regular Expressions 5.5 (正規表現を使うため)
Option Explicit
' ==============================================================================
' プログラム名:FastLayerRenamer
' 概要:ObjectDBXを使用して、図面を開かずに画層名を正規表現で一括置換する
' 作成者:Legendary Chief Architect
' ==============================================================================
Sub BatchRenameLayersWithDBX()
Dim objShell As Object
Dim targetFolder As Object
Dim folderPath As String
Dim fileName As String
' --- 1. フォルダ選択ダイアログ ---
Set objShell = CreateObject("Shell.Application")
Set targetFolder = objShell.BrowseForFolder(0, "処理する図面が入ったフォルダを選択してください", 0)
If targetFolder Is Nothing Then Exit Sub
folderPath = targetFolder.Self.Path & "\"
' --- 2. ObjectDBXの初期化 ---
' ※AutoCADのバージョンによって、ObjectDBXのクラス名は異なります。
' 例: AutoCAD 2021-2024なら "ObjectDBX.AxDbDocument.24"
' ここでは、お使いの環境に合わせて書き換えてください。
Dim dbxDoc As Object
On Error Resume Next
Set dbxDoc = GetInterfaceObject("ObjectDBX.AxDbDocument.24")
If dbxDoc Is Nothing Then
MsgBox "ObjectDBXの初期化に失敗しました。バージョン指定を確認してください。", vbCritical
Exit Sub
End If
On Error GoTo ErrorHandler
' --- 3. 正規表現の設定 ---
Dim regEx As New RegExp
With regEx
.Global = True ' 全ての一致箇所を対象にする
.IgnoreCase = True ' 大文字小文字を区別しない
' 【重要】ここに置換したいパターンのルールを書く
' 例: "OLD_" で始まる文字列をキャプチャするパターン
.Pattern = "^OLD_(.*)"
End With
' --- 4. ファイルループ処理 ---
fileName = Dir(folderPath & "*.dwg")
Do While fileName <> ""
Debug.Print "Processing: " & fileName
' ObjectDBXで図面を(バックグラウンドで)開く
dbxDoc.Open (folderPath & fileName)
' 図面内の画層(Layers)をループ
Dim layerObj As Object
For Each layerObj In dbxDoc.Layers
' 画層名が正規表現のパターンに一致するかチェック
If regEx.Test(layerObj.Name) Then
' 置換実行: $1 は正規表現の括弧 () で囲った部分(キャプチャグループ)を指す
' ここでは "OLD_WALL" -> "NEW-WALL" のように変換するイメージ
layerObj.Name = "NEW-" & regEx.Replace(layerObj.Name, "$1")
Debug.Print " -> Renamed: " & layerObj.Name
End If
Next layerObj
' 変更を保存して閉じる
dbxDoc.SaveAs (folderPath & fileName)
' 次のファイルへ
fileName = Dir()
Loop
MsgBox "全ての処理が完了しました!", vbInformation
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました。" & vbCrLf & "ファイル名: " & fileName & vbCrLf & "内容: " & Err.Description, vbCritical
End Sub
' AutoCADのバージョンに応じたObjectDBX取得用のヘルパー関数
' (環境によっては GetInterfaceObject ではなく、直接型を指定する必要があります)
Function GetInterfaceObject(progID As String) As Object
Set GetInterfaceObject = CreateObject(progID)
End Function
4. プロフェッショナルのための「陥りやすい落とし穴」
このコードを実戦投入する前に、必ず以下の3点を心に刻んでおいてください。
① ObjectDBXの「バージョン番号」問題
コード内の `ObjectDBX.AxDbDocument.24` という部分は、AutoCADのバージョンに依存します。
- AutoCAD 2021〜2024 $\rightarrow$ `.24`
- AutoCAD 2019〜2020 $\rightarrow$ `.23`
ここがズレていると、プログラムは「そんなオブジェクトは知らない」とへそを曲げてしまいます。
② 「書き換えられない画層」の存在
AutoCADには、絶対に名前を変えてはいけない画層が存在します。
- Layer “0”
- Defpoints
これらを無理に変えようとすると、エラーで止まってしまいます。正規表現のパターン(`.Pattern`)を設計する際は、これらを避けるように作るか、コード内で `If layerObj.Name <> “0” Then` のような除外処理を入れるのがプロの作法です。
③ バックアップは「絶対」に
ObjectDBXによる書き換えは、GUIを介さないため「Ctrl+Z(元に戻す)」が効きません。`dbxDoc.SaveAs` を実行した瞬間に、ファイルは上書きされます。
必ず、作業前にフォルダごとコピーしてバックアップを取っておくこと。 これが、伝説のエンジニアが必ず守る鉄則です。
最後に:技術は「道具」であり、「武器」である
ここまで読んでくれたあなたなら、もう「単に記録するだけ」の段階は卒業しています。
ObjectDBXという「高速なエンジン」と、正規表現という「精密な制御」を手に入れたことで、あなたは数百枚の図面を数秒で支配する力を得ました。
最初はエラーが出るかもしれません。正規表現のパターンが上手くいかないかもしれません。でも、止まらずにデバッグを繰り返してください。その試行錯誤の先に、真の「自動化エンジニア」としての道が開けています。
さあ、恐れずにコードを書き換えて、あなたの業務を劇的に進化させてください。応援していますよ!
