NX二次开发-算法篇-随便找个不规则的体,找出面的中心点的Z坐标最高和最低的面,高亮显示

 1     NX9+VS2012
 2 
 3     #include <uf.h>
 4     #include <uf_evalsf.h>
 5     #include <NXOpen/Body.hxx>
 6     #include <NXOpen/Face.hxx>
 7     #include <uf_disp.h>
 8 
 9 
10     public:
11 
12         void SelectBody();
13 
14     void SelectUVFace::SelectBody()
15     {
16         UF_initialize();//初始化
17     
18         //获取体收集器控件
19         PropertyList*  BodySelectProps = bodySelect0->GetProperties();
20         std::vector<NXOpen::TaggedObject *> Bodys = BodySelectProps->GetTaggedObjectVector("SelectedObjects");
21         delete BodySelectProps;
22         BodySelectProps = NULL;
23         
24         NXOpen::Body *mybody = dynamic_cast<NXOpen::Body *>(Bodys[0]);//获取选择的体
25     
26         std::vector<Face*> face = mybody->GetFaces();//通过体获得所有面
27     
28         double z = -10000;
29         double z1 = 10000;
30         tag_t highest = NULL;//最高面TAG
31         tag_t lowest = NULL;//最低面TAG
32         for (int i = 0; i < face.size(); i++)//循环找到所有的面
33         {
34             //face[i]->Highlight();//高亮所有面
35             UF_EVALSF_p_t evaluator = NULL;
36             double uv_min_max[4] = {0.0, 1.0, 0.0, 1.0};
37             UF_EVALSF_initialize_2(face[i]->Tag(), &evaluator);//初始化一个面评估器结构    
38             UF_EVALSF_ask_face_uv_minmax(evaluator, uv_min_max);//计算u,v参数空间一个面的最小值、最大值
39     
40             double uv_pair[2] = {0.5 * (uv_min_max[0] + uv_min_max[1]), 0.5 * (uv_min_max[2] + uv_min_max[3])};
41             UF_MODL_SRF_VALUE_t surf_eval; 
42             UF_EVALSF_evaluate(evaluator, UF_MODL_EVAL_ALL, uv_pair, &surf_eval);
43     
44             Point3d origin(surf_eval.srf_pos[0], surf_eval.srf_pos[1], surf_eval.srf_pos[2]);//得到UV0.5的XYZ点坐标
45             Vector3d vector1(surf_eval.srf_unormal[0], surf_eval.srf_unormal[1], surf_eval.srf_unormal[2]);//得到UV面的向量
46             UF_EVALSF_free(&evaluator);
47     
48             if (z>surf_eval.srf_pos[2])//判断当Z值大于UV点Z值的时候
49             {
50                 z = z;
51             }
52             else//当Z值小于UV点Z值的时候
53             {
54                 z = surf_eval.srf_pos[2];//Z就等于UV点Z最大值
55                 highest = face[i]->Tag();//找到这个面
56             }
57     
58             if (z1<surf_eval.srf_pos[2])//判断当Z1值小于UV点Z值的时候
59             {
60                 z1 = z1;
61             }
62             else//当Z1值大于UV点Z值的时候
63             {
64                 z1 = surf_eval.srf_pos[2];//Z1就等于UV点Z最小值
65                 lowest = face[i]->Tag();//找到这个面
66             }
67     
68         }
69         //设置面高亮显示
70         UF_DISP_set_highlight(highest, 1);
71         UF_DISP_set_highlight(lowest, 1);
72     
73         UF_terminate();//终止
74     }

原文地址:https://www.cnblogs.com/nxopen2018/p/10957425.html