/// <summary> /// Construct a solid by sweeping a face along a curve. /// </summary> /// <param name="outer">The perimeter of the face to sweep.</param> /// <param name="inner">The holes of the face to sweep.</param> /// <param name="curve">The curve along which to sweep.</param> /// <param name="material">The solid's material.</param> /// <param name="startSetback">The setback of the sweep from the start of the curve.</param> /// <param name="endSetback">The setback of the sweep from the end of the curve.</param> /// <returns>A solid.</returns> public static Solid SweepFaceAlongCurve(Polygon outer, Polygon[] inner, ICurve curve, Material material = null, double startSetback = 0, double endSetback = 0) { var solid = new Solid(material); var l = curve.Length(); var ssb = startSetback / l; var esb = endSetback / l; var transforms = curve.Frames(ssb, esb); if (curve is Polygon) { for (var i = 0; i < transforms.Length; i++) { var next = i == transforms.Length - 1 ? transforms[0] : transforms[i + 1]; solid.SweepPolygonBetweenPlanes(outer, transforms[i].XY, next.XY); } } else { // Add start cap. Face cap = null; Edge[][] openEdges; if (inner != null) { cap = solid.AddFace(transforms[0].OfPolygon(outer), transforms[0].OfPolygons(inner)); openEdges = new Edge[1 + inner.Length][]; } else { cap = solid.AddFace(transforms[0].OfPolygon(outer)); openEdges = new Edge[1][]; } // last outer edge var openEdge = cap.Outer.GetLinkedEdges(); openEdge = solid.SweepEdges(transforms, openEdge); openEdges[0] = openEdge; if (inner != null) { for (var i = 0; i < cap.Inner.Length; i++) { openEdge = cap.Inner[i].GetLinkedEdges(); // last inner edge for one hole openEdge = solid.SweepEdges(transforms, openEdge); openEdges[i + 1] = openEdge; } } solid.Cap(openEdges, true); } return(solid); }
/// <summary> /// Construct a solid by sweeping a face along a curve. /// </summary> /// <param name="perimeter">The perimeter of the face to sweep.</param> /// <param name="holes">The holes of the face to sweep.</param> /// <param name="curve">The curve along which to sweep.</param> /// <param name="startSetback">The setback distance of the sweep from the start of the curve.</param> /// <param name="endSetback">The setback distance of the sweep from the end of the curve.</param> /// <returns>A solid.</returns> public static Solid SweepFaceAlongCurve(Polygon perimeter, IList <Polygon> holes, ICurve curve, double startSetback = 0, double endSetback = 0) { var solid = new Solid(); var l = curve.Length(); // The start and end setbacks can't be more than // the length of the beam together. if ((startSetback + endSetback) >= l) { startSetback = 0; endSetback = 0; } // Calculate the setback parameter as a percentage // of the curve length. This will not work for curves // without non-uniform parameterization. var ssb = startSetback / l; var esb = endSetback / l; var transforms = curve.Frames(ssb, esb); if (curve is Polygon) { for (var i = 0; i < transforms.Length; i++) { var next = i == transforms.Length - 1 ? transforms[0] : transforms[i + 1]; solid.SweepPolygonBetweenPlanes(perimeter, transforms[i], next); } } else if (curve is Bezier) { var startCap = solid.AddFace(transforms[0].OfPolygon(perimeter)); for (var i = 0; i < transforms.Length - 1; i++) { var next = transforms[i + 1]; solid.SweepPolygonBetweenPlanes(perimeter, transforms[i], next); } var endCap = solid.AddFace(transforms[transforms.Length - 1].OfPolygon(perimeter).Reversed()); } else { // Add start cap. Face cap = null; Edge[][] openEdges; if (holes != null) { cap = solid.AddFace(transforms[0].OfPolygon(perimeter), transforms[0].OfPolygons(holes)); openEdges = new Edge[1 + holes.Count][]; } else { cap = solid.AddFace(transforms[0].OfPolygon(perimeter)); openEdges = new Edge[1][]; } // last outer edge var openEdge = cap.Outer.GetLinkedEdges(); openEdge = solid.SweepEdges(transforms, openEdge); openEdges[0] = openEdge; if (holes != null) { for (var i = 0; i < cap.Inner.Length; i++) { openEdge = cap.Inner[i].GetLinkedEdges(); // last inner edge for one hole openEdge = solid.SweepEdges(transforms, openEdge); openEdges[i + 1] = openEdge; } } solid.Cap(openEdges, true); } return(solid); }