Esempio n. 1
0
        /// <summary>
        /// 获取对角线
        /// </summary>
        static Snap.NX.Line GetDiagonalLine(Snap.NX.Body body, out Snap.NX.Face baseFace)
        {
            Snap.NX.Line result   = null;
            var          workPart = Snap.Globals.WorkPart;
            var          box      = body.Box;
            var          p2       = new Snap.Position((box.MaxX + box.MinX) / 2, (box.MaxY + box.MinY) / 2);
            var          lines    = new List <NXOpen.NXObject>();

            if (!string.IsNullOrEmpty(body.Name))
            {
                lines = workPart.NXOpenPart.Layers.GetAllObjectsOnLayer(body.Layer).Where(l => l is NXOpen.Line).ToList();
                lines.ToList().ForEach(u =>
                {
                    Snap.NX.Line line = u as NXOpen.Line;
                    bool isRemove     = true;
                    if (Snap.Compute.Distance(line, body) < SnapEx.Helper.Tolerance)
                    {
                        var p1 = (line.StartPoint + line.EndPoint) / 2;
                        p2.Z   = p1.Z;
                        if (SnapEx.Helper.Equals(p1, p2, SnapEx.Helper.Tolerance))
                        {
                            isRemove = false;
                        }
                    }

                    if (isRemove)
                    {
                        lines.Remove(u);
                    }
                });
            }
            GetBaseFace(body, Enumerable.Select(lines, u => Snap.NX.Line.Wrap(u.Tag)).ToList(), out baseFace, out result);
            return(result);
        }
Esempio n. 2
0
        /// <summary>
        /// 获取拔模角度
        /// </summary>
        public static double GetDraftAngle(this Snap.NX.Face face, Snap.Vector draftVector)
        {
            var result = 0.0;
            var angles = new List <double>();
            var vector = new Snap.Vector(double.NaN, double.NaN, double.NaN);

            switch (face.ObjectSubType)
            {
            case Snap.NX.ObjectTypes.SubType.FacePlane:
                vector = face.GetFaceDirection();
                break;
            }

            if (double.IsNaN(vector.X) || double.IsNaN(vector.Y) || double.IsNaN(vector.Z))
            {
                var posLst = SnapEx.Create.GetFacePoints(face);
                posLst.ForEach(u => {
                    angles.Add(90 - Snap.Vector.Angle(draftVector, GetFaceDirectionByPoint(face, u)));
                });
            }
            else
            {
                angles.Add(90 - Snap.Vector.Angle(draftVector, vector));
            }

            if (angles.Count > 0)
            {
                int count = angles.Count;
                angles.ForEach(u => {
                    result += u / count;
                });
            }

            return(result);
        }
Esempio n. 3
0
        /// <summary>
        /// 获取面上所有的测量点
        /// </summary>
        public static List <Snap.Position> GetFacePoints(Snap.NX.Face face, CMMTool.CMMConfig config, List <Snap.NX.Curve> edges, bool isRoundInt = false, double max_facet_size = 1)
        {
            //var mark = Snap.Globals.SetUndoMark(Globals.MarkVisibility.Invisible, "GetFacePointsEx");
            var positions = new List <Snap.Position>();

            try
            {
                positions = SnapEx.Create.GetFacePoints(face, max_facet_size);
                ////所有边上的点都不取
                //var minD = double.MaxValue;
                //var probeDatas = config.ProbeDatas ?? new List<CMMTool.ProbeData>();
                //foreach (var data in probeDatas)
                //{
                //    minD = System.Math.Min(data.D, minD);
                //}
                //positions.ToList().ForEach(p => {
                //    if (Helper.GetPointToEdgeMinDistance(p, edges) < minD)
                //    {
                //        positions.Remove(p);
                //    }
                //});
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                //Snap.Globals.UndoToMark(mark, null);
            }

            return(positions);
        }
