【入門編】【上級プロフェッショナル向け】ObjectDBXと正規表現を用いた「図面を開かない」全画層名の一括置換と保存 – AutoCAD VBA解析バイブル

スポンサーリンク
スポンサーリンク

図面を「開かずに」書き換える。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という「高速なエンジン」と、正規表現という「精密な制御」を手に入れたことで、あなたは数百枚の図面を数秒で支配する力を得ました。

最初はエラーが出るかもしれません。正規表現のパターンが上手くいかないかもしれません。でも、止まらずにデバッグを繰り返してください。その試行錯誤の先に、真の「自動化エンジニア」としての道が開けています。

さあ、恐れずにコードを書き換えて、あなたの業務を劇的に進化させてください。応援していますよ!

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