Click or drag to resize
BrepFaceSplit Method (IEnumerableCurve, Double)
Split this face using 3D trimming curves.

Namespace: Rhino.Geometry
Assembly: RhinoCommon (in RhinoCommon.dll) Version: 5.1.50000.0 (5.0.20693.0)
Syntax
public Brep Split(
	IEnumerable<Curve> curves,
	double tolerance
)

Parameters

curves
Type: System.Collections.GenericIEnumerableCurve
Curves to split with.
tolerance
Type: SystemDouble
Tolerance for splitting, when in doubt use the Document Absolute Tolerance.

Return Value

Type: Brep
A brep consisting of all the split fragments, or null on failure.
Examples
using Rhino;
using Rhino.Commands;
using System.Linq;
using Rhino.Geometry;
using Rhino.Input;
using Rhino.DocObjects;
using System.Collections.Generic;

namespace examples_cs
{
  public class TightBoundingBoxCommand : Command
  {
    public override string EnglishName { get { return "csTightBoundingBox"; } }

    protected override Result RunCommand(RhinoDoc doc, RunMode mode)
    {
      ObjRef obj_ref;
      var rc = RhinoGet.GetOneObject(
        "Select surface to split", true, ObjectType.Surface, out obj_ref);
      if (rc != Result.Success)
        return rc;
      var surface = obj_ref.Surface();
      if (surface == null)
        return Result.Failure;

      obj_ref = null;
      rc = RhinoGet.GetOneObject(
        "Select cutting curve", true, ObjectType.Curve, out obj_ref);
      if (rc != Result.Success)
        return rc;
      var curve = obj_ref.Curve();
      if (curve == null)
        return Result.Failure;

      var brep_face = surface as BrepFace;
      if (brep_face == null)
        return Result.Failure;

      var split_brep = brep_face.Split(
        new List<Curve> {curve}, doc.ModelAbsoluteTolerance);
      if (split_brep == null)
      {
        RhinoApp.WriteLine("Unable to split surface.");
        return Result.Nothing;
      }

      var meshes = Mesh.CreateFromBrep(split_brep);

      foreach (var mesh in meshes)
      {
        var bbox = mesh.GetBoundingBox(true);
        switch (bbox.IsDegenerate(doc.ModelAbsoluteTolerance))
        {
          case 3:
          case 2:
            return Result.Failure;
          case 1:
            // rectangle
            // box with 8 corners flattened to rectangle with 4 corners
            var rectangle_corners = bbox.GetCorners().Distinct().ToList();
            // add 1st point as last to close the loop
            rectangle_corners.Add(rectangle_corners[0]);
            doc.Objects.AddPolyline(rectangle_corners);
            doc.Views.Redraw();
            break;
          case 0: 
            // box
            var brep_box = new Box(bbox).ToBrep();
            doc.Objects.AddBrep(brep_box);
            doc.Views.Redraw();
            break;
        }
      }

      return Result.Success;
    }
  }
}
from scriptcontext import doc
import rhinoscriptsyntax as rs
from Rhino.Geometry import *
from Rhino.Input import *
from Rhino.DocObjects import *
from Rhino.Commands import *
from System.Collections.Generic import *

def RunCommand():
  rc, obj_ref = RhinoGet.GetOneObject(
    "Select surface to split", True, ObjectType.Surface)
  if rc != Result.Success:
    return rc
  brep_face = obj_ref.Surface()
  if brep_face == None:
    return Result.Failure

  rc, obj_ref = RhinoGet.GetOneObject(
    "Select cutting curve", True, ObjectType.Curve)
  if rc != Result.Success:
    return rc
  curve = obj_ref.Curve()
  if curve == None:
    return Result.Failure

  curves = List[Curve]([curve])
  split_brep = brep_face.Split(
    curves, doc.ModelAbsoluteTolerance)

  if split_brep == None:
    RhinoApp.WriteLine("Unable to split surface.")
    return Result.Nothing

  meshes = Mesh.CreateFromBrep(split_brep)
  print type(meshes)
  for mesh in meshes:
    bbox = mesh.GetBoundingBox(True)
    bbox_type = bbox.IsDegenerate(doc.ModelAbsoluteTolerance)
    if bbox_type == 1: # rectangle
        # box with 8 corners flattened to rectangle with 4 corners
        box_corners = bbox.GetCorners()
        rectangle_corners = []
        for corner_point in box_corners:
          if corner_point not in rectangle_corners:
              rectangle_corners.append(corner_point)
        # add 1st point as last to close the loop
        rectangle_corners.append(rectangle_corners[0])
        doc.Objects.AddPolyline(rectangle_corners)
        doc.Views.Redraw()
    elif bbox_type == 0: # box
        brep_box = Box(bbox).ToBrep()
        doc.Objects.AddBrep(brep_box)
        doc.Views.Redraw()
    else: # bbox invalid, point, or line
      return Result.Failure

  return Result.Success

if __name__ == "__main__":
  RunCommand()
See Also