こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンを押すだけの「自動化ごっこ」は、今日で終わりにしましょう。
現場でバリバリ動く実用的なVBAを書くうえで、避けて通れないのが「空間(スペース)の制御」です。
「あれ?プログラムを実行したはずなのに、描いたはずの図形がどこにも見当たらない……」
初学者が必ずと言っていいほどハマるこの悲劇、原因のほとんどは「今、自分がモデル空間にいるのか、ペーパー空間にいるのか」をコードで制御できていないことにあります。
今回は、AutoCADのオブジェクトモデルの心臓部である `ActiveSpace` を完全に手なずけ、空間の配置ミスを撲滅する極意を伝授します。ここをクリアすれば、あなたのAutoCAD VBAスキルは確実に一段階上のステージへ進みますよ!
—
1. なぜ「空間の迷子」が起きるのか? AutoCADの二大世界を知る
AutoCADには、図形を描くための「モデル空間(Model Space)」と、図面を用紙にレイアウトして印刷するための「ペーパー空間(Paper Space / レイアウト)」という、全く性質の異なる2つの世界が存在します。
人間であれば、画面のタブを見れば「あ、今はレイアウトタブにいるな」と直感的に分かりますが、VBAのプログラムは冷徹な機械です。あなたが「ここに線を引け!」と命令すれば、画面がどこを向いていようとも、現在の「アクティブな空間」に容赦なく図形を放り込みます。
- モデル空間に引くつもりが、レイアウト(ペーパー空間)の枠線の上に線を乱立させてしまった……
- ペーパー空間の表題欄に文字を入れたいはずが、モデルの図面の中に巨大な文字を書いてしまった……
こんな現場のミスを、人の目によるチェックだけに頼る必要はありません。プログラムに「今どこにいるか」を判定させ、必要なら強制的に目的地へワープさせればいいのです。
—
2. 空間を支配する鍵:`ActiveSpace` プロパティの正体
AutoCAD VBAで空間をコントロールするために絶対に覚えておくべきオブジェクト、それが `AcadDocument.ActiveSpace` です。
このプロパティは、現在の空間状態を定数(定まった数値)として保持し、かつ書き換えることもできます。
- `acModelSpace` (値:1) : モデル空間
- `acPaperSpace` (値:2) : ペーパー空間
言葉で説明するより、コードを見た方が早いですね。まずは現在の空間を判定し、必要に応じて切り替える「基本のキ」を見てみましょう。
—
3. 実践コード:空間を自動判定・強制制御するマクロ
以下のコードをVBAエディタ([Alt] + [F11])に貼り付けてみてください。現在の空間をメッセージで優しく教えてくれつつ、もしペーパー空間にいたら自動でモデル空間へ連れていってくれる、紳士的なプログラムです。
Sub ControlActiveSpaceDemo()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
‘ 1. 現在の空間を判定してユーザーにお知らせする
If acadDoc.ActiveSpace = acModelSpace Then
MsgBox “現在は【モデル空間】にいます。”, vbInformation, “空間チェック”
Else
MsgBox “現在は【ペーパー空間(レイアウト)】にいます。”, vbInformation, “空間チェック”
‘ あえてモデル空間に強制ワープさせたい場合
‘ acadDoc.ActiveSpace = acModelSpace
‘ MsgBox “モデル空間へ強制移動しました!”, vbInformation
End If
End Sub
💡 コードの解説
1. `ThisDrawing` で現在アクティブな図面ドキュメントを掴みます。
2. `acadDoc.ActiveSpace` を使って、「今、モデルとペーパーのどっちにいるの?」と状態を覗き見(取得)しています。
3. 条件分岐(`If…Else`)を使うことで、状態に応じた適切な処理を分岐させることができます。
—
4. 【現場で即戦力】「モデル空間に確実に線を引く」安全設計テンプレート
実務でマクロを書くときは、「今どっちにいるか分からない」という前提でコードを組むのがプロの作法です。
図形を作成する直前に、「絶対にモデル空間にいる状態を作る」という安全装置を仕込んだ実践的なテンプレートを授けましょう。
Sub DrawLineSafely()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
‘ 【重要】処理の前に、強制的に「モデル空間」へ切り替える
‘ これにより、ペーパー空間でマクロが実行されてしまうミスを100%防ぎます
acadDoc.ActiveSpace = acModelSpace
‘ 変数の準備
Dim lineObj As AcadLine
Dim startPoint(0 To 2) As Double
Dim endPoint(0 To 2) As Double
‘ 始点と終点の座標を設定 (X, Y, Z)
startPoint(0) = 0#: startPoint(1) = 0#: startPoint(2) = 0#
endPoint(0) = 100#: endPoint(1) = 100#: endPoint(2) = 0#
‘ モデル空間(ModelSpaceコレクション)に線分を追加
Set lineObj = acadDoc.ModelSpace.AddLine(startPoint, endPoint)
‘ 画面を更新
acadDoc.Regen acActiveViewport
MsgBox “モデル空間に安全に線を引きました!”, vbInformation, “完了”
End Sub
ここがエンジニアのこだわりポイント!
このコードのミソは、図形を描画する前に `acadDoc.ActiveSpace = acModelSpace` を挟んでいる点です。
さらに、描画先も単なる `ActiveDocument.ModelSpace` ではなく、ドキュメントから明示的に `acadDoc.ModelSpace` を指定しています。これにより、ユーザーがレイアウトタブを開いたままマクロを起動したとしても、意図した通りにモデル空間へ図形を生成させることができます。
—
まとめ:空間の主導権をVBAに握らせよう
今回は、`AcadDocument.ActiveSpace` を使った空間制御の基本を解説しました。
- AutoCADにはモデル空間とペーパー空間の2つの世界がある
- VBAは現在の空間を空気読まずにそのまま描画する
- だからこそ、コード内で `ActiveSpace` を判定・制御(または強制変更)することが不可欠
ここをクリアすれば、もう「あれ、図形が消えた?」とCAD画面をウロウロ探しまわる必要はなくなります。ミスを未然に防ぐ堅牢なコードを書いて、スマートに業務を自動化していきましょう。
ここをクリアすれば、AutoCAD VBAの基本はバッチリです!
次のステップでも、現場で即役立つ知見をお届けしていきますので、楽しみにしていてくださいね。
