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

スポンサーリンク

座標系の迷宮を脱出せよ:OCSからWCSへの「正攻法」をマスターする

AutoCAD APIを扱うエンジニアが、初級者から一歩抜け出し、「真のプロ」へと進化する分岐点。それが「OCS(オブジェクト座標系)の支配」です。

多くの開発者が、ポリラインの頂点座標を取得しようとして痛い目を見ます。「`Coordinates`プロパティで取得した配列をそのまま使えばいい」という考えは、3D空間やUCS、あるいは押し出し(Elevation/Thickness)が絡んだ瞬間に崩壊します。

今日は、AutoCAD APIの深淵の一つである`TranslateCoordinates`を駆使し、OCSの罠を完全に無力化するアーキテクチャを伝授します。

なぜ`Coordinates`プロパティだけでは不十分なのか

ポリライン(`AcDbPolyline`)の頂点は、そのオブジェクト固有の「OCS」で定義されています。これらは、オブジェクトの「法線ベクトル(Normal)」をZ軸としたローカルな座標系です。

もしポリラインが傾いていたり、押し出されていたりする場合、`Coordinates`の値はWCS(世界座標系)とは全く異なる意味を持ちます。この「ローカル座標」を「地球の座標(WCS)」へと変換する数学的演算、あるいはAPIの正確な使い分けができないツールは、実務において「ゴミ」を算出する計算機に過ぎません。

鉄則:TranslateCoordinatesを「正しく」使う

AutoCAD VBAにおいて、座標変換の神は `Utility.TranslateCoordinates` メソッドです。これを使いこなすための設計指針は以下の通りです。

1. 法線ベクトルを常に意識する: ポリラインの`Normal`プロパティを必ず取得すること。
2. 定数の定義: `acOCS` から `acWCS` への変換を明示すること。
3. 配列の扱い: `TranslateCoordinates`はVariant型配列を要求します。メモリの無駄遣いを避けつつ、型安全性を確保する処理が必要です。

プロダクションコード:OCSからWCSへの変換ロジック

以下は、私が実際の業務自動化現場で用いている、極めて堅牢な変換関数です。これをモジュールに組み込むだけで、座標計算のバグは劇的に減少します。

”’

”’ ポリラインのOCS頂点をWCSに変換して取得する実務用関数
”’

Public Function GetPolylineWcsVertices(objPline As AcadLWPolyline) As Double()
Dim i As Long
Dim coords As Variant
Dim wcsPoint As Variant
Dim normal As Variant
Dim vertex(0 To 2) As Double
Dim wcsResult() As Double

‘ ポリラインの頂点配列(OCS)を取得
coords = objPline.Coordinates
normal = objPline.Normal

‘ 頂点数に応じた動的配列の確保(2Dポリラインは頂点数2の配列)
ReDim wcsResult(0 To (UBound(coords) + 1) / 2 3 – 1)

For i = LBound(coords) To UBound(coords) Step 2
‘ 一時的な頂点座標(Z=0として扱うのがOCSの基本)
vertex(0) = coords(i)
vertex(1) = coords(i + 1)
vertex(2) = 0

‘ 【核心】TranslateCoordinatesによる座標変換
‘ acOCS(1) から acWCS(0) へ変換。法線ベクトルを第4引数に渡すのが重要
wcsPoint = ThisDrawing.Utility.TranslateCoordinates(vertex, acOCS, acWCS, False, normal)

‘ 結果を配列に格納
Dim idx As Long
idx = (i / 2) 3
wcsResult(idx) = wcsPoint(0)
wcsResult(idx + 1) = wcsPoint(1)
wcsResult(idx + 2) = wcsPoint(2)
Next i

GetPolylineWcsVertices = wcsResult
End Function

開発リーダーからの「極限の忠告」

1. パフォーマンスの罠

このコードはループ内で`TranslateCoordinates`を呼び出します。もし数千個の頂点を持つ巨大なポリラインを処理する場合、APIのオーバーヘッドが無視できません。その場合は、`Math`ライブラリを用いて行列計算(回転行列の適用)を自前で実装する方が高速です。しかし、「保守性の低い最適化」は悪です。まずは上記コードで実装し、ボトルネックが確認されてから最適化してください。

2. データベース連携時の注意点

WCS座標を外部データベース(SQL ServerやCSVなど)に書き出す際、精度の取り扱いには細心の注意を払ってください。`Double`型の精度をそのまま保存せず、業務要件に応じた丸め処理(`Round`関数)を挟むことが、後のデータ照合トラブルを防ぐ鍵となります。

3. なぜ「設計」が重要なのか

多くのプログラマは、ActiveXの制約に振り回されます。しかし、真のエンジニアは「ActiveXが何を求めているか(この場合はNormalベクトル)」を常に先回りして提供します。コードをコピペするだけでなく、「なぜその引数が必要なのか」を理解してください。それができれば、AutoCADのバージョンアップや、将来的な.NET APIへの移行にも揺るがない基盤が手に入ります。

結び

座標系の理解は、AutoCAD開発における「読み書き」のレベルです。ここを疎かにする者は、永遠に数値のズレと戦うことになります。今日紹介したパターンを自らの武器としてください。

あなたの書くコードが、誰かの残業時間を削り、設計の品質を高める。それこそが、我々エンジニアに与えられた唯一の役割です。

さあ、エディタを開いて、このロジックをあなたのツールに組み込んでください。検討を祈ります。

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