AutoCAD VBAの「壁」を突破せよ:ポリラインの座標をWCSで正確に掴む極意
AutoCADのAPIを触り始めると、誰もが一度は絶望する壁があります。それが「OCS(オブジェクト座標系)の呪縛」です。
「ポリラインの頂点座標を取得したはずなのに、図面上で見えている位置と全く違う値が返ってくる…」
もしあなたが今、この泥沼にハマっているなら、おめでとうございます。あなたは「マクロの記録」という遊び場を卒業し、AutoCADの核心に足を踏み入れた証拠です。今日は、伝説のエンジニアとして、この座標変換の迷宮を攻略する術を授けます。
—
1. なぜ「そのまま」ではいけないのか?
AutoCADには複数の座標系が存在します。
- WCS(世界座標系): 図面の絶対的な基準。
- OCS(オブジェクト座標系): 3D空間で傾いたオブジェクト(押し出し方向を持つポリラインなど)が持つ、独自のローカルな座標系。
ポリライン(`AcDbPolyline`)の頂点座標は、常にそのポリラインの「押し出し方向」に直交する平面上の「OCS」で保持されています。つまり、ポリラインが傾いていればいるほど、`Coordinates`プロパティが返す値と、私たちが図面上で見るWCSの数値は乖離します。
これを解決するのが `Utility.TranslateCoordinates` メソッドです。
—
2. 座標変換の「黄金律」
このメソッドは、魔法のように座標を変換してくれます。引数の指定さえ間違えなければ。
‘ TranslateCoordinatesの構文
‘ Result = Utility.TranslateCoordinates(Point, From, To, OCS)
この引数、特に `From` と `To` の指定にコツがあります。
- Point: 変換したい座標(バリアント型配列)。
- From: どの座標系か(`acOCS`を指定)。
- To: どの座標系にしたいか(`acWorld`を指定)。
- OCS: ここが肝!「そのポリラインの法線ベクトル(押し出し方向)」を渡します。
—
3. 実践:ポリラインの全頂点をWCSで取得する
以下のコードは、選択したポリラインの全ての頂点を、WCS座標に変換してイミディエイトウィンドウに出力する実用的なスクリプトです。
Public Sub GetPolylineWCSCoordinates()
Dim ent As AcadEntity
Dim pline As AcadLWPolyline
Dim coords As Variant
Dim i As Integer
Dim ptOCS(0 To 2) As Double
Dim ptWCS As Variant
Dim normal As Variant
‘ ユーザーにポリラインを選択させる
ThisDrawing.Utility.GetEntity ent, pt, “ポリラインを選択してください”
If TypeOf ent Is AcadLWPolyline Then
Set pline = ent
coords = pline.Coordinates
normal = pline.Normal ‘ ポリラインの押し出し方向(法線ベクトル)
‘ 頂点は2つずつセットで格納されている(X, Y)
For i = LBound(coords) To UBound(coords) Step 2
‘ OCS上の点を作成
ptOCS(0) = coords(i)
ptOCS(1) = coords(i + 1)
ptOCS(2) = 0 ‘ 2DポリラインのZは常に0
‘ 核心:TranslateCoordinatesでWCSへ変換
‘ acOCSからacWorldへ。第4引数にポリラインの法線ベクトルを渡す
ptWCS = ThisDrawing.Utility.TranslateCoordinates(ptOCS, acOCS, acWorld, False, normal)
Debug.Print “頂点 ” & (i / 2) & “: ” & _
“X=” & Format(ptWCS(0), “0.000”) & _
“, Y=” & Format(ptWCS(1), “0.000”) & _
“, Z=” & Format(ptWCS(2), “0.000”)
Next i
Else
MsgBox “ポリラインを選択してください。”
End If
End Sub
—
4. 陥りやすい罠とエンジニアの心得
このコードを書く際、初心者が必ずと言っていいほどハマるポイントが二つあります。
罠①:`GetEntity` で取得したオブジェクトの型
上記のコードでは `AcadLWPolyline`(軽量ポリライン)を対象にしています。古い `AcadPolyline`(2D/3Dポリライン)はデータ構造が異なります。実務では「もしや?」と思ったら `TypeName(ent)` で型を確認する習慣をつけてください。
罠②:Z座標の扱い
`TranslateCoordinates` は非常に賢いメソッドですが、入力する配列のサイズには厳格です。「2DだからXとYだけでいいや」と要素数2の配列を渡すと、容赦なくエラーを吐きます。常に3要素(X, Y, Z)の配列を渡すのが、トラブルを未然に防ぐプロの作法です。
—
最後に:自動化の先にある景色
座標変換をマスターしたあなたは、もう「座標がズレる」という不安から解放されます。これができると、図面内の特定のポイントを検知して自動で注釈を振ったり、外部のCSVデータと図面上のオブジェクトを紐付けたりといった、高度な設計自動化への道が大きく開けます。
AutoCAD VBAは、単なるマクロ言語ではありません。CADという空間そのものを数学的に操作する強力なツールです。
恐れずに、もっと深く。分からないことがあれば、いつでもまた聞きに来てください。あなたの自動化の旅を、私はこれからも応援しています。
