Creating a Sweep with Multiple Closed Loops

Until today, The Building Coder samples lacked a demonstration of using the NewSweep method.

That was very kindly provided in yet another helpful answer by Frank @Fair59 Aarssen to the Revit API discussion forum thread on how to create a sweep with multiple closed loops in profile.

Let me also highlight an interesting TED talk on the topic of poverty versus universal basic income:

Creating a Sweep with Multiple Closed Loops

Question: I want to create a sweep with multiple closed loops in profile, like this:

Profile with multiple loops

I can draw the profile on the plane with model lines, but if I use it to create a sweep, it will report errors such as "cannot create sweep" without any other tips.

I have created sweeps using profiles with two loops successfully like this:

Profile with one hole

Profile with the other hole

Is there any limitation, for example, the sweep profile can only have two closed loops at most, otherwise it will be wrong?

Later: After further testing, I still cannot create a sweep with three closed loops.

I tried orienting the two inner loops both clockwise and counterclockwise, but nothing helps.

Answer: Every loop needs to be a separate CurveArray!

I added Frank's correction to the test code provided and integrated it into The Building Coder samples module CmdNewSweptBlend.cs:

  public Sweep CreateSweepWithMultipleLoops(
    Document doc )
  {
    // Extrusion path

    CurveArray path = new CurveArray();

    path.Append( Line.CreateBound( XYZ.Zero, 
      new XYZ( 0, 5, 0 ) ) );

    // Profile vertices: rectangle with two
    // rectangular holes

    XYZ p1 = new XYZ( 0, 0, 0 );
    XYZ p2 = new XYZ( 10, 0, 0 );
    XYZ p3 = new XYZ( 10, 15, 0 );
    XYZ p4 = new XYZ( 0, 15, 0 );
    XYZ a1 = new XYZ( 1, 5, 0 );
    XYZ a2 = new XYZ( 3, 5, 0 );
    XYZ a3 = new XYZ( 3, 10, 0 );
    XYZ a4 = new XYZ( 1, 10, 0 );
    XYZ b1 = new XYZ( 5, 5, 0 );
    XYZ b2 = new XYZ( 7, 5, 0 );
    XYZ b3 = new XYZ( 7, 10, 0 );
    XYZ b4 = new XYZ( 5, 10, 0 );

    CurveArrArray arrcurve = new CurveArrArray();
    CurveArray curve = new CurveArray();
    curve.Append( Line.CreateBound( p1, p2 ) );
    curve.Append( Line.CreateBound( p2, p3 ) );
    curve.Append( Line.CreateBound( p3, p4 ) );
    curve.Append( Line.CreateBound( p4, p1 ) );
    arrcurve.Append( curve );
    curve = new CurveArray();
    curve.Append( Line.CreateBound( a1, a4 ) );
    curve.Append( Line.CreateBound( a4, a3 ) );
    curve.Append( Line.CreateBound( a3, a2 ) );
    curve.Append( Line.CreateBound( a2, a1 ) );
    arrcurve.Append( curve );
    curve = new CurveArray();
    curve.Append( Line.CreateBound( b1, b4 ) );
    curve.Append( Line.CreateBound( b4, b3 ) );
    curve.Append( Line.CreateBound( b3, b2 ) );
    curve.Append( Line.CreateBound( b2, b1 ) );
    arrcurve.Append( curve );

    Application app = doc.Application;

    SweepProfile profile = app.Create
      .NewCurveLoopsProfile( arrcurve );

    Plane plane = Plane.CreateByNormalAndOrigin( 
      XYZ.BasisZ, XYZ.Zero );

    SketchPlane sketchPlane = SketchPlane.Create( 
      doc, plane );

    Sweep sweep = doc.FamilyCreate.NewSweep( true, 
      path, sketchPlane, profile, 0, 
      ProfilePlaneLocation.Start );

    return sweep;
  }

Here is the result of running this code in a new family document:

Sweep with multiple loops

Many thanks to Frank for this solution!

Poverty versus Universal Basic Income

In case you are interested in the topic of universal basic income, you might find this TED talk quite illuminating: Poverty isn't a lack of character; it's a lack of cash, by historian Rutger Bregman, on June 13, 2017.

"Ideas can and do change the world," he says, sharing his case for a provocative one: guaranteed basic income. Learn more about the idea's 500-year history and a forgotten modern experiment where it actually worked – and imagine how much energy and talent we would unleash if we got rid of poverty once and for all.