概要 - 座標を変換する(VBA/ActiveX)

TranslateCoordinates メソッドは、点または変位を別の座標系に変換します。

点の引数 OriginalPoint は、3D 点と 3D 変位ベクトルのどちらにも解釈可能です。この引数がどちらであるかは、Boolean データ型の引数 Disp によって決まります。引数 Disp が TRUE に設定されていると、引数 OriginalPoint は変位ベクトルとして扱われます。それ以外のときは、点として扱われます。この他にも、OriginalPoint がどの座標系からのものか、および OriginalPoint をどの座標系へと変換するかを決めるための 2 つの引数があります。From 引数と To 引数には、次の AutoCAD 座標系を指定することができます。

WCS
ワールド座標系。これは、基準座標系です。その他のすべての座標系は、決して変わることのない WCS を基準にして定義されます。WCS を基準にして計測した値は、他の座標系が変更されても一定です。ActiveX のメソッドやプロパティで受け渡しされる点はすべて、特に指定のない限り WCS で表現されます。
UCS
ユーザ座標系。これは、作業座標系です。ユーザは図面の作成作業を簡単にするために UCS を指定します。AutoLISP のルーチンや外部関数から返される点など、AutoCAD のコマンドに渡されるすべての点は、現在の UCS における点です(ただし、ユーザがコマンド プロンプトでその前に * を付けた場合は除きます)。アプリケーションで WCS、OCS、または DCS の座標を AutoCAD コマンドに送信する場合は、TranslateCoordinates メソッドを呼び出して、まず座標を UCS に変換する必要があります。
OCS
オブジェクト座標系。Polyline オブジェクトと LightweightPolyline オブジェクトの特定のメソッドとプロパティで指定される点の値は、そのオブジェクトを基準にしてこの座標系で表現されています。通常、これらの点はオブジェクトの用途に応じて WCS、現在の UCS、または現在の DCS に変換されます。逆に、WCS、UCS、または DCS の点は、同じプロパティを使ってデータベースに書き込む前に OCS に変換しておかなければなりません。

座標を OCS からまたは OCS へと変換する場合は、TranslateCoordinates メソッドの最後の引数に OCS の法線を入力しなければなりません。

DCS
ディスプレイ座標系。表示前にオブジェクトを変換する座標系です。DCS の原点は AutoCAD のシステム変数 TARGET に格納されている点で、その Z 軸は視線方向です。言い換えれば、ビューポートは常にその DCS のプラン ビューということです。これらの座標を使用すると、AutoCAD ユーザに対する表示位置を決めることができます。
PSDCS
ペーパー空間 DCS。この座標系は、現在アクティブなモデル空間のビューポートの DCS との間だけで変換されます。この座標系は基本的には 2D 変換であり、引数 Disp が FALSE の場合は、常に X 座標と Y 座標の尺度変更とオフセットが行われます。Z 座標は尺度変更されますが、変換されることはありません。したがって、Z 座標を使用すると、2 種類の座標系の間の尺度係数を検出できます。PSDCS は、現在のモデル空間ビューポートにしか変換できません。引数 from が PSDCS となっている場合は、引数 to は DCS でなければなりません。逆に、引数 from が DCS となっている場合は、引数 to は PSDCS でなければなりません。

OCS 座標から WCS 座標へ変換する

次の例では、ポリラインをモデル空間に作成します。ポリラインの最初の頂点を OCS と WCS の両方の座標で表示します。OCS から WCS に変換するには、OCS の法線を TranslateCoordinates メソッドの最後の引数に入れる必要があります。

Sub Ch8_TranslateCoordinates()
    ' Create a polyline in model space.
    Dim plineObj As AcadPolyline
    Dim points(0 To 14) As Double

    ' Define the 2D polyline points
    points(0) = 1: points(1) = 1: points(2) = 0
    points(3) = 1: points(4) = 2: points(5) = 0
    points(6) = 2: points(7) = 2: points(8) = 0
    points(9) = 3: points(10) = 2: points(11) = 0
    points(12) = 4: points(13) = 4: points(14) = 0

    ' Create a light weight Polyline object in model space
    Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points)

    ' Find the X and Y coordinates of the
    ' first vertex of the polyline
    Dim firstVertex As Variant
    firstVertex = plineObj.Coordinate(0)

    ' Find the Z coordinate for the polyline
    ' using the elevation property
    firstVertex(2) = plineObj.Elevation

    ' Change the normal for the pline so that the
    ' difference between the coordinate systems
    ' is obvious.
    Dim plineNormal(0 To 2) As Double
    plineNormal(0) = 0#
    plineNormal(1) = 1#
    plineNormal(2) = 2#
    plineObj.Normal = plineNormal

    ' Translate the OCS coordinate into WCS
    Dim coordinateWCS As Variant
    coordinateWCS = ThisDrawing.Utility.TranslateCoordinates _
          (firstVertex, acOCS, acWorld, False, plineNormal)

    ' Display the coordinates of the point
    MsgBox "The first vertex has the following coordinates:" _
 & vbCrLf & "OCS: " & firstVertex(0) & ", " & _
 firstVertex(1) & ", " & firstVertex(2) & vbCrLf & _
 "WCS: " & coordinateWCS(0) & ", " & _
 coordinateWCS(1) & ", " & coordinateWCS(2)
End Sub