【AutoCAD VBA】重量級図面を瞬時に開く:外部参照(Xref)ロードスキップの極意
AutoCADの自動化に取り組むエンジニア諸君。特に、数百の外部参照(Xref)がリンクされた「巨大な図面ファイル」を扱う現場で、`Documents.Open` を実行してコーヒーを淹れに行く習慣は、今日で卒業しよう。
AutoCADのオープンプロセスにおいて、外部参照の解決(Resolved)は、単なるファイルの読み込み以上の計算コストを強いる。レイアウトの再計算、パスの検証、そして依存関係のツリー構築。これらは、図面の内容を「確認するだけ」の自動化ツールにとっては、極めて無駄なオーバーヘッドだ。
今回は、AutoCADの内部システム変数 `XLOADCTL` と `DEMANDLOAD` を巧みに操り、外部参照のロードを「物理的」かつ「一時的」に無効化して爆速で図面を開くテクニックを伝授する。
—
なぜ「普通に開く」と遅いのか?
AutoCADはデフォルト設定で、ファイルを開く際に全外部参照のパスを検証し、必要に応じてメモリへ展開する。これはマルチユーザー環境では正義だが、「図面内の特定の画層を抽出したい」「属性情報を書き換えたい」といった自動化タスクにおいては、完全にボトルネックとなる。
我々が目指すべきは、「必要最小限のデータで図面をロードし、タスク終了後に安全に閉じる」というライフサイクル管理だ。
—
爆速オープンを実現する実装戦略
外部参照を制御するには、AutoCADのシステム変数 `XLOADCTL` を一時的に書き換えるのが定石だ。
- XLOADCTL = 0: 外部参照をロード(低速)
- XLOADCTL = 2: 外部参照をロードするが、元のファイルをロックしない(読み取り専用ライク)
- XLOADCTL = 1 (または設定変更でオフ): 特定条件下で外部参照のロードを制御可能
しかし、最も強力なのは、「外部参照のパスを一時的に無効化する」アプローチではない。`Application.Documents.Open` の引数とシステム変数の事前制御によって、AutoCADのエンジンに「外部参照を読み込むな」と指示を出すことだ。
プロダクションコード:高速オープン・クローズテンプレート
このコードは、堅牢性を重視し、異常終了時にもシステム変数が元に戻るよう設計している。
Option Explicit
‘ @brief 指定された図面を外部参照をロードせずに高速オープンする
‘ @param filePath 図面ファイルのフルパス
Public Sub FastOpenDrawing(ByVal filePath As String)
Dim originalXLoadCtl As Integer
Dim doc As AcadDocument
‘ 1. 現在のシステム変数を保存(後で必ず戻すため)
originalXLoadCtl = ThisDrawing.GetVariable(“XLOADCTL”)
‘ 2. XLOADCTLを0に設定して外部参照の自動解決を抑制
‘ ※環境により 1 や 2 を使い分けるが、0が最も厳格
ThisDrawing.SetVariable “XLOADCTL”, 0
On Error GoTo Cleanup
‘ 3. 図面を開く(ReadOnlyで開くのが最も高速)
Set doc = Application.Documents.Open(filePath, True)
‘ — ここに自動化処理を記述 —
Debug.Print “図面タイトル: ” & doc.Name
‘ —————————-
Cleanup:
‘ 4. エラーの有無にかかわらず、必ず元の設定に戻す(重要!)
ThisDrawing.SetVariable “XLOADCTL”, originalXLoadCtl
If Not doc Is Nothing Then
doc.Close False ‘ 保存せずに閉じる
End If
If Err.Number <> 0 Then
MsgBox “エラー発生: ” & Err.Description, vbCritical
End If
End Sub
—
現場で絶対に守るべき「3つの鉄則」
1. システム変数の「原状回復」は絶対命令
VBAの最も醜いバグは、ツールが異常終了した後、AutoCADの環境設定が破壊されたまま残ることだ。`On Error GoTo` を使用し、どのような例外が発生しても `SetVariable` で元の値を書き戻すコードを徹底せよ。これを怠るエンジニアに、プロの称号は与えられない。
2. ロックファイル(.lock)問題の回避
`XLOADCTL` を操作する際、共有フォルダ上の図面ではロックファイルの問題が顕在化することがある。読み取り専用 (`ReadOnly = True`) で開くことが、パフォーマンス向上と同時編集トラブル回避の両面で最良の解だ。
3. オブジェクトの参照寿命を意識せよ
`Application.Documents.Open` で開いたドキュメントを `doc` オブジェクトに代入する際、`ThisDrawing` と混同しないこと。自動化ツールが大規模になるほど、複数のドキュメントを操作する機会が増える。常に「どのドキュメントに対して処理を行っているか」を明示的に記述しろ。
—
総括:エンジニアとしての視座
外部参照をスキップするということは、図面データの一部が「欠落している」状態で作業を行うことを意味する。もし君が、欠落している外部参照内のブロックを操作しようとすれば、当然ながらエラーになるだろう。
このテクニックは、「図面全体をロードする必要があるのか?」「ヘッダ情報やモデル空間の特定オブジェクトだけが必要なのではないか?」という問いに対する一つの回答だ。
もし、さらなる高速化を求めるなら、ObjectARXや .NET API (Databaseクラス) を使い、DWGファイルを「図面を開かずに(Databaseオブジェクトとして)」読み込む設計へ移行すべきだ。しかし、VBAという制約の中で最大限のパフォーマンスを引き出すことこそが、実務を知るエンジニアの矜持である。
さあ、このコードを武器に、君の業務を次のステージへ引き上げろ。
