コード例 #1
0
        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);
        }
コード例 #2
0
        // 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);
        }
コード例 #3
0
        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);
        }