【入門編】【実務中級】AcadDocument.Utility.GetOrientationによる「回転角」の取得:ANGBASE設定に左右されない正確な角度入力 – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCAD VBAの世界へようこそ。
マクロの記録ボタンをポチポチ押すだけのステージから抜け出し、「自分の手でCADを自在に操るプログラムを書きたい!」そう思っているあなたへ。

今回は、実務で絶対に避けて通れない「角度の取得」について、プロのアーキテクト視点からディープに、そして分かりやすく解説します。

ここをクリアすれば、図面の設定に振り回されない「本当の意味で頑健なAutoCADマクロ」が組めるようになります。さあ、一緒に扉を開けましょう!

なぜ、ただの「角度入力」で現場のエンジニアは頭を抱えるのか?

AutoCADで図面を描くとき、こんな経験はありませんか?
「自分の担当図面では『東(右方向)』が角度0度なのに、隣の部署から回ってきた図面は『北(上方向)』が0度になっている……!」

AutoCADには、ANGBASE(角度基準)というシステム変数があります。これによって、図面ごとに「どこを0度とするか」が変わってしまうのです。

もしあなたが、素朴にユーザーから「角度」だけを入力させようとすると……

  • ある図面では正しく動くのに、別の図面にもっていくとブロックの向きが明後日の方向を向く
  • 角度の足し算・引き算のデバッグだけで残業が消えていく

こんな悲劇が起きます。この問題を美しく、かつ完璧に解決するのが今回テーマにする `GetOrientation` です。

基礎知識:GetAngle と GetOrientation の決定的な違い

VBAでユーザーから角度を入力させるメソッドには、主に以下の2つがあります。

1. `GetAngle` (ゲット・アングル)
2. `GetOrientation` (ゲット・オリエンテーション)

この2つの違い、一言で言えばこうなります。

  • `GetAngle`:

現在の図面のANGBASE(基準角度)とANGDIR(回転方向:時計回りか反時計回りか)の影響を「受ける」

  • `GetOrientation`:

現在の図面の設定を「無視して、常に東(3時方向)を基準(0度)とした絶対的な角度」を返す

実務の自動化において、ブロックの挿入や図形の回転角をピタッと意図通りに決めたい場合、信頼すべきは「常に東を0度とする」 `GetOrientation` です。図面ごとのローカルルールに依存しない、これがプロのコードの鉄則です。

【実践】GetOrientation を使った堅牢な角度取得コード

百聞は一見に如かず。実際に動くコードを見てみましょう。
このコードは、画面上で2点をクリック(あるいは基準点からの方向を指定)してもらい、その方向の「真の角度(ラジアン)」を取得して、イミディエイトウィンドウに出力する実用スニペットです。

Sub GetTrueOrientationSample()
‘ —————————————————————–
‘ 目的: ANGBASEの設定に依存せず、常に東基準の正確な角度を取得する
‘ —————————————————————–
Dim acadUtility As AcadUtility
Set acadUtility = ThisDrawing.Utility

On Error GoTo ErrorHandler ‘ ユーザーが右クリックやESCでキャンセルした時の対策

Dim basePoint As Variant
Dim returnAngle As Double

‘ 1. 基準となる点をユーザーに指示させる(省略して直接角度だけ聞くことも可能)
basePoint = acadUtility.GetPoint(, vbCrLf & “基準となる基点を選択してください: “)

‘ 2. GetOrientationの実行
‘ 第1引数に基点を渡すことで、その点から引いた「向き」の角度を取得できます
returnAngle = acadUtility.GetOrientation(basePoint, vbCrLf & “方向を示す点(または角度)を指定してください: “)

‘ 3. 取得したラジアンを「度(Degree)」に変換して確認
Dim angleDeg As Double
angleDeg = returnAngle (180 / Atn(1) 4) ‘ 厳密なラジアン→度変換

‘ 結果出力
MsgBox “取得した絶対角度(東基準): ” & Format(angleDeg, “0.00”) & ” 度”, vbInformation, “成功”

Exit Sub

ErrorHandler:
‘ ユーザーがキャンセル(ESCキーなど)した場合はErr.Numberが必ず入る
If Err.Number = -2145320939 Then
MsgBox “処理がキャンセルされました。”, vbExclamation, “中断”
Else
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End If
End Sub

コードの重要ポイント解説

  • `ThisDrawing.Utility` の活用

AutoCADの画面対話(ユーザーからの入力を待つ処理)は、すべて `Document` オブジェクトの `Utility` プロジェクトが握っています。

  • エラーハンドリング(`On Error GoTo`)は必須

CADの対話型メソッドは、ユーザーが途中で `ESC` キーを押すと容赦なく実行時エラーを吐いてマクロが止まります。実務では必ずキャンセル時のトラップを書きましょう。

  • ラジアンの罠

AutoCADの内部計算はすべて「ラジアン」で行われます。`GetOrientation` が返す値もラジアンです。人間が直感的に扱いやすい「度(Degree)」に変換する計算式(`180 / 3.14159…` ですが、上記のコードでは円周率を `Atn(1) 4` で安全に求めています)を覚えておくとスマートです。

現場でありがちな失敗と、その処方箋

罠1: `GetAngle` を使ってしまい、違う部署の図面で大混乱

「さっきまで完璧に動いていたのに、別の設計士の図面で文字の向きが90度ズレる!」という相談を本当によく受けます。原因のほとんどは `GetAngle` を使っているせいです。図面ごとの「変数値」にプログラムを振り回されないよう、方向を扱うロジックには迷わず `GetOrientation` を採用してください。

罠2: 基点を渡さずに呼び出して座標系で迷子になる

`GetOrientation` は、第1引数に `basePoint` (基点)を省略して呼ぶこともできます。しかし、基点を省略すると「現在のUCS(ユーザー座標系)の原点」からの角度とみなされてしまい、ユーザーが意図したローカルな位置関係とズレることがあります。
画面上のオブジェクトの向きを合わせたい等の文脈では、必ず「基準となる点」をあらかじめ取得してから渡すのがセオリーです。

おわりに:ここをクリアすれば、もう初学者ではない

お疲れ様でした!
今回は `AcadDocument.Utility.GetOrientation` を通して、AutoCADの座標系や環境設定(ANGBASE)に依存しない堅牢なコーディングの考え方を解説しました。

単に「動くコード」を書くだけなら、ネットのサンプルをコピペすれば事足ります。しかし、「どんな環境の、どんな変態的な設定がされた図面でも、エラーを出さずに正確に動作するコード」を書けるようになった瞬間から、あなたはもう「AutoCAD VBAの初学者」ではありません。立派な業務自動化のアーキテクトです。

この知見をあなたの実務に持ち帰り、退屈な手作業を鮮やかに自動化してみてください。
それでは、次のステップでお会いしましょう。あなたの開発ライフが素晴らしいものになりますように!

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