今天是国庆节,放假休息懒得动,没有出去玩,在家研究一下发射线函数UF_MODL_trace_a_ray。小弟以前在软件公司混的时候,当时我做的那个项目就用到了UF_MODL_trace_a_ray,当时为了赶项目,从别处抄了代码,改吧改吧。自己也没有仔细的去研究一下这个函数的用法。UF_MODL_trace_a_ray在NX二次开发中算是一个用到比较高频的函数,今天研究了一下,写了一道例题,UFUN和NXOpen C++简单混合去用了一下,大致介绍下函数的用法。如有错误,还请各位前辈多多指教小弟!
1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_modl.h> 6 #include <uf_mtx.h> 7 #include <uf_curve.h> 8 #include <NXOpen/CurveCollection.hxx> 9 #include <NXOpen/NXObject.hxx> 10 #include <NXOpen/Part.hxx> 11 #include <NXOpen/PartCollection.hxx> 12 #include <uf_obj.h> 13 #include <NXOpen/ListingWindow.hxx> 14 15 NXOpen::Session *theSession = NXOpen::Session::GetSession(); 16 NXOpen::Part *workPart(theSession->Parts()->Work()); 17 NXOpen::Part *displayPart(theSession->Parts()->Display()); 18 19 UF_initialize(); 20 21 //创建点 22 double Point1[3] = { -300.0, 50.0, 50.0 }; 23 tag_t PointTag = NULL_TAG; 24 UF_CURVE_create_point(Point1, &PointTag); 25 26 //创建块 27 UF_FEATURE_SIGN Sign = UF_NULLSIGN; 28 double Corner_pt[3] = { 0.0, 0.0, 0.0 }; 29 char *Edge_len[3] = { "100", "100", "100"}; 30 tag_t BlkTag = NULL_TAG; 31 UF_MODL_create_block1(Sign, Corner_pt, Edge_len, &BlkTag); 32 33 //特征找体 34 tag_t BodyTag = NULL_TAG; 35 UF_MODL_ask_feat_body(BlkTag, &BodyTag); 36 37 //创建射线(从点出发,向X方向,发射到块上) 38 tag_t Bodies[1] = { BodyTag }; 39 double Direction[3] = { 1.0, 0.0, 0.0 }; 40 double TransForm[16]; 41 UF_MTX4_identity(TransForm); 42 int num_results; 43 UF_MODL_ray_hit_point_info_p_t hit_list; 44 UF_MODL_trace_a_ray(1, Bodies, Point1, Direction, TransForm, 0, &num_results, &hit_list); 45 46 //判断射线与块是否有交点 47 if ( num_results == 0 ) 48 { 49 uc1601("提示:找不到射线交点", 1); 50 } 51 52 if ( num_results != 0 ) 53 { 54 //创建直线(连接发射点和射线与块的第一个交点) 55 NXOpen::Point3d StartPoint1{ Point1[0], Point1[1], Point1[2] }; 56 NXOpen::Point3d EndPoint1{ hit_list[0].hit_point[0], hit_list[0].hit_point[1], hit_list[0].hit_point[2] }; 57 NXOpen::Line *Line1; 58 Line1 = workPart->Curves()->CreateLine(StartPoint1, EndPoint1); 59 60 //赋予直线红色 61 UF_OBJ_set_color(Line1->Tag(), 186); 62 63 //创建直线(连接射线与块的第一个交点与第二个交点) 64 NXOpen::Point3d EndPoint2{ hit_list[1].hit_point[0], hit_list[1].hit_point[1], hit_list[1].hit_point[2] }; 65 NXOpen::Line *Line2; 66 Line2 = workPart->Curves()->CreateLine(EndPoint1, EndPoint2); 67 68 //赋予直线绿色 69 UF_OBJ_set_color(Line2->Tag(), 108); 70 71 //赋予第一个交点所在面为蓝色 72 tag_t FirstFaceTag = { hit_list[0].hit_face }; 73 UF_OBJ_set_color(FirstFaceTag, 211); 74 75 //赋予第二个交点所在面为紫色 76 tag_t SecondFaceTag = { hit_list[1].hit_face }; 77 UF_OBJ_set_color(SecondFaceTag, 164); 78 79 //打印坐标点和方向 80 char msg[256]; 81 sprintf_s(msg, "交点数量为:%d 射线与块第一个交点坐标为: X坐标:%f Y坐标:%f Z坐标:%f 射线与块第二个交点坐标为: X坐标:%f Y坐标:%f Z坐标:%f", 82 num_results,hit_list[0].hit_point[0], hit_list[0].hit_point[1], hit_list[0].hit_point[2], hit_list[1].hit_point[0], hit_list[1].hit_point[1], hit_list[1].hit_point[2]); 83 84 lw->Open(); 85 lw->WriteLine(msg); 86 } 87 88 UF_terminate();