【入門編】【初心者向け】AcadDocument.Utility.AngleFromPointで「2点間の角度」を取得し、テキストの回転角に自動適用する – AutoCAD VBA解析バイブル

スポンサーリンク

こんにちは!AutoCADの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、自分の手でCADを自在に操る「真のエンジニア」への扉を開いたあなたへ、最高にワクワクする技術をお伝えしましょう。

今回は、AutoCAD VBAの基礎でありながら、実務の図面整理でめちゃくちゃ役立つ「2点間の角度を自動計算し、テキストの回転角にビシッと適用するツール」の作り方を解説します。

ここをクリアすれば、AutoCAD VBAのオブジェクトモデルの心臓部である `AcadDocument` と `Utility` の扱い方が手に取るように分かるようになりますよ。さあ、一緒に基本をマスターしていきましょう!

—

1. なぜ「2点間の角度」が自動化の第一歩なのか?

図面を描いていて、こんな面倒くささを感じたことはありませんか?

  • 斜めの壁や配管に沿って、文字(注釈)を綺麗に配置したい。
  • いちいちプロパティウィンドウを開いて、回転角(Rotation)に「34.25度」などと手入力している。

人間は「ここからここまで」と画面をクリックするだけで直感的に理解できますが、プログラムにそれをさせるには「数学的な座標」を翻訳してあげる必要があります。

AutoCAD VBAには、この「人間のクリック」と「CADの空間数学」をスマートにつないでくれる魔法の道具箱が備わっています。それが `AcadDocument.Utility` オブジェクトです。

—

2. 本日の主役:`AngleFromPoint` とは?

今回使う最大の武器が、`AngleFromPoint` メソッドです。

retAngle = ThisDrawing.Utility.AngleFromPoint(Point1, Point2)

これは、「指定した起点(Point1)から終点(Point2)へ向かうベクトルが、X軸の正方向に対して何度傾いているか(ラジアン単位)」を瞬時に計算してくれる関数です。

ここで初学者が絶対に覚えておくべきAutoCAD VBAの2大鉄則を伝授します。

1. 座標は「配列(Array)」で扱う
AutoCADの点は `X, Y, Z` の3次元座標です。VBAでは `Double型の大規模な配列(例: Dim p1(0 To 2) As Double)` として渡すのがルールです。
2. 角度は「ラジアン(Radian)」で返ってくる
「90度」と言いたいときは `90` ではなく、$\pi / 2$ すなわち `Atn(1) 2` (あるいは `1.570796…`)というラジアン値でプロパティに渡す必要があります。VBAには便利な `VBA.Rnd` はありますが、度数法をラジアンに変換する関数はないため、`角度 (3.14159265358979 / 180)` という変換式を覚えておくと重宝します。

—

3. 実装コード:傾き自動追従テキスト配置マクロ

