对于电极自动编程开发,通常在第一步需要进行型腔铣粗加工,如果需要再考虑效率的问题,一般只对基准面以上的部分采用型腔铣,而单独的基准台只需要进行2D轮廓加工,可以节约一些时间。这样就需要对型腔铣单独设置加工区域面,并且要通过算法自动找到基准台以上的所有面。
自动识别电极基准面以上的所有面大致算法:
1,首先要自动找到电极的基准面,这一步对于做电极自动编程非常重要,找到基准面就可以确定电极的方向、大小等,后续的很多识别算法,都会参考这个基准面。那么如何自动找到电极的基准面呢?(要求是处于正交状态的任意方向,都能自动找到),方法在另外的帖子会详细说明,或者可以加胡君qq85585969获取算法的原型代码。
2,找到基准面后,就已经确定了电极的方向,然后以基准面的法向方向作为Z向建立工作坐标系,再遍历电极所有的面,计算每个面的边界盒得到Z向的极限值,再对比基准面的高度,就能得到基准面以上的所有面。
1 //获取geom根组,根据geom名字查询组的TAG 2 tag_t rootGeomGroup=NULL_TAG; 3 UF_SETUP_ask_geom_root(setupTag,&rootGeomGroup); 4 tag_t geomGroupName = NULL_TAG; 5 UF_NCGROUP_ask_object_of_name(rootGeomGroup, "WORKPIECE", &geomGroupName); 6 7 //获取刀具根组,根据刀具名字查询组的TAG 8 tag_t rootMctGroup=NULL_TAG; 9 UF_SETUP_ask_mct_root(setupTag,&rootMctGroup); 10 tag_t mctGroupName = NULL_TAG; 11 UF_NCGROUP_ask_object_of_name(rootMctGroup, "D10", &mctGroupName); 12 13 //获取program根组,根据program名字查询组的TAG 14 tag_t rootProgramGroup=NULL_TAG; 15 UF_SETUP_ask_program_root(setupTag,&rootProgramGroup); 16 tag_t programGroupName = NULL_TAG; 17 UF_NCGROUP_ask_object_of_name(rootProgramGroup, "HUNC01", &programGroupName); 18 19 //设定所属几何体、刀具、程序组 20 UF_NCGROUP_accept_member( geomGroupName, operTag); 21 UF_NCGROUP_accept_member( mctGroupName, operTag); 22 UF_NCGROUP_accept_member( programGroupName, operTag); 23 24 /*以下设置加工区域、切削模式、每刀切削深度、侧面底面余量、切削方向、内外公差、非切削运动、起始点等*/ 25 26 //设置加工区域 27 int dfCount = 0; 28 tag_t *datumTopAllFace; 29 30 /* 下面为自定义的一个函数,通过算法自动获得一个电极基准面以上的所有面, 31 并将获得的面存储到一个Tag数组中,用于下一步设置加工区域。 32 */ 33 GetEleDatumTopFaces(datumFace, &dfCount, &datumTopAllFace); 34 UF_CAMGEOM_append_items(operTag, UF_CAM_cut_area, dfCount, datumTopAllFace, NULL); 35 delete(datumTopAllFace); 36 37 38 //设置切削模式为跟随周边(follow) 39 UF_PARAM_set_int_value (operTag, UF_PARAM_CUT_METHOD, UF_PARAM_dpm_cut_pattern_follow); 40 41 //设置每刀切削深度 42 UF_PARAM_set_double_value (operTag, UF_PARAM_CUTLEV_GLOBAL_CUT_DEPTH, 0.56); 43 44 //不勾选侧面与底面余量一致 45 UF_PARAM_set_int_value (operTag, UF_PARAM_STOCK_PART_USE, UF_PARAM_stock_part_use_as_is); 46 47 //设置侧面余量 48 UF_PARAM_set_double_value (operTag, UF_PARAM_STOCK_PART, 0.35); 49 50 //设置底部余量 51 UF_PARAM_set_double_value (operTag, UF_PARAM_STOCK_FLOOR, 0.15); 52 53 //设置切削刀路方向:向内-向外 54 UF_PARAM_set_int_value (operTag, UF_PARAM_CUT_FOLLOW_PROGRESSION, UF_PARAM_cut_follow_progression_inward); 55 56 //设置公差(内外公差) 57 double InOutVlaue[2] = { 0.31, 0.32 }; 58 UF_PARAM_set_2d_value (operTag, UF_PARAM_TOL_IN_OUT, InOutVlaue); 59 60 61 //设置进给率速度, ask查询的目的,是填充feedrateVla的值. 62 UF_PARAM_feedrate_t feedrateVla; 63 UF_PARAM_ask_subobj_ptr_value (operTag, UF_PARAM_FEED_CUT, &feedrateVla); 64 feedrateVla.value = 235.3; 65 UF_PARAM_set_subobj_ptr_value (operTag, UF_PARAM_FEED_CUT, &feedrateVla); 66 67 68 //生成程序 69 logical generated; 70 UF_PARAM_generate(operTag, &generated); 71 72 73 //刷新导航器 74 UF_UI_ONT_refresh();
效果演示: