【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);
}

 

 
posted @ 2022-07-06 15:21  王牌飞行员_里海  阅读(81)  评论(0编辑  收藏  举报