【実務・中級編】【実務中級】AcadDocument.Utility.TranslateCoordinatesによる「傾いたUCS」への対応:WCS座標を現在のユーザー座標系に変換して正確に配置する手法 – AutoCAD VBA解析バイブル

スポンサーリンク

AutoCAD VBAを掌握する:傾いたUCSをねじ伏せる座標変換の極意

AutoCADの自動化において、最も多くのエンジニアが「泥沼」にはまる瞬間。それは、「WCS(ワールド座標系)で計算したはずの座標が、なぜか全く違う場所にプロットされる」という現象だ。

図面ごとにUCS(ユーザー座標系)が回転・移動している現場では、座標の直打ち(ハードコーディング)は罪に等しい。本稿では、`TranslateCoordinates`を完璧に使いこなし、どんな傾いた図面でも正確無比に配置を行う、プロフェッショナルな座標変換設計を伝授する。

1. なぜ「座標系」の意識が甘いとツールは死ぬのか

多くの初学者は、`Point3D`をただの「X, Y, Zの数値の羅列」と捉える。だが、AutoCADにおける座標とは、「どの座標系を基準にしたベクトルか」というメタ情報とセットで存在する。

`AcadDocument.Utility.TranslateCoordinates` を無視して、WCSの座標をそのまま `ModelSpace.AddLine` 等に投げ込むと、UCSが回転している図面では斜め方向にズレた図形が生成される。このバグは修正が困難であり、数千個の要素を生成した後に気づけば、そのプロジェクトは完全に破綻する。

2. TranslateCoordinates:唯一無二の正しい変換エンジン

座標変換を行う際、`Utility`オブジェクトの `TranslateCoordinates` メソッドを使うのが唯一の正解だ。

‘ メソッド構文の要点
‘ RetVal = Utility.TranslateCoordinates(Point, From, To, OCS)

このメソッドの引数は以下の通りだ。

  • From/To: `acWorld` (0), `acUCS` (1), `acOCS` (2) を指定する。
  • OCS (第三引数): True/False。これは「オブジェクト座標系(押し出しベクトル)」を考慮するかどうかのフラグだ。通常は `acWorld` から `acUCS` への変換なら `False` でいい。

3. 実践:保守性の高いプロダクションコード

単にメソッドを呼ぶだけでなく、「戻り値の型(Variant)」を明示的に変換すること。これがVBA特有の不安定さを排除する鉄則だ。

以下は、WCS上の座標を現在のUCS座標系へ変換し、円を描画する堅牢な実装例である。

Public Sub DrawCircleAtTargetUCS()
Dim acadUtil As AcadUtility
Set acadUtil = ThisDrawing.Utility

‘ 1. WCS上の基準点 (例: 100, 100, 0)
Dim wcsPoint As Variant
wcsPoint = Array(100#, 100#, 0#)

‘ 2. 変換実行 (WCS -> UCS)
‘ 座標系を明示的に指定することで、読みやすさと安全性を確保する
Dim ucsPoint As Variant
On Error Resume Next ‘ 予期せぬ座標系エラー対策
ucsPoint = acadUtil.TranslateCoordinates(wcsPoint, acWorld, acUCS, False)

If Err.Number <> 0 Then
MsgBox “座標変換に失敗しました。図面設定を確認してください。”
Exit Sub
End If
On Error GoTo 0

‘ 3. 変換後の座標を使用して配置
Dim circleObj As AcadCircle
Set circleObj = ThisDrawing.ModelSpace.AddCircle(ucsPoint, 50#)

‘ 4. 更新の反映
circleObj.Update
End Sub

このコードが「プロ仕様」である理由

1. Variantの活用: `TranslateCoordinates` は `Variant` 型(配列)を返すため、そのまま `AddCircle` に渡せる設計にしている。
2. エラーハンドリング: `TranslateCoordinates` は稀に異常なUCS定義下でエラーを吐く。`On Error` を挟むことで、ツール全体が落ちるのを防ぐ。
3. 明示的定数: `acWorld` や `acUCS` を使うことで、数ヶ月後に見返しても「何から何へ変換しているか」が一目瞭然である。

4. 業務自動化における「黄金律」

最後に、実務で多くのツールを管理する立場からアドバイスしたい。

  • 「現在のUCS」を過信しない: ツール実行の直前にユーザーがUCSを変更する可能性がある。可能な限り、変換直前に `TranslateCoordinates` を実行する「遅延評価」のスタイルをとれ。
  • データベース連携時の注意: 外部DB(Excel/SQL Server)から座標を読み込む際は、必ず「これはWCS値である」というメタデータをDB側に持たせること。UCS値は「表示用」であり、計算の基準にしてはならない。
  • OCS(オブジェクト座標系)との混同を避ける: 円弧やポリラインの法線ベクトル(Normal)を扱う際は、`acOCS` を使用する必要がある。ここを `acWorld` で代用しようとすると、必ず計算が狂う。

結論:座標系を制する者がAutoCADを制す

AutoCAD VBAにおいて、座標系を理解することは「言語仕様を覚える」ことよりも価値がある。`TranslateCoordinates` は、単なる関数ではない。君のコードが、どんな過酷な図面環境でも「正しく動く」ことを保証する、信頼の防波堤だ。

さあ、明日からは「なぜかズレる」という報告に怯えるのはやめよう。ロジックで数学的に正しい配置を導き出せ。それが、プロのエンジニアの流儀だ。

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