Esempio n. 4
0
        public override Snap.NX.Face GetChamferFace()
        {
            if (ChamferFace != null)
            {
                return(ChamferFace);
            }
            Snap.NX.Face result  = null;
            var          results = new List <Snap.NX.Face>();

            if (BaseFace != null)
            {
                var baseFOriention = new Snap.Orientation(BaseFace.GetFaceDirection());
                var v1             = Snap.Vector.Unit(baseFOriention.AxisX);
                var v2             = Snap.Vector.Unit(baseFOriention.AxisY);
                var v3             = Snap.Vector.Unit(v1 + v2);
                var v4             = v3.Copy(Snap.Geom.Transform.CreateRotation(new Snap.Position(), BaseFace.GetFaceDirection(), 90)).Unitize();

                var chamferFaces = ElecBody.Faces.Where(u => u.ObjectSubType == Snap.NX.ObjectTypes.SubType.FacePlane && Snap.Compute.Distance(u, BaseFace) < SnapEx.Helper.Tolerance).ToList();
                chamferFaces.ForEach(u =>
                {
                    var faceDir = u.GetFaceDirection();
                    if (SnapEx.Helper.Equals(v3, faceDir, SnapEx.Helper.Tolerance) ||
                        SnapEx.Helper.Equals(-v3, faceDir, SnapEx.Helper.Tolerance) ||
                        SnapEx.Helper.Equals(-v4, faceDir, SnapEx.Helper.Tolerance) ||
                        SnapEx.Helper.Equals(v4, faceDir, SnapEx.Helper.Tolerance)
                        )
                    {
                        results.Add(u);
                    }
                });
            }

            result = results.FirstOrDefault();

            if (results.Count > 1)
            {
                var baseFaceBoxUV = BaseFace.BoxUV;
                var elecBasePos   = BaseFace.Position((baseFaceBoxUV.MinU + baseFaceBoxUV.MaxU) / 2, (baseFaceBoxUV.MinV + baseFaceBoxUV.MaxV) / 2);

                var faceDirection = BaseFace.GetFaceDirection();
                var plane         = new Snap.Geom.Surface.Plane(elecBasePos, faceDirection);

                foreach (var u in results)
                {
                    var uv          = u.BoxUV;
                    var cneterPoint = u.Position((uv.MaxU + uv.MinU) / 2, (uv.MaxV + uv.MaxV) / 2);
                    var resullt     = Snap.Compute.ClosestPoints(cneterPoint, plane);
                    var dir         = Snap.Vector.Unit(resullt.Point1 - resullt.Point2);
                    if (SnapEx.Helper.Equals(dir, -faceDirection) && Snap.Compute.Distance(BaseFace, u) < SnapEx.Helper.Tolerance)
                    {
                        result = u;
                        break;
                    }
                }
            }

            ChamferFace = result;

            return(result);
        }
Esempio n. 5
0
        internal static Snap.NX.FaceBlend CreateFaceBlend(Snap.NX.Face face1, Snap.NX.Face face2, Snap.Number radius)
        {
            NXOpen.Part workPart = (NXOpen.Part)Globals.WorkPart;
            NXOpen.Features.FaceBlendBuilder featureBuilder = workPart.Features.CreateFaceBlendBuilder(null);
            featureBuilder.Tolerance = Globals.DistanceTolerance;
            ScCollector collector = workPart.ScCollectors.CreateCollector();

            NXOpen.Face[]   boundaryFaces = new NXOpen.Face[0];
            FaceTangentRule rule          = workPart.ScRuleFactory.CreateRuleFaceTangent((NXOpen.Face)face1, boundaryFaces, 0.5);

            SelectionIntentRule[] rules = new SelectionIntentRule[] { rule };
            collector.ReplaceRules(rules, false);
            featureBuilder.FirstFaceCollector     = collector;
            featureBuilder.ReverseFirstFaceNormal = true;
            ScCollector collector2 = workPart.ScCollectors.CreateCollector();

            NXOpen.Face[]   faceArray2 = new NXOpen.Face[0];
            FaceTangentRule rule2      = workPart.ScRuleFactory.CreateRuleFaceTangent((NXOpen.Face)face2, faceArray2, 0.5);

            SelectionIntentRule[] ruleArray2 = new SelectionIntentRule[] { rule2 };
            collector2.ReplaceRules(ruleArray2, false);
            featureBuilder.SecondFaceCollector     = collector2;
            featureBuilder.ReverseSecondFaceNormal = true;
            featureBuilder.CircularCrossSection.SetRadius(radius.ToString());
            NXOpen.Features.Feature feature = (NXOpen.Features.Feature)Snap.NX.Feature.CommitFeature(featureBuilder);
            featureBuilder.Destroy();
            return((NXOpen.Features.FaceBlend)feature);
        }
Esempio n. 6
0
        /// <summary>
        /// 获取平面投影面积
        /// </summary>
        public static double GetPlaneProjectArea(this Snap.NX.Face face, Snap.Vector baseDir)
        {
            var topFaceDir         = -baseDir;
            var topFaceOrientation = new Snap.Orientation(topFaceDir);
            var box = SnapEx.Ex.AcsToWcsBox3d(face.BoxEx(), topFaceOrientation);

            return(System.Math.Abs(box.MinX - box.MaxX) * System.Math.Abs(box.MinY - box.MaxY));
        }
