// edge curve convenience method private List <ICurve> GetSurfaceBrepEdges(RH.Brep brep, bool getExterior = true, bool getInterior = false, bool getBottom = false) { double tol = Doc.ModelAbsoluteTolerance * 1; RH.Curve[] brpCurves = null; if (getInterior) { brpCurves = brep.DuplicateNakedEdgeCurves(false, true); } else { brpCurves = brep.DuplicateNakedEdgeCurves(true, false); } if (getBottom) { double lowestPt = brpCurves.Min(o => o.PointAtStart.Z); brpCurves = brpCurves.Where(o => o.PointAt(0.5).Z == lowestPt).ToArray(); } List <ICurve> outCurves = null; if (brpCurves != null) { outCurves = RH.Curve.JoinCurves(brpCurves, tol).Select(o => (ICurve)ConvertToSpeckle(o)).ToList(); } return(outCurves); }
/***************************************************/ public static BHG.IGeometry FromRhino(this RHG.Brep brep) { if (brep == null) { return(null); } string log; if (!brep.IsValidWithLog(out log)) { Reflection.Compute.RecordError("Conversion failed, Rhino Brep is invalid: " + log); return(null); } if (brep.Faces.Count == 0) { return(null); } if (brep.IsSolid) { return(brep.ToBHoMSolid()); } if (brep.IsPlanarSurface()) { BHG.ICurve externalEdge = RHG.Curve.JoinCurves(brep.DuplicateNakedEdgeCurves(true, false)).FirstOrDefault().FromRhino(); List <BHG.ICurve> internalEdges = RHG.Curve.JoinCurves(brep.DuplicateNakedEdgeCurves(false, true)).Select(c => c.FromRhino()).ToList(); return(new BHG.PlanarSurface(externalEdge, internalEdges)); } if (brep.Faces.Count == 1) { return(brep.Faces[0].FromRhino()); } // Default case - return open Polysurface return(new BHG.PolySurface() { Surfaces = brep.Faces.Select(s => s.FromRhino()).ToList() }); }
// edge curve convenience method private List <ICurve> GetSurfaceBrepEdges(RH.Brep brep, bool getExterior = true, bool getInterior = false, bool getBottom = false) { double tol = Doc.ModelAbsoluteTolerance * 1; RH.Curve[] brpCurves = null; if (getInterior) { brpCurves = brep.DuplicateNakedEdgeCurves(false, true); } else { brpCurves = brep.DuplicateNakedEdgeCurves(true, false); } if (getBottom) { var bottomCrv = brpCurves. Where(o => o.IsLinear())?. Where(o => new Vector3d(o.PointAtEnd.X - o.PointAtStart.X, o.PointAtEnd.Y - o.PointAtStart.Y, o.PointAtEnd.Z - o.PointAtStart.Z).IsPerpendicularTo(Vector3d.ZAxis))?. Aggregate((curMin, o) => curMin == null || o.PointAtStart.Z < curMin.PointAtStart.Z ? o : curMin); if (bottomCrv != null) { brpCurves = new RH.Curve[] { bottomCrv } } ; } List <ICurve> outCurves = null; if (brpCurves != null && brpCurves.Count() > 0) { outCurves = (brpCurves.Count() == 1) ? new List <ICurve>() { (ICurve)ConvertToSpeckle(brpCurves[0]) } } : RH.Curve.JoinCurves(brpCurves, tol).Select(o => (ICurve)ConvertToSpeckle(o)).ToList(); return(outCurves); } } }