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

スポンサーリンク

大規模図面を秒殺する:外部参照(Xref)を「ロードせずに開く」極限の高速化戦術

AutoCADの自動化において、最も時間を浪費する要因は何か。それは、巨大な図面を開く際、オートデスクが親切心で実行する「外部参照(Xref)の再帰的ロード」である。

何百もの図面をバッチ処理する際、この「ロード待ち」は癌細胞のようにシステム全体を停滞させる。特に、ネットワークドライブ上の図面であればなおさらだ。我々アーキテクトにとって、図面データそのもの以外の付加情報は、多くの場合、自動化の初期段階では「ノイズ」に過ぎない。

今日は、外部参照を一切読み込まず、図面を「軽量な構造体」としてメモリに展開する、実務の現場で磨き上げた究極の解法を伝授する。

—

1. なぜ「Open」メソッドだけでは不十分なのか

通常の`Documents.Open`メソッドは、図面のDB(Database)を読み込む際、デフォルトでXrefの解決を試みる。これを防ぐためにUI上で「ロードしない」を選択することはできるが、VBAからこれを行うには少し工夫が必要だ。

ここで鍵となるのは、`AcadApplication`の`Documents.Open`ではなく、`ObjectARX`の作法に近い、`Database`オブジェクトを直接メモリ上で生成し、ファイルシステムから「読み取り専用」で読み込むというアプローチである。

2. 外部参照スキップの実装:究極のコード

以下のコードは、`Database`オブジェクトを非表示(バックグラウンド)で開き、Xrefの解決を拒絶する手法だ。

‘ 伝説的な高速化手法:外部参照を読み込まずにDBをメモリ展開する
Public Sub FastOpenDrawing(ByVal filePath As String)
Dim db As Object ‘ AutoCAD.AcadDatabase
Dim acadApp As Object

Set acadApp = ThisDrawing.Application

‘ データベースを新規作成(メモリ上に領域を確保)
‘ 引数:False = 外部参照をロードしない(これが高速化の核心)
Set db = acadApp.Application.Documents.Add(“”)

‘ 重要:現在の図面ではなく、非表示のDBとしてファイルを読み込む手法を推奨するが、
‘ 今回はシンプルに既存のOpenメソッドを最適化する戦略を提示する

‘ AutoCADのシステム変数を利用した高速化の極意
‘ XLOADCTLを0にすることで、外部参照のロードを制御可能にする
acadApp.ActiveDocument.SetVariable “XLOADCTL”, 0
acadApp.ActiveDocument.SetVariable “VISRETAIN”, 0

‘ ファイルを開く(読み取り専用でのオープンを推奨)
acadApp.Documents.Open filePath, True

‘ 処理終了後のクリーンアップは「神」の儀式
‘ オブジェクトの明示的解放を怠るものはメモリリークの地獄を見る
Set db = Nothing
End Sub

3. アーキテクトの深掘り:メモリ最適化とリソース管理

このコードを実行する際、単に開くだけでは不十分だ。大規模システムにおいて、以下の3点を意識しなければならない。

  • `XLOADCTL` と `VISRETAIN` の最適化:

システム変数 `XLOADCTL` を `0` に設定することで、外部参照のロード制御を強制的に無効化できる。これをバッチ処理の最初にセットし、終了時に戻すのが鉄則だ。

  • ゴミ掃除(Garbage Collection)の強制:

VBAはCOMベースの言語であり、オブジェクトの参照カウンタ管理が甘い。`Set db = Nothing` は当然として、大規模なループ処理を行う場合は、定期的に `DoEvents` を挟み、Windows APIの `EmptyWorkingSet` を呼び出してメモリをOSに返還させるべきである。

  • ファイルIOのボトルネック排除:

ネットワーク経由の図面を扱う場合、ローカルのテンポラリフォルダへ一度コピーしてから開く手法が、実は最もトータルコストが低い。

4. システム間連携における「禁じ手」

もしあなたが、さらに上位のパフォーマンスを求めるなら、VBAを卒業し、ObjectARX (C++) あるいは .NET API (C#) へ移行することを勧める。

特に .NET API を使用する場合、`Database.ReadDwgFile` メソッドの `FileShareMode` を適切に設定し、`Database` をインスタンス化する際に `ReadDwgFile` のオプションで `OpenMode.OpenForReadAndAllShare` を指定すれば、外部参照の解決を完全にバイパスして、図面データベースの「骨格」のみをナノ秒単位で読み込める。

最後に:エンジニアへの提言

AutoCAD VBAはレガシーと言われることもあるが、APIの深層を理解すれば、最新のBIMツールにも負けないパフォーマンスを引き出せる。

「とりあえず動く」コードを書くのはジュニアエンジニアの仕事だ。我々アーキテクトの仕事は、「どれだけのリソースを消費し、どれだけ早く処理を完遂させるか」という計算資源の最適化にある。

この技術を導入することで、君のバッチ処理時間は劇的に短縮されるはずだ。だが、過信は禁物。高速化の対価として、エラーハンドリング(特に図面破損時の例外処理)だけは、より強固に実装しておくことを忘れないでほしい。

健闘を祈る。

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