Exemplo n.º 1
0
        private Spiral AlignmentSpiralToSpeckle(CivilDB.AlignmentSubEntitySpiral spiral, CivilDB.Alignment alignment)
        {
            var _spiral = new Spiral();

            _spiral.startPoint = PointToSpeckle(spiral.StartPoint);
            _spiral.endPoint   = PointToSpeckle(spiral.EndPoint);
            _spiral.length     = spiral.Length;
            _spiral.pitch      = 0;
            _spiral.spiralType = SpiralTypeToSpeckle(spiral.SpiralDefinition);

            // get plane
            var vX    = new Vector3d(System.Math.Cos(spiral.StartDirection) + spiral.StartPoint.X, System.Math.Sin(spiral.StartDirection) + spiral.StartPoint.Y, 0);
            var vY    = vX.RotateBy(System.Math.PI / 2, Vector3d.ZAxis);
            var plane = new Acad.Plane(new Point3d(spiral.RadialPoint.X, spiral.RadialPoint.Y, 0), vX, vY);

            _spiral.plane = PlaneToSpeckle(plane);

            // get turns
            int turnDirection = (spiral.Direction == CivilDB.SpiralDirectionType.DirectionLeft) ? 1 : -1;

            _spiral.turns = turnDirection * spiral.Delta / (System.Math.PI * 2);

            // create polyline display, default tessellation length is 1
            var tessellation       = 1;
            int spiralSegmentCount = System.Convert.ToInt32(System.Math.Ceiling(spiral.Length / tessellation));

            spiralSegmentCount = (spiralSegmentCount < 10) ? 10 : spiralSegmentCount;
            double         spiralSegmentLength = spiral.Length / spiralSegmentCount;
            List <Point2d> points = new List <Point2d>();

            points.Add(spiral.StartPoint);
            for (int i = 1; i < spiralSegmentCount; i++)
            {
                double x = 0;
                double y = 0;
                double z = 0;

                alignment.PointLocation(spiral.StartStation + (i * spiralSegmentLength), 0, tolerance, ref x, ref y, ref z);
                points.Add(new Point2d(x, y));
            }
            points.Add(spiral.EndPoint);
            double length = 0;

            for (int j = 1; j < points.Count; j++)
            {
                length += points[j].GetDistanceTo(points[j - 1]);
            }
            var poly = new Polyline();

            poly.value           = PointsToFlatList(points);
            poly.units           = ModelUnits;
            poly.closed          = (spiral.StartPoint != spiral.EndPoint) ? false : true;
            poly.length          = length;
            _spiral.displayValue = poly;

            return(_spiral);
        }
Exemplo n.º 2
0
        public Polyline3d PolylineToNativeDB(Polyline polyline) // AC polyline3d can only have linear segments
        {
            var vertices = new Point3dCollection();

            for (int i = 0; i < polyline.points.Count; i++)
            {
                vertices.Add(PointToNative(polyline.points[i]));
            }
            return(new Polyline3d(Poly3dType.SimplePoly, vertices, polyline.closed));
        }
Exemplo n.º 3
0
        // Splines
        public Curve SplineToSpeckle(Spline spline)
        {
            var curve = new Curve();

            // get nurbs and geo data
            var data    = spline.NurbsData;
            var _spline = spline.GetGeCurve() as NurbCurve3d;

            // handle the display polyline
            try
            {
                var      poly         = spline.ToPolyline(false, true);
                Polyline displayValue = ConvertToSpeckle(poly) as Polyline;
                curve.displayValue = displayValue;
            }
            catch { }

            // get weights: autocad assigns unweighted points a value of -1, and will return an empty list in the spline's nurbsdata if no points are weighted
            var weights = new List <double>();

            for (int i = 0; i < spline.NumControlPoints; i++)
            {
                double weight = spline.WeightAt(i);
                if (weight < 0)
                {
                    weights.Add(1);
                }
                else
                {
                    weights.Add(weight);
                }
            }

            // set nurbs curve info
            curve.points   = PointsToFlatArray(data.GetControlPoints().OfType <Point3d>().ToList()).ToList();
            curve.knots    = data.GetKnots().OfType <double>().ToList();
            curve.weights  = weights;
            curve.degree   = spline.Degree;
            curve.periodic = spline.IsPeriodic;
            curve.rational = spline.IsRational;
            curve.closed   = spline.Closed;
            curve.length   = _spline.GetLength(_spline.StartParameter, _spline.EndParameter, tolerance);
            curve.domain   = IntervalToSpeckle(_spline.GetInterval());
            curve.bbox     = BoxToSpeckle(spline.GeometricExtents, true);
            curve.units    = ModelUnits;

            return(curve);
        }
        // Polycurve
        // TODO: NOT TESTED FROM HERE DOWN
        public PolylineCurve3d PolylineToNative(Polyline polyline)
        {
            var points = PointListToNative(polyline.value, polyline.units).ToList();

            if (polyline.closed)
            {
                points.Add(points[0]);
            }
            var _polyline = new PolylineCurve3d(new Point3dCollection(points.ToArray()));

            if (polyline.domain != null)
            {
                _polyline.SetInterval(IntervalToNative(polyline.domain));
            }
            return(_polyline);
        }
Exemplo n.º 5
0
        public Polyline PolylineToSpeckle(AcadDB.Polyline3d polyline) // AC polyline3d can only have linear segments
        {
            List <Point3d> vertices = new List <Point3d>();

            foreach (PolylineVertex3d vertex in polyline)
            {
                vertices.Add(vertex.Position);
            }
            if (polyline.Closed)
            {
                vertices.Add(vertices[0]);
            }

            var _polyline = new Polyline(PointsToFlatArray(vertices), ModelUnits);

            _polyline.closed = polyline.Closed;
            _polyline.length = polyline.Length;
            _polyline.bbox   = BoxToSpeckle(polyline.GeometricExtents, true);

            return(_polyline);
        }
Exemplo n.º 6
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);
        }