Beispiel #1
0
        static IEnumerable <NXOpen.Arc> ToEdgeCurveMany(ArcCurve curve)
        {
            NXOpen.Point3d ToXYZ(Point3d p) => new NXOpen.Point3d(p.X, p.Y, p.Z);

            if (curve.IsClosed(DistanceTolerance * 1.01))
            {
                var    interval = curve.Domain;
                double min = interval.Min, mid = interval.Mid, max = interval.Max;
                var    points = new NXOpen.Point3d[]
                {
                    ToXYZ(curve.PointAt(min)),
                    ToXYZ(curve.PointAt(min + (mid - min) * 0.5)),
                    ToXYZ(curve.PointAt(mid)),
                    ToXYZ(curve.PointAt(mid + (max - mid) * 0.5)),
                    ToXYZ(curve.PointAt(max)),
                };

                yield return(WorkPart.Curves.CreateArc(points[0], points[2], points[1], false, out _));

                yield return(WorkPart.Curves.CreateArc(points[2], points[4], points[3], false, out _));
            }
            else
            {
                yield return(WorkPart.Curves.CreateArc(ToXYZ(curve.Arc.StartPoint), ToXYZ(curve.Arc.EndPoint), ToXYZ(curve.Arc.MidPoint), false, out _));
            }
        }
Beispiel #2
0
        public static Point3d ToRhino(this NXOpen.Point3d value)
        {
            Point3d rhino = RawDecoder.ToRhino(value);

            UnitConverter.Scale(ref rhino, UnitConverter.NXToRhinoUnitsRatio);
            return(rhino);
        }
Beispiel #3
0
        static global::NXOpen.Point3d[] ToNXPoint3dArray(NurbsCurvePointList list, double factor)
        {
            var count  = list.Count;
            var points = new global::NXOpen.Point3d[count];

            int p = 0;

            if (factor == 1.0)
            {
                while (p < count)
                {
                    var location = list[p].Location;
                    points[p++] = new NXOpen.Point3d(location.X, location.Y, location.Z);
                }
            }
            else
            {
                while (p < count)
                {
                    var location = list[p].Location;
                    points[p++] = new NXOpen.Point3d(location.X * factor, location.Y * factor, location.Z * factor);
                }
            }

            return(points);
        }
        public static NXOpen.Point3d[] ToHost(NurbsCurvePointList list)
        {
            var count  = list.Count;
            var points = new NXOpen.Point3d[count];

            for (int p = 0; p < count; ++p)
            {
                var location = list[p].Location;
                points[p] = new NXOpen.Point3d(location.X, location.Y, location.Z);
            }

            return(points);
        }
Beispiel #5
0
        public static IEnumerable <NXOpen.Line> ToNXLines(PolylineCurve value, double factor)
        {
            int pointCount = value.PointCount;

            if (pointCount > 1)
            {
                NXOpen.Point3d end, start = value.Point(0).ToXYZ(factor);
                for (int p = 1; p < pointCount; start = end, ++p)
                {
                    end = value.Point(p).ToXYZ(factor);
                    yield return(WorkPart.Curves.CreateLine(start, end));
                }
            }
        }
        public static NXOpen.Point3d[] ToHost(NurbsSurfacePointList list)
        {
            var count  = list.CountU * list.CountV;
            var points = new NXOpen.Point3d[count];

            int p = 0;

            foreach (var point in list)
            {
                var location = point.Location;
                points[p++] = new NXOpen.Point3d(location.X, location.Y, location.Z);
            }

            return(points);
        }
Beispiel #7
0
        static IEnumerable <NXOpen.Line> ToEdgeCurveMany(PolylineCurve curve)
        {
            NXOpen.Part workPart = _theSession.Parts.Work;

            int pointCount = curve.PointCount;

            if (pointCount > 1)
            {
                var            point = curve.Point(0);
                NXOpen.Point3d end, start = new NXOpen.Point3d(point.X, point.Y, point.Z);
                for (int p = 1; p < pointCount; start = end, ++p)
                {
                    point = curve.Point(p);
                    end   = new NXOpen.Point3d(point.X, point.Y, point.Z);
                    yield return(workPart.Curves.CreateLine(start, end));
                }
            }
        }
Beispiel #8
0
        static RevSurface ToRhinoConicalSurface(NXOpen.Face face, FaceEx.FaceData faceData)
        {
            double totalHeight;           // 圆锥总高度

            NXOpen.Point3d top;           // 圆锥顶点

            double radius;                // 锥底半径
            var    faceBoundingBox = face.GetAlignedBoundingBox(faceData.Direction);

            if (face.GetEdges().Length == 1 && face.GetEdges()[0].SolidEdgeType == NXOpen.Edge.EdgeType.Circular)
            {
                // 无修剪的锥形
                TheUfSession.Eval.Initialize2(face.GetEdges()[0].Tag, out var edgeEvaluator);
                TheUfSession.Eval.AskArc(edgeEvaluator, out var arc);
                TheUfSession.Eval.Free(edgeEvaluator);

                NXOpen.Point3d bottom = arc.center.ToPoint3d();        // 锥底中心点

                totalHeight = faceBoundingBox.Height;

                top = bottom.Move(faceBoundingBox.HeightDirection, totalHeight);

                radius = arc.radius;
            }
            else
            {
                var tangentOfHalfAngle = Math.Tan(faceData.RadiusData);

                top = faceData.Point.Move(faceBoundingBox.HeightDirection, faceData.Radius / tangentOfHalfAngle);

                totalHeight = faceBoundingBox.Height + faceData.Radius / Math.Tan(faceData.RadiusData);

                radius = faceData.Radius + faceBoundingBox.Height * tangentOfHalfAngle;
            }

            var cone = new Cone(new Plane(top.ToRhino(), faceBoundingBox.HeightDirection.Reverse().ToRhino()), totalHeight, radius);

            return(cone.ToRevSurface());

            // var curve = new LineCurve(outerPointOnCircle.ToRhino(), top.ToRhino());
            // return RevSurface.Create(curve, new Line(bottom.ToRhino(), top.ToRhino()), 0.0, Math.PI * 2.0);
        }
