AutoCAD VBAを掌握する:サムネイルの呪縛を解く「自動全体表示保存」の設計思想
AutoCADの運用において、エクスプローラーや外部ビューアに表示される「プレビュー(サムネイル)」は、単なるおまけではない。それは図面管理の可視性を担保する重要なインフラだ。
しかし、無造作に保存された図面を開くと、前回の作業者が放置した「どこか遠くの端っこ」が表示されることはないか? これを解消するために手動で `Zoom Extents` を行い、保存する。この単純作業こそ、自動化の格好の標的だ。
今回は、単に「コマンドを実行する」という低次元なコードではなく、AutoCADの内部ライフサイクルを理解した、堅牢かつ実務的な実装術を伝授する。
—
1. なぜ「SendCommand」を避けるべきなのか
多くの初学者は `ThisDrawing.SendCommand “_ZOOM _E “` を使う。だが、プロのエンジニアはこれを選択肢から除外する。理由は明白だ。
- 同期の問題: `SendCommand` は非同期的に実行されることがあり、保存処理(`SaveAs`)がコマンド完了を待たずに走り出すリスクがある。
- 例外処理の脆弱性: 実行中にダイアログが表示されたり、コマンドラインがロックされていたりすると、そこで処理がストップする。
- パフォーマンス: コマンドを発行するオーバーヘッドは、APIによる直接制御に比べて遥かに重い。
我々が取るべきアプローチは、`Application.ZoomExtents` メソッドの直接呼び出しである。これが最も速く、そして安全だ。
—
2. 堅牢な実装:プロダクションコード
以下のコードは、単にZoomを行うだけでなく、データベースの整合性を維持し、保存処理までを一貫して行うためのテンプレートである。
‘ —————————————————————————
‘ @brief 現在の図面を最適化して保存するプロシージャ
‘ @description ZoomExtentsを強制し、サムネイル視認性を確保する
‘ —————————————————————————
Public Sub SaveDrawingOptimized()
Dim doc As AcadDocument
Set doc = ThisDrawing
On Error GoTo ErrorHandler
‘ 1. ビューの最適化
‘ SendCommandではなく、Applicationオブジェクトのメソッドを直接叩く
ThisDrawing.Application.ZoomExtents
‘ 2. 保存実行
‘ ここで名前を付けて保存する場合は、引数にフルパスを渡す
‘ 今回は上書き保存を想定
If Not doc.Saved Then
doc.Save
End If
Debug.Print “図面最適化と保存が完了しました: ” & doc.Name
Exit Sub
ErrorHandler:
MsgBox “図面の保存中にエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“内容: ” & Err.Description, vbCritical, “自動化エラー”
End Sub
—
3. 実務で直面する「罠」と回避策
このコードをそのまま現場に放り込む前に、以下の技術的要件を理解しておく必要がある。
A. 読み取り専用図面のハンドリング
もし開いている図面が「読み取り専用」だった場合、`doc.Save` は実行時エラーを引き起こす。運用ツールとしては、事前に `doc.ReadOnly` プロパティをチェックし、スキップするロジックを組み込むのが基本だ。
B. ペーパー空間とモデル空間の揺らぎ
`ZoomExtents` はアクティブなレイアウトに対してのみ機能する。もし、サムネイルの基準を特定の「モデル空間」に固定したいのであれば、明示的に `ThisDrawing.ActiveSpace = acModelSpace` を呼び出し、必要に応じて `ThisDrawing.ActiveLayout` を切り替える設計が必要となる。
C. データベースの更新タイミング
極めて巨大な図面の場合、`ZoomExtents` 直後に `Save` をかけると、稀にサムネイル生成が追いつかないケースがある。その場合は、`DoEvents` を挟むか、あるいは `ThisDrawing.Regen acActiveViewport` を実行し、描画キャッシュを強制更新してから保存する工夫が「玄人」の仕事だ。
—
4. チーフアーキテクトからの助言
今回紹介したコードは、あくまで「単一図面」の自動化の基礎だ。これを数百枚のDWGに対して一括適用するツール(バッチ処理)に昇華させるなら、`ObjectDBX` の使用を強く推奨する。
`ObjectDBX` は AutoCAD の GUI を介さずに図面を操作できるため、図面を開いて閉じるという重い処理を劇的に高速化できる。
「動くコードを書く」のは初級者。「保守しやすく、環境を壊さないコードを書く」のが中級者。そして「AutoCADのレンダリングパイプラインを理解し、最短距離で結果を出す」のが上級者だ。
君たちが今日作成するこの小さなスクリプトが、チーム全体の生産性を底上げする一歩になることを期待している。さあ、IDEを開いて実装に取り掛かってくれ。
