AutoCAD VBAを掌握せよ:アプリケーション制御の「深淵」と「鉄則」
現場で「とりあえず動くコード」を量産し、半年後に自ら書いたコードのメンテナンスに頭を抱えるエンジニアを、私は何人も見てきた。AutoCAD VBAは、単なるマクロの集まりではない。AutoCADという巨大なプロセスを操る「アーキテクト」の自覚が必要だ。
今回は、AutoCAD VBAの心臓部である`AcadApplication`の制御、そして「図面を開かずに情報を抜き取る」という、実務の現場で最も重宝されるテクニックを伝授する。
—
1. 起動と終了:プロセスの「ライフサイクル」を設計する
初心者は往々にして「CreateObject」を安易に呼び出すが、ここに罠がある。
なぜ「GetActiveObject」が先なのか
AutoCADのプロセスは重い。VBAから起動を制御する際、既に起動しているインスタンスがあるにもかかわらず新しいプロセスを立ち上げるのは、メモリ資源の浪費であり、ライセンスの無駄だ。
‘ 【推奨】既に起動しているAutoCADを取得し、なければ生成する堅牢なパターン
Public Function GetAutoCAD() As AcadApplication
On Error Resume Next
‘ 既に開いているAutoCADプロセスを掴む
Set GetAutoCAD = GetObject(, “AutoCAD.Application.24”) ‘ バージョン番号は適宜調整
If Err.Number <> 0 Then
‘ なければ新規起動
Set GetAutoCAD = CreateObject(“AutoCAD.Application.24”)
End If
On Error GoTo 0
‘ 可視化して制御を握る
GetAutoCAD.Visible = True
End Function
【鉄則】
- エラーハンドリングは必須: `On Error`なしのコードは、現場では「時限爆弾」と同じだ。
- インスタンスの再利用: 既存プロセスを掴む設計にすることで、起動のボトルネックを解消せよ。
—
2. 図面を開かずに情報を取得する:境界線の向こう側
実務では「数百枚の図面から特定の属性だけを抽出したい」といった要求が日常茶飯事だ。しかし、全てを`Application.Documents.Open`で開いていては、処理が追いつかない。
ここで重要なのは、「図面ファイル(DWG)そのもの」への直接アクセスだ。`ObjectDBX`(現在は `AxDbDocument`)を使用すれば、AutoCADのGUIを描画させることなく、バックグラウンドで図面情報を瞬時に抽出できる。
生産性を劇的に変える「AxDbDocument」実装例
Public Sub GetDrawingInfoWithoutOpening(ByVal dwgPath As String)
Dim dbx As Object
Set dbx = CreateObject(“ObjectDBX.AxDbDocument.24”)
‘ 図面をバックグラウンドで読み込む
dbx.Open dwgPath
‘ この時点でデータベースはメモリ上にある。図面ファイルを開く必要はない
Debug.Print “図面名: ” & dbx.Name
Debug.Print “モデル空間のオブジェクト数: ” & dbx.ModelSpace.Count
‘ 必要に応じて情報を抽出
‘ Dim ent As AcadEntity
‘ For Each ent In dbx.ModelSpace
‘ ‘ ここで属性抽出やレイヤ情報の確認を行う
‘ Next
‘ オブジェクトの解放(メモリリークを防ぐ)
Set dbx = Nothing
End Sub
なぜこの設計が「プロフェッショナル」なのか
- 高速性: GUIのレンダリングを介さないため、数十倍の速度で処理が完結する。
- リソース効率: メモリ消費を最小限に抑え、バックグラウンドでバッチ処理を組むことが可能になる。
- 安定性: 図面を開く際に発生する「ダイアログ表示」や「欠落した参照ファイルの警告」による処理中断を回避できる。
—
3. 実務で生き残るための「設計の哲学」
コードを書き始める前に、以下の3点を意識してほしい。
1. オブジェクトの解放を怠るな:
`Set obj = Nothing` を疎かにするエンジニアは、長期稼働するツールを開発できない。特に`AxDbDocument`のような外部オブジェクトは、スコープを抜けてもメモリに残りやすい。確実に解放する癖をつけろ。
2. ハードコードを排除せよ:
バージョン番号(.24など)やファイルパスをコード内に直書きしてはいけない。構成ファイル(INIやJSON)に分離するか、定数として管理し、環境変化に強い設計にすること。
3. 「見えない場所」のケア:
図面を開かずに抽出する場合、当然ながら「AutoCAD画面上のイベント」は発生しない。複雑な計算や図形操作を行う場合は、必ず「同期」の考え方を持つこと。
最後に:エンジニアとしての矜持
AutoCAD VBAは、古い言語と言われることもある。だが、APIの深層を理解すれば、これほど強力な自動化武器はない。今回紹介した`AxDbDocument`の活用は、単なるテクニックではなく、「パフォーマンスを突き詰める姿勢」そのものだ。
君たちが書くコード一つで、現場の設計者が数時間もの単純作業から解放される。その責任と重みを感じながら、最高のツールをビルドしてほしい。
さらなる深淵へ踏み込みたいなら、次は「ObjectARXとの境界」や「トランザクション制御」について語ろう。準備はいいか。
