private Face ByBrepFace(BrepFace ghBrepFace) { Rhino.Geometry.Surface ghSurface = ghBrepFace.UnderlyingSurface(); Face untrimmedFace = BySurface(ghSurface); BrepLoop ghOuterLoop = ghBrepFace.OuterLoop; Wire outerWire = null; BrepLoopList ghLoops = ghBrepFace.Loops; List <Wire> innerWires = new List <Wire>(); foreach (BrepLoop ghLoop in ghLoops) { BrepTrimList ghTrims = ghLoop.Trims; List <Edge> trimmingEdges = new List <Edge>(); foreach (BrepTrim ghTrim in ghTrims) { BrepEdge ghEdge = ghTrim.Edge; if (ghEdge == null) { continue; //throw new Exception("An invalid Rhino edge is encountered."); } Topology topology = ByCurve(ghEdge.DuplicateCurve()); // Edge or Wire? Edge trimmingEdge = topology as Edge; if (trimmingEdge != null) { trimmingEdges.Add(trimmingEdge); } Wire partialTrimmingWire = topology as Wire; if (partialTrimmingWire != null) { List <Edge> partialTrimmingEdges = partialTrimmingWire.Edges; trimmingEdges.AddRange(partialTrimmingEdges); } } Wire trimmingWire = Wire.ByEdges(trimmingEdges); List <Vertex> trimmingVertices = trimmingWire.Vertices; if (ghLoop == ghOuterLoop) { outerWire = trimmingWire; } else { innerWires.Add(trimmingWire); } } Face outerTrimmedFace = Topologic.Utilities.FaceUtility.TrimByWire(untrimmedFace, outerWire, true); Face finalFace = outerTrimmedFace.AddInternalBoundaries(innerWires); return(finalFace); }
public static void GetBrepFaceNakedBoundaries(Brep b, int index, out Curve[] crv) { BrepLoopList loops = b.Faces[index].Loops; crv = new Curve[loops.Count]; for (int i = 0; i < loops.Count; i++) { crv[i] = loops[i].To3dCurve(); } }
internal static void _InitThreadSafe(this BrepLoopList loops) { lock (loops) { var count = loops.Count; if (count > 0) { // we take last element and thus init all list - this make our list threadsafe var last = loops[count - 1]; } foreach (var loop in loops) { loop.Trims._InitThreadSafe(); } } }
public static void GetBrepFaceOuterNakedBoundary(Brep b, int index, out Curve crv) { BrepLoopList loops = b.Faces[index].Loops; crv = loops[0].To3dCurve(); }
public static global::Topologic.Face ToTopologic(this BrepFace brepFace) { global::Rhino.Geometry.Surface ghSurface = brepFace?.UnderlyingSurface(); if (ghSurface == null) { return(null); } global::Topologic.Face untrimmedFace = ghSurface.ToTopologic(); BrepLoop ghOuterLoop = brepFace.OuterLoop; Wire outerWire = null; BrepLoopList ghLoops = brepFace.Loops; List <Wire> innerWires = new List <Wire>(); foreach (BrepLoop ghLoop in ghLoops) { BrepTrimList ghTrims = ghLoop.Trims; List <Edge> trimmingEdges = new List <Edge>(); foreach (BrepTrim ghTrim in ghTrims) { BrepEdge ghEdge = ghTrim.Edge; if (ghEdge == null) { continue; //throw new Exception("An invalid Rhino edge is encountered."); } Topology topology = ghEdge.DuplicateCurve().ToTopologic(); if (topology == null) { continue; } // Edge or Wire? Edge trimmingEdge = topology as Edge; if (trimmingEdge != null) { trimmingEdges.Add(trimmingEdge); } Wire partialTrimmingWire = topology as Wire; if (partialTrimmingWire != null) { IList <Edge> partialTrimmingEdges = partialTrimmingWire.Edges; trimmingEdges.AddRange(partialTrimmingEdges); } } Wire trimmingWire = Wire.ByEdges(trimmingEdges); if (ghLoop == ghOuterLoop) { outerWire = trimmingWire; } else { innerWires.Add(trimmingWire); } } global::Topologic.Face outerTrimmedFace = global::Topologic.Utilities.FaceUtility.TrimByWire(untrimmedFace, outerWire, true); global::Topologic.Face finalFace = outerTrimmedFace.AddInternalBoundaries(innerWires); return(finalFace); }