public static List <CAMCutter> CreateCutter(CAMElectrode ele, CNCConfig.CAMConfig camConfig, NXOpen.Tag cutterGroupRootTag, out CNCConfig.CAMConfig.ProjectInfo project) { var eleInfo = ele.Electrode.GetElectrodeInfo(); List <CAMCutter> result = new List <CAMCutter>(); var info = ele.Electrode.GetElectrodeInfo(); var cutterConfigs = camConfig.FindCutterInfo(info.MAT_NAME); project = camConfig.Projects.Where(u => u.方案名称 == "自动").FirstOrDefault() ?? camConfig.Projects.Where(u => u.方案名称 == "自动").FirstOrDefault(); if (project == null) { throw new Exception("配置工具未配置方案!"); } var cutterStrs = new List <string>(); project.Details.ForEach(u => { cutterStrs.Add(u.刀具); cutterStrs.Add(u.参考刀具); }); cutterStrs = cutterStrs.Where(u => !string.IsNullOrEmpty(u)).ToList(); cutterStrs = cutterStrs.Distinct().ToList(); foreach (var item in cutterStrs) { var cutterConfig = cutterConfigs.FirstOrDefault(m => m.刀具名称 == item); if (cutterConfig != null) { Action <double> action = (f) => { var camCutter = new CAMCutter(); camCutter.AUTOCAM_TYPE = AUTOCAM_TYPE.mill_planar; camCutter.AUTOCAM_SUBTYPE = AUTOCAM_SUBTYPE.MILL; camCutter.CutterName = cutterConfig.刀具名称 + (f != 0 ? f.ToString() : ""); camCutter.TL_DIAMETER = double.Parse(cutterConfig.直径) + (f * 2); camCutter.TL_COR1_RAD = double.Parse(cutterConfig.R角) + f; camCutter.TL_COR1_RAD = camCutter.TL_COR1_RAD < 0 ? 0 : camCutter.TL_COR1_RAD; camCutter.TL_HEIGHT = double.Parse(cutterConfig.刀长); camCutter.TL_FLUTE_LN = double.Parse(cutterConfig.刃长); camCutter.TL_NUMBER = int.Parse(cutterConfig.刀号); camCutter.TL_ADJ_REG = int.Parse(cutterConfig.补正号); camCutter.Speed = double.Parse(cutterConfig.转速); camCutter.FeedRate = double.Parse(cutterConfig.进给); camCutter.FEED_TRAVERSAL = double.Parse(cutterConfig.横越); camCutter.CutDepth = double.Parse(cutterConfig.切深); result.Add(camCutter); }; action(0); if (eleInfo.FINISH_NUMBER > 0) //精 { action(eleInfo.FINISH_SPACE); } if (eleInfo.MIDDLE_NUMBER > 0) //中 { action(eleInfo.MIDDLE_SPACE); } if (eleInfo.ROUGH_NUMBER > 0) //粗 { action(eleInfo.ROUGH_SPACE); } } else { throw new Exception("配置工具方案刀具配置异常!"); } } result = Helper.CreateCutter(result, cutterGroupRootTag); return(result); }
/// <summary> /// 自动编程 /// </summary> public static void AutoCam(CAMElectrode ele, CNCConfig.CAMConfig camConfig) { //安全距离 var safeDistance = 10; var autoBlankOffset = new double[] { camConfig.AutoBlankXPlus, camConfig.AutoBlankXReduce, camConfig.AutoBlankYPlus, camConfig.AutoBlankYReduce, camConfig.AutoBlankZPlus, camConfig.AutoBlankZReduce }; var eleInfo = ele.Electrode.GetElectrodeInfo(); var bodyBox = ele.BodyBox; //几何组根节点 NXOpen.Tag geometryGroupRootTag; //程序组根节点 NXOpen.Tag orderGroupRootTag; //刀具组根节点 NXOpen.Tag cutterGroupRootTag; //方法组根节点 NXOpen.Tag methodGroupRootTag; //几何体组 NXOpen.Tag workGeometryGroupTag; //TODO 初始化对象 NXOpen.Tag setup_tag; ufSession.Setup.AskSetup(out setup_tag); ufSession.Setup.AskGeomRoot(setup_tag, out geometryGroupRootTag); ufSession.Setup.AskProgramRoot(setup_tag, out orderGroupRootTag); ufSession.Setup.AskMctRoot(setup_tag, out cutterGroupRootTag); ufSession.Setup.AskMthdRoot(setup_tag, out methodGroupRootTag); //根据配置文件创建刀具 CNCConfig.CAMConfig.ProjectInfo projectConfig; var cutters = CreateCutter(ele, camConfig, cutterGroupRootTag, out projectConfig); //TODO删除旧的程序 //TODO 创建坐标系和几何体 //加工坐标系 NXOpen.Tag workMcsGroupTag; ufSession.Ncgeom.Create(AUTOCAM_TYPE.mill_planar, AUTOCAM_SUBTYPE.MCS, out workMcsGroupTag); ufSession.Obj.SetName(workMcsGroupTag, AUTOCAM_ROOTNAME.GEOM_EACT); ufSession.Ncgroup.AcceptMember(geometryGroupRootTag, workMcsGroupTag); //TODO 设置安全平面 var normal = new Snap.Vector(0, 0, 1); var origin = new Snap.Position((bodyBox.MinX + bodyBox.MaxX) / 2, (bodyBox.MinY + bodyBox.MaxY) / 2, bodyBox.MaxZ + safeDistance); ufSession.Cam.SetClearPlaneData(workMcsGroupTag, origin.Array, normal.Array); //TODO 创建几何体 ufSession.Ncgeom.Create(AUTOCAM_TYPE.mill_planar, AUTOCAM_SUBTYPE.WORKPIECE, out workGeometryGroupTag); ufSession.Obj.SetName(workGeometryGroupTag, eleInfo.Elec_Name); ufSession.Ncgroup.AcceptMember(workMcsGroupTag, workGeometryGroupTag); //TODO 添加Body作为工作几何体 Helper.SetCamgeom(NXOpen.UF.CamGeomType.CamPart, workGeometryGroupTag, new List <NXOpen.Tag> { ele.Electrode.ElecBody.NXOpenTag }); //TODO 设置毛坯为自动块 ufSession.Cam.SetAutoBlank(workGeometryGroupTag, NXOpen.UF.UFCam.BlankGeomType.AutoBlockType, autoBlankOffset); Action <string, double, int> action = (type, fireNum, number) => { //TODO 创建程序 NXOpen.Tag programGroupTag; ufSession.Ncprog.Create(AUTOCAM_TYPE.mill_planar, AUTOCAM_SUBTYPE.PROGRAM, out programGroupTag); ufSession.Obj.SetName(programGroupTag, string.Format("{0}-{1}", eleInfo.Elec_Name, type)); ufSession.Ncgroup.AcceptMember(orderGroupRootTag, programGroupTag); var list = CAMOper.CreateCamOper(workGeometryGroupTag, programGroupTag, methodGroupRootTag, cutterGroupRootTag, ele, projectConfig, cutters, fireNum); list = list.Where(u => u.OperIsValid).ToList(); //var exMsg=Helper.PathGenerate(programGroupTag); //Helper.ShowInfoWindow(exMsg); }; if (eleInfo.FINISH_NUMBER > 0) //精 { action("F", eleInfo.FINISH_SPACE, eleInfo.FINISH_NUMBER); } if (eleInfo.MIDDLE_NUMBER > 0) //中 { action("M", eleInfo.MIDDLE_SPACE, eleInfo.MIDDLE_NUMBER); } if (eleInfo.ROUGH_NUMBER > 0) //粗 { action("R", eleInfo.ROUGH_SPACE, eleInfo.ROUGH_NUMBER); } }
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; }