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

スポンサーリンク

【AutoCAD VBA】2点間の角度を支配する:`AngleFromPoint` でテキストを自動整列させる実務プログラミング

図面内の配管、構造物の軸線、あるいは斜めに走る敷地境界線。その傾きに合わせて注釈テキストを1つずつ回転させる作業に、どれだけの時間を溶かしているだろうか?

「文字を選択して、プロパティパレットを開いて、ラジアン換算を頭で計算して回転角を入力する……」

もしあなたが、このような手作業を「CADの仕様だから仕方ない」と諦めているなら、今すぐその思考をアップデートしてほしい。AutoCAD VBAにおけるオブジェクトモデルの鉄則を理解すれば、2点間を指定するだけで、テキストが意図した角度で一瞬にして吸い付くように配置される自動化ツールは、わずか数十行のコードで実装できる。

今回は、AutoCAD VBAの心臓部である `AcadDocument.Utility` オブジェクトの極意に迫り、実務の現場で「使える」堅牢な自動整列ツールの構築方法を伝授しよう。

—

1. なぜ「2点間の角度計算」でつまずくのか?

初学者が真っ先に陥る罠が、三角関数(`Atn` や `Sin`、`Cos`)を自前で実装しようとしてコードを複雑化させ、座標系の違いや象限の考慮漏れ(ラジアンと度数の変換ミスなど)でバグの温床を作るという失敗だ。

AutoCAD VBAには、開発者が幾何計算の泥沼にハマらないための強力なネイティブメソッドが用意されている。それが `Utility.AngleFromPoint` だ。

`AngleFromPoint` の本質とライフサイクル

このメソッドは、指定した「基準点」から「もう1つの点」に向かうベクトルが、現在のUCS(ユーザー座標系)のX軸正方向メンバに対してなす角度をラジアン単位で一発で弾き出す。

ここで重要なのは、このユーティリティ機能が `ThisDrawing.Utility`(裏側では `AcadUtility` オブジェクト)に属しているという点だ。ドキュメントのライフサイクルに完全に依存しており、図面が開かれていればインスタンスの生成を意識することなく即座に呼び出せる。この軽量さとアクセスの良さを使い倒すのがプロの設計思想である。

—

2. 実務で通用する堅牢なコード設計

実務で動かすマクロに求められるのは、「綺麗なコード」ではなく「例外で絶対に落ちない、ユーザーに優しいコード」だ。

ユーザーが画面上で点を指定する(`GetPoint`)際、右クリックでキャンセルしたり、意図しない入力をしたりすることは日常茶飯事である。したがって、エラーハンドリング(`On Error`)を完全に網羅し、さらにWCS(世界座標系)とUCSの整合性を意識した設計にしなければならない。

以下のプロダクションコードは、そのままあなたの業務ツールとして組み込める完全版だ。

コピペして即戦力となるプロダクションコード

Sub AlignTextByTwoPoints()
‘ ——————————————————————————–
‘ ツール名: 2点間の傾き取得&テキスト自動整列ツール
‘ 概要: ユーザーが画面上で指定した2点の角度を算出し、新規テキストをその角度で配置する
‘ ——————————————————————————–

‘ エラーハンドリングの準備
On Error GoTo ErrorHandler

Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing

Dim util As AcadUtility
Set util = acadDoc.Utility

‘ 1. テキストに表示する文字列の取得(実務ではフォームやセル連携に拡張可能)
Dim strTextContent As String
strTextContent = util.GetString(True, vbCrLf & “入力するテキスト文字列を指定してください: “)
If strTextContent = “” Then
MsgBox “文字列が入力されませんでした。処理を中断します。”, vbExclamation, “処理中断”
Exit Sub
End Sub

‘ 2. 基準点(始点)の取得
Dim ptStart As Variant
ptStart = util.GetPoint(, vbCrLf & “1点目(基準点)を指定してください: “)

‘ 3. 終点の取得(始点からのラバーバンドを表示させるために第1引数に ptStart を渡す)
Dim ptEnd As Variant
ptEnd = util.GetPoint(ptStart, vbCrLf & “2点目(方向を決める点)を指定してください: “)

