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); }
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); }