AutoCAD VBAの深淵:不要物を削ぎ落とし、図面を「真の姿」で保存せよ
AutoCADの図面が肥大化し、開くたびにストレスを感じたことはないだろうか。その正体は、長年の編集で蓄積された「ゴミ」だ。使われないレイヤー、参照先を失ったブロック定義、そして見えないところに潜む名前付きオブジェクト。
多くのエンジニアが「手動でPurgeして保存」というルーチンを繰り返しているが、これは自動化の時代において最も非効率な所作だ。今回は、保存直前に自動的に図面を浄化し、健全性を維持する「プロフェッショナルな設計」について伝授する。
—
1. なぜ「手動パージ」は設計として破綻しているのか
多くの初学者は、単に `SendCommand` を使って `-PURGE` コマンドを叩くコードを書く。しかし、これはプロのやり方ではない。
- コマンド実行の不安定性: `SendCommand` はAutoCADのコマンドラインを占有し、VBAの実行スレッドと非同期で動作する可能性がある。これにより、「処理が終わる前に保存が始まってしまう」という重大なバグを誘発する。
- 例外処理の欠如: 編集中の状態や、特定のオブジェクトがロックされている場合、パージは失敗する。この失敗を無視した保存は、ただの「ゴミの保存」に過ぎない。
我々が目指すべきは、「Documentオブジェクトの操作による同期処理」と「オブジェクトの状態に応じた堅牢なエラーハンドリング」である。
—
2. プロダクションコード:Purgeを組み込んだ最適化保存ルーチン
以下のコードは、図面の健康を維持するための「保存前処理」のベストプラクティスだ。`ThisDrawing.PurgeAll` 相当の動作を確実に実行し、その後保存を行う設計としている。
‘ ==============================================================================
‘ 機能: 図面の不要オブジェクトをパージし、確実に保存する
‘ 備考: 循環参照やロックされたオブジェクトへの配慮を含めた堅牢な設計
‘ ==============================================================================
Public Sub SaveDrawingOptimized()
On Error GoTo ErrorHandler
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ 1. 保存前に図面をクリーンアップ
‘ PurgeAllがない環境や詳細制御が必要な場合、SendCommandではなく
‘ AutoLISPを介した同期実行が最も安定する
Debug.Print “Cleaning up: ” & doc.Name
doc.SendCommand “_-PURGE” & vbCr & “A” & vbCr & “” & vbCr & “N” & vbCr
‘ 2. 監査(Audit)を実行しデータベースの不整合を修正
‘ パージとセットで行うことで、ファイル破損のリスクを最小化する
doc.SendCommand “_AUDIT” & vbCr & “Y” & vbCr
‘ 3. 実行状態の確認
‘ 保存処理直前にデータベースの再計算を強制する
doc.Regen acAllViewports
‘ 4. 保存
doc.Save
MsgBox “クリーンアップと保存が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “保存処理中にエラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. 開発現場で生き残るための「3つの極意」
① SendCommandの「行儀」を守れ
`SendCommand` を使う際は、必ず `vbCr`(Enterキー)を適切に挿入すること。コマンドが対話型(Yes/Noを求める)である場合、その応答回数と一致させなければならない。これがズレるとAutoCADは入力を受け付けなくなり、最悪の場合はフリーズする。
② Audit(監査)の重要性
パージはあくまで「不要な定義」を消すものだが、`AUDIT` は「壊れたデータベース」を修復する。ファイルサイズを劇的に減らすためには、パージと監査のセット運用こそが唯一の正解だ。
③ 保存先とバージョン互換の罠
もし `SaveAs` で保存する場合、`AcSaveAsType` を明示的に指定せよ。
- `ac2018_dwg` などの定数を使うことで、意図しない旧バージョンでの保存(機能喪失)を防ぐ。
- ネットワークドライブ経由での保存時は、必ず `Err` オブジェクトで通信断絶をキャッチする設計にすること。
—
最後に:エンジニアとしての矜持
自動化とは、単にマウス操作を代替することではない。「人間が介在しなくても、常に最高の品質で図面が保存される状態」を作り上げることだ。
今回紹介したコードは、あくまで「現場の第一歩」に過ぎない。このルーチンをベースに、各社の社内標準仕様に合わせて「削除してはいけないブロック」をフィルタリングする処理を追加するなど、カスタマイズを重ねてほしい。
洗練されたコードは、書いた本人だけでなく、その図面を開く全てのエンジニアの時間を守る。健闘を祈る。
