【入門編】【実務中級】AcadDocument.ActiveSpaceとMSpaceプロパティの使い分け:ペーパー空間上の「ビューポート内」へモデル空間から自動で作図する制御法 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:ペーパー空間の「ビューポート」を支配し、モデル空間へ書き込む極意

こんにちは。AutoCADの自動化の世界へようこそ。
日々、図面と格闘している皆さんなら一度はこんな経験があるはずです。「レイアウト(ペーパー空間)にいるのに、モデル空間の座標系をそのまま使って注釈を書き込みたい」「特定のビューポートを狙い撃ちして自動作図したい」と。

「マクロの記録」から卒業し、AutoCADのオブジェクトモデルを自在に操りたいあなたへ。今日は、AutoCAD VBAの最も美しく、かつ最も誤解されやすい「空間制御」の核心をお教えします。

1. なぜ「空間」を意識する必要があるのか?

AutoCADのデータ構造は、大きく分けて以下の2つの空間で成り立っています。

  • モデル空間 (`acModelSpace`): 設計の本体。無限の広さを持つ現実の縮尺の世界。
  • ペーパー空間 (`acPaperSpace`): 出図用。レイアウト上の配置や枠組み。

ここで重要なのが、「ビューポート」の存在です。ペーパー空間に置かれたビューポートは、モデル空間を覗き見る「窓」です。この窓の中に注釈を落とすとき、あなたは「ペーパー空間にいるのか? それともビューポート越しにモデル空間にいるのか?」をVBAに明確に指示しなければなりません。

これを取り違えると、図形がどこか彼方へ消えたり、予期せぬスケールで描かれたりします。

2. 空間制御の三種の神器:ActiveSpaceとMSpace

コードを書く上で、常に意識すべきプロパティがこの3つです。

1. `ThisDrawing.ActiveSpace`: 現在の空間が「モデル」か「ペーパー」かを判定(戻り値:`acModelSpace` / `acPaperSpace`)。
2. `ThisDrawing.MSpace`: ペーパー空間内にいる時、ビューポート内(モデル空間)の編集が有効かどうかを切り替えるスイッチ(True / False)。
3. `ThisDrawing.ActivePViewport`: 現在アクティブなビューポートオブジェクトを取得。

3. 実践:ビューポート経由でモデル空間へ書き込むロジック

では、レイアウト上の特定のビューポートを操作し、その中(モデル空間の座標)に文字を書き込むコードを見てみましょう。

Sub DrawTextInViewport()
Dim objViewport As AcadPViewport
Dim objModelSpace As AcadModelSpace
Dim textObj As AcadText
Dim insertPoint(0 To 2) As Double

‘ 1. 現在のレイアウトにある「最初のビューポート」を取得
‘ ※実際の実務では名前やインデックスで検索してください
For Each ent In ThisDrawing.PaperSpace
If TypeOf ent Is AcadPViewport Then
Set objViewport = ent
Exit For
End If
Next

‘ 2. 空間制御の核心:ペーパー空間へ移動し、ビューポートを有効化する
ThisDrawing.ActiveSpace = acPaperSpace ‘ ペーパー空間に切り替え
ThisDrawing.MSpace = True ‘ モデル空間編集を許可
ThisDrawing.ActivePViewport = objViewport ‘ ターゲットのビューポートをアクティブに!

‘ 3. これでモデル空間の座標系がそのまま使える
insertPoint(0) = 100: insertPoint(1) = 100: insertPoint(2) = 0
Set objModelSpace = ThisDrawing.ModelSpace
Set textObj = objModelSpace.AddText(“自動注釈”, insertPoint, 5.0)

‘ 4. 後処理:ペーパー空間に戻す(これを行わないと操作が混乱します)
ThisDrawing.MSpace = False
ThisDrawing.ActiveSpace = acModelSpace

MsgBox “ビューポート内に書き込みました。”
End Sub

コードのポイント解説

  • `ThisDrawing.MSpace = True`: これを忘れると、ペーパー空間上の「紙の上の座標」に書き込まれてしまいます。
  • `ActivePViewport`の指定: 複数のビューポートがある場合、この指定がないとAutoCADは「どこに描けばいいの?」と迷子になります。
  • 後処理: 処理が終わったら必ず`MSpace = False`に戻すこと。これはエンジニアとしての「マナー」です。これを怠ると、ユーザーが手動で編集する際に意図しない挙動を引き起こす原因になります。

4. よくあるエラーとその対処法

  • 「オブジェクトが取得できません」: ビューポートがロックされている、あるいはレイアウトがアクティブではない可能性があります。`ThisDrawing.ActiveLayout`を適宜切り替えてください。
  • 「座標がズレる」: ビューポートの縮尺(`CustomScale`)を確認してください。モデル空間に書き込む際は、あくまで「モデル空間上の座標」を指定する必要があります。

最後に:自動化は「視点の制御」から始まる

AutoCAD VBAにおいて、最もバグを生みやすいのは「今、どの空間を操作しているか」という認識のズレです。

今回紹介した`ActiveSpace`と`MSpace`の切り替えをマスターすれば、あなたはもう「マクロを動かされる側」ではなく、「AutoCADの空間を意のままに操る側」です。

まずはこのコードを、あなたの図面で動かしてみてください。そこから、特定のレイヤーにだけ書き込む、縮尺を自動計算するなど、応用は無限大に広がります。

ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ。また次のステップで、もっと深い世界でお会いしましょう!

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