1724/2078

Creating a Sweep with Multiple Closed Loops

Originally Published in

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 XYZ050 ) ) );

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

    XYZ p1 = new XYZ000 );
    XYZ p2 = new XYZ1000 );
    XYZ p3 = new XYZ10150 );
    XYZ p4 = new XYZ0150 );
    XYZ a1 = new XYZ150 );
    XYZ a2 = new XYZ350 );
    XYZ a3 = new XYZ3100 );
    XYZ a4 = new XYZ1100 );
    XYZ b1 = new XYZ550 );
    XYZ b2 = new XYZ750 );
    XYZ b3 = new XYZ7100 );
    XYZ b4 = new XYZ5100 );

    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.NewSweeptrue
      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.