思路:
1、采用UF_MODL_ask_mass_props_3d()函数,主要用来获取实体和片体的相关质量信息,包括体积、密度、表面积等;
2、该函数不支持选择一个面,因为这个面,既不是实体,也不是片体,可以对选择的面,进行抽取,抽取后得到片体,然后求出片体的表面积,就相当于选择面求了面积,最后删除抽取这个面即可。
详细代码如下:
//用户定义代码
#include <uf_modl.h>
#include <uf_ui.h>
#include <uf_obj.h>
#include <uf_assem.h>
//NX二次开发获取面面积方法一
UF_initialize();
//遍历实体对象,
std::vector<tag_t> body_collection;
int thetype, thesubtype, body_type;
tag_t objctTAG = NULL_TAG;
UF_OBJ_cycle_objs_in_part(UF_ASSEM_ask_work_part(),UF_solid_type,&objctTAG);
while (objctTAG != NULL_TAG)
{
UF_OBJ_ask_type_and_subtype(objctTAG, &thetype, &thesubtype);
if (thesubtype == UF_solid_body_subtype)//收集子类型为body
{
UF_MODL_ask_body_type(objctTAG, &body_type);
if (body_type == UF_MODL_SOLID_BODY)//收集body为实体的
{
body_collection.push_back(objctTAG);
}
}
UF_OBJ_cycle_objs_in_part(UF_ASSEM_ask_work_part(), UF_solid_type, &objctTAG);
}
//打印TAG
char msg[256];
UF_UI_open_listing_window();
uf_list_p_t faces_list;
int faces_count;
tag_t facesTAG = NULL_TAG, sheet_bodyTAG=NULL_TAG;
double acc_val[11] = { 0.01,0,0,0,0,0,0,0,0,0,0 };
double massprop[47];
double massprop_stat[13];
for (int i = 0; i < body_collection.size(); i++)
{
//获得所有实体的面
UF_MODL_ask_body_faces(body_collection[i], &faces_list);
UF_MODL_ask_list_count(faces_list, &faces_count);//一共多少个面
for (int j = 0; j < faces_count; j++)
{
UF_MODL_ask_list_item(faces_list, j, &facesTAG);//得到每一个面的TAG
UF_MODL_extract_face(facesTAG, 0, &sheet_bodyTAG);//抽取面,获得片体的tag
tag_t objects[1] = { sheet_bodyTAG };
UF_MODL_ask_mass_props_3d(objects, 1, 2, 3, 7.8, 1, acc_val, massprop, massprop_stat);
sprintf(msg, "%f mm^2 \n", massprop[0]*100.0);
UF_UI_write_listing_window(msg);
UF_OBJ_delete_object(sheet_bodyTAG);//删除抽取的面
}
UF_MODL_delete_list(&faces_list);//删除链表
}
UF_terminate();
运行结果如图所示: