public static Wire ToTopologic(this PolyCurve polyCurve) { Curve[] curves = polyCurve.Explode(); List <Edge> edges = new List <Edge>(); foreach (Curve curve in curves) { Topology topology = curve.ToTopologic(); Edge edge = topology as Edge; if (edge != null) { edges.Add(edge); continue; } Wire wire = topology as Wire; if (wire != null) { edges.AddRange(wire.Edges); continue; } } return(Wire.ByEdges(edges)); }
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 Wire ToTopologic(this Polygon3D polygon3D) { List <Edge> edges = new List <Edge>(); foreach (ICurve3D curve3D in polygon3D.GetSegments()) { if (curve3D.GetStart() != curve3D.GetEnd()) { edges.Add(curve3D.ToTopologic()); } } return(Wire.ByEdges(edges)); }
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); }