こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がさっぱりわからない……」というフェーズから抜け出し、自分の手でCADを自在に操るエンジニアへの第一歩を踏み出そうとしているあなたへ。
今回は、AutoCAD VBAの基礎中の基礎でありながら、多くの初心者が最初につまずく「空間(モデル空間とペーパー空間)の概念と切り替え」について、徹底的に分かりやすく解説していきます。
ここをクリアすれば、あなたのAutoCAD VBAスキルは確実に一段階レベルアップします。さあ、一緒に扉を開けましょう!
—
1. なぜ「空間」を意識する必要があるのか?
AutoCADには、図形を描くための「モデル空間 (ModelSpace)」と、印刷レイアウトを整えるための「ペーパー空間 (PaperSpace)」という、2つの異なる世界が存在します。
CAD画面の下部にあるタブを見れば一目瞭然ですね。「モデル」タブと「レイアウト」タブを行き来しているはずです。
- モデル空間:実寸(1:1)で無限の広さに設計図を描く世界。
- ペーパー空間:図面枠を配置し、図面を印刷・PDF化するためにビューポートを覗く世界。
VBAでプログラムを書くとき、「今、自分はどちらの世界に図形を描こうとしているのか」をコードで明確に指示してあげないと、AutoCADは混乱してエラーを起こしてしまいます。「モデル空間に線を描いたつもりが、印刷用レイアウトの余白に線を描いていた!」なんて事態を防ぐためにも、空間のコントロールをマスターする必要があるのです。
—
2. オブジェクトモデルの構造を覗き見よう
AutoCAD VBAの頂点には `Application` があり、その下に現在開いている図面である `Document` がぶら下がっています。
AcadApplication
┗ AcadDocument (ActiveDocument)
┣ ModelSpace (モデル空間の図形コレクション)
┗ PaperSpace / Layouts (ペーパー空間・レイアウトの管理)
コードを書くとき、私たちはよく `ThisDrawing.ModelSpace` という表現を使います。これは「今アクティブな図面の、モデル空間という名のコンテナ(箱)」を指しています。
—
3. 【実践】モデル空間とペーパー空間を自在に行き来するコード
それでは、実際にVBAのエディタを開いて、空間を切り替えながら図形を配置するコードを見てみましょう。
以下のコードは、「モデル空間に円を描き、ペーパー空間(アクティブなレイアウト)に文字を配置する」という一連の処理を行う実用的なマクロです。
Sub DrawInDifferentSpaces()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing ‘ 現在の図面をオブジェクト変数に格納
‘ ==========================================
‘ 1. モデル空間に円を描画する
‘ ==========================================
Dim centerPoint(0 to 2) As Double
Dim radius As Double
Dim acadCircle As AcadCircle
‘ 円の中心座標 (X=0, Y=0, Z=0)
centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0#
radius = 50.3 ‘ 半径50.3の円
‘ モデル空間のコレクションに対して円を追加
Set acadCircle = acadDoc.ModelSpace.AddCircle(centerPoint, radius)
‘ ついでにモデル空間を画面上にアクティブとして表示させる
acadDoc.ActiveSpace = acModelSpace
MsgBox “モデル空間に円を描画しました。次はペーパー空間に文字を書きます。”, vbInformation, “確認”
‘ ==========================================
‘ 2. ペーパー空間(レイアウト)に文字を描画する
‘ ==========================================
Dim insertPoint(0 to 2) As Double
Dim textString As String
Dim height As Double
Dim acadText As AcadText
‘ 文字の配置座標 (X=50, Y=50, Z=0)
insertPoint(0) = 50#: insertPoint(1) = 50#: insertPoint(2) = 0#
textString = “【AutoCAD VBA 自動作成図面】”
height = 5# ‘ 文字高さ
‘ 【重要】アクティブな空間をペーパー空間に切り替える
acadDoc.ActiveSpace = acPaperSpace
‘ ペーパー空間のコレクションに対して文字を追加
‘ ※ PaperSpaceプロパティは、現在アクティブなレイアウトのペーパー空間を指します
Set acadText = acadDoc.PaperSpace.AddText(textString, insertPoint, height)
‘ 画面の表示を強制的に更新(ビューの再描画)
acadDoc.Regen acActiveViewport
MsgBox “処理が完了しました! モデルとレイアウトを確認してください。”, vbInformation, “完了”
End Sub
コードのここがポイント!
1. `ThisDrawing.ModelSpace.AddCircle`
わざわざ画面を切り替えなくても、コードから直接「モデル空間」を指定して図形を追加できます。これがVBAの強力なところです。
2. `acadDoc.ActiveSpace = acPaperSpace`
画面上の表示を「モデルタブ」から「レイアウトタブ(ペーパー空間)」へ切り替える命令です。定数 `acPaperSpace` や `acModelSpace` を使います。
3. `acadDoc.PaperSpace`
現在アクティブになっているレイアウトのペーパー空間オブジェクトを指します。複数のレイアウトがある場合、どのレイアウトがアクティブかによって描画先が変わるので注意が必要です。
—
4. 初心者が絶対ブルる「よくあるエラー」と対策
現場でコードを書き始めると、必ずと言っていいほど次のようなエラーに遭遇します。先回りして回避策を知っておきましょう。
エラー①:「メソッドまたはデータメンバーが見つかりません」
- 原因:`PaperSpace` に直接図形を追加しようとした際、オブジェクトの参照が漏れている場合があります。
- 対策:必ず `acadDoc.PaperSpace.Add~` のように、どのドキュメントのペーパー空間なのかを明示しましょう。
エラー②:ペーパー空間に描いたはずの図形が見当たらない!
- 原因:ペーパー空間(レイアウト)の表示領域(用紙枠)の外側に図形を描いてしまっている、または単位系のスケールが合っていないケースです。
- 対策:ペーパー空間に図形を描くときは、用紙サイズ(A4やA3など)の座標系(通常はミリ単位のポジショニング)を意識する必要があります。まずはモデル空間での作図に慣れてからペーパー空間へ挑戦するのが安全です。
—
まとめ:空間の支配権はあなたにある!
今回は、AutoCAD VBAにおける「モデル空間」と「ペーパー空間」の構造、そしてそれらをコードで自由に行き来する方法を解説しました。
- 図形の本質的なデータは、画面上でどのタブを開いていいても、コードで `ModelSpace` や `PaperSpace` を指定すれば自由に追加できる。
- 画面の見た目を切り替えるには `ActiveSpace` プロパティを使う。
ここさえ押さえておけば、図面枠の自動生成や、モデルの図形とレイアウトの注釈を組み合わせた高度な自動化ツールも夢ではありません。
ここをクリアすれば、AutoCAD VBAの基本はバッチリです!
ぜひ手元の環境でコードを動かして、CADがカチャカチャと音を立てて自動で図形を描いていく爽快感を味わってみてください。それでは、次のステップでお会いしましょう!