‘ 4. 2点間の角度(ラジアン)を算出
Dim dblAngle As Double
dblAngle = util.AngleFromPoint(ptStart, ptEnd)

‘ 5. テキストを配置する挿入起点の取得
Dim ptInsert As Variant
ptInsert = util.GetPoint(ptStart, vbCrLf & “テキストの挿入起点を指定してください: “)

‘ 6. テキストの高さ設定(現在の文字スタイルや標準値に依存させるか、明示的に指定)
Dim dblTextHeight As Double
dblTextHeight = 255.0 ‘ ※図面の縮尺・単位(mm等)に合わせて調整してください

‘ 7. ModelSpaceへAcadTextオブジェクトを生成
Dim acadTextObj As AcadText
Set acadTextObj = acadDoc.ModelSpace.AddText(strTextContent, ptInsert, dblTextHeight)

‘ 8. 算出した角度を回転角(Rotation)に適用
acadTextObj.Rotation = dblAngle

‘ 9. 画面の再描画を強制
acadDoc.Regen acAllViewports

‘ 正常終了メッセージ
MsgBox “テキストの自動整列が完了しました。(角度: ” & Format(dblAngle (180 / ى), “0.00”) & “°)”, vbInformation, “完了”

Exit Sub

ErrorHandler:
‘ ユーザーによるESCキーや右クリックでのキャンセルをトラップ
If Err.Number = -2147352567 Or Err.Number = -2147467259 Then
‘ エラー番号 2147352567 等はユーザーキャンセル等の一般エラー
MsgBox “処理がキャンセルされました。”, vbInformation, “中断”
Else
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “エラー”
End If

End Sub

—

3. コードのキワ:プロが解説する実装の急所

上記のコードには、単なる「動くコード」を超えた、実務を分かっているエンジニアならではの設計思想が組み込まれている。

① ラバーバンド(ゴム紐効果)の活用

`util.GetPoint(ptStart, …)` の第1引数に `ptStart` を渡している点に注目してほしい。
これにより、AutoCADの画面上で1点目をクリックした瞬間から、マウスカーソルの動きに合わせて「1点目からカーソルへ伸びる線(ラバーバンド)」が視覚的に描画される。ユーザーは自分がどの方向に線を引こうとしているのかを視覚的に把握しながら2点目を指定できるため、ヒューマンエラーが劇的に減少する。UI/UXの観点において、この一手間を惜しむべきではない。

② ラジアンと度数の壁を意識しない設計

AutoCADのオブジェクトプロパティ(`Rotation` など)は、世界標準であるラジアン(Radian)を要求する。しかし、人間の脳は「45度」「90度」といった度数法(Degree)で思考する。
コード内では角度変換を行わず、`AngleFromPoint` が返したラジアン値をそのまま `Rotation` にブチ込んでいる。余計な変換を挟まないことで、浮動小数点演算の精度落ちや、象限反転時のバグを完全に排除しているのだ。

—

4. データベースや外部ファイル連携への拡張性

今回のコードは、単体の文字配置で終わらない。
実務の現場では、「Excelの管理台帳から読み込んだ配管名称や機器番号を、図面の指定した角度通りに自動配置していく」というバッチ処理へと発展させることが多い。

その場合、`util.GetPoint` でユーザーに対話入力を求める部分を、Excelから読み込んだ座標配列や角度データ(CSVやデータベース経由)に置き換えるだけで、数千個の注釈を数秒で正しい角度に整列させるモンスターツールへと変貌を遂げる。

‘ 拡張イメージ:外部データから取得した角度を直接適用する場合
‘ acadTextObj.Rotation = 外部から取得したラジアン値

—

5. まとめ:手作業の呪縛を断ち切れ

今回紹介した `AngleFromPoint` を使った角度の自動取得とテキスト整列は、AutoCAD VBAのポテンシャルを証明する氷山の一角に過ぎない。

「2点間の傾きをコードで瞬時に捉え、オブジェクトのプロパティを支配する」

この感覚を掴んだ瞬間から、あなたの図面作成スピードは次元が変わる。今日から手作業による回転入力の習慣を捨て、すべてをコードに語らせよう。それが、真に業務をハックするエンジニアの選択である。

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