Exemple #1
0
        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);
                }
            }
        }
Exemple #3
0
        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);
        }