Esempio n. 7
0
        public static Vector GetFaceDirectionByPoint(this Snap.NX.Face face, Snap.Position pos)
        {
            var ufSession = NXOpen.UF.UFSession.GetUFSession();

            double[] param = new double[2], faceOnPoint = pos.Array, u1 = new double[3], v1 = new double[3], u2 = new double[3], v2 = new double[3], unitNorm = new double[3], radii = new double[2];
            ufSession.Modl.AskFaceParm(face.NXOpenTag, faceOnPoint, param, faceOnPoint);
            ufSession.Modl.AskFaceProps(face.NXOpenTag, param, faceOnPoint, u1, v1, u2, v2, unitNorm, radii);
            return(Snap.Vector.Unit(new Snap.Vector(unitNorm)));
        }
Esempio n. 8
0
        private static ObjectTypes.SubType GetFaceType(Snap.NX.Face snapFace)
        {
            ObjectTypes.SubType  faceUnknown = ObjectTypes.SubType.FaceUnknown;
            NXOpen.Face.FaceType undefined   = NXOpen.Face.FaceType.Undefined;
            try
            {
                undefined = snapFace.NXOpenFace.SolidFaceType;
            }
            catch
            {
            }
            switch (undefined)
            {
            case NXOpen.Face.FaceType.Planar:
                faceUnknown = ObjectTypes.SubType.FacePlane;
                break;

            case NXOpen.Face.FaceType.Cylindrical:
                faceUnknown = ObjectTypes.SubType.FaceCylinder;
                break;

            case NXOpen.Face.FaceType.Conical:
                faceUnknown = ObjectTypes.SubType.FaceCone;
                break;

            case NXOpen.Face.FaceType.Spherical:
                faceUnknown = ObjectTypes.SubType.FaceSphere;
                break;

            case NXOpen.Face.FaceType.Parametric:
                faceUnknown = ObjectTypes.SubType.FaceBsurface;
                break;

            case NXOpen.Face.FaceType.Blending:
                faceUnknown = ObjectTypes.SubType.FaceBlend;
                break;

            case NXOpen.Face.FaceType.Offset:
                faceUnknown = ObjectTypes.SubType.FaceOffset;
                break;

            case NXOpen.Face.FaceType.Swept:
                faceUnknown = ObjectTypes.SubType.FaceExtruded;
                break;
            }
            if (undefined != NXOpen.Face.FaceType.SurfaceOfRevolution)
            {
                return(faceUnknown);
            }
            double num = GetSurfaceRadii(snapFace)[1];

            if (num != 0.0)
            {
                return(ObjectTypes.SubType.FaceTorus);
            }
            return(ObjectTypes.SubType.FaceRevolved);
        }
Esempio n. 9
0
        public PointData IsIntervene(Snap.Position p, ProbeData data)
        {
            PointData result = null;

            PointType pointType = PointType.UNKOWN;

            Snap.NX.Face face = null;

            //基准顶面
            if (_horizontalDatumFace != null)
            {
                if (IsPointAtFace(_horizontalDatumFace, p))
                {
                    face      = _horizontalDatumFace;
                    pointType = PointType.HorizontalDatumFace;
                }
            }

            if (pointType == PointType.UNKOWN)
            {
                foreach (var u in GetVerticalDatumFaces())
                {
                    if (IsPointAtFace(u, p))
                    {
                        face      = u;
                        pointType = PointType.VerticalDatumFace;
                        break;
                    }
                }
            }

            if (pointType == PointType.UNKOWN)
            {
                foreach (var u in GetElectrodeHeadFace())
                {
                    if (IsPointAtFace(u, p))
                    {
                        face      = u;
                        pointType = PointType.HeadFace;
                        break;
                    }
                }
            }

            if (pointType != PointType.UNKOWN)
            {
                result = IsIntervene(p, face.GetFaceDirection(), data);
                if (result != null)
                {
                    result.PointType = pointType;
                }
            }


            return(result);
        }
