NX二次开发-比对面的实现

该篇文章详细描述了如何通过Unigraphics中的函数UF_MODL_ask_face_data和UF_MODL_ask_mass_props_3d来获取电极类零件的基准面,通过对比零件体和包容体的面,实现面的匹配并确定基准面的过程,以及相关的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 为了实现面的比对找到想要的基准面,做了一个案例模拟:

具体思路:为了获得电极类零件的基准面,需要比照面然后获得基准面

那么通过对零件的包容块同零件的面对照,只要面符合类型一致为平面,矢量一致,面积大小基本一致,那么就可以把这个面当成基准面。

所以需要查找面的参数,获得类型和矢量方向由函数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, &current_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, &current_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 );
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值