【入門編】【初心者】AcadDocument.ActiveSpaceを自動検知し、モデル空間とペーパー空間で異なる注釈尺度を自動適用する – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:空間を自動検知して「注釈尺度」を支配せよ

こんにちは。現場で泥臭い自動化を積み重ね、AutoCADの挙動を骨の髄まで理解したチーフアーキテクトです。

マクロの記録ボタンを押して生成されたコードを眺めて、「なぜか動かない」「特定の状況でエラーになる」と頭を抱えたことはありませんか?それは、AutoCADという巨大なエンジンが持つ「現在のコンテキスト(文脈)」をコードが正しく理解していないからです。

今回は、AutoCAD VBAの入り口として最も重要でありながら、多くの初心者が躓く「ActiveSpace(作業空間の判定)」をテーマに、実務で即戦力となる「空間自動検知・尺度適用ツール」を解説します。

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

AutoCADには、作図を行う「モデル空間(acModelSpace)」と、印刷レイアウトを整える「ペーパー空間(acPaperSpace)」が存在します。

  • モデル空間: 現実世界のサイズで描く(1:1)。
  • ペーパー空間: 印刷用紙上のサイズで整える(注釈尺度を適用)。

この二つは、プログラムから見ると「全く別の世界」です。モデル空間にいるつもりでペーパー空間用の処理を走らせれば、AutoCADは容赦なくエラーを返します。「今、自分はどこにいるのか?」をプログラムに教えること。これが自動化の第一歩です。

2. 空間を判定する魔法のオブジェクト:ActiveSpace

AutoCAD VBAで空間を判定するには、`ThisDrawing.ActiveSpace` というプロパティを使います。

  • acModelSpace (0): モデル空間にいる。
  • acPaperSpace (1): ペーパー空間(レイアウト)にいる。

これを利用して、現在の空間に応じた「適切な注釈尺度」を強制的にセットするコードを書いてみましょう。

実践コード:空間自動検知・尺度適用マクロ

このコードを標準モジュールに貼り付けて実行してみてください。

Option Explicit

Public Sub AutoSetAnnotationScale()
Dim doc As AcadDocument
Set doc = ThisDrawing

‘ 1. 現在の空間を判定
‘ ActiveSpaceは定数で返ってくるので、Select Caseで分岐させるのが定石
Select Case doc.ActiveSpace
Case acModelSpace
‘ モデル空間の場合の処理:文字サイズを大きく設定する
MsgBox “モデル空間を検知しました。標準尺度 1:1 を適用します。”
doc.SetVariable “CANNOSCALE”, “1:1”

Case acPaperSpace
‘ ペーパー空間の場合の処理:図面枠用に尺度を 1:100 にする
MsgBox “ペーパー空間を検知しました。標準尺度 1:100 を適用します。”
doc.SetVariable “CANNOSCALE”, “1:100”

Case Else
MsgBox “予期せぬ空間です。”
End Select

‘ 再描画をかけて変更を反映させる
doc.Regen acActiveViewport
End Sub

3. このコードの「ここがポイント」

  • SetVariable: AutoCADのシステム変数(`CANNOSCALE`など)を直接操作するコマンドです。コマンドラインで入力する内容をVBAから制御できるため、非常に強力です。
  • Regen: 尺度を変更した直後は画面上の表示が追いつかないことがあります。`Regen`を呼ぶことで、AutoCADの表示エンジンに「今の状態を再計算しろ」と命令を送ります。これがスムーズな動作の秘訣です。

4. 初学者が陥りやすい罠:エラーを防ぐ極意

コードを書き始めると、必ず以下のエラーに遭遇します。

「オブジェクトがありません」エラー

これは、「ペーパー空間にいるのに、モデル空間のオブジェクトを操作しようとした」ときに発生します。

  • 対策: 常に `If doc.ActiveSpace = acModelSpace Then …` というガードを設ける癖をつけてください。

空間を切り替えた直後の「フリーズ」

レイアウトタブをクリックした直後など、AutoCADが内部的に切り替え処理を行っている最中にマクロを動かすと、不安定になります。

  • 対策: `DoEvents` を挟むことで、OSやAutoCADの描画処理に一瞬だけ隙間を与えてあげると、驚くほど安定します。

最後に:自動化の先にあるもの

今回解説した `ActiveSpace` の判定は、単なる尺度設定だけでなく、「モデル空間のときはレイヤAを非表示にする」「ペーパー空間のときは特定の図面枠を自動挿入する」といった、より高度な自動化への扉です。

AutoCAD VBAは、あなたの「面倒だ」と感じる作業をすべて肩代わりしてくれます。まずはこのコードを動かし、自分の環境に合わせて改造してみてください。

「プログラムが自分の代わりにCADを操作する」という感覚を掴めれば、あなたはもう初心者ではありません。エンジニアとしての新しいキャリアの始まりです。また次のステップでお会いしましょう!

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