Esempio n. 10
0
        private static void GetSurfaceData(Snap.NX.Face face, out int surfaceType, out Snap.Position axisPoint, out Vector axisVector, out double radius1, out double radius2, out int normalFlip)
        {
            UFSession uFSession = Globals.UFSession;

            double[] point = new double[3];
            double[] dir   = new double[3];
            double[] box   = new double[6];
            uFSession.Modl.AskFaceData(face.NXOpenTag, out surfaceType, point, dir, box, out radius1, out radius2, out normalFlip);
            axisPoint  = new Snap.Position(point);
            axisVector = new Vector(dir);
        }
Esempio n. 11
0
 /// <summary>
 /// 是否是边上的点
 /// </summary>
 static bool IsPointOnEdge(Snap.NX.Face face, Snap.Position p)
 {
     foreach (var item in face.EdgeCurves)
     {
         var d = Compute.Distance(p, item);
         if (d < _tolerance)
         {
             return(true);
         }
     }
     return(false);
 }
Esempio n. 12
0
        /// <summary>
        /// 获取基准面
        /// </summary>
        static void GetBaseFace(Snap.NX.Body body, List <Snap.NX.Line> diagonalLines, out Snap.NX.Face face, out Snap.NX.Line line)
        {
            Snap.NX.Face outFace = null;
            Snap.NX.Line outLine = null;
            var          faces   = body.Faces.ToList();

            faces = faces.Where(u => u.ObjectSubType == Snap.NX.ObjectTypes.SubType.FacePlane).ToList();
            var baseFace = faces.Where(u => u.IsHasAttr(ELEC_BASE_EDM_FACE)).FirstOrDefault();

            if (baseFace != null)
            {
                faces = new List <Snap.NX.Face> {
                    baseFace
                };
            }
            var tempFaces = faces.Where(u => SnapEx.Helper.Equals(u.GetFaceDirection(), -Snap.Globals.WcsOrientation.AxisZ, SnapEx.Helper.Tolerance)).ToList();

            tempFaces = tempFaces.OrderByDescending(u => {
                var uv = u.BoxUV;
                return(Math.Abs(uv.MinU - uv.MaxU) * Math.Abs(uv.MaxV - uv.MinV));
            }).ToList();

            tempFaces.ForEach(u =>
            {
                faces.Remove(u);
            });

            faces.InsertRange(0, tempFaces);

            foreach (var u in faces)
            {
                var corners = u.Box.Corners.Distinct().ToList();
                foreach (var item in diagonalLines)
                {
                    Snap.NX.Line diagonalLine = item;
                    if (Snap.Compute.Distance(diagonalLine, u) < SnapEx.Helper.Tolerance)
                    {
                        var startPos = corners.Where(m => SnapEx.Helper.Equals(m, diagonalLine.StartPoint, SnapEx.Helper.Tolerance));
                        var endPos   = corners.Where(m => SnapEx.Helper.Equals(m, diagonalLine.EndPoint, SnapEx.Helper.Tolerance));
                        if (startPos.Count() > 0 && endPos.Count() > 0)
                        {
                            outFace = u;
                            outLine = diagonalLine;
                            face    = outFace;
                            line    = outLine;
                            return;
                        }
                    }
                }
            }
            face = outFace;
            line = outLine;
        }
Esempio n. 13
0
        static Snap.Geom.Box3d GetBox3d(List <Face> faces)
        {
            double minX = 0, maxX = 0, minY = 0, maxY = 0, minZ = 0, maxZ = 0;

            if (faces.Count > 0)
            {
                Snap.NX.Face snapFace = faces.FirstOrDefault();
                var          box      = snapFace.Box;
                minX = box.MinX;
                maxX = box.MaxX;
                minY = box.MinY;
                maxY = box.MaxY;
                minZ = box.MinZ;
                maxZ = box.MaxZ;

                faces.ForEach(u =>
                {
                    Snap.NX.Face face = u;
                    var b             = face.Box;
                    if (minX > b.MinX)
                    {
                        minX = b.MinX;
                    }

                    if (minY > b.MinY)
                    {
                        minY = b.MinY;
                    }

                    if (minZ > b.MinZ)
                    {
                        minZ = b.MinZ;
                    }

                    if (maxX < b.MaxX)
                    {
                        maxX = b.MaxX;
                    }

                    if (maxY < b.MaxY)
                    {
                        maxY = b.MaxY;
                    }

                    if (maxZ < b.MaxZ)
                    {
                        maxZ = b.MaxZ;
                    }
                });
            }

            return(new Snap.Geom.Box3d(minX, minY, minZ, maxX, maxY, maxZ));
        }
