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