【実務の極意】図面の「重さ」を根絶せよ!DGN線種データの肥大化を防ぐVBAクリーンアップ術
こんにちは。今日も図面作成、お疲れ様です。
「昨日までサクサク動いていた図面が、なぜか急に重くなった……」
「保存するたびに、あの『保存中…』のプログレスバーが異様に長く感じる……」
もしあなたがそんな経験をしているなら、それは図面の中に「目に見えない幽霊」が住み着いているサインかもしれません。その正体こそが、今回私たちが退治するターゲット、「DGN線種データ(DGN Linetype Bloat)」です。
今日は、マクロの記録(Record Macro)という初級ステップを終え、「実務で使える自動化」へと足を踏み入れたあなたに、プロの現場で必須となる「図面クリーンアップの自動化」を伝授します。
ここをクリアすれば、AutoCAD VBAを扱うエンジニアとしての視座が一段高く引き上げられますよ。さあ、一緒に見ていきましょう。
1. なぜ図面は「勝手に」重くなるのか?
まず、敵を知ることから始めましょう。なぜ、何もしていないのにファイルサイズが肥大化するのでしょうか。
原因の多くは、「他のCADソフト(MicroStationなど)から持ち込まれた不要なデータ」です。図面をコピーしたり、外部参照(Xref)を貼り付けたりする過程で、DGN形式の線種定義などのメタデータが、図面の裏側にこっそり入り込んでしまいます。
これらは通常の「未使用アイテムの削除」では消えないことが多く、図面を読み込むたびにメモリを消費し、保存速度を著しく低下させます。いわば、「図面の中のゴミ」が、目に見えない形で積み重なっている状態なのです。
2. 「マクロの記録」では届かない領域
「マクロの記録」機能を使えば、画面上の操作をそのままコードにできます。しかし、今回のような「クリーンアップ」には向きません。
なぜなら、`PURGE`(名前削除)コマンドは、実行すると「本当に削除しますか?」といったダイアログボックス(確認画面)を表示するからです。マクロの記録は「画面上のボタンをクリックすること」は記録できても、「ダイアログに対して論理的にどう答えるか」という制御が苦手なのです。
そこで登場するのが、コマンドライン・インターフェース(CLI)への直接介入です。
3. 解決策:`-PURGE` コマンドをVBAから操る
AutoCADのコマンドには、頭にハイフンを付けた `-PURGE` という形式があります。これを使うと、ダイアログを表示させず、すべてコマンドライン上でのテキスト入力だけで完結させることができます。
これをVBAの `SendCommand` メソッドを使って、プログラムから「文字を打ち込ませる」のです。
【実践】クリーンアップ&保存自動化コード
以下のコードは、図面内の不要なデータを一掃し、その後に上書き保存を行う実戦的なルーチンです。
Option Explicit
''' <summary>
''' 図面内の不要なDGNデータや未使用アイテムをクリーンアップし、保存する
''' </summary>
Sub Professional_CleanupAndSave()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing ' 現在開いている図面を対象にする
On Error GoTo ErrorHandler
Debug.Print "--- クリーンアップ処理を開始します ---"
' 1. コマンドライン経由でPURGEを実行
' コマンドの構成:
' -PURGE (ハイフン付きでダイアログを抑制)
' R (Regapps: 登録アプリケーションの削除。DGN対策に非常に有効)
' * (すべての名前を対象)
' N (確認メッセージに対して「いいえ」=すべて削除)
' vbCr は Enterキーを意味します
Debug.Print "DGN/Regappsのクリーニング中..."
acadDoc.SendCommand "-PURGE" & vbCr & "R" & vbCr & "*" & vbCr & "N" & vbCr
' 2. その他の未使用アイテム(線種、レイヤー等)をまとめて削除
' A (All: すべてのアイテム)
' N (確認メッセージに対して「いいえ」=一括削除)
Debug.Print "未使用アイテムのクリーンアップ中..."
acadDoc.SendCommand "-PURGE" & vbCr & "A" & vbCr & "*" & vbCr & "N" & vbCr
' 3. 最後に図面を保存
' 保存処理を挟むことで、クリーンな状態をファイルに書き込みます
Debug.Print "図面を保存しています..."
acadDoc.Save
MsgBox "クリーンアップと保存が完了しました!" & vbCrLf & _
"図面が軽量化されたはずです。", vbInformation, "成功"
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical, "実行エラー"
End Sub
4. コードの「魂」を読み解く:エンジニアの視点
このコードには、単なる動作以上の「設計思想」が詰まっています。
`vbCr` の重要性
`vbCr` は Carriage Return(キャリッジリターン)、つまりキーボードの Enterキー を意味します。
`SendCommand` は、人間がコマンドラインに文字を打ち込んで Enter を叩く動作をシミュレートしています。
`”-PURGE” & vbCr & “R” & vbCr` と書くことで、「`-PURGE` と打って Enter」「`R` と打って Enter」という連続した動作をプログラムが代行しているのです。
なぜ `Regapps` (R) を指定するのか?
DGNデータの肥大化の主犯格の一つに「登録アプリケーション(Regapps)」があります。これは、外部ソフトが図面に書き込んだ設定情報です。これを `-PURGE` の `R` オプションで消去することが、ファイルサイズ削減の最大の鍵となります。
オブジェクトのライフサイクルを意識する
「クリーンアップしてから保存する」という順序は、オブジェクトのライフサイクルにおいて極めて重要です。メモリ上に残っている「ゴミ」を、ファイルに書き込む(Save)前に物理的に除去する。この「整理整頓してから梱包する」という意識が、プロの自動化エンジニアの作法です。
5. 陥りやすい罠と回避策(トラブルシューティング)
このコードを運用する上で、以下の点に注意してください。
1. 「コマンド実行中」に実行してはいけない
AutoCADが何らかのコマンド(LINEやMOVEなど)を実行している最中に `SendCommand` を送ると、コマンドが混ざってしまい、予期せぬ動作を引き起こします。必ず、何も操作していない状態で実行されるように設計しましょう。
2. 読み取り専用ファイルへの実行
読み取り専用(Read-Only)の図面に対して `Save` を行うとエラーになります。実務では、`If acadDoc.ReadOnly Then …` といった条件分岐を入れて、エラーを未然に防ぐのがスマートです。
3. Undo(元に戻す)の履歴
`SendCommand` による操作は、Undo履歴に蓄積されます。大量のデータを削除した直後に「あ、やっぱり戻したい!」と思っても、コマンドライン経由の操作は複雑なため、戻すのが難しい場合があります。
最後に:あなたはもう「ただのユーザー」ではない
いかがでしたか?
「マクロの記録」は、あくまで「操作の録画」です。対して、今回学んだ `SendCommand` を用いた手法は、「AutoCADの脳(コマンドライン)に直接語りかける」高度な技術です。
図面が重いという現象に対し、「仕方ない」と諦めるのではなく、「プログラムで解決しよう」と考える。その思考プロセスこそが、エンジニアとしての成長の源泉です。
一歩ずつ、確実に。この知識をあなたの武器にして、より快適な設計環境を作り上げていってください。応援していますよ!
