static internal IEnumerable <GeometryObject> ToHost(this Rhino.Geometry.Brep brep) { Solid solid = null; // MakeValidForV2 converts everything inside brep to NURBS if (brep.MakeValidForV2()) { var splittedBrep = SplitClosedFaces(brep); if (splittedBrep != null) { brep = splittedBrep; //RhinoDoc.ActiveDoc.Objects.Add(brep); try { var builder = new BRepBuilder(brep.IsSolid ? BRepType.Solid : BRepType.OpenShell); builder.AllowRemovalOfProblematicFaces(); builder.SetAllowShortEdges(); var brepEdges = new List <BRepBuilderGeometryId> [brep.Edges.Count]; foreach (var face in brep.Faces) { var faceId = builder.AddFace(face.ToHost(), face.OrientationIsReversed); builder.SetFaceMaterialId(faceId, GraphicAttributes.Peek.MaterialId); foreach (var loop in face.Loops) { var loopId = builder.AddLoop(faceId); foreach (var trim in loop.Trims) { if (trim.TrimType != BrepTrimType.Boundary && trim.TrimType != BrepTrimType.Mated) { continue; } var edge = trim.Edge; if (edge == null) { continue; } var edgeIds = brepEdges[edge.EdgeIndex]; if (edgeIds == null) { edgeIds = brepEdges[edge.EdgeIndex] = new List <BRepBuilderGeometryId>(); foreach (var e in edge.ToHost()) { edgeIds.Add(builder.AddEdge(BRepBuilderEdgeGeometry.Create(e))); } } if (trim.IsReversed()) { for (int e = edgeIds.Count - 1; e >= 0; --e) { builder.AddCoEdge(loopId, edgeIds[e], true); } } else { for (int e = 0; e < edgeIds.Count; ++e) { builder.AddCoEdge(loopId, edgeIds[e], false); } } } builder.FinishLoop(loopId); } builder.FinishFace(faceId); } builder.Finish(); if (builder.IsResultAvailable()) { solid = builder.GetResult(); } } catch (Autodesk.Revit.Exceptions.ApplicationException e) { // TODO: Fix cases with singularities and uncomment this line //Debug.Fail(e.Source, e.Message); Debug.WriteLine(e.Message, e.Source); } } else { Debug.Fail("SplitClosedFaces", "SplitClosedFaces failed to split a closed surface."); } } if (solid != null) { yield return(solid); } else { // Emergency result as a mesh var mp = MeshingParameters.Default; mp.MinimumEdgeLength = Revit.VertexTolerance; mp.ClosedObjectPostProcess = true; mp.JaggedSeams = false; var brepMesh = new Rhino.Geometry.Mesh(); brepMesh.Append(Rhino.Geometry.Mesh.CreateFromBrep(brep, mp)); foreach (var g in brepMesh.ToHost()) { yield return(g); } } }
static internal IEnumerable <GeometryObject> Convert(Rhino.Geometry.Brep brep) { // Convert everything inside brep to NURBS if (false && brep.MakeValidForV2()) { brep = SplitClosedFaces(brep, ModelAbsoluteTolerance); foreach (var face in brep.Faces) { var builder = new BRepBuilder(face.IsSolid ? BRepType.Solid : BRepType.OpenShell); //builder.AllowRemovalOfProblematicFaces(); //builder.SetAllowShortEdges(); var brepSurface = Convert(face.UnderlyingSurface()); var brepEdges = new List <BRepBuilderGeometryId> [brep.Edges.Count]; var faceId = builder.AddFace(brepSurface, face.OrientationIsReversed); foreach (var loop in face.Loops) { var loopId = builder.AddLoop(faceId); foreach (var trim in loop.Trims) { if (trim.TrimType != BrepTrimType.Boundary) { continue; } var edge = trim.Edge; if (edge == null) { continue; } var edgeIds = brepEdges[edge.EdgeIndex]; if (edgeIds == null) { edgeIds = brepEdges[edge.EdgeIndex] = new List <BRepBuilderGeometryId>(); foreach (var c in Convert(edge.EdgeCurve)) { edgeIds.Add(builder.AddEdge(BRepBuilderEdgeGeometry.Create(c))); } } if (trim.IsReversed()) { for (int e = edgeIds.Count - 1; e >= 0; --e) { builder.AddCoEdge(loopId, edgeIds[e], true); } } else { for (int e = 0; e < edgeIds.Count; ++e) { builder.AddCoEdge(loopId, edgeIds[e], false); } } } builder.FinishLoop(loopId); } builder.FinishFace(faceId); builder.Finish(); if (!builder.IsResultAvailable()) { continue; } yield return(builder.GetResult()); } } else { // Emergency code var mp = MeshingParameters.Default; mp.MinimumEdgeLength = ModelAbsoluteTolerance; foreach (var m in Convert(Rhino.Geometry.Mesh.CreateFromBrep(brep, mp))) { yield return(m); } } }