Example #1
0
        /// <summary>
        /// 上传CMM文件
        /// </summary>
        public static void WriteCMMFile(ElecManage.Electrode elec, object data, CMMConfig cmmConfig)
        {
            var info     = elec.GetElectrodeInfo();
            var elecName = info.Elec_Name;

            Helper.ShowMsg(string.Format("{0}开始上传取点文件...", elecName));
            var MODEL_NUMBER = info.EACT_MODELNO;
            var fileName     = string.Format("{0}{1}", elecName, ".txt");
            var result       = Path.Combine(_cmmFilePath, fileName);

            if (Directory.Exists(_cmmFilePath))
            {
                Directory.Delete(_cmmFilePath, true);
            }
            Directory.CreateDirectory(_cmmFilePath);
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);

            File.WriteAllText(result, json);
            if (cmmConfig.IsSelGetPointFilePath && !string.IsNullOrEmpty(cmmConfig.GetPointFilePath))
            {
                var path = Path.Combine(cmmConfig.GetPointFilePath, string.Format(@"{0}\{1}", info.EACT_MODELNO, elecName));
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                File.WriteAllText(Path.Combine(path, fileName), json);
            }
            FtpUpload("CMM", new ElecManage.MouldInfo {
                MODEL_NUMBER = MODEL_NUMBER
            }, result, elecName);
            Helper.ShowMsg(string.Format("{0}取点文件上传成功", elecName));
        }
Example #2
0
        /// <summary>
        /// 设置边界和加工底面
        /// </summary>
        /// <param name="ele">电极</param>
        public void SetBoundaryAndCutFloor(ElecManage.Electrode ele)
        {
            List <NXOpen.Tag>         peripheral;
            List <List <NXOpen.Tag> > innerCircumference;

            Helper.GetOutlineCurve(ele.BaseFace, out peripheral, out innerCircumference);
            var trans = Snap.Geom.Transform.CreateTranslation(0, 0, ele.GetElectrodeInfo().HEADPULLUPH);

            innerCircumference.ForEach(u => {
                var curves = new List <NXOpen.Tag>();
                u.ForEach(m => {
                    NXOpen.Tag tmpValue;
                    ufSession.Modl.CreateCurveFromEdge(m, out tmpValue);
                    var curve      = Snap.NX.Curve.Wrap(tmpValue);
                    curve.IsHidden = true;
                    curve.Move(trans);
                    curves.Add(tmpValue);
                });

                Helper.SetBoundaryByCurves(curves
                                           , NXOpen.UF.CamGeomType.CamPart, OperTag, NXOpen.UF.CamMaterialSide.CamMaterialSideInLeft);
            });

            Helper.SetCutFloor(OperTag, ele.BaseFace.GetCenterPointEx());
        }
Example #3
0
        /// <summary>
        /// 设置边界和加工底面
        /// </summary>
        /// <param name="ele">电极</param>
        public void SetBoundaryAndCutFloor(ElecManage.Electrode ele)
        {
            List <NXOpen.Tag>         peripheral;
            List <List <NXOpen.Tag> > innerCircumference;

            Helper.GetOutlineCurve(ele.BaseFace, out peripheral, out innerCircumference);
            Helper.SetBoundaryByCurves(peripheral
                                       , NXOpen.UF.CamGeomType.CamPart, OperTag, NXOpen.UF.CamMaterialSide.CamMaterialSideInLeft);
            Helper.SetCutFloor(OperTag, ele.TopFace.GetCenterPointEx());
        }
Example #4
0
 /// <summary>
 /// 设置加工区域
 /// </summary>
 /// <param name="ele">电极</param>
 public void SetMillArea(ElecManage.Electrode ele)
 {
     Helper.SetCamgeom(NXOpen.UF.CamGeomType.CamCutArea, OperTag, Enumerable.Select(ele.ElecHeadFaces, u => u.NXOpenTag).ToList());
     //指定检查体
     Helper.SetCamgeom(NXOpen.UF.CamGeomType.CamCheck, OperTag, Enumerable.Select(
                           new List <Snap.NX.Face> {
         ele.BaseFace
     },
                           u => u.NXOpenTag).ToList());
 }
