static void TrimSurface(Brep brep, int surface, bool orientationIsReversed, IEnumerable <IEnumerable <BrepBoundary> > shells) { foreach (var shell in shells) { var brepFace = brep.Faces.Add(surface); brepFace.OrientationIsReversed = orientationIsReversed; foreach (var loop in shell) { var brepLoop = brep.Loops.Add(loop.type, brepFace); var edgeCount = loop.edges.Count; for (int e = 0; e < edgeCount; ++e) { var brepEdge = loop.edges[e]; int orientation = loop.orientation[e]; if (orientation == 0) { continue; } if (loop.trims.SegmentCurve(e) is Curve trim) { var ti = brep.AddTrimCurve(trim); brep.Trims.Add(brepEdge, orientation < 0, brepLoop, ti); } } brep.Trims.MatchEnds(brepLoop); } } }
static void TrimSurface(Brep brep, int surface, bool orientationIsReversed, List <BrepBoundary>[] shells) { foreach (var shell in shells) { var brepFace = brep.Faces.Add(surface); brepFace.OrientationIsReversed = orientationIsReversed; foreach (var loop in shell) { var brepLoop = brep.Loops.Add(loop.type, brepFace); var edgeCount = loop.edges.Count; for (int e = 0; e < edgeCount; ++e) { var brepEdge = loop.edges[e]; if (loop.trims.SegmentCurve(e) is Curve trim) { var ti = brep.AddTrimCurve(trim); int orientation = loop.orientation[e]; if (orientation == 0) { brep.Trims.Add(false, brepLoop, ti).TrimType = BrepTrimType.Singular; } else { brep.Trims.Add(brepEdge, orientation < 0, brepLoop, ti); } } } brep.Trims.MatchEnds(brepLoop); } } }
private static void AddNXFace(NXOpen.Face face, Brep brep) { Surface surface = face.ToRhinoSurface(); if (surface == null) { return; } int surfIndex = brep.AddSurface(surface); BrepFace brepFace = brep.Faces.Add(surfIndex); // Console.WriteLine("***************************************************"); try { var loopList = face.GetLoops().ToList(); if (loopList.Count == 0) { return; } if (loopList[0].Type != NXOpen.Extensions.Topology.LoopType.Outer && loopList[0].Type != NXOpen.Extensions.Topology.LoopType.LikelyOuter) { var outerLoop = loopList.FirstOrDefault(obj => obj.Type == NXOpen.Extensions.Topology.LoopType.Outer || obj.Type == NXOpen.Extensions.Topology.LoopType.LikelyOuter); if (outerLoop != null) { loopList.Remove(outerLoop); loopList.Insert(0, outerLoop); } } var faceSense = face.GetSense(); // Console.WriteLine("Face Sense:" + faceSense); var outerLoopSense = loopList[0].FirstFin.Sense; // Console.WriteLine("Outer loop:" + outerLoopSense); for (int i = 0; i < loopList.Count; i++) { // Console.WriteLine("********Loop*******"); var currentNxLoop = loopList[i]; if (currentNxLoop.Fins.Length == 0) { continue; } BrepLoopType brepLoopType; switch (currentNxLoop.Type) { case NXOpen.Extensions.Topology.LoopType.LikelyOuter: case NXOpen.Extensions.Topology.LoopType.Outer: brepLoopType = BrepLoopType.Outer; break; case NXOpen.Extensions.Topology.LoopType.LikelyInner: case NXOpen.Extensions.Topology.LoopType.Inner: case NXOpen.Extensions.Topology.LoopType.InnerSingular: brepLoopType = BrepLoopType.Inner; break; case NXOpen.Extensions.Topology.LoopType.Winding: if (i == 0) { brepLoopType = BrepLoopType.Outer; } else { brepLoopType = BrepLoopType.Inner; } break; case NXOpen.Extensions.Topology.LoopType.Unknown: default: brepLoopType = BrepLoopType.Unknown; break; } var brepLoop = brep.Loops.Add(brepLoopType, brepFace); var currentFin = currentNxLoop.FirstFin; var trims = new PolyCurve(); Dictionary <BrepEdge, int> brepEdges = new Dictionary <BrepEdge, int>(); int finCount = 0; do { finCount++; var curve3d = currentFin.Edge.ToRhinoCurve(); if (currentFin.StartVertex != null && curve3d.PointAtStart.DistanceTo(currentFin.StartVertex.Position.ToRhino()) > Globals.DistanceTolerance) { curve3d.Reverse(); } var brepEdgeCurve = brep.AddEdgeCurve(curve3d); var brepEdge = brep.Edges.Add(brepEdgeCurve); //Console.WriteLine("Start of Fin" + currentFin.StartVertex.Position); //Console.WriteLine("Start of Edge" + curve3d.PointAtStart); //Console.WriteLine("End of Fin" + currentFin.EndVertex.Position); //Console.WriteLine("End of Edge" + curve3d.PointAtEnd); brepEdges.Add(brepEdge, curve3d.TangentAt(curve3d.Domain.Mid).IsParallelTo(brepEdge.TangentAt(brepEdge.Domain.Mid))); var curve2d = surface.Pullback(curve3d, Globals.DistanceTolerance); trims.Append(curve2d); currentFin = currentFin.Next; } while (currentFin != currentNxLoop.FirstFin); trims.MakeClosed(Globals.DistanceTolerance); for (int j = 0; j < brepEdges.Count; j++) { if (trims.SegmentCurve(j) is Curve) { var curve = trims.SegmentCurve(j) as Curve; var ti = brep.AddTrimCurve(curve); if (brepEdges.ElementAt(j).Value == 0) { continue; } var brepTrim = brep.Trims.Add(brepEdges.ElementAt(j).Key, brepEdges.ElementAt(j).Value < 0, brepLoop, ti); brepTrim.TrimType = BrepTrimType.Boundary; } } // brepLoop.Trims.MatchEnds(); // brep.Trims.MatchEnds(brepLoop.Trims[0], brepLoop.Trims.Last()); // brep.Repair(Globals.DistanceTolerance); } } catch (Exception ex) { Console.WriteLine("无法添加 NX 面:" + ex); } brep.Trims.MatchEnds(); brep.Repair(Globals.DistanceTolerance); }