今天看到胡工对bounding_box的分享,我也来测试一番(原帖地址:https://www.ugapi.com/thread-10287.html)

获取对象的边界盒子的三个函数:

1 UF_MODL_ask_bounding_box      //只能得到绝对坐标系下的边界盒子,速度快,结果不精确 
2 UF_MODL_ask_bounding_box_aligned //可以得到指定坐标系下的盒子,速度快,结果不精确
3 UF_MODL_ask_bounding_box_exact   //可以得到指定坐标系下的盒子,速度慢,结果精确

运行时间测试: 

 

生成上面这个3D产品的边界包容盒100次,测试的结果为:

UF_MODL_ask_bounding_box_exact的速度还是挺慢的

函数例子:

  1 //box
2 #include "Text.h"
3 static int init_proc(UF_UI_selection_p_t select, void *user_data)
4 {
5 int errorCode = 0;
6 int num_triples = 1; //选择类型 数量
7 UF_UI_mask_t mask_triples[] = { UF_solid_type,0,0 }; //定义选择类型
8
9 errorCode = UF_UI_set_sel_mask(select, UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, num_triples, mask_triples);
10 if (errorCode == 0)
11 {
12 return UF_UI_SEL_SUCCESS;
13 }
14 else
15 {
16 return UF_UI_SEL_FAILURE;
17 }
18 }
19
20 extern DllExport void ufusr(char *param, int *returnCode, int rlen)
21 {
22 UF_initialize();
23 char *message = "提示";
24 char *title = "标题";
25 int scope = UF_UI_SEL_SCOPE_ANY_IN_ASSEMBLY;//选取范围
26 int response;
27 int count = 0;
28 tag_p_t object;
29 UF_UI_select_with_class_dialog(message, title, scope, init_proc, NULL, &response, &count, &object);
30 for (int i = 0; i < count; i++)
31 {
32 tag_t tagObj = object[i];
33 UF_DISP_set_highlight(tagObj, 0);
34 //---------------------- Enter your callback code here -------------------
35 double block_corner_pt[3];
36 char charC[132] = "";
37 char charK[132] = "";
38 char charG[132] = "";
39 char * edge_len[3] = { "","","" };
40
41 //UF_MODL_ask_bounding_box
42 double bounding_box[6];
43 UF_MODL_ask_bounding_box(tagObj, bounding_box);
44 //创建方块
45 tag_t tagBox;
46 block_corner_pt[0] = bounding_box[0];
47 block_corner_pt[1] = bounding_box[1];
48 block_corner_pt[2] = bounding_box[2];
49 sprintf(charC, "%f", abs(bounding_box[0]-bounding_box[3]));
50 sprintf(charK, "%f", abs(bounding_box[1]-bounding_box[4]));
51 sprintf(charG, "%f", abs(bounding_box[2]-bounding_box[5]));
52 edge_len[0] = charC;
53 edge_len[1] = charK;
54 edge_len[2] = charG;
55 UF_MODL_create_block1(UF_NULLSIGN, block_corner_pt, edge_len, &tagBox);
56
57
58 //UF_MODL_ask_bounding_box_aligned
59 tag_t tagWcsTemp = NULL_TAG;
60 UF_CSYS_ask_wcs(&tagWcsTemp);
61 double pDblMin_corner[3] = { 0,0,0 };
62 double pDblminDirections[3][3];
63 double pDbDistances[3] = { 0,0,0 };
64 UF_MODL_ask_bounding_box_aligned(tagObj, tagWcsTemp, FALSE, pDblMin_corner, pDblminDirections, pDbDistances);
65 //创建方块
66 block_corner_pt[0] = pDblMin_corner[0];
67 block_corner_pt[1] = pDblMin_corner[1];
68 block_corner_pt[2] = pDblMin_corner[2];
69 sprintf(charC, "%f", pDbDistances[0]);
70 sprintf(charK, "%f", pDbDistances[1]);
71 sprintf(charG, "%f", pDbDistances[2]);
72 edge_len[0] = charC;
73 edge_len[1] = charK;
74 edge_len[2] = charG;
75 UF_MODL_create_block1(UF_NULLSIGN, block_corner_pt, edge_len, &tagBox);
76
77
78 //UF_MODL_ask_bounding_box_exact
79 double pDblBodyBox[3];
80 double directions[3][3];
81 double distances[3];
82 UF_MODL_ask_bounding_box_exact(tagObj, tagWcsTemp, pDblBodyBox, directions, distances);
83 //创建方块
84 block_corner_pt[0] = pDblBodyBox[0];
85 block_corner_pt[1] = pDblBodyBox[1];
86 block_corner_pt[2] = pDblBodyBox[2];
87 sprintf(charC, "%f", distances[0]);
88 sprintf(charK, "%f", distances[1]);
89 sprintf(charG, "%f", distances[2]);
90 edge_len[0] = charC;
91 edge_len[1] = charK;
92 edge_len[2] = charG;
93 UF_MODL_create_block1(UF_NULLSIGN, block_corner_pt, edge_len, &tagBox);
94
95
96 //------------------------------------------------------------------------
97 }
98 UF_terminate();
99 }
100
101 extern int ufusr_ask_unload(void)
102 {
103 return (UF_UNLOAD_IMMEDIATELY);
104 }

效果:

【NX二次开发】获取对象边界包容盒的三个函数UF_MODL_ask_bounding_box的更多相关文章

  1. NX二次开发-获取WCS坐标系的原点坐标和矩阵标识

    函数:UF_CSYS_ask_csys_info() 函数说明:获取工作坐标系对象的标识符. 用法: #include <uf.h> #include <uf_csys.h> ...

  2. NX二次开发-获取WCS标识

    函数:UF_CSYS_ask_wcs() 函数说明:获取工作坐标系对象的标识. 用法: 1 #include <uf.h> 2 #include <uf_csys.h> 3 e ...

  3. NX二次开发-获取面的法向向量UF_MODL_ask_face_data

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> #include <u ...

  4. NX二次开发-获取切换按钮的当前状态UF_MB_ask_toggle_state

    NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...

  5. NX二次开发-获取按钮的ID UF_MB_ask_button_id

    NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...

  6. NX二次开发-获取WCS标识UF_CSYS_ask_wcs

    NX9+VS2012 #include <uf.h> #include <uf_csys.h> UF_initialize(); //获取WCS标识 tag_t WcsId = ...

  7. NX二次开发-获取坐标系信息UF_CSYS_ask_csys_info

    NX9+VS2012 #include <uf.h> #include <uf_csys.h> UF_initialize(); //获取WCS标识 tag_t WcsId = ...

  8. NX二次开发-获取矩阵值UF_CSYS_ask_matrix_values

    NX9+VS2012 #include <uf.h> #include <uf_csys.h> UF_initialize(); //获取WCS标识 tag_t WcsId = ...

  9. NX二次开发-获取工程图尺寸的值UF_DRF_ask_dim_info

    UF_initialize(); //遍历所有尺寸 ; tag_t DimTag = NULL_TAG; UF_OBJ_cycle_objs_in_part1(UF_PART_ask_display_ ...

随机推荐

  1. 用 vitePress 快速创建一个文档项目

    其实开发一个项目最需要的就是操作文档,文档的质量决定了项目的开发流程,开发规范等等. 对于前端框架来说,文档最友好的还是vue,不仅是中国人的框架,而且文档支持了中文.仔细查看 Vue 的官方文档,还 ...

  2. Java并发容器篇

    作者:汤圆 个人博客:javalover.cc 前言 断断续续一个多月,也写了十几篇原创文章,感觉真的很不一样: 不能说技术有很大的进步,但是想法确实跟以前有所不同: 还没开始的时候,想着要学的东西太 ...

  3. .NET 在信创常用软件适配清单之中?

    2020年8月份写了一篇文章<.NET Core也是国产化信息系统开发的重要选项>, 这又过去了大半年了,在信创领域发生了很大的变化,今天写这篇文章主要是想从信创常用软件适配清单 看一看. ...

  4. 玩转直播系列之RTMP协议和源码解析(2)

    一.背景 实时消息传输协议(Real-Time Messaging Protocol)是目前直播的主要协议,是Adobe公司为Flash播放器和服务器之间提供音视频数据传输服务而设计的应用层私有协议. ...

  5. 01 CTF MISC 杂项 知识梳理

    1.隐写术( steganograhy ) 将信息隐藏到信息载体,不让计划的接收者之外的人获取信息.近几年来,隐写术领域已经成为了信息安全的焦点.因为每个Web站点都依赖多媒体,如音频.视频和图像.隐 ...

  6. prometheus node-exporter增加新的自定义监控项

    项目中collector中新增加自己所需监控项即可 定义启动node-exporter是传入的参数 var ( phpEndPoint = kingpin.Flag("collector.p ...

  7. [刷题] PTA 02-线性结构3 Reversing Linked List

    链表逆序 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 using namesp ...

  8. linux操作系统故障处理-ext4文件系统超级块损坏修复

    linux操作系统故障处理-ext4文件系统超级块损坏修复   背景 前天外面出差大数据测试环境平台有7台服务器挂了,同事重启好了五台服务器,但是还有两台服务器启动不起来,第二天回来后我和同事再次去机 ...

  9. mysql基础之忘掉密码解决办法及恢复root最高权限办法

    如果忘记了mysql的root用户的密码,可以使用如下的方法,重置root密码. 方法一: 1.停止当前mysql进程 systemctl stop mariadb 2.mysql进程停止后,使用如下 ...

  10. linux服务器环境安全防范教程

    一.目录权限设置很重要:可以有效防范黑客上传木马文件. 如果通过 chmod 644 * -R 的话,php文件就没有权限访问了. 如果通过chmod 755 * -R 的话,php文件的权限就高了. ...