【入門編】【実務中級】AcadDocument.Utility.TranslateCoordinatesによる「ペーパー空間からモデル空間」への座標変換と図形転送 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージはもう卒業して、「真のAutoCAD VBAの力」を手に入れたいあなたへ。

今回は、実務で必ずと言っていいほどぶつかる壁、「ペーパー空間(レイアウト)とモデル空間の座標変換」について徹底解説します。ここをクリアすれば、図面自動化のスキルが一気にプロの領域へ到達しますよ。

—

なぜ、座標変換で躓くのか?

AutoCADを使っていると、こんな要望はありませんか?

> 「レイアウトタブ(ペーパー空間)の図面枠上でクリックした位置に、モデル空間側の文字や記号をピタリと配置したい!」

ここで多くの人がパニックに陥ります。
なぜなら、ペーパー空間の「ミリ単位の座標(例: X=100, Y=50)」と、モデル空間の「実世界の実寸座標(例: X=15000, Y=8000)」は、まったく別の世界線にあるからです。

用紙の寸法と、図面のスケール(尺度)、そしてビューポートのズーム状態。これらを計算して結びつけてあげる必要があります。
それを一発で解決してくれるのが、AutoCAD VBAが誇る最強のメソッド `TranslateCoordinates` です。

ここをマスターすれば、もう手作業で座標計算機を叩く必要はなくなります。一緒に本質を学んでいきましょう!

—

座標変換のキーマン:TranslateCoordinates とは?

`TranslateCoordinates` は、`AcadUtility` オブジェクトに備わっている空間座標の翻訳機です。

RetVal = AcadUtility.TranslateCoordinates(Point, FromSpace, ToSpace, Disp [, DispFrame])

このメソッドの恐ろしくも素晴らしいところは、以下の4つの空間を行き来できる点です。

1. モデル空間 (acModel)
2. ペーパー空間のレイアウト全体 (acPaperSpace)
3. ビューポートの中(DCS: 表示座標系)
4. 画面上のピクセル位置 (PSDCS)

今回はこの中から、「ペーパー空間(レイアウト)の座標」を「モデル空間の座標」へダイレクトに翻訳する手順をコードで見ていきます。

—

【実践】ペーパー空間の指示点をモデル空間に変換して図形を転送するマクロ

それでは、実務でそのまま使えるサンプルコードを公開します。
このコードは、レイアウトタブ上でユーザーに点(またはオブジェクト)を指定してもらい、その場所がモデル空間上のどこを指しているのかを計算し、モデル空間側に文字(Text)を生成するプログラムです。

サンプルコード

Sub TranslateAndTransferToModel()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

On Error GoTo ErrorHandler

‘ 1. 現在の空間がペーパー空間(レイアウト)かチェック
If acadDoc.ActiveSpace = acModelSpace Then
MsgBox “このマクロは「レイアウト(ペーパー空間)」タブで実行してください。”, vbExclamation, “空間エラー”
Exit Sub
End If

Dim util As AcadUtility
Set util = acadDoc.Utility

‘ 2. ペーパー空間上で任意の点をユーザーに指示してもらう
Dim ptPaper As Variant
ptPaper = util.GetPoint(, vbCrLf & “【ペーパー空間】配置したい位置をクリックしてください: “)

‘ 3. 【核心】ペーパー空間からモデル空間への座標変換
‘ ※注意:ビューポートの中をクリックしていることが前提となります
Dim ptModel As Variant
ptModel = util.TranslateCoordinates( _
ptPaper, _
acPaperSpace, _ ‘ 変換元:ペーパー空間
acModelSpace, _ ‘ 変換先:モデル空間
False) ‘ True=変位量(ベクトル), False=位置座標

‘ 4. 変換されたモデル空間の座標に、実際にテキストを配置する
Dim modelSpaceObj As AcadModelSpace
Set modelSpaceObj = acadDoc.ModelSpace

Dim txtObj As AcadText
Dim insertionPoint(0 To 2) As Double

‘ 変換された座標をセット
insertionPoint(0) = ptModel(0)
insertionPoint(1) = ptModel(1)
insertionPoint(2) = ptModel(2)

‘ モデル空間側に文字を作成(高さは適宜調整してください)
Set txtObj = modelSpaceObj.AddText(“★ここが変換点”, insertionPoint, 50.0)

MsgBox “座標変換に成功しました!” & vbCrLf & _
“モデル空間 (X: ” & Format(ptModel(0), “0.00”) & _
“, Y: ” & Format(ptModel(1), “0.00”) & “) に文字を配置しました。”, vbInformation, “処理完了”

Exit Sub

ErrorHandler:
If Err.Number <> -2147352567 Then ‘ キャンセル時のエラー番号を考慮
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub

—

コードのここがポイント! 押さえておきたい3つの極意

1. `ActiveSpace` によるガード節

AutoCAD VBAでは、今自分が「どこにいるか(モデルかレイアウトか)」を意識することがバグを防ぐ第一歩です。モデル空間でこのマクロを走らせると期待通りに動かないため、最初に弾くロジックを入れています。

2. `TranslateCoordinates` の第4引数(Disp)の罠

ここが初学者が一番ハマるポイントです。

  • `False` を指定すると:「絶対座標(位置)」として変換します(今回のケース)。
  • `True` を指定すると:「相対座標(距離・ベクトル)」として変換します(尺度のみをかけ合わせたい場合など)。

座標そのものを移したいのか、長さや移動量を移したいのかでここを切り替えます。

3. ビューポートの罠(実務上の注意点)

`TranslateCoordinates` を使う際、レイアウト上に複数のビューポートが存在する場合、AutoCADは「どのビューポートの視点を通した空間か」を正しく認識しなければなりません。
基本的には、最後にアクティブになった(あるいは最後にマウスが乗った)ビューポートが基準となります。実務でシート内に複数ビューポートがある複雑な図面を扱う場合は、対象のビューポートをあらかじめ `ActiveViewport` に設定するなどの配慮が必要になることを覚えておきましょう。

—

まとめ:ここをクリアすれば、もう怖くない!

今回は、`AcadDocument.Utility.TranslateCoordinates` を使ったペーパー空間からモデル空間への座標変換を解説しました。

一見難しそうに見える座標系(OCS, WCS, DCS, PSDCS)の概念も、VBAの強力なユーティリティメソッドを使えば、数行のコードでスマートに料理できます。

ここをクリアしたあなたなら、図面枠の自動生成、レイアウトごとの一括スタンプ押し、詳細図の自動切り出しなど、業務効率化の可能性が無限に広がっているはずです。

「ここをもっと深掘りしたい」「こういう図面自動化もできる?」といった疑問があれば、いつでもまたこの部屋へノックしに来てください。
あなたのAutoCAD自動化ライフを、これからも応援しています!

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