public Polycurve PolycurveToSpeckle(AcadDB.Polyline polyline) // AC polylines are polycurves with linear or arc segments { var polycurve = new Polycurve(units: ModelUnits) { closed = polyline.Closed }; // extract segments var segments = new List <ICurve>(); for (int i = 0; i < polyline.NumberOfVertices; i++) { SegmentType type = polyline.GetSegmentType(i); switch (type) { case SegmentType.Line: segments.Add(LineToSpeckle(polyline.GetLineSegmentAt(i))); break; case SegmentType.Arc: segments.Add(ArcToSpeckle(polyline.GetArcSegmentAt(i))); break; } } polycurve.segments = segments; polycurve.length = polyline.Length; polycurve.bbox = BoxToSpeckle(polyline.GeometricExtents, true); return(polycurve); }
// Polycurves public Polyline PolylineToSpeckle(AcadDB.Polyline polyline) // AC polylines can have arc segments, this treats all segments as lines { List <Point3d> vertices = new List <Point3d>(); for (int i = 0; i < polyline.NumberOfVertices; i++) { vertices.Add(polyline.GetPoint3dAt(i)); } if (polyline.Closed) { vertices.Add(polyline.GetPoint3dAt(0)); } var _polyline = new Polyline(PointsToFlatArray(vertices), ModelUnits); _polyline.closed = polyline.Closed; _polyline.length = polyline.Length; _polyline.bbox = BoxToSpeckle(polyline.GeometricExtents, true); return(_polyline); }
public AcadDB.Polyline PolycurveToNativeDB(Polycurve polycurve) //polylines can only support curve segments of type circular arc { AcadDB.Polyline polyline = new AcadDB.Polyline() { Closed = polycurve.closed }; var plane = new Autodesk.AutoCAD.Geometry.Plane(Point3d.Origin, Vector3d.ZAxis.TransformBy(Doc.Editor.CurrentUserCoordinateSystem)); // TODO: check this // add all vertices for (int i = 0; i < polycurve.segments.Count; i++) { var segment = polycurve.segments[i]; switch (segment) { case Line o: polyline.AddVertexAt(i, PointToNative(o.start).Convert2d(plane), 0, 0, 0); if (!polycurve.closed && i == polycurve.segments.Count - 1) { polyline.AddVertexAt(i + 1, PointToNative(o.end).Convert2d(plane), 0, 0, 0); } break; case Arc o: var bulge = Math.Tan((double)(o.endAngle - o.startAngle) / 4); // bulge polyline.AddVertexAt(i, PointToNative(o.startPoint).Convert2d(plane), bulge, 0, 0); if (!polycurve.closed && i == polycurve.segments.Count - 1) { polyline.AddVertexAt(i + 1, PointToNative(o.endPoint).Convert2d(plane), 0, 0, 0); } break; default: throw new Speckle.Core.Logging.SpeckleException("Polycurve segment is not a line or arc!"); } } return(polyline); }