AutoCAD VBAの流儀:ユーザーを迷子にさせない「視点復帰」の極意
AutoCADの自動化ツールを開発する際、初心者が陥る最大の罠は「処理の速さ」ばかりを追求し、「ユーザーの体験」を置き去りにすることだ。
マクロが走り、画面が激しく点滅し、処理が終わった時には直前まで見ていた図面上の箇所から遥か彼方の「全体表示」や「謎の座標」に飛ばされる。こんなツールは、現場では「仕事の邪魔」と見なされる。
今回は、AutoCAD VBA開発において必須の品格とも言える、「処理終了後の視点復帰(ZoomPrevious)」の実装について、プロフェッショナルな設計思想を伝授する。
—
なぜ `ZoomPrevious` を使うのか?
大規模な図面を操作する際、処理の過程で `ZoomExtents`(全図形表示)を呼び出すことは珍しくない。しかし、ツールが終了するたびにユーザーが手動でスクロールバーを操作し、元の作業場所へ戻る時間は、積もり積もれば膨大な損失となる。
「ユーザーが中断した場所に、自動で戻す」。この一見地味な気遣いこそが、現場で愛されるツールと、ゴミ箱へ直行するツールの決定的な境界線だ。
—
実践:堅牢な視点復帰のプロダクションコード
単に `ZoomPrevious` を呼ぶだけでは不十分だ。処理中にエラーが発生し、途中でマクロが強制終了した場合、視点は戻らない。`On Error` ハンドラを適切に配置し、どんな状況下でも確実に元の視点へ戻す設計を心掛けよ。
Public Sub SmartProcess()
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument
Set acadApp = ThisDrawing.Application
Set acadDoc = ThisDrawing
‘ エラーハンドリング:何があっても視点を戻すための布石
On Error GoTo Cleanup
‘ 1. 画面更新の停止(パフォーマンス向上の鉄則)
acadApp.Visible = True
acadDoc.Utility.Prompt “処理を開始します…”
‘ 2. 現在の視点をスタックに保存(ZoomPreviousの基点を作る)
‘ ※ZoomWindowやZoomExtentsを実行する前に、
‘ 一度現在の状態を「前回の視点」として認識させる必要がある
acadDoc.SendCommand “_ZOOM” & vbCr & “_PREVIOUS” & vbCr
‘ — ここにメインの業務ロジックを記述 —
‘ 例:図面全体を走査して特定のレイヤーを操作する等の重い処理
Call HeavyDrawingProcess(acadDoc)
‘ ————————————–
Cleanup:
‘ エラーが発生しても、正常終了しても必ず通るルート
If Err.Number <> 0 Then
MsgBox “処理中にエラーが発生しました: ” & Err.Description, vbCritical
End If
‘ 3. 視点を元の位置へ戻す
‘ ZoomPreviousを呼び出し、処理前の状態へ復帰させる
acadDoc.SendCommand “_ZOOM” & vbCr & “_PREVIOUS” & vbCr
acadDoc.Utility.Prompt “処理が完了しました。作業場所へ復帰します。”
End Sub
Private Sub HeavyDrawingProcess(doc As AcadDocument)
‘ ここに業務ロジックを記述
‘ 処理中にZoomExtents等が必要な場合はここで行う
doc.SendCommand “_ZOOM” & vbCr & “_EXTENTS” & vbCr
‘ 重い処理をシミュレート
Dim i As Long
For i = 1 To 1000000: Next i
End Sub
—
知っておくべき「APIの重み」
このコードで重要なのは、`SendCommand` を使ってコマンドライン経由で `ZOOM PREVIOUS` を叩いている点だ。VBAのオブジェクトモデル(`ZoomWindow` や `ZoomExtents` メソッド)は強力だが、履歴スタックへの反映挙動が予測しづらい場合がある。
コマンドラインを `SendCommand` で制御する方法は、AutoCADの内部的な「Undo履歴」や「視点スタック」に対して極めて忠実に動作する。APIのメソッドとコマンドラインの使い分けを理解することは、上級エンジニアへの登竜門だ。
プロフェッショナルからの助言
1. パフォーマンスの代償: `SendCommand` は直感的だが、計算コストはわずかに高い。ループ処理の中で頻繁に呼び出すのは避け、あくまで「マクロの開始時」と「終了時」の制御に限定すること。
2. トランザクション管理: データベース連携を行うツールの場合、視点復帰の前に必ず `Database.TransactionManager` で変更をコミット(あるいはロールバック)したことを確認しろ。図面の状態が不整合なまま視点を戻すと、ユーザーは混乱する。
3. ユーザーを驚かせない: `acadApp.Visible = False` でバックグラウンド処理をする手法もあるが、視点の強制移動が発生する場合は、ユーザーに現在の状況を `Utility.Prompt` で逐次伝えることが、心理的な安心感に繋がる。
—
まとめ:UXは「コードの行数」ではなく「気配り」で決まる
今回紹介した「処理終了後の視点復帰」は、極めて基本的なテクニックだ。しかし、この「ユーザーが今どこにいて、どう動いているか」を想像しながらコードを書く姿勢こそが、最高峰の業務自動化エンジニアの資質である。
AutoCAD VBAは古くからの技術だが、その本質は「CADという巨大なエンジンをいかに美しく制御するか」という哲学にある。小手先のテクニックに溺れず、常に「そのツールを使う人間」の視点を忘れるな。それが、あなたのツールがチームのスタンダードとして生き残る唯一の道だ。
