【実務・中級編】【実務中級者向け】外部参照(Xref)のロードをスキップして図面オープンを高速化するテクニック – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA】大規模図面の「呪縛」を解く。外部参照(Xref)を無視して爆速で開く技術

AutoCADで数千枚の図面をバッチ処理する際、多くのエンジニアが直面する壁がある。そう、「外部参照(Xref)の読み込み待ち時間」だ。

大規模なプロジェクトになればなるほど、図面には無数の外部参照がリンクされている。VBAで `Documents.Open` を実行した瞬間、AutoCADは律儀にそれら全てのリンク先を探し、読み込み、再生成を行う。この「親切心」が、自動化ツールにおいては致命的なボトルネックとなる。

今日は、業務効率化の最前線に立つ君たちへ、「不要な外部参照を読み込まず、図面を瞬時に開く」ための極限のテクニックを伝授する。

—

なぜ「そのまま開く」ことが罪なのか

AutoCADは図面を開く際、デフォルトで全ての外部参照をロードしようとする。ネットワーク越しに配置された巨大な外部参照や、リンク切れの図面が混ざっている場合、タイムアウトやフリーズが頻発する。

これを解決する唯一の正攻法は、システム変数 `DEMANDLOAD` を一時的に操作し、図面オープン時の挙動を制御することだ。

—

実装のコア:`DEMANDLOAD` の制御

`DEMANDLOAD` は、外部参照の要求ロード(Demand Loading)を制御するシステム変数である。これを一時的に「0(読み込まない)」に設定することで、図面内の参照情報を無視して、ホスト図面のデータのみをメモリに展開できる。

実践的プロダクションコード

以下のコードは、エラーハンドリングを徹底し、オープン後に必ずシステム変数を復元する「堅牢な設計」を採用している。

‘ ———————————————————
‘ 目的: 外部参照をロードせずにDWGを高速オープンする
‘ ———————————————————
Public Sub OpenDrawingFast(ByVal filePath As String)
Dim doc As AcadDocument
Dim originalDemandLoad As Integer

‘ 1. 現在のシステム変数を退避
originalDemandLoad = ThisDrawing.GetVariable(“DEMANDLOAD”)

‘ 2. 外部参照の要求ロードを無効化 (0: ロードしない)
ThisDrawing.SetVariable “DEMANDLOAD”, 0

On Error GoTo ErrorHandler

‘ 3. 図面を開く
Set doc = Application.Documents.Open(filePath, False)

‘ — ここに高速処理を記述 —
Debug.Print “高速ロード完了: ” & doc.Name

‘ 終了処理へ
GoTo Finally

ErrorHandler:
MsgBox “図面のオープンに失敗しました: ” & Err.Description, vbCritical

Finally:
‘ 4. 必ずシステム変数を元に戻す(重要!)
ThisDrawing.SetVariable “DEMANDLOAD”, originalDemandLoad
End Sub

—

このコードを「業務レベル」に昇華させるための注意点

単に動くだけのコードでは、現場の運用には耐えられない。以下の3つの鉄則を守れ。

1. 状態の復元(Finallyブロックの概念)

VBAには `Try-Finally` 構文がない。そのため、`On Error GoTo` を駆使して、異常終了時であっても `SetVariable` が必ず実行される設計にしなければならない。これを怠ると、次回のAutoCAD起動時に外部参照が読み込まれなくなり、現場から「ツールを使うと図面がおかしくなる」というクレームが上がる。

2. ファイルアクセスの排他制御

大規模図面セットを連続処理する場合、ファイルのオープン状態を厳密に管理する必要がある。処理が終わるたびに `doc.Close False` を呼び出し、メモリを解放せよ。さもなくば、AutoCADの `ObjectDBX` を検討するフェーズだ。今回の手法は、図面の「見た目」や「モデル空間のデータ」をいじりたい場合にこそ真価を発揮する。

3. ネットワークトラフィックの考慮

`DEMANDLOAD` を切ることで、ネットワーク上のファイルパス探索が省略される。これは、特に低速なVPN環境下でのバッチ処理において、劇的な時間短縮(場合によっては5分かかっていた処理が数秒になる)をもたらす。

—

さらなる高みへ:ObjectDBXという選択肢

もし君が「図面を開く必要すらない(図面内の属性値抽出や特定のブロックの置換のみが目的)」のであれば、`Documents.Open` すら使うべきではない。`ObjectDBX (AxDbDocument)` を使用すれば、AutoCADのGUIを介さずに、バックグラウンドで高速かつ安全にDWGを操作できる。

しかし、「画面表示が必要なコマンドを呼び出す」あるいは「図面内の情報を確認しながら修正したい」という要件であれば、今回の `DEMANDLOAD` 制御が最も確実で、かつモダンな解である。

まとめ

  • 無駄な読み込みは排除せよ: `DEMANDLOAD` を0にするだけで、世界は変わる。
  • 変数は必ず戻せ: 後の自分や同僚が困らないよう、環境汚染は最小限に。
  • 堅牢なエラー制御: `On Error` を使いこなし、何が起きても安全に閉じる。

このコードを君のライブラリに組み込み、今まで「処理が終わるまでコーヒーを飲みに行っていた」時間を、クリエイティブな設計業務に変えてほしい。それがエンジニアとしての真の価値だ。

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