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

时间: 2024-08-30 11:08:30

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

NX二次开发-算法篇-找相切面

方法1:通过判断相邻面公共边的光顺性来找相切面 1 #include <uf.h> 2 #include <uf_modl.h> 3 #include <uf_obj.h> 4 5 6 UF_initialize(); 7 8 9 //获取面的所有边 10 uf_list_p_t edge_list; 11 UF_MODL_ask_face_edges(42084, &edge_list); 12 13 //获取链表的数量 14 int count; 15 UF

NX二次开发-算法篇-创建最大边界包容盒

1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_obj.h> 5 #include <uf_modl.h> 6 #include <uf_part.h> 7 8 UF_initialize(); 9 10 //遍历当前显示部件所有体 11 std::vector<tag_t> SolidVector; 12 tag_t ObjectTag = NULL_TAG; 13 int Type, SubTy

NX二次开发-算法篇-判断找到两个数组里不相同的对象

1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_curve.h> 5 #include <uf_modl.h> 6 #include <vector> 7 #include <uf_disp.h> 8 9 10 UF_initialize(); 11 12 //第一步,创建5条直线 13 UF_CURVE_line_t Coords1; 14 Coords1.start_point[0] = 0.0

NX二次开发-算法篇-vector函数排序(例子:遍历所有点并排序)

1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_curve.h> 6 #include <uf_obj.h> 7 #include <uf_part.h> 8 #include <vector> 9 #include <algorithm> 10 11 using namespace std; 12 13 14 UF_initiali

NX二次开发-算法篇-冒泡排序(例子:遍历所有点并排序)

1 NX9+VS2012 2 3 4 #include <uf.h> 5 #include <uf_ui.h> 6 #include <uf_curve.h> 7 #include <uf_obj.h> 8 #include <uf_part.h> 9 #include <vector> 10 11 using namespace std; 12 13 14 15 UF_initialize(); 16 17 //遍历前有一点需要注意

NX二次开发-NX+VS写代码设断点调试技巧

在做NX二次开发的时候写完代码,编译可以通过,但是执行的时候却没有反应,或者得到的结果不对,说明肯定有地方传值出错了.我在查找代码错误的时候有几种方法:1.uc1601打印函数输入和输出的值看对不对.2.VS设断点-添加进程调试,来看输入输出值对不对3.UF_CALL也就是UF_get_fail_message这个函数,来看函数自己用的对不对.4.查看NX-Help-LogFile(日志),拖到最后看提示了哪些错误. 我一般用的比较多的是设断点调试,这里先说设断点调试.其他方法改天再写. 写举一

NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))

在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article/details/88922030 这篇博客,要不然你听不懂我下面在说什么. 版本NX11+VS2013+office2016 首先我们通过NX开发向导创建了一个模板. 先把项目属性改成多字节.下面我们把前面做的MFC项目里的几个EXCAL头文件和stdafx一块拷过来,加到NX的项目里. 在NX的

NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的方法,无论C++还是C#还是VB方式思路都是一样的.先介绍用MFC去做,然后在写一篇博客介绍怎么在NX的二次开发的向导模板里去做.NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article

Visual Stadio 与NX二次开发的环境配置(以VS2010、NX10.0为例)

问题描述: 许多博文发布了关于Visual Stadio 与NX二次开发的环境配置,这些博文的提示事修改了文件NX10_Open.vsz中的引擎为10.0,但实际结果是创建C++引导失败. 问题解决概述: 创建正确引导应该同时修改NX10_Open.vsz与NX10_NXOpenCPP.vsz两个文件的引擎版本号. 解决步骤: 将NX10.0 UGOPEN目录下的所有文件夹(VB.VC.VC#)复制,并粘贴到Visual Stadio 2010安装目录下与对应的文件夹合并即可(覆盖). 例如,将