Esempio n. 14
0
        private static double[] GetSurfaceRadii(Snap.NX.Face face)
        {
            int num;

            Snap.Position position;
            Vector        vector;
            int           num2;

            double[] numArray = new double[2];
            GetSurfaceData(face, out num, out position, out vector, out numArray[0], out numArray[1], out num2);
            return(numArray);
        }
Esempio n. 15
0
        private static Vector GetSurfaceAxisVector(Snap.NX.Face face)
        {
            int num;

            Snap.Position position;
            Vector        vector;
            double        num2;
            double        num3;
            int           num4;

            GetSurfaceData(face, out num, out position, out vector, out num2, out num3, out num4);
            return(vector);
        }
Esempio n. 16
0
        /// <summary>
        /// 获取对角线
        /// </summary>
        static Snap.NX.Line GetDiagonalLine(Snap.NX.Body body, out Snap.NX.Face baseFace)
        {
            Snap.NX.Line result = null;
            baseFace = null;
            var workPart = Snap.Globals.WorkPart;
            var box      = body.Box;
            var p2       = new Snap.Position((box.MaxX + box.MinX) / 2, (box.MaxY + box.MinY) / 2, (box.MaxZ + box.MinZ) / 2);
            var lines    = new List <Snap.NX.Line>();

            if (!string.IsNullOrEmpty(body.Name))
            {
                lines = workPart.NXOpenPart.Layers.GetAllObjectsOnLayer(body.Layer).ToArray().Where(u => u is NXOpen.Line).Select(u => Snap.NX.Line.Wrap(u.Tag)).ToList();
                foreach (var line in lines.ToList())
                {
                    if (!Entry.Instance.IsDistinguishSideElec)
                    {
                        var p1      = (line.StartPoint + line.EndPoint) / 2;
                        var tempVec = p1 - p2;
                        var tempOri = Snap.Globals.Wcs.Orientation.AxisZ;
                        if ((
                                SnapEx.Helper.Equals(tempVec, tempOri, SnapEx.Helper.Tolerance) ||
                                SnapEx.Helper.Equals(tempVec, -tempOri, SnapEx.Helper.Tolerance) ||
                                SnapEx.Helper.Equals(p1, p2, SnapEx.Helper.Tolerance)
                                ) && Snap.Compute.Distance(line, body) < SnapEx.Helper.Tolerance
                            )
                        {
                        }
                        else
                        {
                            lines.Remove(line);
                        }
                    }
                    else
                    {
                        if (Snap.Compute.Distance(line, body) < SnapEx.Helper.Tolerance)
                        {
                        }
                        else
                        {
                            lines.Remove(line);
                        }
                    }
                }
            }
            if (lines.Count > 0)
            {
                GetBaseFace(body, lines, out baseFace, out result);
            }
            return(result);
        }
Esempio n. 17
0
        public static bool AskPointContainment(Snap.Position position, Snap.NX.Face face)
        {
            return(Snap.Compute.Distance(position, face) <= SnapEx.Helper.Tolerance);

            var ufSession = NXOpen.UF.UFSession.GetUFSession();
            int pt_status = 0;

            ufSession.Modl.AskPointContainment(position.Array, face.NXOpenTag, out pt_status);
            if (0x1 == pt_status || 0x3 == pt_status)
            {
                return(true);
            }
            return(false);
        }
Esempio n. 18
0
        /// <summary>
        /// 创建拉伸体
        /// </summary>
        public static Extrude Extrude(Snap.NX.Face face, double height)
        {
            var     curves      = face.EdgeCurves;
            Session theSession  = Session.GetSession();
            Part    workPart    = theSession.Parts.Work;
            Part    displayPart = theSession.Parts.Display;

            var normal = face.Normal(face.BoxUV.MinU, face.BoxUV.MinV);
            var point  = face.Position(face.BoxUV.MinU, face.BoxUV.MinV);

            var curveList = new List <NXOpen.Curve>();

            curves.ToList().ForEach(u =>
            {
                curveList.Add(u);
            });

            //创建拉伸
            NXOpen.Features.Feature nullFeatures_Feature = null;
            ExtrudeBuilder          extrudeBuilder1;

            extrudeBuilder1 = workPart.Features.CreateExtrudeBuilder(nullFeatures_Feature);

            //方向
            extrudeBuilder1.Direction = workPart.Directions.CreateDirection(point, normal, SmartObject.UpdateOption.WithinModeling);

            //曲面
            Section section1;

            section1 = workPart.Sections.CreateSection();
            extrudeBuilder1.Section = section1;
            var curveDumbRule1 = workPart.ScRuleFactory.CreateRuleCurveDumb(curveList.ToArray());

            SelectionIntentRule[] rules1 = new SelectionIntentRule[1];
            rules1[0] = curveDumbRule1;
            section1.AddToSection(rules1, curves.FirstOrDefault(), null, null, new Point3d(), NXOpen.Section.Mode.Create);

            //开始值、结束值
            extrudeBuilder1.Limits.StartExtend.Value.Value = 0;
            extrudeBuilder1.Limits.EndExtend.Value.Value   = height;

            Extrude feature1;

            feature1 = (Extrude)extrudeBuilder1.CommitFeature();
            extrudeBuilder1.Destroy();
            return(feature1);
        }
