3D 座標を指定する(.NET)

3D WCS(ワールド座標系) 座標の入力は、2D WCS 座標入力と似ています。X および Y 値の指定に加えて、Z 値を指定します。2D 座標は Point2d オブジェクトによって表されますが、3D 座標を表すには Point3d オブジェクトを使用します。AutoCAD .NET API のほとんどのプロパティとメソッドは 3D 座標を使用します。

2D と 3D のポリラインの座標を定義、照会する

次の例では、それぞれ 3 つの座標を持つ 2 つのポリラインを作成します。最初のポリラインは 2D ポリラインであり、2 つ目のポリラインは 3D です。3D ポリラインの作成では、頂点を含む配列の長さが、Z 座標を含めるように拡張されていることに注意してください。ポリラインの座標を照会し、その座標をメッセージ ボックスに表示します。

VB.NET

Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
 
<CommandMethod("Polyline_2D_3D")> _
Public Sub Polyline_2D_3D()
    '' 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 polyline with two segments (3 points)
        Using acPoly As Polyline = New Polyline()
            acPoly.AddVertexAt(0, New Point2d(1, 1), 0, 0, 0)
            acPoly.AddVertexAt(1, New Point2d(1, 2), 0, 0, 0)
            acPoly.AddVertexAt(2, New Point2d(2, 2), 0, 0, 0)
            acPoly.ColorIndex = 1

            '' Add the new object to the block table record and the transaction
            acBlkTblRec.AppendEntity(acPoly)
            acTrans.AddNewlyCreatedDBObject(acPoly, True)

            '' Create a 3D polyline with two segments (3 points)
            Using acPoly3d As Polyline3d = New Polyline3d()
                acPoly3d.ColorIndex = 5

                '' Add the new object to the block table record and the transaction
                acBlkTblRec.AppendEntity(acPoly3d)
                acTrans.AddNewlyCreatedDBObject(acPoly3d, True)

                '' Before adding vertexes, the polyline must be in the drawing
                Dim acPts3dPoly As Point3dCollection = New Point3dCollection()
                acPts3dPoly.Add(New Point3d(1, 1, 0))
                acPts3dPoly.Add(New Point3d(2, 1, 0))
                acPts3dPoly.Add(New Point3d(2, 2, 0))

                For Each acPt3d As Point3d In acPts3dPoly
                    Using acPolVer3d As PolylineVertex3d = New PolylineVertex3d(acPt3d)
                        acPoly3d.AppendVertex(acPolVer3d)
                        acTrans.AddNewlyCreatedDBObject(acPolVer3d, True)
                    End Using
                Next

                '' Get the coordinates of the lightweight polyline
                Dim acPts2d As Point2dCollection = New Point2dCollection()
                For nCnt As Integer = 0 To acPoly.NumberOfVertices - 1
                    acPts2d.Add(acPoly.GetPoint2dAt(nCnt))
                Next

                '' Get the coordinates of the 3D polyline
                Dim acPts3d As Point3dCollection = New Point3dCollection()
                For Each acObjIdVert As ObjectId In acPoly3d
                    Dim acPolVer3d As PolylineVertex3d
                    acPolVer3d = acTrans.GetObject(acObjIdVert, _
                                                   OpenMode.ForRead)

                    acPts3d.Add(acPolVer3d.Position)
                Next

                '' Display the Coordinates
                Application.ShowAlertDialog("2D polyline (red): " & vbLf & _
                                            acPts2d(0).ToString() & vbLf & _
                                            acPts2d(1).ToString() & vbLf & _
                                            acPts2d(2).ToString())

                Application.ShowAlertDialog("3D polyline (blue): " & vbLf & _
                                            acPts3d(0).ToString() & vbLf & _
                                            acPts3d(1).ToString() & vbLf & _
                                            acPts3d(2).ToString())
            End Using
        End Using

        '' Save the new objects to the database
        acTrans.Commit()
    End Using
End Sub

C#

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
 
