【実務・中級編】【実務中級】座標変換の極意:UCS(ユーザー座標系)とWCS(世界座標系)をTranslateCoordinatesで相互変換する – AutoCAD VBA解析バイブル

スポンサーリンク

【AutoCAD VBA】座標変換の極意:UCSとWCSの罠を断ち切り、`TranslateCoordinates`を完全掌握する

開発プロジェクトのリーダーである私のもとに、よくこんな悲鳴が届く。
「VBAで計算した座標に図形を生成したはずなのに、傾いた図面だと全く違う変な場所に飛んでいく……」

原因は明白だ。WCS(世界座標系)とUCS(ユーザー座標系)の概念を無視し、目の前の「画面上の数字」をそのままコードに直書きしているからだ。

AutoCAD VBAを実務レベルで使いこなし、泥臭い図面修正から解放された自動化ツールを作るためには、座標系のコントロールがすべての基礎となる。今回は、AutoCADの空間を支配するための最強の武器、`Utility.TranslateCoordinates`メソッドを用いた座標変換の極意を伝授しよう。

1. なぜ「生の座標」を信用してはならないのか?

AutoCADの内部データベース(DXFグループコードやエンティティの座標)は、例外なくすべて WCS(World Coordinate System / 世界座標系) を基準に保持されている。

しかし、設計者が図面を描くときに見ているのは、回転や移動が加えられた UCS(User Coordinate System / ユーザー座標系) だ。

  • VBAが返す座標・要求する座標:基本は WCS
  • ユーザーが画面(UI)上で認識している座標:現在の UCS

この乖離を理解せず、UCS上の「X=100, Y=100」という値をそのまま `AddLine` や `AddCircle` に放り込むと、図面が傾いている現場ほど盛大に座標がズレる。バグの温床であり、手戻りの原因だ。

ここで登場するのが、座標系の翻訳者である `TranslateCoordinates` メソッドである。

2. `TranslateCoordinates` の正しい作法

`TranslateCoordinates` は、`AcadUtility` オブジェクトが持つ関数だ。特定の座標値を、ある座標系から別の座標系へ、あるいは図面座標からディスプレイ座標へと変換してくれる。

メソッドの構文と引数の罠

RetVal = AcadUtility.TranslateCoordinates(Point, FromType, ToType, [Displacement], [Normal])

このメソッドで最も重要なのは、第2引数の `FromType` と第3引数の `ToType` だ。ここに指定する定数(`AcCoordinateSystem` 列挙体)を間違えると、意図しない計算結果が返ってくる。

  • `acWorld` (0): WCS
  • `acUCS` (1): UCS
  • `acDisplayDCS` (2): ディスプレイDCS
  • `acPaperSpaceDCS` (3): ペーパー空間DCS
  • `acDrawing` (2D): 2D図面座標

実務で圧倒的に使うのは、`acUCS` と `acWorld` の相互変換である。

3. 【実践】UCS上のクリック位置・指定点をWCSに変換して正確に図形を置く

実務でよくある要件として、「ユーザーが画面上で指定した点(UCS基準)を起点にして、プログラム側でWCSを基準とした正確な図形群を構築する」というケースがある。

以下のプロダクションコードは、現在のUCS上で取得した点を安全にWCSへ変換し、そこに円を生成する堅牢なプロシージャだ。エラーハンドリングとオブジェクトのライフサイクルを意識した設計にしている。

Option Explicit

”’

”’ ユーザー座標系(UCS)で指定された点を世界座標系(WCS)に変換し、
”’ その位置に安全に円を配置する実務向けプロシージャ
”’

Public Sub DrawCircleAtUCSPoint()
Dim acadApp As AcadApplication
Dim acadDoc As AcadDocument

‘ アプリケーションとアクティブドキュメントの安全な取得
Set acadApp = ThisDrawing.Application
Set acadDoc = acadApp.ActiveDocument

On Error GoTo ErrorHandler

‘ 1. ユーザー対話により、現在のUCS上で点を取得する
Dim basePointUCS As Variant
basePointUCS = acadDoc.Utility.GetPoint(, “基準となる点を指定してください: “)

‘ 2. 取得したUCS上の点を、WCS(世界座標系)へ変換する
‘ 引数: 変換元ポイント, 変換元座標系(UCS), 変換先座標系(WCS)
Dim basePointWCS As Variant
basePointWCS = acadDoc.Utility.TranslateCoordinates( _
basePointUCS, _
acUCS, _
acWorld, _
False ‘ False = 座標点として変換 (Trueの場合は変位/ベクトル)
)

‘ 3. WCS座標を基準にしてモデル空間に円を描画する
‘ これにより、図面がどれだけ回転・傾いていても意図した正確な位置に作図される
Dim modelSpace As AcadModelSpace
Set modelSpace = acadDoc.ModelSpace

Dim rad As Double
rad = 50.0 ‘ 半径50mm

Dim cObj As AcadCircle
Set cObj = modelSpace.AddCircle(basePointWCS, rad)

‘ 画面を強制更新
acadApp.Update

MsgBox “WCSへの座標変換と作図が正常に完了しました。”, vbInformation, “座標変換成功”
Exit Sub

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

‘ オブジェクトの解放
Set cObj = Nothing
Set modelSpace = Nothing
Set acadDoc = Nothing
Set acadApp = Nothing
End Sub

4. プロフェッショナルが教える設計上の極意

現場でこのコードを運用するにあたり、シニアエンジニアとして以下の2点を強く進言する。

① 「点 (Point)」と「ベクトル (Displacement)」の混同を絶つ

`TranslateCoordinates` の第4引数 `[Displacement]` は生死を分けるポイントだ。

  • 座標そのもの(位置)を変換する場合は `False`
  • 長さや方向(ベクトル、例えば「X方向に100移動する」といった相対距離)を変換する場合は `True`

これを間違えると、UCSが回転している図面において、移動ベクトルが狂い、図形が明あらぬ方向へ飛んでいくバグを生む。相対距離を扱う場合は必ず `True` を指定せよ。

② パフォーマンスとトランザクションの意識

大量の座標変換(例えば、外部CSVから数千件の座標を読み込んでUCS上に一括プロットする場合など)を行う際、ループ内で毎回 `TranslateCoordinates` を呼び出すのは許容範囲内だが、画面描画の `acadApp.Update` や `Zoom` をループ内に挟むのは厳禁である。
一括処理時は `acadDoc.StartUndoMark` と `acadDoc.EndUndoMark` でトランザクションを囲み、描画更新を止めることで、処理速度を劇的に向上させることができる。

まとめ

AutoCAD VBAにおける座標系は、一見すると厄介な足かせに見える。しかし、`TranslateCoordinates`の本質を理解し、「入力はUCS、処理と保持はWCS」という鉄のルールを設計に組み込めば、どんなに複雑な傾きを持った現場の図面であっても、寸分狂わず自動化処理を完遂できる。

「なんとなく動く」から「ロジカルにバグを排除できる」コードへ。
この知見をあなたの開発プロジェクトに組み込み、真の業務効率化を達成してほしい。

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