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

スポンサーリンク

座標系という「幻想」を制御せよ: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環境を、真に堅牢なシステムへと昇華させる唯一の道である。

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