座標系という「幻想」を制御せよ:TranslateCoordinatesが明かすAutoCADの深淵
AutoCADのAPIを叩く際、多くのエンジニアが陥る罠がある。それは「座標とは絶対的な値である」という錯覚だ。だが、現場の図面は往々にして傾き、回転し、複雑なUCS(ユーザー座標系)の迷宮と化している。
WCS(世界座標系)を信じきったコードは、現場の担当者が「ちょっと回転させた」だけで、配置場所を数キロメートル誤爆させる。本稿では、`Utility.TranslateCoordinates` を駆使し、どんな狂った座標系環境下でも、意図した場所にエンティティを配置するための「座標系の支配術」を伝授する。
—
1. 座標系変換の哲学:WCSとUCSの境界線
AutoCADの内部DBはWCSで管理されているが、ユーザーの視界は常にUCSに支配されている。プログラムが「100, 100に配置せよ」と命じたとき、その「100, 100」がWCSなのかUCSなのかを定義しなければ、システムはゴミを生成するだけだ。
`TranslateCoordinates` は、単なる計算関数ではない。AutoCADのジオメトリエンジンに対する「座標系の通訳」である。
2. 実装の極意:TranslateCoordinatesの正確な利用
以下のコードは、UCS上の座標をWCSへ変換し、確実に配置を行うためのテンプレートだ。ここで重要なのは、`AcCoordinateSystem` 列挙体の正しい選択と、配列の扱いである。
‘ 座標変換と配置の核心ロジック
Public Sub PlaceEntityInCurrentUCS(ByVal x As Double, ByVal y As Double, ByVal z As Double)
Dim doc As AcadDocument
Set doc = ThisDrawing
‘ 変換用配列:Variant型でなければならない(APIの仕様)
Dim ptInput(0 To 2) As Double
Dim ptOutput As Variant
ptInput(0) = x: ptInput(1) = y: ptInput(2) = z
‘ Utility.TranslateCoordinatesの真髄
‘ 引数:入力配列, 入力座標系(acUCS), 出力座標系(acWCS), 投影フラグ
‘ acUCS(1) から acWCS(0) への変換を定義する
ptOutput = doc.Utility.TranslateCoordinates(ptInput, acUCS, acWCS, False)
‘ 配置処理:ptOutput(0)~(2)を使用する
Dim circleObj As AcadCircle
Set circleObj = doc.ModelSpace.AddCircle(ptOutput, 50.0)
‘ 【重要】オブジェクトの明示的解放
‘ VBAのGCは信用するな。大規模ループ時は特にメモリリークの温床となる
Set circleObj = Nothing
Set doc = Nothing
End Sub
—
3. チーフアーキテクトの視点:パフォーマンスと安定性の最適化
A. メモリ解放の規律
VBAの参照カウンタは、循環参照や巨大なループ内で容易にスタックする。特に `AcadUtility` や `AcadDocument` へのアクセスが頻発する場合、明示的な `Set Object = Nothing` は必須だ。これを怠れば、長時間のバッチ処理でAutoCADが「重くなる」という、最も恥ずべき事態を招く。
B. API呼び出しのオーバヘッド抑制
`TranslateCoordinates` は強力だが、数千回単位のループで呼び出すと遅延の原因となる。もし変換ロジックが単純な回転・平行移動のみであれば、変換行列(Matrix)を自前でキャッシュし、メモリ上で計算する方が数倍高速だ。
- 判断基準: 呼び出し回数が100回以下なら `TranslateCoordinates` で十分。それ以上なら行列演算クラスを別途実装し、VBAの `Variant` 配列のやり取りを最小化せよ。
C. レガシー環境とWindows APIの併用
もし図面上のUCS名や複雑な定義を完全に特定する必要がある場合、標準のVBAメソッドだけでは限界がある。その際は、`acdb.dll` を介したObjectARXのラッパーや、Windows API (`GetCursorPos` 等) を使って、ユーザーの現在のビューポート状態を直接読み取るという「禁じ手」も視野に入れる必要がある。だが、まずは `TranslateCoordinates` を極めることが先決だ。
—
4. 結論:システムは「人間」の視界を尊重せよ
ツールは、設計者が図面上で見ている世界と、プログラムが認識している世界を同期させなければならない。座標変換を制御するということは、すなわち「ユーザーの視界を制御する」ことと同義だ。
貴殿が書くコードは、単なる自動化スクリプトではない。AutoCADという巨大な空間エンジンのアーキテクチャの一部である。この重みを理解し、常に「今の座標系は何か?」を問い続けろ。
それが、レガシーなAutoCAD環境を、真に堅牢なシステムへと昇華させる唯一の道である。
