Beispiel #1
0
        public Alignment AlignmentToSpeckle(CivilDB.Alignment alignment)
        {
            var _alignment = new Alignment();

            // get the alignment subentity curves
            List <ICurve> curves   = new List <ICurve>();
            var           stations = new List <double>();

            for (int i = 0; i < alignment.Entities.Count; i++)
            {
                var entity = alignment.Entities.GetEntityByOrder(i);

                var    polycurve = new Polycurve(units: ModelUnits, applicationId: entity.EntityId.ToString());
                var    segments  = new List <ICurve>();
                double length    = 0;
                for (int j = 0; j < entity.SubEntityCount; j++)
                {
                    CivilDB.AlignmentSubEntity subEntity = entity[j];
                    ICurve segment = null;
                    switch (subEntity.SubEntityType)
                    {
                    case CivilDB.AlignmentSubEntityType.Arc:
                        var arc = subEntity as CivilDB.AlignmentSubEntityArc;
                        segment = AlignmentArcToSpeckle(arc);
                        break;

                    case CivilDB.AlignmentSubEntityType.Line:
                        var line = subEntity as CivilDB.AlignmentSubEntityLine;
                        segment = AlignmentLineToSpeckle(line);
                        break;

                    case CivilDB.AlignmentSubEntityType.Spiral:
                        var spiral = subEntity as CivilDB.AlignmentSubEntitySpiral;
                        segment = AlignmentSpiralToSpeckle(spiral, alignment);
                        break;
                    }
                    if (segment != null)
                    {
                        length += subEntity.Length;
                        segments.Add(segment);
                    }
                }
                if (segments.Count == 1)
                {
                    curves.Add(segments[0]);
                }
                else
                {
                    polycurve.segments = segments;
                    polycurve.length   = length;

                    // add additional props like entity type
                    polycurve["alignmentType"] = entity.EntityType.ToString();
                    curves.Add(polycurve);
                }
            }

            // get display poly
            var poly = alignment.BaseCurve as Autodesk.AutoCAD.DatabaseServices.Polyline;

            using (Polyline2d poly2d = poly.ConvertTo(false))
            {
                _alignment.displayValue = CurveToSpeckle(poly2d.Spline.ToPolyline()) as Polyline;
            }

            _alignment.curves = curves;
            if (alignment.DisplayName != null)
            {
                _alignment.name = alignment.DisplayName;
            }
            if (alignment.StartingStation != null)
            {
                _alignment.startStation = alignment.StartingStation;
            }
            if (alignment.EndingStation != null)
            {
                _alignment.endStation = alignment.EndingStation;
            }

            // handle station equations
            var equations  = new List <double>();
            var directions = new List <bool>();

            foreach (var stationEquation in alignment.StationEquations)
            {
                equations.AddRange(new List <double> {
                    stationEquation.RawStationBack, stationEquation.StationBack, stationEquation.StationAhead
                });
                bool equationIncreasing = (stationEquation.EquationType.Equals(CivilDB.StationEquationType.Increasing)) ? true : false;
                directions.Add(equationIncreasing);
            }
            _alignment.stationEquations          = equations;
            _alignment.stationEquationDirections = directions;

            _alignment.units = ModelUnits;

            // add civil3d props if they exist
            if (alignment.SiteName != null)
            {
                _alignment["site"] = alignment.SiteName;
            }
            if (alignment.StyleName != null)
            {
                _alignment["style"] = alignment.StyleName;
            }

            return(_alignment);
        }
Beispiel #2
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);
        }