それでは、開発環境(VBAエディタ / Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてみてください。

実務でそのまま使えるよう、エラーハンドリングと丁寧なコメントを仕込んでおきました。

Sub AlignTextByTwoPoints()
On Error GoTo ErrorHandler

Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

Dim util As AcadUtility
Set util = acadDoc.Utility

‘ 1. ユーザーにテキスト文字列を入力してもらう
Dim textStr As String
textStr = util.GetString(False, vbCrLf & “配置する文字を入力してください: “)
If textStr = “” Then Exit Sub

‘ 2. 基準となる「1点目(始点)」を画面クリックで取得
Dim pt1 As Variant
pt1 = util.GetPoint(, vbCrLf & “1点目(基準点)をクリックしてください: “)

‘ 3. 傾きを決める「2点目(終点)」を画面クリックで取得
Dim pt2 As Variant
pt2 = util.GetPoint(pt1, vbCrLf & “2点目(方向を決める点)をクリックしてください: “)

‘ 4. AngleFromPoint メソッドで2点間の角度(ラジアン)を算出
Dim angleRadian As Double
angleRadian = util.AngleFromPoint(pt1, pt2)

‘ 5. 文字の挿入基点をどこにするか(今回は1点目を採用)
‘ ※Textオブジェクトの挿入点には、配列をそのまま渡します
Dim insertionPoint(0 To 2) As Double
insertionPoint(0) = pt1(0): insertionPoint(1) = pt1(1): insertionPoint(2) = pt1(2)

‘ 6. モデル空間に文字(AcadText)を作成
Dim acadTextObj As AcadText
Dim textHeight As Double
textHeight = 250 ‘ 必要に応じて文字高さを変更してください(例: 250mm)

Set acadTextObj = acadDoc.ModelSpace.AddText(textStr, insertionPoint, textHeight)

‘ 7. 計算した角度をテキストの回転プロパティに適用!
acadTextObj.Rotation = angleRadian

‘ 8. 画面を更新
acadDoc.Regen acAll

MsgBox “文字の整列が完了しました!”, vbInformation, “AutoCAD VBA 成功”
Exit Sub

ErrorHandler:
‘ ユーザーがESCキーでキャンセルした場合などのエラー処理
If Err.Number <> -2147352567 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End If
End Sub

—

4. コードの深掘り解説:ここがエンジニアの急所

この短いコードの中には、AutoCADを自在に操るためのエッセンスが凝縮されています。

① `GetPoint` の柔軟性

`util.GetPoint()` は、ユーザーにマウスで画面をクリックさせる強力なメソッドです。第1引数に `pt1` を渡している(Rubber-band lineの起点指定)ことに注目してください。これによって、1点目をクリックした瞬間から、マウスカーソルの動きに合わせて「ピバーッ」と線が伸びる視覚的フィードバックが生まれ、圧倒的に操作しやすいツールになります。

② オブジェクトのライフサイクルとスコープ

`ThisDrawing` から `AcadDocument` を取得し、そこから `Utility` や `ModelSpace` を呼び出す階層構造(オブジェクトモデル)を意識してください。
AutoCAD VBAでは、生成した図形オブジェクト(`AcadText` など)は自動的にメモリ管理されますが、どの空間(ModelSpace / PaperSpace)に追加するかを明示することが鉄則です。

—

5. 初学者が陥りがちな「罠(エラー)」と対策

罠1: 「型が一致しません」という実行時エラー (Error 13)

  • 原因: `GetPoint` はユーザーが右クリックやESCでキャンセルすると、空のデータ(Empty)を返します。これをそのまま `AngleFromPoint` に突っ込むと怒られます。
  • 対策: 本格的なツールにする場合は `If IsArray(pt1) = False Then Exit Sub` のようなガード節を入れましょう(今回はシンプルにするため省略していますが、実務では必須です)。

罠2: 文字が変な方向に向く・逆さになる

  • 原因: 2点間を右から左へクリックした場合、角度は180度($\pi$)逆を向きます。図面の可読性を考慮すると、文字が下向きや逆さまになってしまうのは実務上NGです。
  • 発展的なアドバイス: 応用編として、取得したラジアンが $\pi / 2$ より大きく、かつ $3\pi / 2$ より小さい場合(つまり文字が左向きになる場合)、`angleRadian = angleRadian + 3.14159…` のように補正して、「文字が常に上向き・右向きを読めるように自動反転させるロジック」を組んでみると、一人前のプログラミングスキルが身につきますよ。

—

まとめ

お疲れ様でした!
今回は `AcadDocument.Utility.AngleFromPoint` を使って、ユーザーのクリックから瞬時に角度を割り出し、テキストオブジェクトの姿勢をコントロールする方法を学びました。

「画面から入力を受け取り、計算し、図形を生成・修飾する」
この一連の流れこそが、あらゆるAutoCAD自動化ツールの基本形です。

ここをクリアしたあなたなら、次は「複数の線分の角度の一括調整」や「ブロック参照(AcadBlockReference)の回転角制御」など、より高度な領域へスムーズに進むことができます。

日々の煩わしい手作業をコードでスマートに解決し、クリエイティブな設計業務に時間を使い倒しましょう。それでは、次回の極限知見でお会いしましょう!

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