一、创作灵感
在nx二次开发中我们经常会用到收集器,实现对对象的操作,下面结合UI界面实现对实体或者片体进行单独选择,然后分别对实体和片体进行染色,片体为绿色,实体为红色,这样做的的目的是实现对片体、实体的条件过滤;获取收集到的对象的TAG值,便于今后开发对相应对象的操作。
二、主要内容
1、整体思路
1.1过滤条件的设置
1)由于体收集器中的SetIncludeSheetBodies()成员函数无效,不能用来设置是否包括片体,只能通过其他方法进行实现;
2)找到过滤器程序部分,通过UF_MODL_ask_body_type()函数查询相应体的类型,判断是实体还是片体,其中UF_UI_SEL_ACCEPT为接受设置,UF_UI_SEL_REJECT为拒绝设置,通过判断body_type是否是UF_MODL_SOLID_BODY实体,还是UF_MODL_SHEET_BODY片体,进行过滤。
1.2实现对收集器收集到的对象进行操作
1)在NX二次开发中都需要对对象的TAG进行操作,因此有必要对UI体收集器收集到的对象进行遍历获得其TAG(bodys[i]->Tag());
2)一般的体收集器可以对一个或多个体或者片体进行收集,因此需要for循环进行遍历;
3)通过获取片体和实体的TAG,对实体和片体进行染色,片体为绿色,实体为红色(ufnu染色或者NXopen进行染色)。
2、代码部分
//用户定义
#include <uf.h>
#include <uf_modl.h>
#include <uf_obj.h>
#include <uf_ui.h>
#include <NXOpen/DisplayManager.hxx>
#include <NXOpen/DisplayModification.hxx>
#include <NXOpen/DisplayableObject.hxx>
//获取实体
PropertyList* bodySelect0Props = bodySelect0->GetProperties();
std::vector<NXOpen::TaggedObject *> bodys = bodySelect0Props->GetTaggedObjectVector("SelectedObjects");
delete bodySelect0Props;
bodySelect0Props = NULL;
//获取片体
PropertyList* bodySelect01Props = bodySelect01->GetProperties();
std::vector<NXOpen::TaggedObject *> sheets = bodySelect01Props->GetTaggedObjectVector("SelectedObjects");
delete bodySelect01Props;
bodySelect01Props = NULL;
UF_initialize();
UF_UI_open_listing_window();
char msg[256];
for (int i = 0; i < bodys.size(); i++)
{
tag_t bodyTAG = bodys[i]->Tag();
sprintf(msg, "%d\n", bodyTAG);
UF_UI_write_listing_window(msg);
UF_OBJ_set_color(bodyTAG, 186);
}
char msg1[256];
for (int i = 0; i < sheets.size(); i++)
{
tag_t sheetsTAG = sheets[i]->Tag();
sprintf(msg1, "%d\n", sheetsTAG);
UF_UI_write_listing_window(msg);
UF_OBJ_set_color(sheetsTAG, 36);
}
UF_terminate();
运行结果如下图所示:
总结
在1.2实现对收集器收集到的对象进行操作小节可以用通过获取片体和实体的TAG,对实体和片体进行染色,片体为绿色,实体为红色(ufnu染色),但目前为止NXopen进行染色部分还不会有会的兄弟欢迎下方评论)。