static private Rhino.Geometry.Brep SplitClosedFaces(Rhino.Geometry.Brep brep, double tolerance) { Brep brepToSplit = null; while (brepToSplit != brep && brep != null) { brep.Standardize(); brepToSplit = brep; foreach (var face in brepToSplit.Faces) { face.ShrinkFace(BrepFace.ShrinkDisableSide.ShrinkAllSides); var splittersU = face.IsClosed(0) ? face.TrimAwareIsoCurve(1, face.Domain(0).Mid) : null; var splittersV = face.IsClosed(1) ? face.TrimAwareIsoCurve(0, face.Domain(1).Mid) : null; var splittersULength = (splittersU?.Length).GetValueOrDefault(); var splittersVLength = (splittersV?.Length).GetValueOrDefault(); var splittersLength = splittersULength + splittersVLength; if (splittersLength > 0) { var splitters = new Rhino.Geometry.Curve[splittersLength]; splittersU?.CopyTo(splitters, 0); splittersV?.CopyTo(splitters, splittersULength); brep = face.Split(splitters, tolerance); if (brep == null || brep.Faces.Count == brepToSplit.Faces.Count) { return(null); } } } } return(brep); }
static private Rhino.Geometry.Brep SplitClosedFaces(Rhino.Geometry.Brep brep) { Brep brepToSplit = null; while (brepToSplit != brep && brep != null) { brep.Standardize(); brepToSplit = brep; foreach (var face in brepToSplit.Faces) { face.ShrinkFace(BrepFace.ShrinkDisableSide.ShrinkAllSides); var face_IsClosed = new bool[2]; var splitters = new List <Rhino.Geometry.Curve>(); // Compute splitters at C2 for (int d = 0; d < 2; d++) { face_IsClosed[d] = face.IsClosed(d); var domain = face.Domain(d); var t = domain.Min; while (face.GetNextDiscontinuity(d, Continuity.C2_continuous, t, domain.Max, out t)) { splitters.AddRange(face.TrimAwareIsoCurve((d == 0) ? 1 : 0, t)); face_IsClosed[d] = false; } } if (face_IsClosed[0]) { splitters.AddRange(face.TrimAwareIsoCurve(1, face.Domain(0).Mid)); } if (face_IsClosed[1]) { splitters.AddRange(face.TrimAwareIsoCurve(0, face.Domain(1).Mid)); } if (splitters.Count > 0) { brep = face.Split(splitters, Revit.ShortCurveTolerance); if (brep == null) { return(null); } if (brep.Faces.Count != brepToSplit.Faces.Count) { break; // try again until no face is splitted } // Split was ok but no new faces were created for tolerance reasons // Too near from the limits. brep = brepToSplit; } } } return(brep); }