[CommandMethod("Polyline_2D_3D")]
public static void Polyline_2D_3D()
{
    // 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 polyline with two segments (3 points)
        using (Polyline acPoly = new Polyline())
        {
            acPoly.AddVertexAt(0, new Point2d(1, 1), 0, 0, 0);
            acPoly.AddVertexAt(1, new Point2d(1, 2), 0, 0, 0);
            acPoly.AddVertexAt(2, new Point2d(2, 2), 0, 0, 0);
            acPoly.ColorIndex = 1;

            // Add the new object to the block table record and the transaction
            acBlkTblRec.AppendEntity(acPoly);
            acTrans.AddNewlyCreatedDBObject(acPoly, true);


            // Create a 3D polyline with two segments (3 points)
            using (Polyline3d acPoly3d = new Polyline3d())
            {
                acPoly3d.ColorIndex = 5;

                // Add the new object to the block table record and the transaction
                acBlkTblRec.AppendEntity(acPoly3d);
                acTrans.AddNewlyCreatedDBObject(acPoly3d, true);

                // Before adding vertexes, the polyline must be in the drawing
                Point3dCollection acPts3dPoly = new Point3dCollection();
                acPts3dPoly.Add(new Point3d(1, 1, 0));
                acPts3dPoly.Add(new Point3d(2, 1, 0));
                acPts3dPoly.Add(new Point3d(2, 2, 0));

                foreach (Point3d acPt3d in acPts3dPoly)
                {
                    using (PolylineVertex3d acPolVer3d = new PolylineVertex3d(acPt3d))
                    {
                        acPoly3d.AppendVertex(acPolVer3d);
                        acTrans.AddNewlyCreatedDBObject(acPolVer3d, true);
                    }
                }

                // Get the coordinates of the lightweight polyline
                Point2dCollection acPts2d = new Point2dCollection();
                for (int nCnt = 0; nCnt < acPoly.NumberOfVertices; nCnt++)
                {
                    acPts2d.Add(acPoly.GetPoint2dAt(nCnt));
                }

                // Get the coordinates of the 3D polyline
                Point3dCollection acPts3d = new Point3dCollection();
                foreach (ObjectId acObjIdVert in acPoly3d)
                {
                    PolylineVertex3d acPolVer3d;
                    acPolVer3d = acTrans.GetObject(acObjIdVert,
                                                    OpenMode.ForRead) as PolylineVertex3d;

                    acPts3d.Add(acPolVer3d.Position);
                }

                // Display the Coordinates
                Application.ShowAlertDialog("2D polyline (red): \n" +
                                            acPts2d[0].ToString() + "\n" +
                                            acPts2d[1].ToString() + "\n" +
                                            acPts2d[2].ToString());

                Application.ShowAlertDialog("3D polyline (blue): \n" +
                                            acPts3d[0].ToString() + "\n" +
                                            acPts3d[1].ToString() + "\n" +
                                            acPts3d[2].ToString());
            }
        }

        // Save the new object to the database
        acTrans.Commit();
    }
}

VBA/ActiveX コード リファレンス

Sub Polyline_2D_3D()
    Dim pline2DObj As AcadLWPolyline
    Dim pline3DObj As AcadPolyline
 
    Dim points2D(0 To 5) As Double
    Dim points3D(0 To 8) As Double
 
    ' Define three 2D polyline points
    points2D(0) = 1: points2D(1) = 1
    points2D(2) = 1: points2D(3) = 2
    points2D(4) = 2: points2D(5) = 2
 
    ' Define three 3D polyline points
    points3D(0) = 1: points3D(1) = 1: points3D(2) = 0
    points3D(3) = 2: points3D(4) = 1: points3D(5) = 0
    points3D(6) = 2: points3D(7) = 2: points3D(8) = 0
 
    ' Create the 2D light weight Polyline
    Set pline2DObj = ThisDrawing.ModelSpace. _
                                      AddLightWeightPolyline(points2D)
    pline2DObj.Color = acRed
    pline2DObj.Update
 
    ' Create the 3D polyline
    Set pline3DObj = ThisDrawing.ModelSpace. _
                                      AddPolyline(points3D)
    pline3DObj.Color = acBlue
    pline3DObj.Update
 
    ' Query the coordinates of the polylines
    Dim get2Dpts As Variant
    Dim get3Dpts As Variant
 
    get2Dpts = pline2DObj.Coordinates
    get3Dpts = pline3DObj.Coordinates
 
    ' Display the coordinates
 
    MsgBox ("2D polyline (red): " & vbCrLf & "(" & _
            get2Dpts(0) & ", " & get2Dpts(1) & ")" & vbCrLf & "(" & _
            get2Dpts(2) & ", " & get2Dpts(3) & ")"& vbCrLf & "(" & _
            get2Dpts(4) & ", " & get2Dpts(5) & ")")
 
    MsgBox ("3D polyline (blue): " & vbCrLf & "(" & _
            get3Dpts(0) & ", " & get3Dpts(1) & ", " & _
            get3Dpts(2) & ")" & vbCrLf & "(" & _
            get3Dpts(3) & ", " & get3Dpts(4) & ", " & _
            get3Dpts(5) & ")" & vbCrLf & "(" & _
            get3Dpts(6) & ", " & get3Dpts(7) & ", " & _
            get3Dpts(8) & ")")
End Sub