座標系の迷宮を脱出せよ: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への変換ロジック
以下は、私が実際の業務自動化現場で用いている、極めて堅牢な変換関数です。これをモジュールに組み込むだけで、座標計算のバグは劇的に減少します。
”’
”’
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開発における「読み書き」のレベルです。ここを疎かにする者は、永遠に数値のズレと戦うことになります。今日紹介したパターンを自らの武器としてください。
あなたの書くコードが、誰かの残業時間を削り、設計の品質を高める。それこそが、我々エンジニアに与えられた唯一の役割です。
さあ、エディタを開いて、このロジックをあなたのツールに組み込んでください。検討を祈ります。
