【テクニカル・上級編】【実務中級】AcadDocument.Utility.TranslateCoordinatesによる「OCS(オブジェクト座標系)」から「WCS」への変換:ポリライン頂点の正確な位置特定 – AutoCAD VBA解析バイブル

スポンサーリンク

座標変換の深淵:OCSからWCSへの「数学的」脱出

AutoCAD開発において、座標系の混乱は多くのジュニアエンジニアが直面する最初の壁だ。特に、押し出し方向(Normal Vector)を持つポリライン(`LWPOLYLINE`)の頂点を扱う際、単なる座標値の取得で満足していては、実務上の複雑な設計データには太刀打ちできない。

`AcadDocument.Utility.TranslateCoordinates`。このメソッドは、単純な変換ツールではない。AutoCADのデータベースが内部で隠蔽している「OCS(オブジェクト座標系)」と「WCS(世界座標系)」の数学的変換を、APIレベルで叩き出すための鍵である。

本稿では、このメソッドを「最適かつ安全に」使いこなし、システム間連携や自動設計において誤差をゼロにするための極限の知見を伝授する。

1. なぜ「OCS」を直接触ってはいけないのか

多くの開発者が陥る罠は、`LWPOLYLINE`の `Coordinates` プロパティを直接読み取り、それをそのままWCSとして扱うことだ。これは、押し出し方向が `(0, 0, 1)` である単純な平面図形においてのみ許される「怠慢」に過ぎない。

オブジェクトの押し出し方向が傾いている場合、その頂点データは「オブジェクト独自の平面上に定義された2D座標」として保持されている。これを正確なWCSへ引き上げるには、以下の手順が不可欠だ。

1. オブジェクトの押し出し方向(Normal)を取得
2. TranslateCoordinates を使用し、OCSの2D平面からWCSの3D空間へマッピング

2. 極限のコード実装:メモリ解放とパフォーマンス

VBAはガベージコレクションが強力ではない。大規模な図面でループ処理を行う際、オブジェクトの解放を怠れば、瞬く間にメモリリークが引き起こされる。以下のコードは、高負荷環境でも耐えうる堅牢な実装だ。

‘ ————————————————————————-
‘ ポリラインの頂点を正確にWCSへ変換するモジュール
‘ ————————————————————————-
Public Sub ExtractWcsVertices(ByVal plineObj As AcadLWPolyline)
Dim i As Long
Dim coords As Variant
Dim wcsPoint As Variant
Dim normal As Variant
Dim utility As AcadUtility

‘ オブジェクトの押し出し方向を取得
normal = plineObj.Normal
Set utility = ThisDrawing.Utility

‘ 頂点データはVariant配列として取得する(メモリ効率のため)
coords = plineObj.Coordinates

‘ 頂点ペア(X, Y)をループ処理
For i = LBound(coords) To UBound(coords) Step 2
‘ OCSからWCSへの変換を実行
‘ 第2引数: 0=OCS, 1=WCS, 2=OCS(押し出し考慮)
‘ ここではTranslateCoordinatesの仕様に基づき、OCS(2)からWCS(1)へ変換
wcsPoint = utility.TranslateCoordinates( _
Array(coords(i), coords(i + 1), 0), _
acOCS, _
acWCS, _
False, _
normal)

‘ 結果をログや外部データベースへ出力
Debug.Print “WCS Vertex: ” & wcsPoint(0) & “, ” & wcsPoint(1) & “, ” & wcsPoint(2)
Next i

‘ 明示的解放(VBAのメモリ管理の鉄則)
Set utility = Nothing
End Sub

3. チーフアーキテクトからの忠告

A. レガシー環境でのAPI安定性

`TranslateCoordinates` は、COMインターフェースを介した呼び出しである。もし極めて頻繁な(数万回単位の)呼び出しが必要な場合、VBAのオーバーヘッドが無視できなくなる。その際は、Matrix(変換行列)を自前で計算し、`VBA` 側で直接行列演算を行う方が圧倒的に高速だ。数学的な労力は増えるが、それは「開発者の技術的負債」を減らすための投資である。

B. システム間連携の要諦

外部DB(SQL Server等)に座標を格納する場合、必ず `WCS` に統一して保存せよ。OCSで保存するということは、図形の「押し出し方向」というメタデータと「頂点座標」という実データを分離して管理することを意味し、それは将来的なシステム障害の温床となる。

C. Windows APIとの併用

もし大規模な座標変換計算を伴うなら、VBA単体で完結させようとせず、`C# (COM Interop)` や `C++ (ObjectARX)` で記述したDLLを呼び出す構成を検討せよ。VBAはあくまで「制御のハブ」とし、重い数学的処理はバイナリレベルに委ねる。これが、10年先も稼働するシステムを構築する者の責務だ。

結びに代えて

AutoCAD VBAは古臭い言語かもしれない。しかし、その背後にあるオブジェクトモデルは、CADの本質を突いた極めて洗練されたアーキテクチャだ。`TranslateCoordinates` を使いこなすことは、AutoCADの「空間」を自在に操る力を手に入れることに他ならない。

ツールに振り回されるな。APIの裏側にある数学的真実を理解し、コードに魂を込めよ。それが、真の業務自動化エンジニアへの道である。

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