AutoCADの「肥大化」を根絶せよ:VBAによる自動Purge実装の極意
こんにちは。現場で長年AutoCADと向き合っていると、避けて通れないのが「図面ファイルの肥大化」という問題です。
「ただ保存するだけ」で数MBも容量が増える……。原因は、使い終わったレイヤー、消したはずのブロック定義、そして目に見えないゴミデータ(名前削除できないオブジェクト)です。
今回は、「保存ボタンを押すたびに自動でPurge(名前削除)を実行する」という、実務で即戦力となる自動化ルーチンを伝授します。マクロの記録から一歩先へ進みたいあなたへ、AutoCADの内部メモリを掌握する技術をお教えしましょう。
—
なぜ「手動のPurge」では不十分なのか
多くの設計者は、図面を閉じる前に手動で `PURGE` コマンドを打ちます。しかし、人間は忘れる生き物です。また、Purgeには「一度の実行では消せないネストされた要素」が存在することをご存知でしょうか?
本当のエンジニアリングは、「ヒューマンエラーを仕組みで殺す」ことから始まります。VBAを使って、保存プロセスの直前に「完全なクリーンアップ」を強制的に組み込むのです。
—
実装の鍵:SendCommand と「再帰的処理」
AutoCAD VBAで図面を操作する際、最も強力かつ注意が必要なのが `SendCommand` メソッドです。これはコマンドラインに直接命令を投げる手法ですが、「コマンドが終了するまで待機する」という特性を理解していないと、処理が空振りします。
自動Purgeを実行する実装コード
以下のコードをVBAエディタ(`VBAIDE`)の `ThisDrawing` モジュールに貼り付けてください。
Public Sub CleanAndSave()
‘ 1. 現在の図面オブジェクトを取得
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ 2. 警告やダイアログを抑制(自動化の基本:ユーザーを待たせない)
doc.SetVariable “CMDECHO”, 0
doc.SetVariable “QAFLAGS”, 1 ‘ Purgeの確認ダイアログをスキップ
‘ 3. Purgeの実行
‘ “-PURGE” コマンドの「R(全消去)」→「(全て対象)」→「N(確認なし)」の順
‘ ネストされた不要要素を確実に消すため、3回繰り返すのが現場の定石
Dim i As Integer
For i = 1 To 3
doc.SendCommand “-PURGE” & vbCr & “R” & vbCr & “” & vbCr & “N” & vbCr
Next i
‘ 4. 図面の保存
doc.Save
‘ 5. 設定を元に戻す
doc.SetVariable “QAFLAGS”, 0
doc.SetVariable “CMDECHO”, 1
MsgBox “図面のクリーニングと保存が完了しました。”, vbInformation, “自動化完了”
End Sub
—
コードの「ここが重要!」ポイント
1. `SendCommand` と `vbCr` の関係
`SendCommand` の中にある `vbCr` は「Enterキー」を意味します。コマンドラインに文字を打ち込むだけでなく、しっかり「確定」させることで、プログラムは正しく動作します。
2. なぜPurgeを「3回」繰り返すのか?
これが経験則に基づく知恵です。AutoCADのブロック定義は「入れ子(ネスト)」になっていることが多々あります。1回目のPurgeで外側が消え、初めて2回目で内側のゴミが「削除可能」な状態になります。3回行えば、ほぼ全てのゴミがクリーンアップされます。
3. `QAFLAGS` という名の「魔法のスイッチ」
`QAFLAGS` を `1` に設定することで、通常であれば画面に表示される「このアイテムを削除しますか?」という煩わしいダイアログを強制的にOFFにできます。これを忘れると、自動化プロセスがダイアログで停止してしまいます。
—
陥りやすいエラーと対策
- 「コマンドが実行されません」という場合
AutoCADが現在「コマンド入力待ち」の状態でない可能性があります。`ThisDrawing.SendCommand` を実行する直前に、`SendKeys “{ESC}{ESC}”` を入れて、アクティブなコマンドを確実にキャンセルする癖をつけましょう。
- ファイルが開けないエラー
ファイルが「読み取り専用」になっていないか確認してください。VBAはOSの権限に左右されます。
—
さあ、次のステップへ
このルーチンをマスターすれば、あとはこのマクロを「リボンメニュー」に登録するだけです。そうすれば、あなたはもう「重い図面」に頭を悩ませることはなくなります。
プログラミングとは、単にコードを書くことではありません。「本来人間がやらなくていい雑務を、マシンに肩代わりさせること」です。
今日からこのコードをあなたの武器にし、一つ上のステージのエンジニアを目指してください。また何か分からないことがあれば、いつでも聞きに来てくださいね。応援しています!
