对已有的模型进行找底面基准,
在前面例子基础上加上获得显示部件的对象的tag的代码拼接上就可以了。
获得显示部件tag需要使用 UF_PART_ask_display_part()和UF_OBJ_cycle_all()实现。
/*****************************************************************************
**
** NXOpen_Wizard10.c
**
** Description:
** Contains Unigraphics entry points for the application.
**
*****************************************************************************/
/* Include files */
#include <stdarg.h>
#include <stdio.h>
#include <uf.h>
#include <uf_ui_types.h>
#include <uf_ui.h>
#include <uf_obj.h>
#include <uf_modl.h>
#include <stdlib.h>
#include <uf_part.h>
static void ECHO(char *format, ...)
{
char msg[UF_UI_MAX_STRING_BUFSIZE];
va_list args;
va_start(args, format);
vsnprintf_s(msg, sizeof(msg), _TRUNCATE, format, args);
va_end(args);
UF_UI_open_listing_window();
UF_UI_write_listing_window(msg);
UF_print_syslog(msg, FALSE);
}
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))
static int report_error(char *file, int line, char *call, int irc)
{
if (irc)
{
char err[133];
UF_get_fail_message(irc, err);
ECHO("*** ERROR code %d at line %d in %s:\n",
irc, line, file);
ECHO("+++ %s\n", err);
ECHO("%s;\n", call);
}
return(irc);
}
/*****************************************************************************
** Activation Methods
*****************************************************************************/
/* Explicit Activation
** This entry point is used to activate the application explicitly, as in
** "File->Execute UG/Open->User Function..." */
extern DllExport void ufusr(char *parm, int *returnCode, int rlen)
{
/* Initialize the API environment */
if (UF_CALL(UF_initialize()))
{
/* Failed to initialize */
return;
}
/* TODO: Add your application code here */
tag_t bodyofwork_tag = NULL_TAG;
tag_t object = NULL_TAG;
tag_t DisplayTag_body = UF_PART_ask_display_part();//获取当前显示部件
//以下代码:获取当前显示部件的对象tag
object = UF_OBJ_cycle_all(DisplayTag_body, object);
while (object != NULL_TAG)
{
int type = 0, subtype = 0;
UF_OBJ_ask_type_and_subtype(object, &type, &subtype);//获得对象类型
if (type == UF_solid_type && 0 == subtype)
{//实体
UF_OBJ_set_color(object, 1);//设置颜色
bodyofwork_tag = object;
}
object = UF_OBJ_cycle_all(DisplayTag_body, object);
}
//以下代码:获取零件的极限尺寸并创建包容块
double corner_point1[3] = { 0.0, 0.0, 0.0 };
char* edge_12[3];
double box1[6];
UF_MODL_ask_bounding_box
(
bodyofwork_tag,
box1
);
edge_12[0] = (char*)malloc(256);
sprintf(edge_12[0], "%f", box1[3] - box1[0]);
edge_12[1] = (char*)malloc(256);
sprintf(edge_12[1], "%f", box1[4] - box1[1]);
edge_12[2] = (char*)malloc(256);
sprintf(edge_12[2], "%f", box1[5] - box1[2]);
tag_t blk_tag12 = NULL_TAG;
tag_t body_tag1 = NULL_TAG;
char* edge_len12[3] = { "100.0", "100.0","100.0" };
edge_len12[0] = edge_12[0];
edge_len12[1] = edge_12[1];
edge_len12[2] = edge_12[2];
UF_MODL_create_block(UF_NULLSIGN, NULL_TAG, corner_point1, edge_len12, &blk_tag12);//创建包容块
//以下代码:获取包容块和零件的面列表
uf_list_p_t face_list;//定义链表变量
UF_MODL_create_list(&face_list);//初始化链表
UF_MODL_ask_body_faces(bodyofwork_tag, &face_list);//通过体特征获得面的链表
UF_MODL_ask_feat_body(blk_tag12, &body_tag1);//获得包容块的标识号,通过特征获得
uf_list_p_t face_list1;//定义链表变量
UF_MODL_create_list(&face_list1);//初始化链表
UF_MODL_ask_body_faces(body_tag1, &face_list1);
int i = 0, k = 0;//面链表的序号值
tag_t current_face = NULL_TAG;
tag_t current_face1 = NULL_TAG;
UF_MODL_ask_list_count(face_list, &i);//获得面组的总数量
UF_MODL_ask_list_count(face_list, &k);
//以下代码:遍历零件和包容块所有面,比照得到底面基准,并改为红色
for (int j = 0; j <= i - 1; j++)
{
UF_MODL_ask_list_item(face_list, j, ¤t_face);//获得具体面的标识号
tag_t face_tag = current_face;
double acc_val[11] = { 0.01,0,0,0,0,0,0,0,0,0,0 };
double mass_props[47];
double statistics[13];
tag_t sheet_body = NULL_TAG;
UF_MODL_extract_face(face_tag, 0, &sheet_body);
UF_MODL_ask_mass_props_3d(&sheet_body, 1, 2, 3, 1.0, 1, acc_val, mass_props, statistics);
char SurfaceArea[256];
sprintf(SurfaceArea, "%f", mass_props[0] * 100);//厘米和毫米单位换算
int Type;
double Point[3];
double Dir[3];
double Box[6];
double Radius[3];
double RadData[3];
int NormDir;
UF_MODL_ask_face_data(face_tag, &Type, Point, Dir, Box, Radius, RadData, &NormDir);
for (int h = 0; h <= k - 1; h++)
{
UF_MODL_ask_list_item(face_list1, h, ¤t_face1);//获得具体面的标识号
tag_t face_tag1 = current_face1;
double acc_val1[11] = { 0.01,0,0,0,0,0,0,0,0,0,0 };
double mass_props1[47];
double statistics1[13];
tag_t sheet_body1 = NULL_TAG;
UF_MODL_extract_face(face_tag1, 0, &sheet_body1);
UF_MODL_ask_mass_props_3d(&sheet_body1, 1, 2, 3, 1.0, 1, acc_val1, mass_props1, statistics1);
char SurfaceArea1[256];
sprintf(SurfaceArea1, "%f", mass_props1[0] * 100);//厘米和毫米单位换算
int Type1;
double Point1[3];
double Dir1[3];
double Box1[6];
double Radius1[3];
double RadData1[3];
int NormDir1;
UF_MODL_ask_face_data(face_tag1, &Type1, Point1, Dir1, Box1, Radius1, RadData1, &NormDir1);
double s;
s = mass_props1[0] / mass_props[0];
if (Type1 == 22 && Type == 22 && Dir[0] == Dir1[0] && Dir[1] == Dir1[1] && Dir[2] == Dir1[2])//对比面的类型
{
if (!(s > 100/95) || (s < 0.95))
{
UF_OBJ_set_color(face_tag, 186);
}
}
}
}
// 释放内存
UF_MODL_delete_list(&face_list);
/*free(edge_1[0]);*/
free(edge_12[0]);
free(edge_12[1]);
free(edge_12[2]);
/* Terminate the API environment */
UF_CALL(UF_terminate());
}
/*****************************************************************************
** Utilities
*****************************************************************************/
/* Unload Handler
** This function specifies when to unload your application from Unigraphics.
** If your application registers a callback (from a MenuScript item or a
** User Defined Object for example), this function MUST return
** "UF_UNLOAD_UG_TERMINATE". */
extern int ufusr_ask_unload(void)
{
return(UF_UNLOAD_IMMEDIATELY);
}
结果