为了实现面的比对找到想要的基准面,做了一个案例模拟:
具体思路:为了获得电极类零件的基准面,需要比照面然后获得基准面
那么通过对零件的包容块同零件的面对照,只要面符合类型一致为平面,矢量一致,面积大小基本一致,那么就可以把这个面当成基准面。
所以需要查找面的参数,获得类型和矢量方向由函数UF_MODL_ask_face_data实现
获得面的面积通过函数UF_MODL_ask_mass_props_3d实现
然后通过两次循环比照零件体和包容体的面就可以实现。代码还可优化,仅供参考。
/*****************************************************************************
**
** 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>
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 */
UF_FEATURE_SIGN sign1;
tag_t block_tag;
block_tag = NULL_TAG;
tag_t body_tag = NULL_TAG;
double corner_point1[3] = { 0.0, 0.0, 0.0 };
char* edge_len[3] = { "200.0", "100.0","100.0" };
sign1 = UF_NULLSIGN;
tag_t blk_tag1 = NULL_TAG; // 现在是指针类型
//创建块
UF_MODL_create_block(sign1, block_tag, corner_point1, edge_len, &blk_tag1); // 不再需要取地址符号
UF_MODL_ask_feat_body(blk_tag1, &body_tag);
double box[6];
char* edge_1[3];
UF_MODL_ask_bounding_box
(
body_tag,
box
);//获得第一个块的极限尺寸(在绝对坐标系下的)
edge_1[0] = (char*)malloc(256);//分配动态内存
sprintf(edge_1[0], "%f", box[3] - box[0]);//把值转换成字符串
tag_t blk_tag11 = NULL_TAG;
char* edge_len1[3] = { "100.0", "100.0","100.0" };
edge_len1[2] = edge_1[0];
UF_MODL_create_block(UF_POSITIVE, body_tag, corner_point1, edge_len1, &blk_tag11);//创建一个同第一个块求和的块高200
char* edge_12[3];
double box1[6];
UF_MODL_ask_bounding_box
(
body_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_MODL_ask_feat_body(blk_tag1, &body_tag);//获得块的标识号,通过特征获得
uf_list_p_t face_list;//定义链表变量
UF_MODL_create_list(&face_list);//初始化链表
UF_MODL_ask_body_faces(body_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;
//UF_OBJ_set_color(face_tag, 1);//设定面颜色
//char buf[256];
//sprintf(buf, "已选择的整数变量的值为%d\n", i);
//uc1601(buf, 1);
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);//厘米和毫米单位换算
uc1601(SurfaceArea, 1);
//获得面的类型和法向及参考点
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);
//找圆柱侧面
//if (Type == 22)//对比面的类型
//{
// //对圆柱侧面设置颜色
// UF_OBJ_set_color(face_tag, 186);
// //打印面的法向方向
// char msg[256];
// sprintf(msg, "面的法向方向为:\nX:%.0f\nY:%.0f\nZ:%.0f\n", Dir[0], Dir[1], Dir[2]);
// uc1601(msg, 1);
for (int h = 0; h <= k - 1; h++)
{
UF_MODL_ask_list_item(face_list1, h, ¤t_face1);//获得具体面的标识号
tag_t face_tag1 = current_face1;
//UF_OBJ_set_color(face_tag, 1);//设定面颜色
//char buf[256];
//sprintf(buf, "已选择的整数变量的值为%d\n", i);
//uc1601(buf, 1);
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);//厘米和毫米单位换算
uc1601(SurfaceArea1, 1);
//获得面的类型和法向及参考点
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> 1.1) || (s < 0.9))
{
//对圆柱侧面设置颜色
UF_OBJ_set_color(face_tag, 186);
打印面的法向方向
//char msg[256];
//sprintf(msg, "面的法向方向为:\nX:%.0f\nY:%.0f\nZ:%.0f\n", Dir[0], Dir[1], Dir[2]);
//uc1601(msg, 1);
}
}
}
}
//打印
//double box[6];
//char* edge_1[3];
//UF_MODL_ask_bounding_box
//(
// body_tag,
// box
//);//获得第一个块的极限尺寸(在绝对坐标系下的)
//edge_1[0] = (char*)malloc(256);//分配动态内存
//sprintf(edge_1[0], "%f", box[3] - box[0]);//把值转换成字符串
//tag_t blk_tag11 = NULL_TAG;
//char* edge_len1[3] = { "100.0", "100.0","100.0" };
//edge_len1[2] = edge_1[0];
//UF_MODL_create_block(UF_POSITIVE, body_tag, corner_point1, edge_len1, &blk_tag11);//创建一个同第一个块求和的块高200
//char* edge_12[3];
//double box1[6];
//UF_MODL_ask_bounding_box
//(
// body_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);//创建包容块
//char bufc123[256];
//sprintf(bufc123, "\nMinimum z value: %f\n", box1[2]);
//uc1601(bufc123, 1);//输出这个块的z向最小值
//char bufc1234[256];
//sprintf(bufc1234, "\nMaximum z value: %f\n", box1[5]);
//uc1601(bufc1234, 1);//输出这个块的z向最大值
// 释放内存
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 );
}