Offset / Thicken arbitrary polysurface (with continuity)

My objective is to thicken some polysurfaces. I have seen some posts, but either they focus on single surfaces or solutions for meshes.

Pufferfish offset surface (OffSrf) seems that would be the closest to what I want. However, it seems that it generates unconnected surfaces (when the input is connected):

Obviously, when the solid option is activated does not generate a satisfactory result, as the “edges” do not form a continuous wall.

Is there a robust way of generating an offset polysurface (continuous) from an arbitrary polysurface (or even better a thicken solid, but I can work around the offset surface)?

offset_polysurface.gh (11.8 KB)

You can use this method in RhinoCommon: https://developer.rhino3d.com/api/RhinoCommon/html/M_Rhino_Geometry_Brep_CreateOffsetBrep.htm

As for

I doubt it. Unless your geometry is simple, you’re likely to get stuck with parts failing in places.

I don’t think anyone publishes plugins anymore that do the brep offset because they are sick of people complaining about it failing :sweat_smile:

1 Like

Thank you. I will give it a try.

I am not very familiar with RhinoCommon. I have tried this using a C# component but got an error:

  private void RunScript(Brep brep, double offset, bool solid, bool extend, bool shrink, double tol, ref object output)
  {

    Brep b = Brep.CreateOffsetBrep(brep, offset, solid, extend, shrink, tol);
    output = b;

  }

1. Error (CS1501): No overload for method 'CreateOffsetBrep' takes 6 arguments (line 58)

Ok, I managed to make it work!

  private void RunScript(Brep brep, double offset, bool solid, bool extend, bool shrink, double tol, ref object output, ref object blends, ref object walls)
  {

    Brep[] blends_out;
    Brep[] walls_out;
    Brep[] b = Brep.CreateOffsetBrep(brep, offset, solid, extend, shrink, tol, out blends_out, out walls_out);
    output = b;
    blends = blends_out;
    walls = walls_out;

  }

The addon’s name is Parakeet. I am not sure it has a superpower, but it works for your example.