/// <summary> /// Sort a series of curves in the shortest printing path. /// </summary> /// <param name="_curves"></param> /// <returns name="Curves"></returns> public static List <Autodesk.DesignScript.Geometry.Curve> SortPrintableCurves(List <Autodesk.DesignScript.Geometry.Curve> _curves) { List <Autodesk.DesignScript.Geometry.Curve> sortedCurves = new List <Autodesk.DesignScript.Geometry.Curve>(); List <Autodesk.DesignScript.Geometry.Curve> curves = new List <Autodesk.DesignScript.Geometry.Curve>(); curves.AddRange(_curves); // Copying elements to curves to avoid modifying the original list of curves Autodesk.DesignScript.Geometry.Curve currentCurve = curves[curves.Count - 1]; curves.RemoveAt(curves.Count - 1); sortedCurves.Add(currentCurve); // find ouf next curve either startpoint or endpoint is closest to the end point of the current curve while (curves.Count != 0) { int bestI = 0; double bestDistance = double.MaxValue; Autodesk.DesignScript.Geometry.Point currentPoint = currentCurve.EndPoint; for (int i = 0; i < curves.Count; ++i) { Autodesk.DesignScript.Geometry.Curve c = curves[i]; Autodesk.DesignScript.Geometry.Line l1 = Autodesk.DesignScript.Geometry.Line.ByStartPointEndPoint(currentPoint, c.StartPoint); Autodesk.DesignScript.Geometry.Line l2 = Autodesk.DesignScript.Geometry.Line.ByStartPointEndPoint(currentPoint, c.EndPoint); double distanceToStartPoint = l1.Length; double distanceToEndPoint = l2.Length; double d = Math.Min(distanceToStartPoint, distanceToEndPoint); if (bestDistance > d) { bestI = i; bestDistance = d; } } currentCurve = curves[bestI]; curves.RemoveAt(bestI); double distanceToCurrentCurveEndPoint = Autodesk.DesignScript.Geometry.Line.ByStartPointEndPoint(currentPoint, currentCurve.EndPoint).Length; double distanceToCurrentCurveStartPoint = Autodesk.DesignScript.Geometry.Line.ByStartPointEndPoint(currentPoint, currentCurve.StartPoint).Length; if (distanceToCurrentCurveEndPoint < distanceToCurrentCurveStartPoint) { currentCurve = currentCurve.Reverse(); } sortedCurves.Add(currentCurve); } return(sortedCurves); }
public override void Reverse() { curve.Reverse(); }