コード例 #1
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
        /// <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));
        }
コード例 #2
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
        /// <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);
        }
コード例 #3
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
        /// <summary>
        /// 自动取点
        /// </summary>
        public static List <PointData> AutoSelPoint(Snap.NX.Body body, CMMConfig config, bool isUploadFile = true)
        {
            var result    = new List <PointData>();
            var electrode = ElecManage.Electrode.GetElectrode(body);

            if (electrode == null)
            {
                throw new Exception("无法识别该电极!");
            }
            electrode.InitAllFace();
            bool   CMMResult = true;
            string CMMInfo   = string.Empty;

            try
            {
                result = AutoSelPoint(electrode, config, isUploadFile);
            }
            catch (Exception ex)
            {
                CMMResult = false;
                CMMInfo   = ex.Message;
                if (!config.IsUploadDataBase)
                {
                    throw ex;
                }
            }

            var info = electrode.GetElectrodeInfo();

            if (!CMMResult)
            {
                Helper.ShowMsg(string.Format("{0}【{1}】", info.Elec_Name, CMMInfo), 1);
            }

            if (config.IsUploadDataBase)
            {
                DataAccess.Model.EACT_AUTOCMM_RECORD record = new DataAccess.Model.EACT_AUTOCMM_RECORD();
                record.CMMDATE   = DateTime.Now;
                record.CMMINFO   = CMMInfo;
                record.CMMRESULT = CMMResult ? 1 : 2;
                record.MODELNO   = info.EACT_MODELNO;
                record.PARTNO    = info.EACT_PARTNO;
                record.PARTNAME  = info.Elec_Name;
                Helper.ShowMsg(string.Format("{0}上传取点记录", info.Elec_Name));
                InitDatabase();
                DataAccess.BOM.UploadAutoCMMRecord(record);
                Helper.ShowMsg(string.Format("{0}取点记录上传完成", info.Elec_Name));
            }

            return(result);
        }
コード例 #4
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
        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);
        }
コード例 #5
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
        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);
        }
コード例 #6
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
        /// <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);
        }
コード例 #7
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
        /// <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);
        }
コード例 #8
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
 /// <summary>
 /// 上传CMM文件
 /// </summary>
 public static void WriteCMMFileByPointData(ElecManage.Electrode elec, List <PointData> pointData, CMMConfig cmmconfig)
 {
     WriteCMMFile(elec, GetPointInfo.GetCMMPointInfo(pointData, elec, _EactConfigData), cmmconfig);
 }
コード例 #9
0
ファイル: CMMBusiness.cs プロジェクト: suifengsigan/CMM
        /// <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);
        }