Beispiel #9
0
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Filter = "Файлы PRT (*.prt)|*.prt|Все файлы (*.*)|*.*";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                Say("Импорт данных из файла: " + ofd.FileName);

                NXOpen.Session ses = null;
                try
                {
                    ses = NXOpen.Session.GetSession();
                }
                catch (Exception ex)
                {
                    Say("Ошибка: " + ex.ToString());
                }

                if (ses != null)
                {
                    NXOpen.PartLoadStatus status = null;
                    ses.Parts.Open(ofd.FileName, out status);
                    foreach (NXOpen.Part part in ses.Parts)
                    {
                        string name = part.Name;

                        int pointNumber = 1;

                        foreach (NXOpen.Body bd in part.Bodies)
                        {
                            Say("bd.Name=" + bd.Name);
                            NXOpen.Face[] faces = bd.GetFaces();
                            for (int f = 0; f < faces.Length; f++)
                            {
                                Say("faces.Name=" + faces[f].Name);
                                NXOpen.Edge[] edges = faces[f].GetEdges();
                                for (int g = 0; g < edges.Length; g++)
                                {
                                    Say("edges.Name=" + edges[g].Name);

                                    NXOpen.Point3d vert1 = new NXOpen.Point3d();
                                    NXOpen.Point3d vert2 = new NXOpen.Point3d();

                                    edges[g].GetVertices(out vert1, out vert2);

                                    Say(string.Format("faces[{0}].edges[{1}].vert1: X={2:0.0000}; Y={3:0.0000}; Z={4:0.0000}", f, g, vert1.X, vert1.Y, vert2.Z));
                                    Say(string.Format("faces[{0}].edges[{1}].vert2: X={2:0.0000}; Y={3:0.0000}; Z={4:0.0000}", f, g, vert2.X, vert2.Y, vert2.Z));
                                }
                            }
                        }

                        foreach (NXOpen.Sketch sk in part.Sketches)
                        {
                            NXOpen.NXObject[] objs = sk.GetAllGeometry();

                            Say(string.Format("objs.Length = {0}", objs.Length));
                            Say(string.Format("sk.Name = {0}", sk.Name));

                            for (int i = 0; i < objs.Length; i++)
                            {
                                int any_length = objs[i].GetAttributeTitlesByType(NXOpen.NXObject.AttributeType.Any).Length;

                                if (objs[i] is NXOpen.Line)
                                {
                                    NXOpen.Line line = (NXOpen.Line)objs[i];
                                    Say(string.Format("[StartPoint] X={0}, Y={1}, Z={2}", line.StartPoint.X, line.StartPoint.Y, line.StartPoint.Z));
                                    Say(string.Format("[EndPoint] X={0}, Y={1}, Z={2}", line.EndPoint.X, line.EndPoint.Y, line.EndPoint.Z));
                                }
                            }
                        }
                    }
                }
                else
                {
                    Say("Ошибка получения сессии NX!");
                }
            }
        }
Beispiel #10
0
        public static IEnumerable <NXOpen.Curve> ToNXCurves(NurbsCurve value, double factor)
        {
            if (value.Degree == 1)
            {
                var curvePoints = value.Points;
                int pointCount  = curvePoints.Count;
                if (pointCount > 1)
                {
                    NXOpen.Point3d end, start = curvePoints[0].Location.ToXYZ(factor);
                    for (int p = 1; p < pointCount; start = end, ++p)
                    {
                        end = curvePoints[p].Location.ToXYZ(factor);
                        yield return(WorkPart.Curves.CreateLine(start, end));
                    }
                }
            }
            else if (value.Degree == 2)
            {
                for (int s = 0; s < value.SpanCount; ++s)
                {
                    var segment = value.Trim(value.SpanDomain(s)) as NurbsCurve;
                    yield return(CurveEncoder.ToNXSpline(segment, factor));
                }
            }
            else if (value.IsClosable(DistanceTolerance * 1.01))
            {
                var segments = value.DuplicateSegments();
                if (segments.Length == 1)
                {
                    if
                    (
                        value.NormalizedLengthParameter(0.5, out var mid) &&
                        value.Split(mid) is Curve[] half
                    )
                    {
                        yield return((half[0] as NurbsCurve).ToNXSpline(factor));

                        yield return((half[1] as NurbsCurve).ToNXSpline(factor));
                    }
                    else
                    {
                        throw new Exception("Failed to Split closed Edge");
                    }
                }
                else
                {
                    foreach (var segment in segments)
                    {
                        yield return((segment as NurbsCurve).ToNXSpline(factor));
                    }
                }
            }
            else if (value.GetNextDiscontinuity(Continuity.C1_continuous, value.Domain.Min, value.Domain.Max, out var t))
            {
                var splitters = new List <double>()
                {
                    t
                };
                while (value.GetNextDiscontinuity(Continuity.C1_continuous, t, value.Domain.Max, out t))
                {
                    splitters.Add(t);
                }

                var segments = value.Split(splitters);
                foreach (var segment in segments.Cast <NurbsCurve>())
                {
                    yield return(CurveEncoder.ToNXSpline(segment, factor));
                }
            }
            else
            {
                yield return(CurveEncoder.ToNXSpline(value, factor));
            }
        }
 public static Point3d ToRhino(NXOpen.Point3d value)
 {
     return(new Point3d(value.X, value.Y, value.Z));
 }