Split BReps with Planes

Split a Set of BReps with a Plane

partial class Examples
{
  public static Result SplitBrepsWithPlane(RhinoDoc doc)
  {
    //First, collect all the breps to split
    ObjRef[] obj_refs;
    var rc = RhinoGet.GetMultipleObjects("Select breps to split", false, ObjectType.Brep, out obj_refs);
    if (rc != Result.Success || obj_refs == null)
      return rc;

    // Get the final plane
    Plane plane;
    rc = RhinoGet.GetPlane(out plane);
    if (rc != Result.Success)
      return rc;

    //Iterate over all object references
    foreach (var obj_ref in obj_refs)
    {
      var brep = obj_ref.Brep();
      var bbox = brep.GetBoundingBox(false);

      //Grow the boundingbox in all directions
      //If the boundingbox is flat (zero volume or even zero area)
      //then the CreateThroughBox method will fail.
      var min_point = bbox.Min;
      min_point.X -= 1.0;
      min_point.Y -= 1.0;
      min_point.Z -= 1.0;
      bbox.Min = min_point;
      var max_point = bbox.Max;
      max_point.X += 1.0;
      max_point.Y += 1.0;
      max_point.Z += 1.0;
      bbox.Max = max_point;

      var plane_surface = PlaneSurface.CreateThroughBox(plane, bbox);
      if (plane_surface == null)
      {
        //This is rare, it will most likely not happen unless either the plane or the boundingbox are invalid
        RhinoApp.WriteLine("Cutting plane could not be constructed.");
      }
      else
      {
        var breps = brep.Split(plane_surface.ToBrep(), doc.ModelAbsoluteTolerance);
        if (breps == null || breps.Length == 0)
        {
          RhinoApp.Write("Plane does not intersect brep (id:{0})", obj_ref.ObjectId);
          continue;
        }
        foreach (var brep_piece in breps)
        {
          doc.Objects.AddBrep(brep_piece);
        }
        doc.Objects.AddSurface(plane_surface);
        doc.Objects.Delete(obj_ref, false);
      }
    }

    doc.Views.Redraw();
    return Result.Success;
  }
}
from Rhino import *
from Rhino.DocObjects import *
from Rhino.Commands import *
from Rhino.Input import *
from Rhino.Geometry import *
from scriptcontext import doc

def RunCommand():
    #First, collect all the breps to split
    rc, obj_refs = RhinoGet.GetMultipleObjects("Select breps to split", False, ObjectType.Brep)
    if rc != Result.Success or obj_refs == None:
        return rc

    # Get the final plane
    rc, plane = RhinoGet.GetPlane()
    if rc != Result.Success:
        return rc

    #Iterate over all object references
    for obj_ref in obj_refs:
        brep = obj_ref.Brep()
        bbox = brep.GetBoundingBox(False)

        #Grow the boundingbox in all directions
        #If the boundingbox is flat (zero volume or even zero area)
        #then the CreateThroughBox method will fail.
        min_point = bbox.Min
        min_point.X -= 1.0
        min_point.Y -= 1.0
        min_point.Z -= 1.0
        bbox.Min = min_point
        max_point = bbox.Max
        max_point.X += 1.0
        max_point.Y += 1.0
        max_point.Z += 1.0
        bbox.Max = max_point

        plane_surface = PlaneSurface.CreateThroughBox(plane, bbox)
        if plane_surface == None:
            #This is rare, it will most likely not happen unless either the plane or the boundingbox are invalid
            RhinoApp.WriteLine("Cutting plane could not be constructed.")
        else:
            breps = brep.Split(plane_surface.ToBrep(), doc.ModelAbsoluteTolerance)
            if breps == None or breps.Length == 0:
                RhinoApp.Write("Plane does not intersect brep (id:{0})", obj_ref.ObjectId)
                continue
            for brep_piece in breps:
                doc.Objects.AddBrep(brep_piece)
            doc.Objects.AddSurface(plane_surface)
            doc.Objects.Delete(obj_ref, False)

    doc.Views.Redraw()
    return Result.Success

if __name__ == "__main__":
    RunCommand()