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;
  }
}
Partial Friend Class Examples
  Public Shared Function SplitBrepsWithPlane(ByVal doc As RhinoDoc) As Result
	'First, collect all the breps to split
	Dim obj_refs() As ObjRef = Nothing
	Dim rc = RhinoGet.GetMultipleObjects("Select breps to split", False, ObjectType.Brep, obj_refs)
	If rc IsNot Result.Success OrElse obj_refs Is Nothing Then
	  Return rc
	End If

	' Get the final plane
	Dim plane As Plane = Nothing
	rc = RhinoGet.GetPlane(plane)
	If rc IsNot Result.Success Then
	  Return rc
	End If

	'Iterate over all object references
	For Each obj_ref In obj_refs
	  Dim brep = obj_ref.Brep()
	  Dim 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.
	  Dim min_point = bbox.Min
	  min_point.X -= 1.0
	  min_point.Y -= 1.0
	  min_point.Z -= 1.0
	  bbox.Min = min_point
	  Dim max_point = bbox.Max
	  max_point.X += 1.0
	  max_point.Y += 1.0
	  max_point.Z += 1.0
	  bbox.Max = max_point

	  Dim plane_surface = PlaneSurface.CreateThroughBox(plane, bbox)
	  If plane_surface Is Nothing Then
		'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
		Dim breps = brep.Split(plane_surface.ToBrep(), doc.ModelAbsoluteTolerance)
		If breps Is Nothing OrElse breps.Length = 0 Then
		  RhinoApp.Write("Plane does not intersect brep (id:{0})", obj_ref.ObjectId)
		  Continue For
		End If
		For Each brep_piece In breps
		  doc.Objects.AddBrep(brep_piece)
		Next brep_piece
		doc.Objects.AddSurface(plane_surface)
		doc.Objects.Delete(obj_ref, False)
	  End If
	Next obj_ref

	doc.Views.Redraw()
	Return Result.Success
  End Function
End Class
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()