public static NurbsSurface ToRhinoSurface(DB.HermiteFace face, double relativeTolerance) { NurbsSurface nurbsSurface = default; try { #if REVIT_2021 using (var surface = DB.ExportUtils.GetNurbsSurfaceDataForSurface(face.GetSurface())) nurbsSurface = ToRhino(surface, face.GetBoundingBox()); #else using (var surface = DB.ExportUtils.GetNurbsSurfaceDataForFace(face)) nurbsSurface = ToRhino(surface, face.GetBoundingBox()); #endif } catch (Autodesk.Revit.Exceptions.ApplicationException) { } if (nurbsSurface is null) { using (var paramsU = face.get_Params(0)) using (var paramsV = face.get_Params(1)) { nurbsSurface = FromHermiteSurface ( paramsU, paramsV, face.Points, face.MixedDerivs, face.get_Tangents(0), face.get_Tangents(1) ); } } using (var bboxUV = face.GetBoundingBox()) { nurbsSurface = nurbsSurface.Trim ( new Interval(bboxUV.Min.U, bboxUV.Max.U), new Interval(bboxUV.Min.V, bboxUV.Max.V) ) as NurbsSurface; } if (nurbsSurface is object) { double ctol = relativeTolerance * Revit.ShortCurveTolerance * 5.0; if (ctol != 0.0) { // Extend using smooth way avoids creating C2 discontinuities nurbsSurface = nurbsSurface.Extend(IsoStatus.West, ctol, true) as NurbsSurface ?? nurbsSurface; nurbsSurface = nurbsSurface.Extend(IsoStatus.East, ctol, true) as NurbsSurface ?? nurbsSurface; nurbsSurface = nurbsSurface.Extend(IsoStatus.South, ctol, true) as NurbsSurface ?? nurbsSurface; nurbsSurface = nurbsSurface.Extend(IsoStatus.North, ctol, true) as NurbsSurface ?? nurbsSurface; } } return(nurbsSurface); }
public static NurbsSurface ToRhinoSurface(this DB.HermiteFace face) { NurbsSurface nurbsSurface = default; try { using (var surface = DB.ExportUtils.GetNurbsSurfaceDataForFace(face)) nurbsSurface = surface.ToRhino(face.GetBoundingBox()); } catch (Autodesk.Revit.Exceptions.ApplicationException) { } if (nurbsSurface is null) { nurbsSurface = FromHermiteSurface ( face.Points, face.MixedDerivs, face.get_Params(0).Cast <double>().ToArray(), face.get_Params(1).Cast <double>().ToArray(), face.get_Tangents(0), face.get_Tangents(1) ); } if (nurbsSurface is object) { double ctol = Revit.ShortCurveTolerance * 5.0; // Extend using smooth way avoids creating C2 discontinuities nurbsSurface = nurbsSurface.Extend(IsoStatus.West, ctol, true) as NurbsSurface ?? nurbsSurface; nurbsSurface = nurbsSurface.Extend(IsoStatus.East, ctol, true) as NurbsSurface ?? nurbsSurface; nurbsSurface = nurbsSurface.Extend(IsoStatus.South, ctol, true) as NurbsSurface ?? nurbsSurface; nurbsSurface = nurbsSurface.Extend(IsoStatus.North, ctol, true) as NurbsSurface ?? nurbsSurface; } return(nurbsSurface); }