TransformBy メソッドは、点または変位を別の座標系に変換します。AlignCoordinateSystem メソッドを使用して、変換元の座標系と変換先の座標系を指定します。AlignCoordinateSystem メソッドには、以下を指定する必要があります。
ワールド座標系。これは、基準座標系です。その他のすべての座標系は、決して変わることのない WCS を基準にして定義されます。WCS を基準にして計測した値は、他の座標系が変更されても一定です。.NET API のメソッドやプロパティで受け渡しされる点はすべて、特に指定のない限り WCS で表現されます。
ユーザ座標系。これは、作業座標系です。ユーザは図面の作成作業を簡単にするために UCS を指定します。AutoLISP のルーチンや外部関数から返される点など、AutoCAD のコマンドに渡されるすべての点は、現在の UCS における点です(ただし、ユーザがコマンド プロンプトでその前に * を付けた場合は除きます)。アプリケーションが AutoCAD のコマンドに WCS、OCS、または DCS の座標を送る場合は、まず座標を UCS に変換した後、TransformBy メソッドを使用して座標値を表す Point3d または Point2d オブジェクトを変換する必要があります。
オブジェクト座標系(図形座標系または ECS とも呼ばれる)。Polyline2d および Polyline オブジェクトの特定のメソッドおよびプロパティで指定された点の値は、オブジェクトを基準とした、この座標系で表されます。通常、これらの点はオブジェクトの用途に応じて WCS、現在の UCS、または現在の DCS に変換されます。逆に、WCS、UCS、または DCS の点は、同じプロパティを使ってデータベースに書き込む前に OCS に変換しておかなければなりません。
OCS との座標変換を行う場合は、OCS の法線を考慮する必要があります。
ディスプレイ座標系。表示前にオブジェクトを変換する座標系です。DCS の原点は AutoCAD のシステム変数 TARGET に格納されている点で、その Z 軸は視線方向です。言い換えれば、ビューポートは常にその DCS のプラン ビューということです。これらの座標を使用すると、ユーザに対する表示位置を決めることができます。
ペーパー空間 DCS。この座標系は、モデル空間のビューポートの DCS との間だけで変換されます。これは基本的に 2D 変換で、X と Y の各座標の尺度は常に変更されます。したがって、2 種類の座標系の間の尺度係数を検出できます。PSDCS は、モデル空間ビューポートにしか変換できません。
次の例では、ポリラインをモデル空間に作成します。ポリラインの最初の頂点を OCS と WCS の両方の座標で表示します。
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
<CommandMethod("TranslateCoordinates")> _
Public Sub TranslateCoordinates()
'' Get the current document and database, and start a transaction
Dim acDoc As Document = Application.DocumentManager.MdiActiveDocument
Dim acCurDb As Database = acDoc.Database
Using acTrans As Transaction = acCurDb.TransactionManager.StartTransaction()
'' Open the Block table for read
Dim acBlkTbl As BlockTable
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, _
OpenMode.ForRead)
'' Open the Block table record Model space for write
Dim acBlkTblRec As BlockTableRecord
acBlkTblRec = acTrans.GetObject(acBlkTbl(BlockTableRecord.ModelSpace), _
OpenMode.ForWrite)
'' Create a 2D polyline with two segments (3 points)
Dim acPoly2d As Polyline2d = New Polyline2d()
'' Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acPoly2d)
acTrans.AddNewlyCreatedDBObject(acPoly2d, True)
'' Before adding vertexes, the polyline must be in the drawing
Dim acPts2dPoly As Point3dCollection = New Point3dCollection()
acPts2dPoly.Add(New Point3d(1, 1, 0))
acPts2dPoly.Add(New Point3d(1, 2, 0))
acPts2dPoly.Add(New Point3d(2, 2, 0))
acPts2dPoly.Add(New Point3d(3, 2, 0))
acPts2dPoly.Add(New Point3d(4, 4, 0))
For Each acPt3d As Point3d In acPts2dPoly
Dim acVer2d As Vertex2d = New Vertex2d(acPt3d, 0, 0, 0, 0)
acPoly2d.AppendVertex(acVer2d)
acTrans.AddNewlyCreatedDBObject(acVer2d, True)
Next
'' Set the normal of the 2D polyline
acPoly2d.Normal = New Vector3d(0, 1, 2)
'' Get the first coordinate of the 2D polyline
Dim acPts3d As Point3dCollection = New Point3dCollection()
Dim acFirstVer As Vertex2d = Nothing
For Each acObjIdVert As ObjectId In acPoly2d
acFirstVer = acTrans.GetObject(acObjIdVert, _
OpenMode.ForRead)
acPts3d.Add(acFirstVer.Position)
Exit For
Next
'' Get the first point of the polyline and
'' use the eleveation for the Z value
Dim pFirstVer As Point3d = New Point3d(acFirstVer.Position.X, _
acFirstVer.Position.Y, _
acPoly2d.Elevation)
'' Translate the OCS to WCS
Dim mWPlane As Matrix3d = Matrix3d.WorldToPlane(acPoly2d.Normal)
Dim pWCSPt As Point3d = pFirstVer.TransformBy(mWPlane)
Application.ShowAlertDialog("The first vertex has the following " & _
"coordinates:" & _
vbLf & "OCS: " + pFirstVer.ToString() & _
vbLf & "WCS: " + pWCSPt.ToString())
'' Save the new objects to the database
acTrans.Commit()
End Using
End Sub
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
[CommandMethod("TranslateCoordinates")]
public static void TranslateCoordinates()
{
// Get the current document and database, and start a transaction
Document acDoc = Application.DocumentManager.MdiActiveDocument;
Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
{
// Open the Block table record for read
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
OpenMode.ForRead) as BlockTable;
// Open the Block table record Model space for write
BlockTableRecord acBlkTblRec;
acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
OpenMode.ForWrite) as BlockTableRecord;
// Create a 2D polyline with two segments (3 points)
using (Polyline2d acPoly2d = new Polyline2d())
{
// Add the new object to the block table record and the transaction
acBlkTblRec.AppendEntity(acPoly2d);
acTrans.AddNewlyCreatedDBObject(acPoly2d, true);
// Before adding vertexes, the polyline must be in the drawing
Point3dCollection acPts2dPoly = new Point3dCollection();
acPts2dPoly.Add(new Point3d(1, 1, 0));
acPts2dPoly.Add(new Point3d(1, 2, 0));
acPts2dPoly.Add(new Point3d(2, 2, 0));
acPts2dPoly.Add(new Point3d(3, 2, 0));
acPts2dPoly.Add(new Point3d(4, 4, 0));
foreach (Point3d acPt3d in acPts2dPoly)
{
Vertex2d acVer2d = new Vertex2d(acPt3d, 0, 0, 0, 0);
acPoly2d.AppendVertex(acVer2d);
acTrans.AddNewlyCreatedDBObject(acVer2d, true);
}
// Set the normal of the 2D polyline
acPoly2d.Normal = new Vector3d(0, 1, 2);
// Get the first coordinate of the 2D polyline
Point3dCollection acPts3d = new Point3dCollection();
Vertex2d acFirstVer = null;
foreach (ObjectId acObjIdVert in acPoly2d)
{
acFirstVer = acTrans.GetObject(acObjIdVert,
OpenMode.ForRead) as Vertex2d;
acPts3d.Add(acFirstVer.Position);
break;
}
// Get the first point of the polyline and
// use the eleveation for the Z value
Point3d pFirstVer = new Point3d(acFirstVer.Position.X,
acFirstVer.Position.Y,
acPoly2d.Elevation);
// Translate the OCS to WCS
Matrix3d mWPlane = Matrix3d.WorldToPlane(acPoly2d.Normal);
Point3d pWCSPt = pFirstVer.TransformBy(mWPlane);
Application.ShowAlertDialog("The first vertex has the following " +
"coordinates:" +
"\nOCS: " + pFirstVer.ToString() +
"\nWCS: " + pWCSPt.ToString());
}
// Save the new objects to the database
acTrans.Commit();
}
}
Sub 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