NX二次开发—获得零件的底面基准

本文介绍了如何在Unigraphics环境中通过API获取显示部件的tag,并在已有的模型中找到底面基准,对符合条件的面进行颜色设置,展示了基础的交互和数据处理功能。

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

对已有的模型进行找底面基准,

在前面例子基础上加上获得显示部件的对象的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, &current_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, &current_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);
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值