该方法可以将点或位移从一个坐标系转换为另一个坐标系。您可以使用该方法指定要从哪个坐标系转换到哪个坐标系以及要转换到哪个坐标系。该方法需要满足以下条件:TransformByAlignCoordinateSystemAlignCoordinateSystem
将 OCS 坐标转换为 WCS 坐标本示例在模型空间中创建折线。然后,折线的第一个折点将同时显示在 OCS 和 WCS 坐标中。 VB.NETImports 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 C#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(); } } VBA/ActiveX 代码参考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 相关概念父主题: |
|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-1-8 19:09
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.