【NX二次开发】获取相切面的三种方法
方法1:使用NX Open C+++ 的面相切规则NXOpen::FaceTangentRule
下面是封装好的代码:
【NX二次开发】相切面封装函数(100米)
方法2:通过判断边的光顺性判断相邻面是不是相切
//获取边的光顺性 bool isSmooth; UF_MODL_ask_edge_smoothness(tagEdge, 0, &isSmooth);
方法3:获取边的中点,判断点在两个面上的矢量是否垂直
判断两个面是否相切,相切
原理:
两个面相切说明是相邻面
相邻面会有一个公共边,
取公共边的中点,判断该点在面1的法向和该点在面2的法向,
如果这两个法向的夹角小于公差,则为相切
如果是一个参考点判断,处理拉伸面、规则的曲面比较合适
不规则的曲面 需要多设置参考点判断
//判断两个面是否相切,相切 tag_t facea; //面1 tag_t face; //面2 int aaa=判断两个面是否相切(facea,face); //返回1表示相切 extern "C" int 判断两个面是否相切(tag_t facea,tag_t face) { double tol=0.01; //相切公差 int guess1_given; //【输入】我们输入0就可以了 double guess1[ 3 ]; //【输入】假设最近点1(如果上一个参数是0无需设置) int guess2_given; //【输入】我们输入0就可以了 double guess2[ 3 ]; //【输入】假设最近点2(如果上一个参数是0无需设置) double min_dist; //【输出】最小距离 double pt_on_ent1[ 3 ]; //【输出】最小距离测量点1位置(这个点一定是在对象1上的) double pt_on_ent2[ 3 ]; //【输出】最小距离测量点2位置(这个点一定是在对象2上的) UF_MODL_ask_minimum_dist (facea,face,0,guess1,0,guess2,&min_dist,pt_on_ent1,pt_on_ent2); double param[2]; //U,V方向值 double u1[ 3 ]; //输出 输出一阶导数在U位置 double v1[ 3 ]; //输出 输出一阶导数在V位置 double u2[ 3 ]; //输出 输出二阶导数在U位置 double v2[ 3 ]; //输出 输出二阶导数在V位置 double radii[ 2 ]; //输出,双半径,输出主曲率半径 UF_MODL_ask_minimum_dist (facea,face,0,guess1,0,guess2,&min_dist,pt_on_ent1,pt_on_ent2); double fx_5[3],fx_6[3]; UF_MODL_ask_face_parm(facea,pt_on_ent1,param,pt_on_ent1); UF_MODL_ask_face_props (facea,param,pt_on_ent1,u1,v1,u2,v2,fx_5,radii); UF_MODL_ask_face_parm(face,pt_on_ent2,param,pt_on_ent2); UF_MODL_ask_face_props (face,param,pt_on_ent1,u1,v1,u2,v2,fx_6,radii); if( fabs(fabs(fx_5[0])-fabs(fx_6[0]))<tol && fabs(fabs(fx_5[1])-fabs(fx_6[1]))<tol && fabs(fabs(fx_5[2])-fabs(fx_6[2]))<tol ) return(1); return(0); }