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` は、単なる関数ではない。君のコードが、どんな過酷な図面環境でも「正しく動く」ことを保証する、信頼の防波堤だ。
さあ、明日からは「なぜかズレる」という報告に怯えるのはやめよう。ロジックで数学的に正しい配置を導き出せ。それが、プロのエンジニアの流儀だ。
