【テクニカル・上級編】【実務中級者向け】保存前に「Zoom Extents(全体表示)」を強制実行:サムネイルの視認性を高める一括セーブ術 – AutoCAD VBA解析バイブル

スポンサーリンク

現場の「見栄え」を極める:AutoCAD保存前処理の最適化とメモリマネジメント

多くのエンジニアが軽視しがちな「保存直前の表示状態」。Windowsエクスプローラーのサムネイルや、図面管理システムのプレビューで「真っ暗な画面」や「意図しないズーム位置」が表示され、上司やクライアントから指摘を受けた経験はないだろうか。

これは単なる見栄えの問題ではない。図面検索の効率、ひいては組織全体の生産性に直結する「UI/UXの基本」である。今回は、AutoCAD VBAを用い、保存前に強制的に `ZoomExtents` を実行し、かつメモリを汚さない「プロフェッショナルなセーブ・ルーチン」の構築法を伝授する。

—

1. なぜ「Zoom Extents」が重要なのか

AutoCADのサムネイル生成は、ファイル保存時の表示領域をキャプチャする。デフォルトのまま保存すると、前回の作業状態がそのまま記録される。巨大な図面で微小な線分にズームしたまま保存すれば、プレビューは何も映らない。

これを防ぐには、`Database.SaveAs` の前に必ずビューを全域へ誘導する必要がある。しかし、単にコマンドを叩くだけでは不十分だ。AutoCADの非同期処理や、COMオブジェクトの残存によるメモリリークを考慮せねばならない。

—

2. 実装の核心:COMインターフェースの完全制御

VBAで実装する場合、`SendCommand` は避けるべきだ。これは処理が同期されず、かつ図面の状態に依存するため不安定極まりない。必ず `Application.ZoomExtents` メソッドを直接叩くこと。

また、大規模図面でのメモリリークを防ぐため、オブジェクトはスコープを限定し、明示的にNothingを代入する。

‘ 【実務推奨】安全かつ高速な保存前処理ルーチン
Public Sub OptimizedSave(ByVal targetDoc As AcadDocument)
On Error GoTo ErrHandler

‘ 1. アクティブドキュメントの切り替え(マルチドキュメント対応)
If Not targetDoc Is Nothing Then
targetDoc.Activate

‘ 2. Zoom Extents の実行
‘ SendCommandではなく、COMメソッドを使用して同期処理を保証
ThisDrawing.Application.ZoomExtents

‘ 3. 図面情報の更新(レガシー環境での同期漏れを防ぐ)
targetDoc.Regen acActiveViewport

‘ 4. 保存実行
targetDoc.Save
End If

Exit Sub

ErrHandler:
Debug.Print “Save Failed: ” & Err.Description
‘ 必要に応じてログを出力
End Sub

—

3. チーフアーキテクトの視点:パフォーマンスと安定性の境界線

このルーチンを「一括処理(Batch Processing)」に応用する場合、注意すべき点が2つある。

① Windows APIによる待機状態の監視

大量の図面を一括処理する際、AutoCADの `Save` 処理は、ファイルサイズや外部参照(XRef)の数によって完了までの時間が変動する。単なる `DoEvents` だけでは、巨大なDWGの保存中に次の処理へ移行し、プロセスがクラッシュする原因となる。

もし、より高度な安定性を求めるなら、Windows API `GetProcessMemoryInfo` を使い、メモリ使用率が安定するまで待機するロジックを組み込むのが「伝説級」の解法だ。

② メモリ解放の鉄則(Object Management)

VBAはガベージコレクションが脆弱だ。以下のように、処理の最後には必ずオブジェクトを解放せよ。

‘ ループ処理の例
Dim doc As AcadDocument
For Each doc In AcadApplication.Documents
Call OptimizedSave(doc)

‘ 明示的な解放
Set doc = Nothing
‘ 必要であればここでプロセス間通信のクリーンアップを行う
Next doc

—

4. システム間連携を見据えた設計

今後、図面管理システムをWebブラウザベースのものへ移行したり、C# (.NET) へコードを移植する可能性があるなら、`VBA` のコードは「ロジック」と「UI」を分断せよ。

上記のようなセーブ・ルーチンを独立したモジュールとして切り出しておくことで、将来的に `AutoCAD .NET API`(`Editor.CommandAsync`等を使用)に移植する際、ロジックをそのままコピー&ペーストできる。

結論

「たかが保存」と侮るなかれ。
図面のサムネイルひとつで、あなたの設計チームの「整理整頓能力」は推し量られる。
システムを構築する者は、常に「その先」にあるエンドユーザーの体験を想像せよ。

コードをコピペして終わりではない。貴殿の現場の環境(外部参照の有無、ネットワークドライブの速度、CADのバージョン)に合わせて、このロジックをチューニングすることこそが、エンジニアとしての真の腕の見せ所である。

健闘を祈る。

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