こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの操作から一歩抜け出して、自分だけの自動化ツールを作ろうとしているあなたへ、最高にワクワクする技術をお伝えします。
今回は、AutoCAD VBAの基礎でありながら、実務で死ぬほど役に立つテクニック「図面全体の境界ボックス(ExtMin / ExtMax)を計算し、自分好みの余白を持たせてスマートにズームする」方法を解説します。
「標準の `ZoomExtents` だと、図面が画面いっぱいにキツキツで収まってしまい、見栄えが悪い……」
そんな現場のモヤモヤを、今回のコードで見事に解決してみせましょう。ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの扱い方はもうバッチリです!
—
1. なぜ標準の `ZoomExtents` だけでは物足りないのか?
AutoCADには、図面内の全オブジェクトを一発で画面に収める `ZoomExtents` という非常に便利なメソッドが用意されています。
しかし、実際の業務図面ではこんな問題が起きます。
- 画面の端っこにオブジェクトがピタッとくっつきすぎて、図面枠や引き出し線が窮屈に見える。
- レイアウト上の不要な微小ゴミ(消し忘れの点など)まで計算に含まれてしまい、肝心の図面が米粒のように小さくなってしまう。
そこで登場するのが、「図面内のオブジェクトが持つ最小・最大の座標(ExtMin / ExtMax)をVBAで自ら取得し、余白(マージン)を計算してズーム範囲を再定義する」というアプローチです。プロの現場では、こうした「痒いところに手が届くカスタマイズ」が評価されます。
—
2. 座標の限界を知る:`ExtMin` と `ExtMax` とは?
AutoCADのすべての `AcadDocument`(図面)や `AcadEntity`(図形要素)は、見えない箱(バウンディングボックス)に包まれています。その箱の対角にある2つの頂点データがこれです。
- `ExtMin`: 図面全体を包む箱の「左下(X最小, Y最小)」の座標
- `ExtMax`: 図面全体を包む箱の「右上(X最大, Y最大)」の座標
これらは配列(Array)として取得できます。つまり、図面の端から端までの「幅(Width)」と「高さ(Height)」は、引き算だけで簡単に求まるというわけです。
—
3. 【実践】カスタム・ズームマクロの全コード
それでは、実際に動かせる実用コードを公開します。
VBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub SmartZoomWithMargin()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
‘ エラーハンドリング(オブジェクトが何もない図面でのクラッシュを防ぐ)
On Error GoTo ErrorHandler
‘ 1. 図面全体の最小・最大座標を強制更新させる
‘ (※AutoCADは操作直後だとExtMin/ExtMaxが古い場合があるため、一度再計算を促す)
acadDoc.Regen acAllViewports
Dim minPt As Variant
Dim maxPt As Variant
minPt = acadDoc.ExtMin
maxPt = acadDoc.ExtMax
‘ 2. 図面内に何も描かれていない場合のガード処理
‘ (初期状態のExtMinは極端に大きな正の値を持つため、その判定を行います)
If minPt(0) > 1E+20 Then
MsgBox “図面に有効なオブジェクトが見つかりません。”, vbExclamation, “スマートズーム”
Exit Sub
End If
‘ 3. 図面の「幅」と「高さ」を算出
Dim docWidth As Double
Dim docHeight As Double
docWidth = maxPt(0) – minPt(0)
docHeight = maxPt(1) – minPt(1)
‘ 4. 余白(マージン)の割合を設定(例: 20%の余裕を持たせる)
Const MARGIN_RATIO As Double = 0.2
Dim marginX As Double
Dim marginY As Double
marginX = docWidth MARGIN_RATIO
locationY = docHeight MARGIN_RATIO
‘ 5. 新しいズーム用の対角座標を作成(元の範囲を少し広げる)
Dim newMin(2) As Double
Dim newMax(2) As Double
newMin(0) = minPt(0) – marginX
newMin(1) = minPt(1) – marginY
newMin(2) = 0# ‘ Z座標
newMax(0) = maxPt(0) + marginX
newMax(1) = maxPt(1) + marginY
newMax(2) = 0# ‘ Z座標
‘ 6. 計算した新しい範囲で画面をズーム
acadDoc.Application.ZoomWindow newMin, newMax
MsgBox “最適な余白を持たせてズームしました!”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “予期せぬエラー”
End Sub
—
4. コードの深掘りポイント(ここが分かれば初心者卒業!)
今回のコードで、AutoCAD VBAの本質を突いている重要なポイントを3つ解説します。
① 配列として返ってくる座標の扱い
`acadDoc.ExtMin` は、単一の変数ではなく「3要素の配列(X, Y, Z)」として返ってきます。そのため、`minPt(0)` でX座標、`minPt(1)` でY座標を取り出すという作法が必要です。この「配列を受け取って処理する」感覚に慣れると、座標系を扱うAPIの理解が一気に加速します。
② 何もない図面への備え(堅牢性)
AutoCADを起動してすぐの真っ新な図面では、`ExtMin` は `1.0E+20` のような異常にデカい数値を持っています。ここを見逃して計算に使うと、AutoCADがフリーズするか想定外の場所へ宇宙旅行するようなズームになってしまいます。`If minPt(0) > 1E+20 Then` というガード節は、プロのエンジニアが必ず入れる必須の防壁です。
③ `ZoomWindow` メソッドの活用
既存の `ZoomExtents` ではなく、あらかじめ算出した2点(新しい最小座標と最大座標)を指定して画面を切り取る `ZoomWindow` を使っている点が、このコードの最大のキモです。これにより、自由自在な余白コントロールが可能になります。
—
まとめ:自動化の第一歩は「自分の目で見る範囲をコントロールすること」から
今回は、`ExtMin` と `ExtMax` を利用したスマートなズーム範囲の自動計算を解説しました。
- オブジェクトの境界は `ExtMin` / `ExtMax` で取得できる。
- 取得したデータは配列なので、インデックスを指定して計算に使う。
- 余白(マージン)を計算で足してやることで、図面の見栄えを劇的に美しくできる。
ここをクリアしたあなたなら、図面の自動レイアウト調整や、特定ブロックの自動キャプチャ保存など、より高度なAutoCAD自動化の世界へスムーズに進むことができます。
日々の退屈なルーチンワークをVBAで駆逐し、エンジニアとしてのスマートな時間を手に入れましょう。それでは、また次の極限知見でお会いしましょう!
