こんにちは。AutoCAD自動化の世界へようこそ。
私はこれまで、数えきれないほどの図面自動生成システムを構築してきましたが、初学者が最初につまずき、そして乗り越えた瞬間に「VBAの真価」を理解する重要なチェックポイントがあります。
それが、今回解説する「ペーパー空間のビューポート操作」です。
マクロの記録では決して到達できない、プログラムによる空間の制御。ここをマスターすれば、100枚のレイアウト図面をボタン一つで調整するような、魔法のようなツールが作れるようになりますよ。
さあ、一緒に「ActivePViewport」の深淵を覗いてみましょう。
—
1. 「ActivePViewport」を理解するための地図
AutoCAD VBAの世界には、2つの「空間」と、それをつなぐ「窓」が存在します。
- モデル空間 (ModelSpace): 実寸で図面を描く無限の広場。
- ペーパー空間 (PaperSpace/Layout): 印刷するための紙の上の世界。
- ビューポート (PViewport): ペーパー空間に開けられた、モデル空間を覗くための「窓」。
手動操作で「レイアウトタブを開き、ビューポートの中をダブルクリックして編集モードにする」という動作がありますよね? これをプログラムで行うのが、今回主役となる `AcadDocument.ActivePViewport` プロパティです。
ここが重要!
ペーパー空間には、実は「見えないビューポート」が1つ存在します。
それは「紙そのもの」を管理するビューポート(通常IDは1)です。私たちが図面を描くために配置するビューポートは、2番目以降(IDが2以上)になります。
—
2. 実践コード:特定のビューポートを「アクティブ」にする
では、具体的なコードを見てみましょう。このコードは、現在開いているレイアウトの中から、指定した番号のビューポートを探し出し、その中に入って編集可能な状態(モデル空間モード)にするものです。
Sub ActivateSpecificViewport()
Dim doc As AcadDocument
Set doc = ThisDrawing ‘ 現在の図面を取得
‘ 1. まずは「ペーパー空間」に切り替える
‘ これを忘れると、ビューポートの操作でエラーになることがあります
doc.ActiveSpace = acPaperSpace
‘ 2. レイアウトの中にあるビューポートを走査する
Dim pViewport As AcadPViewport
Dim targetID As Integer
targetID = 2 ‘ 今回は「2番目」に作成されたビューポートを対象にします
Dim found As Boolean
found = False
‘ ペーパー空間(現在のレイアウト)内の図形をループで確認
Dim entity As AcadEntity
For Each entity In doc.PaperSpace
‘ 図形が「ビューポート」であるかチェック
If TypeOf entity Is AcadPViewport Then
Set pViewport = entity
‘ 目的のID(または特定の条件)に合致するか確認
‘ 注意:ビューポートIDは作成順に割り振られます
If pViewport.ID = targetID Then
‘ — ここが魔法の呪文 —
‘ ビューポートをアクティブにするためには、
‘ まず MSpace プロパティを True にする必要があります。
‘ これは「ビューポートの中に入りますよ」という宣言です。
doc.MSpace = True
‘ そして、目的のビューポートを「アクティブ」に設定します。
doc.ActivePViewport = pViewport
‘ ———————–
MsgBox “ビューポート ID:” & targetID & ” をアクティブにしました!”
found = True
Exit For
End If
End If
Next entity
If Not found Then
MsgBox “指定されたIDのビューポートが見つかりませんでした。”
End If
End Sub
—
3. 伝説のアーキテクトが教える「3つの急所」
このコードをただコピーするだけでは、現場のトラブルには対応できません。プロとして知っておくべき「急所」を伝授します。
① `doc.MSpace = True` の絶対ルール
AutoCAD VBAにおいて、`ActivePViewport` を変更するためには、必ずその前に `doc.MSpace = True` を実行して「モデル空間編集モード」を有効にする必要があります。
もしペーパー空間自体を操作している状態(`MSpace = False`)でビューポートを切り替えようとすると、実行時エラーが発生します。
② ビューポートIDの罠
コード内で `pViewport.ID` を使いましたが、これは図面を開き直したり、ビューポートを削除・作成したりすると変わることがあります。
実務で「特定のビューポート」を確実に狙い撃ちしたい場合は、ビューポートの `Layer`(画層名) や、`Handle`(ハンドル:不変のID)、あるいは `CustomDictionary` に名前を仕込んでおき、それを条件に判定するのが「壊れないコード」の書き方です。
③ 「紙」のビューポートを避ける
前述の通り、レイアウトには必ず「1番目」のビューポートが存在します。これは「紙全体」を指す特殊なオブジェクトです。
誤ってこれに対して `doc.ActivePViewport = …` を行おうとすると、思い通りの動きになりません。常に 「IDが2以上のもの」 か、「自分で作成したもの」 を対象にするよう意識してください。
—
4. この知識の先にあるもの
ビューポートをプログラムでアクティブにできるようになったあなたは、もう「ただのオペレーター」ではありません。
- 自動ズーム: 特定の座標をビューポートの中心に持ってくる。
- 自動縮尺設定: 1/50、1/100などのスケールを全レイアウト一括適用。
- 画層のフリーズ制御: ビューポートごとに特定の画層を非表示にする。
これらすべてが、`ActivePViewport` を掌握することから始まります。
「ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ」と最初に言いましたね。この「空間をまたぐ感覚」こそが、AutoCADプログラミングの本質だからです。
次は、アクティブにしたビューポートの `ZoomCenter` や `CustomScale` を操作して、図面を美しく整える自動化に挑戦してみてください。あなたの業務が劇的に進化する日は、すぐそこまで来ています。
応援していますよ!