Example #5
0
        /// <summary>
        /// 获取取点信息
        /// </summary>
        public static GetPointInfo GetCMMPointInfo(List <PointData> points, ElecManage.Electrode elec, EactConfig.ConfigData configData)
        {
            var info     = new GetPointInfo();
            var elecInfo = elec.GetElectrodeInfo();

            info.basestationh = Math.Round(elecInfo.BasestationH, 4);
            info.sizex        = elecInfo.X;
            info.sizey        = elecInfo.Y;
            info.sizez        = elecInfo.Z;
            var box = elec.ElecBody.Box;

            info.boxMaxX  = Math.Round(box.MaxXYZ.X, 4);
            info.boxMaxY  = Math.Round(box.MaxXYZ.Y, 4);
            info.boxMaxZ  = Math.Round(box.MaxXYZ.Z, 4);
            info.boxMinX  = Math.Round(box.MinXYZ.X, 4);
            info.boxMinY  = Math.Round(box.MinXYZ.Y, 4);
            info.boxMinZ  = Math.Round(box.MinXYZ.Z, 4);
            info.headh    = Math.Round(elecInfo.HEADPULLUPH, 4);
            info.partname = elecInfo.Elec_Name;
            info.cornor   = ((int)elec.GetCMMQuadrantType(configData.QuadrantType)) + 1;
            var MODEL_NUMBER = elecInfo.EACT_MODELNO;

            info.mouldname = MODEL_NUMBER;

            var trans = Snap.Geom.Transform.CreateTranslation();

            if (elec.BaseFace != null)
            {
                var midPoint = elec.BaseFace.GetCenterPoint();
                trans = Snap.Geom.Transform.CreateTranslation(new Snap.Position() - midPoint);
            }

            //TODO 电极取点的象限角

            points.ForEach(u =>
            {
                var pointInfo       = new CMM.GetPointInfo.PointInfo();
                u.Position          = u.Position.Copy(trans);
                pointInfo.pointname = u.PointName;
                pointInfo.arrow     = u.Arrow;
                pointInfo.TIP       = string.Format("A{0}B{1}", u.A, u.B);
                pointInfo.a         = u.A;
                pointInfo.b         = u.B;
                pointInfo.type      = (int)u.PointType;
                pointInfo.x         = System.Math.Round(u.Position.X, 4);
                pointInfo.y         = System.Math.Round(u.Position.Y, 4);
                pointInfo.z         = System.Math.Round(u.Position.Z, 4);
                pointInfo.i         = System.Math.Round(u.Vector.X, 4);
                pointInfo.j         = System.Math.Round(u.Vector.Y, 4);
                pointInfo.k         = System.Math.Round(u.Vector.Z, 4);
                info.pointlist.Add(pointInfo);
            });

            return(info);
        }
Example #6
0
        /// <summary>
        /// 自动取点
        /// </summary>
        public static List <PointData> AutoSelPoint(ElecManage.Electrode electrode, CMMConfig config, bool isUploadFile = true)
        {
            var positions     = new List <PointData>();
            var tempPositions = new List <PointData>();
            var elecInfo      = electrode.GetElectrodeInfo();

            config.ElecMaxZ = electrode.ElecBody.Box.MaxZ;
            var elecName = elecInfo.Elec_Name;

            Helper.ShowMsg(string.Format("{0}基准面取点", elecName));
            tempPositions = GetHorizontalDatumFacePositions(electrode, config);
            if (tempPositions.Count < 3)
            {
                throw new Exception("基准面取点异常!");
            }
            //根据象限排序
            positions.AddRange(OrderPointDatas(tempPositions));



            Helper.ShowMsg(string.Format("{0}侧面取点", elecName));
            tempPositions = GetVerticalDatumFacesPositions(electrode, config);
            if (tempPositions.Count < 8)
            {
                throw new Exception("侧面取点异常!");
            }
            positions.AddRange(tempPositions);



            Helper.ShowMsg(string.Format("{0}电极头部面取点", elecName));
            tempPositions = GetElectrodeHeadFacePositions(electrode, config);
            if (tempPositions.Count <= 0)
            {
                throw new Exception("电极头部面取点异常!");
            }
            //排序
            tempPositions = tempPositions.OrderBy(u => u.A).ThenBy(u => u.B).ThenByDescending(u => u.Position.Z).ToList();
            positions.AddRange(tempPositions);

            //名称
            foreach (var item in positions)
            {
                item.PointName = string.Format("P{0}", positions.IndexOf(item) + 1);
            }

            if (isUploadFile)
            {
                WriteCMMFile(electrode, GetPointInfo.GetCMMPointInfo(positions, electrode, _EactConfigData), config);
            }
            return(positions);
        }