Esempio n. 19
0
        private static double[,] GetBsurfaceWeights(Snap.NX.Face face)
        {
            UFModl.Bsurface bsurfaceData = GetBsurfaceData(face);
            int             num          = bsurfaceData.num_poles_u;
            int             num2         = bsurfaceData.num_poles_v;

            double[,] numArray = new double[num, num2];
            for (int i = 0; i < num2; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    int num5 = j + (i * num);
                    numArray[j, i] = bsurfaceData.poles[num5, 3];
                }
            }
            return(numArray);
        }
Esempio n. 20
0
        public static Electrode GetElectrode(Snap.NX.Body body)
        {
            Electrode result = null;

            Snap.NX.Face baseFace     = null;
            var          diagonalLine = GetDiagonalLine(body, out baseFace);

            if (diagonalLine != null)
            {
                var faceDirection = baseFace.GetFaceDirection();
                var model         = new JYElectrode();
                model.DiagonalLine = diagonalLine;
                model.BaseFace     = baseFace;
                model.ElecBody     = body;
                result             = model;
            }
            return(result);
        }
Esempio n. 21
0
        private static Snap.Position[,] GetBsurfacePoles(Snap.NX.Face face)
        {
            UFModl.Bsurface bsurfaceData = GetBsurfaceData(face);
            int             num          = bsurfaceData.num_poles_u;
            int             num2         = bsurfaceData.num_poles_v;

            Snap.Position[,] positionArray = new Snap.Position[num, num2];
            for (int i = 0; i < num2; i++)
            {
                for (int j = 0; j < num; j++)
                {
                    int num5 = j + (i * num);
                    positionArray[j, i].X = bsurfaceData.poles[num5, 0];
                    positionArray[j, i].Y = bsurfaceData.poles[num5, 1];
                    positionArray[j, i].Z = bsurfaceData.poles[num5, 2];
                }
            }
            return(positionArray);
        }
Esempio n. 22
0
        /// <summary>
        /// 获取基准角
        /// </summary>
        public static Snap.NX.Face GetBaseCornerFace(Snap.Position startPoint, Snap.Position endPoint, Snap.NX.Body body)
        {
            Snap.NX.Face  result    = null;
            Snap.Position basePoint = (startPoint + endPoint) / 2;

            Snap.NX.Face baseFace = GetBaseFace(startPoint, endPoint, body);

            var faces = body.Faces.ToList();

            if (baseFace != null)
            {
                faces.Remove(baseFace);

                var baseFaceDir = new Snap.Orientation(baseFace.GetFaceDirection());

                var tempFaces = new List <Snap.NX.Face>();

                faces.Where(u => u.ObjectSubType == Snap.NX.ObjectTypes.SubType.FacePlane).ToList().ForEach(u =>
                {
                    var director = u.GetFaceDirection();
                    var angle    = Snap.Vector.Angle(baseFaceDir.AxisX, director);
                    if (Math.Abs(angle - 45) < _tolerance ||
                        Math.Abs(angle - 135) < _tolerance
                        )
                    {
                        tempFaces.Add(u);
                    }
                });

                if (tempFaces.Count > 1)
                {
                    tempFaces.RemoveAll(u => u.Box.MaxZ <= basePoint.Z);
                }

                if (tempFaces.Count > 0)
                {
                    result = tempFaces.FirstOrDefault();
                }
            }

            return(result);
        }
