/// <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)); }
/// <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()); }
/// <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()); }
/// <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()); }
/// <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); }
/// <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); }
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); }
/// <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); }
/// <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); }
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()); }
/// <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 }); } }
/// <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()); }
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; }
/// <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); }
/// <summary> /// 上传CMM文件 /// </summary> public static void WriteCMMFileByPointData(ElecManage.Electrode elec, List <PointData> pointData, CMMConfig cmmconfig) { WriteCMMFile(elec, GetPointInfo.GetCMMPointInfo(pointData, elec, _EactConfigData), cmmconfig); }
/// <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); }