/// <summary> /// Create Rebar following a selected surface /// </summary> /// <param name="face">Surface</param> /// <param name="numberOfCurves">Define number of curves or distance between bars</param> /// <param name="distanceBetweenCurves">Define distance between curves or number of bars</param> /// <param name="flip">Flip orientation</param> /// <param name="offset">Offset</param> /// <param name="idealize">Idealize surfaces to rectangles</param> /// <returns>List of rebar</returns> public static List<Curve> FollowingSurface(Surface face, int numberOfCurves, double distanceBetweenCurves = 0, bool flip = true, double offset = 0, bool idealize = true) { if (idealize) { return face.Follow(50, offset, distanceBetweenCurves, numberOfCurves, flip); } else { // Create return value collection List<Curve> curves = new List<Curve>(); // Get a reference curve from the surface UV p1 = UV.ByCoordinates(0, 0); UV p2 = UV.ByCoordinates(1, 0); double length = (!flip) ? face.DistanceBetweenPoints(p1, p2) : face.DistanceBetweenPoints(p1.Flip(), p2.Flip()); // If there is a distance applied use it to determine the number of lines to create if (distanceBetweenCurves > 0) numberOfCurves = (int)(length / (distanceBetweenCurves)); numberOfCurves++; Surface surface = face; if (offset != 0) surface = (Surface)face.Offset(offset); TrimmedSurface trimmedSurface = new TrimmedSurface(surface); // Walk thru the amount of lines to create for (int j = 1; j < numberOfCurves; j++) { // Create a set of points for createing a curve List<Point> points = new List<Point>(); // Get the height parameter double height = (double)j / (double)numberOfCurves; curves.Add(trimmedSurface.GetCurveAtParameter(height, flip)); } return curves; } }