Esempio n. 23
0
 internal static Snap.NX.TrimBody CreateTrimBody(Snap.NX.Body targetBody, Snap.NX.Face toolFace, bool direction)
 {
     NXOpen.Part workPart = (NXOpen.Part) Globals.WorkPart;
     TrimBody2Builder featureBuilder = workPart.Features.CreateTrimBody2Builder(null);
     featureBuilder.Tolerance = Globals.DistanceTolerance;
     featureBuilder.BooleanTool.ExtrudeRevolveTool.ToolSection.DistanceTolerance = Globals.DistanceTolerance;
     featureBuilder.BooleanTool.ExtrudeRevolveTool.ToolSection.ChainingTolerance = (Globals.UnitType == Globals.Unit.Millimeter) ? 0.02413 : 0.00095;
     ScCollector collector = workPart.ScCollectors.CreateCollector();
     NXOpen.Body[] bodies = new NXOpen.Body[] { targetBody };
     BodyDumbRule rule = workPart.ScRuleFactory.CreateRuleBodyDumb(bodies);
     SelectionIntentRule[] rules = new SelectionIntentRule[] { rule };
     collector.ReplaceRules(rules, false);
     featureBuilder.TargetBodyCollector = collector;
     SelectionIntentRule[] ruleArray2 = new SelectionIntentRule[] { workPart.ScRuleFactory.CreateRuleFaceBody((NXOpen.Body) toolFace.Body) };
     featureBuilder.BooleanTool.FacePlaneTool.ToolFaces.FaceCollector.ReplaceRules(ruleArray2, false);
     featureBuilder.BooleanTool.ReverseDirection = direction;
     TrimBody2 trim = (TrimBody2) Snap.NX.Feature.CommitFeature(featureBuilder);
     featureBuilder.Destroy();
     return new Snap.NX.TrimBody(trim);
 }
Esempio n. 24
0
        /// <summary>
        /// 获取基准面
        /// </summary>
        public static Snap.NX.Face GetBaseFace(Snap.Position startPoint, Snap.Position endPoint, Snap.NX.Body body)
        {
            Snap.Position basePoint = (startPoint + endPoint) / 2;

            Snap.NX.Face baseFace = null;

            var faces = body.Faces.ToList();

            faces.ForEach(u =>
            {
                var box = u.BoxUV;
                var p1  = u.Position((box.MinU + box.MaxU) / 2, (box.MaxV + box.MinV) / 2);
                if (SnapEx.Helper.Equals(p1, basePoint, _tolerance))
                {
                    baseFace = u;
                    return;
                }
            });

            return(baseFace);
        }
Esempio n. 25
0
        private static Vector[] SurfaceEvaluate(Snap.NX.Face face, int mode, double u, double v)
        {
            IntPtr ptr;

            double[] numArray  = new double[] { u / face.FactorU, v / face.FactorV };
            UFEvalsf evalsf    = Globals.UFSession.Evalsf;
            Tag      nXOpenTag = face.NXOpenTag;

            evalsf.Initialize2(nXOpenTag, out ptr);
            ModlSrfValue value2 = new ModlSrfValue();

            evalsf.Evaluate(ptr, mode, numArray, out value2);
            Vector vector  = new Vector(value2.srf_pos);
            Vector vector2 = new Vector(value2.srf_du);
            Vector vector3 = new Vector(value2.srf_dv);
            Vector vector4 = new Vector(value2.srf_unormal);

            vector2 = (Vector)((1.0 / face.FactorU) * vector2);
            vector3 = (Vector)((1.0 / face.FactorV) * vector3);
            return(new Vector[] { vector, vector2, vector3, vector4 });
        }
Esempio n. 26
0
        /// <summary>
        /// 获取基准角法向
        /// </summary>
        public static Snap.Vector GetBaseCornerDirection(Snap.Vector director, Snap.NX.Body body, Snap.Position basePoint)
        {
            var vec = new Snap.Vector();

            director = director.Copy(Snap.Geom.Transform.CreateRotation(basePoint, 90));

            Snap.NX.Face baseFace = null;

            var faces = body.Faces.ToList();

            faces.ForEach(u =>
            {
                var box = u.BoxUV;
                var p1  = u.Position((box.MinU + box.MaxU) / 2, (box.MaxV + box.MinV) / 2);
                if (SnapEx.Helper.Equals(p1, basePoint, _tolerance))
                {
                    baseFace = u;
                    return;
                }
            });

            if (baseFace != null)
            {
                faces.Remove(baseFace);
                faces.ForEach(u =>
                {
                    if (u.ObjectSubType == Snap.NX.ObjectTypes.SubType.FacePlane &&
                        u.Box.MaxZ > basePoint.Z &&
                        SnapEx.Helper.Equals(u.GetFaceDirection(), director) &&
                        SnapEx.Helper.Equals(u.GetFaceDirection(), -director)
                        )
                    {
                        u.Color = System.Drawing.Color.Red;
                    }
                });
            }

            return(vec);
        }
