/// <summary> /// Convert a Robot contour geometry to a Nucleus polycurve /// </summary> /// <param name="contour"></param> /// <returns></returns> public static PolyCurve Convert(RobotGeoContour contour) { PolyCurve result = new PolyCurve(); RobotGeoSegmentCollection segments = contour.Segments as RobotGeoSegmentCollection; RobotGeoSegment firstSegment = segments.Get(1); Vector lastPt = Convert(firstSegment.P1); for (int i = 2; i <= segments.Count; i++) { RobotGeoSegment segment = segments.Get(i); if (segment.Type == IRobotGeoSegmentType.I_GST_ARC) { RobotGeoSegmentArc arcSegment = (RobotGeoSegmentArc)segment; Vector endPt = Convert(arcSegment.P2); Arc arc = new Arc(lastPt, Convert(arcSegment.P1), endPt); result.Add(arc); lastPt = endPt; } else { Vector endPt = Convert(segment.P1); Line line = new Line(lastPt, endPt); result.Add(line); lastPt = endPt; } } result.Close(); return(result); }
/// <summary> /// Convert a Nucleus polyCurve to a Robot Contour /// </summary> /// <param name="polyCurve"></param> /// <returns></returns> public static RobotGeoContour Convert(PolyCurve polyCurve) { RobotGeoContour result = new RobotGeoContour(); foreach (Curve subCrv in polyCurve.SubCurves) { AddContourSegment(result, subCrv); } return(result); }
private static void AddContourSegment(RobotGeoContour result, Curve crv) { if (crv.IsValid) { if (crv is Arc) { Arc arc = (Arc)crv; var segment = new RobotGeoSegmentArc(); segment.P1 = Convert(arc.Vertices[1].Position); segment.P2 = Convert(arc.EndPoint); result.Add((RobotGeoSegment)segment); } else if (crv is PolyLine) { foreach (Vertex v in crv.Vertices) { var segment = new RobotGeoSegmentLine(); segment.P1 = Convert(v.Position); result.Add((RobotGeoSegment)segment); } } else if (crv is PolyCurve) { foreach (Curve subCrv in ((PolyCurve)crv).SubCurves) { AddContourSegment(result, subCrv); } } else // Everything else treated as a line { var segment = new RobotGeoSegmentLine(); segment.P1 = Convert(crv.EndPoint); result.Add((RobotGeoSegment)segment); } } }