【テクニカル・上級編】【実務中級者向け】「名前削除(Purge)」と「監査(Audit)」を組み合わせた「超軽量化セーブ」マクロの構築 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCADの「肥大化」を根絶せよ:PurgeとAuditを極めた超軽量化セーブの実装論

AutoCADの図面ファイルが、何千もの不要なオブジェクトやレジストリ由来のゴミで膨れ上がる現象は、いわば「デジタルなメタボリックシンドローム」だ。多くの開発者は「SAVEコマンドを叩けば良い」と考えるが、それは表層的な処理に過ぎない。

現場で数GBの図面を扱うシニアエンジニアならば理解しているはずだ。「真の最適化は、データベースの整合性を物理的に再構築することから始まる」という事実を。

本稿では、VBAを駆使し、単なる保存を超えた「データ構造の再構築」を行う超軽量化ルーチンを解説する。

—

なぜ「SAVE」だけでは不十分なのか

AutoCADのDWGファイルは、単なる図形データの集まりではない。膨大なテーブル(レイヤー、線種、ブロック定義、画層フィルタ)が複雑に絡み合うデータベースだ。

  • 重複するネストされたブロック
  • 消去不能な「名前削除」対象外のゴミ
  • メモリリークを引き起こす無効なインデックス

これらはSAVEコマンドでは決して解消されない。これらを一掃するには、`Audit`コマンドによるデータベースの整合性チェックと、反復的な`Purge`処理の組み合わせが必須となる。

—

実装の核心:Purge & Auditの自動化ロジック

VBAでこれを実現する際、最も注意すべきは「コマンド実行時の同期制御」だ。AutoCADのコマンドは非同期的に振る舞うことが多く、単純な`SendCommand`では処理が完了する前に制御が戻り、不整合を起こす。

以下のコードは、効率を極限まで高めた最適化セーブの核である。

‘ 伝説的な最適化ルーチン:超軽量化セーブ
Public Sub OptimizeAndSave()
Dim doc As AcadDocument
Set doc = ThisDrawing

‘ 1. 警告の抑制(システム変数を保存して最適化)
Dim oldCmdEcho As Integer
oldCmdEcho = doc.GetVariable(“CMDECHO”)
doc.SetVariable “CMDECHO”, 0

‘ 2. 監査(Audit)による整合性の修復
‘ 自動修復モード(Y)でデータベースの無効なポインタを物理的に削除
doc.SendCommand “_AUDIT” & vbCr & “Y” & vbCr

‘ 3. 名前削除(Purge)の反復
‘ AutoCADのPurgeは1回では完全に消えない場合があるため、3回ループが定石
Dim i As Integer
For i = 1 To 3
‘ 全ての名前付きオブジェクト(All)を削除、ネストされたブロックも追跡
doc.SendCommand “-PURGE” & vbCr & “A” & vbCr & “” & vbCr & “N” & vbCr
Next i

‘ 4. ファイルサイズの最小化保存
‘ SaveAsではなくSaveを使用し、データベースを再構築(WBLOCK相当のクリーンアップ)
doc.Save

‘ 5. システム変数の復元とメモリ開放
doc.SetVariable “CMDECHO”, oldCmdEcho

‘ オブジェクトの明示的開放
Set doc = Nothing

MsgBox “最適化が完了しました。データベース整合性を確保済み。”, vbInformation
End Sub

—

チーフアーキテクトからの深層アドバイス

1. SendCommandの限界とWindows API

大規模プロジェクトで`SendCommand`が不安定になる場合、それはAutoCADのメッセージキューが飽和している兆候だ。そのような極限環境では、`Win32 API`の`PostMessage`を用いて、AutoCADのメインウィンドウへ直接コマンドを注入する手法を推奨する。これにより、VBAの実行スレッドとAutoCADの描画スレッドを意図的に分離できる。

2. オブジェクトのライフサイクル管理

VBAはCOMベースの言語であり、メモリ管理が甘い。特に`AcadDocument`や`AcadDatabase`オブジェクトをループ内で何度も取得するのは悪手だ。必ず`Set`で参照し、処理終了後は`Nothing`で確実に解放する。これを怠れば、長時間のバッチ処理でAutoCADが「スタックオーバーフロー」または「メモリアクセス違反」でクラッシュするのは時間の問題だ。

3. レガシー環境における保守性

もし社内システムが古いAutoCADバージョンを含んでいるなら、`Purge`コマンドの挙動がバージョンごとに微妙に異なることに留意せよ。特に`_PURGE`(ダイアログ形式)と`-PURGE`(コマンドライン形式)の使い分けは、クロスバージョン対応の必須条件である。

—

結びに代えて

自動化とは、単にコードを書くことではない。「システムが抱える負債を、技術の力でいかに可視化し、解消するか」という思想の体現だ。

今回のコードを実装するだけで、図面ファイルのサイズは劇的に減り、読み込み速度は向上する。しかし、真のプロフェッショナルであれば、その先にある「なぜファイルが肥大化したのか」という運用フローの欠陥にまでメスを入れてほしい。

AutoCAD VBAは、使いこなせば最強の武器になる。諸君の健闘を祈る。

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