Esempio n. 27
0
        /// <summary>
        /// 获取BOX
        /// </summary>
        /// <param name="face"></param>
        /// <returns></returns>
        public static Snap.Geom.Box3d BoxEx(this Snap.NX.Face face)
        {
            int    surfaceType;
            double radius1;
            double radius2;
            int    normalFlip;

            double[] point = new double[3];
            double[] dir   = new double[3];
            double[] box   = new double[6];
            try
            {
                NXOpen.UF.UFSession uFSession = NXOpen.UF.UFSession.GetUFSession();
                uFSession.Modl.AskFaceData(face.NXOpenTag, out surfaceType, point, dir, box, out radius1, out radius2, out normalFlip);
                var faceBox = new Snap.Geom.Box3d(box[0], box[1], box[2], box[3], box[4], box[5]);
                return(faceBox);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return(face.Box);
            }
        }
Esempio n. 28
0
        internal static Snap.NX.Face CreateFace(NXOpen.Face nxopenFace)
        {
            Snap.NX.Face snapFace = new Snap.NX.Face(nxopenFace);
            switch (GetFaceType(snapFace))
            {
            case ObjectTypes.SubType.FaceBlend:
                return(new Blend(nxopenFace));

            case ObjectTypes.SubType.FaceBsurface:
                return(new Bsurface(nxopenFace));

            case ObjectTypes.SubType.FaceCone:
                return(new Cone(nxopenFace));

            case ObjectTypes.SubType.FaceCylinder:
                return(new Cylinder(nxopenFace));

            case ObjectTypes.SubType.FaceExtruded:
                return(new Extruded(nxopenFace));

            case ObjectTypes.SubType.FaceOffset:
                return(new Offset(nxopenFace));

            case ObjectTypes.SubType.FacePlane:
                return(new Plane(nxopenFace));

            case ObjectTypes.SubType.FaceRevolved:
                return(new Revolved(nxopenFace));

            case ObjectTypes.SubType.FaceSphere:
                return(new Sphere(nxopenFace));

            case ObjectTypes.SubType.FaceTorus:
                return(new Torus(nxopenFace));
            }
            return(snapFace);
        }
Esempio n. 29
0
        /// <summary>
        /// 获取所有的侧面
        /// </summary>
        protected static List <Snap.NX.Face> GetBaseSideFaces(Snap.NX.Face baseFace, List <Snap.NX.Face> allSideFaces)
        {
            var result              = new List <Snap.NX.Face>();
            var faceDirection       = baseFace.GetFaceDirection();
            var baseFaceCenterPoint = baseFace.GetCenterPoint();
            var orientation         = new Snap.Orientation(faceDirection);
            var firstFace           = allSideFaces.Where(u => SnapEx.Helper.Equals(u.GetFaceDirection(), -orientation.AxisY));
            var twoFace             = allSideFaces.Where(u => SnapEx.Helper.Equals(u.GetFaceDirection(), orientation.AxisX));
            var threeFace           = allSideFaces.Where(u => SnapEx.Helper.Equals(u.GetFaceDirection(), orientation.AxisY));
            var fourFace            = allSideFaces.Where(u => SnapEx.Helper.Equals(u.GetFaceDirection(), -orientation.AxisX));

            Action <List <Snap.NX.Face> > action = itemFace => {
                if (itemFace.Count() > 1)
                {
                    var fFace = itemFace
                                .Where(u => Snap.Compute.Distance(u, baseFace) < SnapEx.Helper.Tolerance)
                                .OrderByDescending(u => Snap.Compute.Distance(baseFaceCenterPoint, ((Snap.NX.Face.Plane)u).Geometry))
                                .ThenByDescending(u => u.GetPlaneProjectArea())
                                .FirstOrDefault();
                    if (fFace != null)
                    {
                        result.Add(fFace);
                    }
                }
                else
                {
                    result.AddRange(itemFace);
                }
            };

            action(firstFace.ToList());
            action(twoFace.ToList());
            action(threeFace.ToList());
            action(fourFace.ToList());
            return(result);
        }
Esempio n. 30
0
 public Snap.NX.Arc[] Divide(Snap.NX.Face face, Position helpPoint)
 {
     Snap.NX.Curve[] curveArray = base.Divide(face, helpPoint);
     return(this.ArcArray(curveArray));
 }