Example #7
0
        public static PointData IsInterveneBySelPoint(ElecManage.Electrode elec, Snap.Position p, CMMConfig config)
        {
            try
            {
                var electrode = elec;
                if (electrode == null)
                {
                    return(null);
                }

                var faces     = electrode.ElecHeadFaces;
                var face      = faces.FirstOrDefault(u => Helper.AskPointContainment(p, u));
                var pointType = PointType.HeadFace;
                if (face == null && Helper.AskPointContainment(p, electrode.BaseFace))
                {
                    face      = electrode.BaseFace;
                    pointType = PointType.HorizontalDatumFace;
                }

                if (face == null)
                {
                    faces     = electrode.BaseSideFaces;
                    face      = faces.FirstOrDefault(u => Helper.AskPointContainment(p, u));
                    pointType = PointType.VerticalDatumFace;
                }

                var vector      = face.GetFaceDirection();
                var edges       = face.EdgeCurves.ToList();
                var pointVector = vector;
                if (double.IsNaN(pointVector.X) || double.IsNaN(pointVector.Y) || double.IsNaN(pointVector.Z))
                {
                    pointVector = face.GetFaceDirectionByPoint(p);
                }
                if (double.IsNaN(pointVector.X) || double.IsNaN(pointVector.Y) || double.IsNaN(pointVector.Z))
                {
                    return(null);
                }

                return(IsIntervene(electrode, p, pointVector, edges, config, pointType));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            return(null);
        }
Example #8
0
        /// <summary>
        /// 设置边界
        /// </summary>
        public void SetBoundary(ElecManage.Electrode electrode)
        {
            List <NXOpen.Tag> peripheral = new List <NXOpen.Tag>();
            var box3d    = electrode.ElecBody.Box;
            var p1       = new Snap.Position(box3d.MinX, box3d.MaxY, box3d.MaxZ);
            var p2       = new Snap.Position(box3d.MinX, box3d.MinY, box3d.MaxZ);
            var p3       = new Snap.Position(box3d.MaxX, box3d.MinY, box3d.MaxZ);
            var p4       = new Snap.Position(box3d.MaxX, box3d.MaxY, box3d.MaxZ);
            var workPart = NXOpen.Session.GetSession().Parts.Work;

            peripheral.Add(Helper.Create_SO_Curve(p1, p2));
            peripheral.Add(Helper.Create_SO_Curve(p2, p3));
            peripheral.Add(Helper.Create_SO_Curve(p3, p4));
            peripheral.Add(Helper.Create_SO_Curve(p4, p1));
            Helper.SetBoundaryByCurves(
                peripheral.ToList()
                , NXOpen.UF.CamGeomType.CamBlank, OperTag, NXOpen.UF.CamMaterialSide.CamMaterialSideInLeft);
        }
Example #9
0
        /// <summary>
        /// 获取基准面的检测点
        /// </summary>
        static List <PointData> GetHorizontalDatumFacePositions(ElecManage.Electrode elec, CMMConfig config)
        {
            var result    = new List <PointData>();
            var face      = elec.BaseFace;
            var edges     = face.EdgeCurves.ToList();
            var positions = Helper.GetFacePoints(face, config, edges, config.IsBaseRoundInt);
            var vector    = face.GetFaceDirection();
            //边界点
            var p1     = face.Position(face.BoxUV.MinU, face.BoxUV.MinV);
            var p2     = face.Position(face.BoxUV.MinU, face.BoxUV.MaxV);
            var p3     = face.Position(face.BoxUV.MaxU, face.BoxUV.MaxV);
            var p4     = face.Position(face.BoxUV.MaxU, face.BoxUV.MinV);
            var center = face.GetCenterPoint();

            var tempPs = new List <Snap.Position> {
                p1, p2, p3, p4
            };

            foreach (var tempP in tempPs)
            {
                var ps = positions.Where(u => Helper.IsSameQuadrant(tempP, u, center)).OrderBy(u => Snap.Position.Distance(tempP, u));
                foreach (var item in ps)
                {
                    var interveneP = IsIntervene(elec, item, vector, edges, config, PointType.HorizontalDatumFace, true);
                    if (interveneP == null)
                    {
                        positions.Remove(item);
                    }
                    else
                    {
                        positions.Remove(item);
                        interveneP.PointType = PointType.HorizontalDatumFace;
                        result.Add(interveneP);
                        break;
                    }
                }
            }
            return(result);
        }
Example #10
0
        static PointData IsIntervene(ElecManage.Electrode elec, Snap.Position p, Snap.Vector pV, List <Snap.NX.Curve> curves, CMMConfig config, PointType pointType = PointType.UNKOWN, bool isBaseFace = false)
        {
            PointData result      = null;
            var       targetBody  = elec.ElecBody;
            var       maxZ        = config.ElecMaxZ + config.SafeDistance;
            var       minDistance = Helper.GetPointToEdgeMinDistance(p, curves);
            var       ProbeDatas  = config.ProbeDatas ?? new List <ProbeData>();

            if (isBaseFace)
            {
                var probeData = ProbeDatas.FirstOrDefault(u => u.IsBaseFaceProbe);
                if (probeData != null)
                {
                    ProbeDatas = new List <ProbeData> {
                        probeData
                    };
                }
            }

            foreach (var data in ProbeDatas)
            {
                if (result != null)
                {
                    break;
                }
                //过滤探球半径的点
                if (minDistance < config.MinEdgeDistance)
                {
                    continue;
                }
                var abs = data.GetABList(p, pV);
                foreach (var ab in abs)
                {
                    var toolBody         = data.GetBody(ab);
                    var lstTrans         = new List <Snap.Geom.Transform>();
                    var centreOfSphere   = data.GetCentreOfSphere(ab);
                    var inspectionPoints = new List <Position>();

                    //退点
                    var sRetreatPosition = p.Copy(Snap.Geom.Transform.CreateTranslation((data.D / 2) * pV));
                    lstTrans.Add(Snap.Geom.Transform.CreateTranslation(sRetreatPosition - centreOfSphere));
                    var mRetreatPosition = sRetreatPosition.Copy(Snap.Geom.Transform.CreateTranslation(config.RetreatPoint * pV));
                    lstTrans.Add(Snap.Geom.Transform.CreateTranslation(mRetreatPosition - sRetreatPosition));
                    var fRetreatPosition = new Snap.Position(mRetreatPosition.X, mRetreatPosition.Y, maxZ);
                    //lstTrans.Add(Snap.Geom.Transform.CreateTranslation(fRetreatPosition - mRetreatPosition));
                    if (config.RetreatPoint != config.EntryPoint)
                    {
                        //逼进拐点
                        var sEntryPosition = sRetreatPosition.Copy(Snap.Geom.Transform.CreateTranslation(config.EntryPoint * pV));
                        if (config.EntryPoint > 0)
                        {
                            lstTrans.Add(Snap.Geom.Transform.CreateTranslation(sEntryPosition - mRetreatPosition));
                        }
                        var fEntryPosition = new Snap.Position(sEntryPosition.X, sEntryPosition.Y, maxZ);
                        inspectionPoints.Add(fEntryPosition);
                        inspectionPoints.Add(sEntryPosition);
                    }
                    inspectionPoints.Add(sRetreatPosition);
                    inspectionPoints.Add(mRetreatPosition);
                    inspectionPoints.Add(fRetreatPosition);
                    if (config.IsInspectionPath)
                    {
                        if (data.CheckInspectionPath(ab, inspectionPoints, targetBody))
                        {
                            continue;
                        }
                    }
                    bool isHasInterference = false;
                    foreach (var trans in lstTrans)
                    {
                        toolBody.Move(trans);
                        if (Helper.CheckInterference(targetBody.NXOpenTag, toolBody.NXOpenTag))
                        {
                            isHasInterference = true;
                            break;
                        }
                    }

                    if (!isHasInterference)
                    {
                        result = new PointData()
                        {
                            Vector = pV, Position = p, A = ab.A, B = ab.B, Arrow = data.ProbeName
                        };
                        result.PointType = pointType;
                        break;
                    }
                }
            }

            return(result);
        }
 /// <summary>
 /// 设置加工区域
 /// </summary>
 /// <param name="ele">电极</param>
 public void SetMillArea(ElecManage.Electrode ele)
 {
     Helper.SetCamgeom(NXOpen.UF.CamGeomType.CamCutArea, OperTag, Enumerable.Select(ele.ElecHeadFaces, u => u.NXOpenTag).ToList());
 }
Example #12
0
        /// <summary>
        /// 设置刻字内容
        /// </summary>
        public void SetText(string text, ElecManage.Electrode ele)
        {
            ele.GetChamferFace();
            if (ele.ChamferFace != null)
            {
                List <NXOpen.Tag>         peripheral;
                List <List <NXOpen.Tag> > innerCircumference;
                Helper.GetOutlineCurve(ele.BaseFace, out peripheral, out innerCircumference);
                if (!(peripheral.Count > 0 && ele.BaseSideFaces.Count > 0))
                {
                    return;
                }
                var list = peripheral.ToList();
                if (list.Count > 2)
                {
                    list = list.OrderByDescending(u => Snap.NX.Edge.Wrap(u).ArcLength).Take(2).ToList();
                }
                var edge        = Snap.NX.Edge.Wrap(list.OrderByDescending(u => Snap.Compute.Distance(ele.ChamferFace, Snap.NX.NXObject.Wrap(u))).FirstOrDefault());
                var minDistance = double.MaxValue;
                innerCircumference.ForEach(u => {
                    u.ForEach(m => {
                        var tmpDistance = Snap.Compute.Distance(edge, Snap.NX.NXObject.Wrap(m));
                        if (minDistance > tmpDistance)
                        {
                            minDistance = tmpDistance;
                        }
                    });
                });

                var textCenterPoint = (edge.StartPoint + edge.EndPoint) / 2;
                var face            = ele.BaseSideFaces.OrderBy(u => Snap.Compute.Distance(textCenterPoint, u)).FirstOrDefault();
                var yDir            = Snap.Vector.Unit(-face.GetFaceDirection());
                textCenterPoint = textCenterPoint.Copy(Snap.Geom.Transform.CreateTranslation((minDistance * 2 / 5) * yDir));
                var textOri = new Snap.Orientation(Snap.Vector.Cross(yDir, Snap.Orientation.Identity.AxisZ), yDir);
                var trans   = Snap.Geom.Transform.CreateRotation(textOri, Snap.Orientation.Identity);
                trans = Snap.Geom.Transform.Composition(trans, Snap.Geom.Transform.CreateTranslation(textCenterPoint - Snap.Position.Origin));
                var textNxObject = Snap.NX.NXObject.Wrap(SnapEx.Create.CreateNode(text, Snap.Position.Origin));
                textNxObject.Move(trans);
                var eData     = new EdmDraw.DraftingEnvironmentData();
                var mpi       = eData.mpi;
                var mpr       = eData.mpr;
                var ufSession = NXOpen.UF.UFSession.GetUFSession();
                ufSession.Drf.AskObjectPreferences(textNxObject.NXOpenTag, eData.mpi, eData.mpr, out eData.radiusValue, out eData.diameterValue);
                //设置尺寸
                var textStyle = new Snap.NX.TextStyle();
                textStyle.SetFont("chinesef", Snap.NX.TextStyle.FontType.NX);
                //文字对齐位置 首选项→公共→文字→对齐位置
                mpi[30] = (int)textStyle.AlignmentPosition;
                //文字样式 首选项→公共→文字→文本参数→字体(将字体设置为blockfont)
                mpi[88] = textStyle.FontIndex;
                //文字样式 首选项→公共→文字→文本参数→设置字宽(粗细)
                mpi[89] = 0;
                //字大小
                mpr[44] = 3.5;
                //文本长宽比
                mpr[45] = 0.5;
                //字体间距
                mpr[46] = 0.1;
                textStyle.AlignmentPosition = Snap.NX.TextStyle.AlignmentPositions.MidCenter;
                ufSession.Drf.SetObjectPreferences(textNxObject.NXOpenTag, eData.mpi, eData.mpr, eData.radiusValue, eData.diameterValue);
                Helper.SetCamText(OperTag, new List <NXOpen.Tag> {
                    textNxObject.NXOpenTag
                });
            }
        }
Example #13
0
 /// <summary>
 /// 设置部件边界
 /// </summary>
 /// <param name="ele">电极</param>
 public void SetBoundary(ElecManage.Electrode ele)
 {
     Helper.SetBoundaryByFace(ele.BaseFace.NXOpenTag, NXOpen.UF.CamGeomType.CamBlank, OperTag, NXOpen.UF.CamMaterialSide.CamMaterialSideInLeft);
 }
        /// <summary>
        /// 设置加工区域
        /// </summary>
        /// <param name="ele">电极</param>
        public void SetMillArea(ElecManage.Electrode ele)
        {
            var faces = ele.ElecHeadFaces.Where(u => u.ObjectSubType != Snap.NX.ObjectTypes.SubType.FacePlane).ToList();

            Helper.SetCamgeom(NXOpen.UF.CamGeomType.CamCutArea, OperTag, Enumerable.Select(faces, u => u.NXOpenTag).ToList());
        }
Example #15
0
        public void Init(ElecManage.Electrode ele, CNCConfig.CAMConfig camConfig)
        {
            CamConfig = camConfig;
            Electrode = ele;

            var body    = ele.ElecBody;
            var basePos = ele.GetElecBasePos();
            var eleInfo = ele.GetElectrodeInfo();

            BodyBox = body.Box;

            //分析面
            var    faces      = ele.ElecBody.Faces;
            double judgeValue = 15;
            var    camFaces   = new List <CAMFace>();

            ele.ElecHeadFaces.ForEach(u => {
                camFaces.Add(new CAMFace {
                    FaceTag = u.NXOpenTag, DraftAngle = u.GetDraftAngle()
                });
            });

            //基准面
            AllBaseFaces = faces.Where(u => camFaces.FirstOrDefault(m => m.FaceTag == u.NXOpenTag) == null).ToList();
            //垂直面
            VerticalFaces = camFaces.Where(u => u.DraftAngle == 0
                                           //&& u.GetSnapFace().ObjectSubType == Snap.NX.ObjectTypes.SubType.FacePlane
                                           ).ToList();
            //水平面
            HorizontalFaces = camFaces.Where(u => u.DraftAngle == 90 &&
                                             u.GetSnapFace().ObjectSubType == Snap.NX.ObjectTypes.SubType.FacePlane
                                             ).ToList();
            //平缓面(等高面)
            GentleFaces = camFaces.Where(u =>
                                         (u.DraftAngle >= judgeValue && u.DraftAngle < 90)
                                         ||
                                         (u.DraftAngle == 90 && u.GetSnapFace().ObjectSubType != Snap.NX.ObjectTypes.SubType.FacePlane)
                                         ).ToList();
            //陡峭面
            var steepFaces = camFaces.Where(u =>
                                            (u.DraftAngle < judgeValue && u.DraftAngle > 0)
                                            //||
                                            //(u.DraftAngle == 0 && u.GetSnapFace().ObjectSubType != Snap.NX.ObjectTypes.SubType.FacePlane)
                                            ).ToList();

            //倒扣面
            ButtonedFaces = camFaces.Where(u => u.DraftAngle < 0).ToList();
            //非平面
            var nonPlanefaces = ele.ElecHeadFaces.Where(u => u.ObjectSubType != Snap.NX.ObjectTypes.SubType.FacePlane).ToList();

            //设置基准面颜色
            AllBaseFaces.ForEach(u => {
                CAMFace.SetColor(camConfig.BaseFaceColor, u.NXOpenTag);
            });
            //设置垂直面颜色
            VerticalFaces.ForEach(u => {
                u.SetColor(camConfig.VerticalPlaneColor);
            });
            //设置水平面颜色
            HorizontalFaces.ForEach(u => {
                u.SetColor(camConfig.HorizontalPlaneColor);
            });
            //设置平缓面颜色
            GentleFaces.ForEach(u => {
                u.SetColor(camConfig.GentlePlaneColor);
            });
            //设置陡峭面颜色
            steepFaces.ForEach(u => {
                u.SetColor(camConfig.CurveSurfaceColor);
            });
            //倒扣面
            ButtonedFaces.ForEach(u => {
                u.SetColor(camConfig.ButtonedFaceColor);
            });

            //分析方案
            CamScheme = E_CamScheme.SIMPLE;
        }
Example #16
0
        /// <summary>
        /// 获取侧面的检测点
        /// </summary>
        static List <PointData> GetVerticalDatumFacesPositions(ElecManage.Electrode elec, CMMConfig config)
        {
            var result    = new List <PointData>();
            var ufSession = NXOpen.UF.UFSession.GetUFSession();
            //获取所有的侧面
            var faces = elec.BaseSideFaces;
            //获取Z值
            var minZ             = elec.BaseFace.Box.MinZ;
            var baseFaceMidPoint = elec.BaseFace.GetCenterPoint();
            var VecZ             = minZ - config.VerticalValue;
            var dicFace          = new Dictionary <Snap.NX.Face, CMMFaceInfo>();
            var listZ            = new List <double>();
            var firstFaces       = faces.Where(u =>
                                               SnapEx.Helper.Equals(u.GetFaceDirection(), new Snap.Vector(0, 1, 0)) ||
                                               SnapEx.Helper.Equals(u.GetFaceDirection(), new Snap.Vector(0, -1, 0))
                                               ).ToList();
            var twoFaces = faces.Where(u =>
                                       SnapEx.Helper.Equals(u.GetFaceDirection(), new Snap.Vector(1, 0, 0)) ||
                                       SnapEx.Helper.Equals(u.GetFaceDirection(), new Snap.Vector(-1, 0, 0))
                                       ).ToList();

            if (!(firstFaces.Count() >= 2 && twoFaces.Count >= 2))
            {
                throw new Exception("获取侧面异常");
            }
            foreach (var face in faces)
            {
                var edges           = face.EdgeCurves.ToList();
                var positions       = Helper.GetFacePoints(face, config, edges, config.IsBaseRoundInt);
                var faceDirection   = face.GetFaceDirection();
                var faceOrientation = new Orientation(faceDirection);
                var tempP           = face.Box.MaxXYZ;
                //侧面变量Z
                if (positions.Count > 0)
                {
                    var sideZP = positions.First();
                    var tempPs = positions
                                 .Where(u => (System.Math.Abs(u.Z - sideZP.Z) < SnapEx.Helper.Tolerance)).ToList();
                    tempPs.ForEach(u => {
                        u.Z = VecZ;
                        positions.Add(u);
                    });
                }
                var ps = positions.Where(u => System.Math.Abs(u.Z - minZ) <= config.VerticalValue).OrderByDescending(u => Snap.Position.Distance(tempP, u)).ToList();
                dicFace.Add(face, new CMMFaceInfo {
                    Positions = ps, Edges = edges, FaceDirection = faceDirection, FaceOrientation = faceOrientation
                });
                if (faces.IndexOf(face) == 0)
                {
                    listZ.Add(VecZ);
                    //其他测量Z值不取 update ph
                    //ps.ForEach(u => {
                    //    listZ.Add(u.Z);
                    //});
                    listZ = listZ.Distinct().ToList();
                }
            }

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

            tempFaces.Add(firstFaces.First(), firstFaces);
            tempFaces.Add(twoFaces.First(), twoFaces);
            foreach (var z in listZ)
            {
                var cmmPointData = new List <PointData>();
                foreach (var tf in tempFaces)
                {
                    var firstFace        = tf.Key;
                    var firstCmmFaceInfo = dicFace[firstFace];
                    var twoFace          = tf.Value.Last();
                    var twoCMMFaceInfo   = dicFace[twoFace];
                    var ftDistance       = Snap.Compute.Distance(firstFace, twoFace);
                    var ps = firstCmmFaceInfo.Positions
                             .Where(u => (System.Math.Abs(u.Z - z) < SnapEx.Helper.Tolerance))
                             .OrderByDescending(u => Snap.Position.Distance(u, baseFaceMidPoint))
                             .ToList();
                    //对称点
                    while (ps.Count > 0)
                    {
                        //获取4个对称点
                        var item           = ps.First();
                        var trans          = Snap.Geom.Transform.CreateReflection(new Snap.Geom.Surface.Plane(baseFaceMidPoint, firstCmmFaceInfo.FaceOrientation.AxisY));
                        var symmetryPoint  = item.Copy(trans);
                        var trans1         = Snap.Geom.Transform.CreateTranslation(ftDistance * (-firstCmmFaceInfo.FaceDirection));
                        var tItem          = item.Copy(trans1);
                        var tSymmetryPoint = symmetryPoint.Copy(trans1);
                        if (
                            !SnapEx.Helper.Equals(item, symmetryPoint, SnapEx.Helper.Tolerance) &&
                            Helper.AskPointContainment(symmetryPoint, firstFace) &&
                            Helper.AskPointContainment(tItem, twoFace) &&
                            Helper.AskPointContainment(tSymmetryPoint, twoFace))
                        {
                            var p1 = IsIntervene(elec, symmetryPoint, firstCmmFaceInfo.FaceDirection, firstCmmFaceInfo.Edges, config, PointType.VerticalDatumFace, true);
                            var p2 = IsIntervene(elec, item, firstCmmFaceInfo.FaceDirection, firstCmmFaceInfo.Edges, config, PointType.VerticalDatumFace, true);
                            var p3 = IsIntervene(elec, tItem, twoCMMFaceInfo.FaceDirection, twoCMMFaceInfo.Edges, config, PointType.VerticalDatumFace, true);
                            var p4 = IsIntervene(elec, tSymmetryPoint, twoCMMFaceInfo.FaceDirection, twoCMMFaceInfo.Edges, config, PointType.VerticalDatumFace, true);

                            if (p1 != null && p2 != null && p3 != null && p4 != null)
                            {
                                cmmPointData.Add(p1);
                                cmmPointData.Add(p2);
                                cmmPointData.Add(p3);
                                cmmPointData.Add(p4);
                                break;
                            }
                        }
                        ps.Remove(item);
                        ps.RemoveAll(u => SnapEx.Helper.Equals(u, symmetryPoint, SnapEx.Helper.Tolerance));
                    }
                }

                if (cmmPointData.Count >= 8)
                {
                    result = OrderPointDatas(cmmPointData);
                    break;
                }
            }

            return(result);
        }
Example #17
0
 /// <summary>
 /// 上传CMM文件
 /// </summary>
 public static void WriteCMMFileByPointData(ElecManage.Electrode elec, List <PointData> pointData, CMMConfig cmmconfig)
 {
     WriteCMMFile(elec, GetPointInfo.GetCMMPointInfo(pointData, elec, _EactConfigData), cmmconfig);
 }
Example #18
0
        /// <summary>
        /// 获取头部面的检测点
        /// </summary>
        static List <PointData> GetElectrodeHeadFacePositions(ElecManage.Electrode elec, CMMConfig config)
        {
            var result    = new List <PointData>();
            var faces     = elec.ElecHeadFaces;
            int faceIndex = 0;

            if (config.IsEDMFaceGetPoint)
            {
                LoopVarValue = 100;
                var EDMFaces = new List <Snap.NX.Face>();
                foreach (var face in faces)
                {
                    if (Snap.Color.ColorIndex(face.Color) == _EactConfigData.EDMColor)
                    {
                        EDMFaces.Add(face);
                    }
                }

                if (EDMFaces.Count > 0)
                {
                    faces = EDMFaces.ToList();
                }
            }

            foreach (var face in faces)
            {
                var edges        = face.EdgeCurves.ToList();
                var positions    = Helper.GetFacePoints(face, config, edges);
                var faceMidPoint = face.GetCenterPointEx();
                var faceArea     = 0.0;

                if (config.IsMinGetPointArea || config.IsGetTowPointArea)
                {
                    faceArea = face.Area;
                }

                //面积小于某值的不取点(可配置)
                if (config.IsMinGetPointArea)
                {
                    if (faceArea < config.MinGetPointArea)
                    {
                        continue;
                    }
                }

                Helper.ShowMsg(string.Format("{0}第{1}个电极头部面取点", elec.ElecBody.Name, faceIndex + 1));
                faceIndex++;

                Action <List <Position> > action = (p) =>
                {
                    for (var i = 0; i < p.Count; i++)
                    {
                        if (i < LoopVarValue)
                        {
                            var item        = p[i];
                            var pointVector = face.GetFaceDirectionByPoint(item);
                            if (double.IsNaN(pointVector.X) || double.IsNaN(pointVector.Y) || double.IsNaN(pointVector.Z))
                            {
                                continue;
                            }
                            var p1 = IsIntervene(elec, item, pointVector, edges, config, PointType.HeadFace);
                            if (p1 != null)
                            {
                                result.Add(p1);
                                break;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                };

                //面积超过以上配置的某个值的,取靠近面的UV百分比为25 % 及75 % 的两个点(一个面最多两个点)
                if (config.IsGetTowPointArea && faceArea > config.GetTowPointArea)
                {
                    var faceBoxUV = face.BoxUV;
                    var faceU     = faceBoxUV.MaxU - faceBoxUV.MinU;
                    var faceV     = faceBoxUV.MaxV - faceBoxUV.MinV;
                    var firstUV   = face.Position(faceBoxUV.MinU + faceU / 4, (faceBoxUV.MaxV + faceBoxUV.MinV) / 2);
                    var twoUV     = face.Position(faceBoxUV.MinU + faceU * 3 / 4, (faceBoxUV.MaxV + faceBoxUV.MinV) / 2);
                    var centerUV  = face.Position((faceBoxUV.MaxU + faceBoxUV.MinU) / 2, (faceBoxUV.MaxV + faceBoxUV.MinV) / 2);
                    var fDistance = Snap.Position.Distance(firstUV, centerUV);
                    var tDistance = Snap.Position.Distance(twoUV, centerUV);
                    var ps1       = positions.Where(u => Snap.Position.Distance(firstUV, u) < fDistance).OrderBy(u => Snap.Position.Distance(firstUV, u)).ToList();
                    var ps2       = positions.Where(u => Snap.Position.Distance(twoUV, u) < tDistance && !ps1.Contains(u)).OrderBy(u => Snap.Position.Distance(twoUV, u)).ToList();
                    action(ps1);
                    action(ps2);
                }
                else
                {
                    var ps = positions.OrderBy(u => Snap.Position.Distance(faceMidPoint, u)).ToList();
                    action(ps);
                }
            }
            return(result);
        }