こんにちは! AutoCAD VBAの海原へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進み、自分の手でCADを自在に操る「エンジニア」への扉を開いたあなたへ。今回は、実務で絶対に役立つ「ファイルサイズの肥大化とサヨナラする技術」をお伝えします。
ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ。ぜひ最後までついてきてくださいね。
—
なぜ、図面ファイルは勝手に太るのか?
図面を描いていると、不思議な現象に遭遇しませんか?
「大して線を描いていないのに、なぜかファイルサイズが数MBもある……」
「コピペを繰り返したら、動作がものすごく重くなった……」
その犯人は、図面の中に残された「ゴミ(未使用のオブジェクト)」です。
- もう使っていない画層(レイヤー)
- 配置したけれど消去したブロック定義
- どこからも参照されていない線種や文字スタイル
これらは、人間が見ていなくても、AutoCADの裏側のデータベース(シンボルテーブル)にこっそりと居座り続けています。これを放置して上書き保存を繰り返すと、ファイルはどんどん肥大化し、ネットワーク経由でのやり取りやオープン・セーブの速度が露骨に落ちていきます。
「じゃあ、保存する前に手動で『名前削除(PURGE)』コマンドを叩けばいいじゃないか」
そう思ったあなた。素晴らしい着眼点です。しかし、毎回の保存でそれを手動でやるのは、エンジニアの美学に反しますよね。
「保存する直前に、VBAで自動的に大掃除を済ませてしまう」
今回は、このスマートな自動化テクニックをあなたに伝授します。
—
AutoCAD VBAにおける「Purge(名前削除)」の壁
さて、ここでAutoCAD VBAならではの「ちょっとした罠」についてお話しておきます。
AutoCADの画面上で「PURGE」と入力すると、ダイアログボックスが出てきて、不要な項目を一網打尽に削除できますよね。しかし、VBAの世界(ActiveX Automation)には、「ダイアログを出して一発で全部消すような都合の良い魔法のメソッド」は存在しません。
代わりに、AutoCADのVBAには`PurgeAll`という強力なメソッドが用意されています。これを使うことで、データベースの隅々まで一気にクリーンアップすることが可能です。
しかし、ここで実務中級者なら知っておくべき「プロの知見」があります。
> 【重要】一度のPurgeでは消しきれないものがある
> ブロックAの中に、使われていないブロックBが入っているような「入れ子構造」の場合、1回目のPurgeではブロックAしか消えません(BはAが消えたことで初めて「未使用」になるため)。
> そのため、実務で完璧な最適化を行うには、「ゴミが出なくなるまでPurgeをループさせる」という泥臭くも確実なロジックが必要になります。
—
実装コード:完全自動パージ&セーブ・マクロ
それでは、開発の現場でそのままコピペして使える実践的なコードを公開します。
このコードは、現在の図面に対して徹底的なパージを行い、その後に上書き保存を実行するプロ仕様のマクロです。
Sub SmartPurgeAndSave()
Dim doc As AcadDocument
Set doc = ThisDrawing
On Error GoTo ErrorHandler
‘ 処理開始のメッセージ(ステータスバーに表示)
doc.Utility.Prompt “図面の最適化(Purge)と保存を開始します…” & vbCrLf
‘ 【核心】パージのループ処理
‘ AutoCADのPurgeAllは、依存関係のある不要オブジェクトを連鎖的に削除するため、
‘ 削除対象がなくなるまで数回ループさせるのがプロの技です。
Dim initialBytes As Long
Dim i As Integer
‘ 連続してPurgeを実行(最大10回まで安全のため制限)
For i = 1 To 10
‘ AutoCADのPurgeAllメソッド
‘ 引数はありません。呼ぶだけで図面内の全未恋オブジェクトが対象になります。
doc.PurgeAll
Next i
‘ 図面を上書き保存
‘ ※もし新規図面(一度も名前をつけて保存していない場合)はエラーになるため注意
If doc.Path = “” Then
MsgBox “この図面はまだ一度も保存されていません。「名前を付けて保存」してください。”, vbExclamation, “保存エラー”
Exit Sub
End If
doc.Save
‘ 完了通知
doc.Utility.Prompt “最適化と保存が正常に完了しました。” & vbCrLf
MsgBox “不要オブジェクトの削除と保存が完了しました!”, vbInformation, “自動化完了”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
コードの解説とエンジニアのこだわりポイント
1. `ThisDrawing` と `AcadDocument`
`ThisDrawing` は、現在AutoCADでアクティブになっている図面を指す特別なオブジェクト変数です。これを `AcadDocument` 型の変数 `doc` に受けることで、IntelliSense(入力補完)が効くようになり、コーディングミスを激減させることができます。
2. なぜ `For` ループで何度も `PurgeAll` を回しているのか?
前述した「入れ子構造のゴミ」を完全に葬り去るためです。1回だけの実行では、親が邪魔をして消せなかった子要素が残ってしまいます。10回というループ回数は、複雑な大規模図面でも完全にゴミを枯渇させるための実用的な安全マージンです。
3. `doc.Path = “”` のトラップ回避
VBAから `doc.Save` を実行する際、その図面がまだ一度もハードディスクに保存されていない(パスが存在しない)場合、AutoCADはパニックを起こしてエラーを吐きます。そのため、`doc.Path` が空文字列(`””`)かどうかを事前にチェックし、未保存図面でのクラッシュを防ぐ安全装置(ガード条件)を組み込んでいます。この気配りが、実務で信頼されるツールの条件です。
—
さらに実務で活用するために:イベントの利用
今回はボタンやコマンドから手動で呼び出すマクロとして紹介しましたが、AutoCAD VBAの「DocumentEvents(図面イベント)」を使えば、ユーザーが「上書き保存(Ctrl + S)」を押した瞬間に、このPurge処理を自動的に割り込ませて実行することも可能です。
「保存するたびに勝手にファイルが軽くなる」
そんなストレスフリーな環境を、ぜひあなたの手で構築してみてください。
ここをマスターしたあなたなら、次は画層の自動整理や、外部参照(Xref)の一括管理など、より高度な自動化の世界へスムーズに進めるはずです。
それでは、快適なAutoCADライフを!
