NX二次开发常用函数:UF_MODL_ask_feat_......(二)

        最近学习NX二次开发发现有一些函数经常使用,俗话说得好,好记性不如烂笔头,现在做一下笔记,帮助理解。

UF_MODL_ask_feat_......在头文件uf_modl.h

1、UF_MODL_ask_feat_direction (查询特征的方向)

概述:获得特征的方向,特征的方向取决于特性类型。有的特征有一个或两个方向,有些则一个都没有。

适用环境:内部或者外部模式

参考:列表 list特征和他们的方向

tag_t (tag_t类型)	feature_obj_id	Input(输入)	特征对象的TAG值
double (实数型)	    dir_x [ ]	    Output(输出)	X方向
double (实数型)	    dir_y [ ]	    Output(输出)	Y方向

实例:通过特征找X、Y的方向,并打印特征的方向值

    UF_initialize();
	//创建块
	UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
	double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点
	char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
	tag_t BlkTag = NULL_TAG;
	UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);

	//查找特征的X,Y方向(可能一个或两个,也可能一个都没有)
	tag_t dirTag = BlkTag;
	double dir_x[3], dir_y[3];
	UF_MODL_ask_feat_direction(dirTag, dir_x, dir_y);

	//打印坐标
	char msg[256];
	sprintf(msg, "dir_x:%f,%f,%f\n", dir_x[0], dir_x[1], dir_x[2]);
	print(msg);
	char msg1[256];
	sprintf(msg1, "dir_y:%f,%f,%f\n", dir_y[0], dir_y[1], dir_y[2]);
	print(msg1);

	UF_terminate();

块有X、Y坐标

2、UF_MODL_ask_feat_name (查询特征的名字)

概述:返回包含特征类型和时间戳的字符串。例如,如果你创建了两个块,它们会
时间戳为BLOCK(0)和BLOCK(1)。

适用环境:内部或者外部模式

参考:example

tag_t (tag_t类型)	feature_tag	    Input(输入)	            特征的TAG值
char * *	        feature_name	Output to be freed(输出)   包含特征名称(特征类型和时间戳),并使用UF_free释放内存

实例:通过特征找名字,并打印特征的名字

	UF_initialize();
	//创建块
	UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
	double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点
	char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
	tag_t BlkTag = NULL_TAG;
	UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);

	//查找特征名字
	char *feature_name = NULL;
	UF_MODL_ask_feat_name(BlkTag, &feature_name);
	//打印名字
	print(feature_name);
	//释放内存
	UF_free(feature_name);

	UF_terminate();

3、UF_MODL_ask_feat_display_name (查询特征的名字)

概述:获取给特征的显示名称。

适用环境:内部或者外部模式

tag_t (tag_t类型)	feature_tag	    Input(输入)	            特征的TAG值
char * *	        feature_name	Output to be freed(输出)   获得特征的显示名称,并使用UF_free释放内存

实例:通过特征找名字,并打印特征的名字

	UF_initialize();
	//创建块
	UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
	double Corner_pt[3] = { 0.0, 0.0, 0.0 };//设置原点
	char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
	tag_t BlkTag = NULL_TAG;
	UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);

	//查找特征名字
	char *feature_name = NULL;
	UF_MODL_ask_feat_name(BlkTag, &feature_name);
	//打印名字
	print(feature_name);
	//释放内存
	UF_free(feature_name);

	UF_terminate();

 4、UF_MODL_ask_feat_location (查询特征在绝对坐标系下的位置)

概述:查询单个特征对象并检索该特征在绝对坐标系中的位置。特征的位置取决于特征类型。

适用环境:内部或者外部模式

tag_t (tag_t类型)	feature_obj_id	Input(输入)	特征对象的TAG值
double (实数型)	    location [ ]	Output(输出)	特征在绝对坐标系下的位置

实例:通过特征找特征的位置,并打印特征的位置坐标

    UF_initialize();
	//创建块
	UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
	double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
	char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
	tag_t BlkTag = NULL_TAG;
	UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);

	//查找特征在绝对坐标系下的位置
	double location[3];
	UF_MODL_ask_feat_location(BlkTag, location);

	//打印特征在绝对坐标系下的位置
	char msg[256];
	sprintf(msg, "location:%f,%f,%f\n", location[0], location[1], location[2]);
	print(msg);

	UF_terminate();

 5、UF_MODL_ask_feat_object (根据特征查询对象,一个特征可能对应多个对象)

概述:根据特征获取对象的TAG值,函数返回类型对于平面返回UF_datum_plane_type对象标识符,对于轴返回UF_datum_axis_type的对象标识符,对于曲线返回UF_sketch_type类型的对象标识符,曲线特征(如投影曲线,提取…)返回对象曲线标识符。

适用环境:内部或者外部模式

tag_t (tag_t类型)	feature	Input(输入)	            特征对象的TAG值
int * (整数型指针)	n_eids	Output(输出)	            对象的数量
tag_t * *	        eids	Output to be freed(输出)   对象数组并释放内存

实例:通过特征找对象的TAG值,并打印特征tag值和对象tag值,以及通过特征找体将实体进行染色

 	UF_initialize();
	//创建块
	UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
	double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
	char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
	tag_t BlkTag = NULL_TAG;
	UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);

	//特征查询对象,一个特征可能对应多个对象
	int n_eids = 0;
	tag_t *eids = NULL;
	UF_MODL_ask_feat_object(BlkTag, &n_eids, &eids);
	for (int i = 0; i < n_eids; i++)
	{
		//打印特征tag值和对象tag值
		char msg[256];
		sprintf(msg, "FeatureTAG:%d\n", BlkTag);
		print(msg);
		char msg1[256];
		sprintf(msg1, "objectTAG:%d\n", eids[i]);
		print(msg1);
		//将对象染色
		tag_t bodyTAG = NULL_TAG;
		UF_MODL_ask_feat_body(eids[i], &bodyTAG);
		UF_OBJ_set_color(bodyTAG, 186);

	}
	UF_terminate();

6、UF_MODL_ask_feat_relatives (根据特征查询与特征相关的联系)

概述:获取特征的亲属(父母和孩子)。这个函数适用于所有功能,包括基准,草图和投影曲线。

适用环境:内部或者外部模式

参考: example

tag_t (tag_t类型)	feature_tag    Input(输入)	                    特征的tag值
int * (整数型指针)	num_parents    Output(输出)	                关联父亲的TAG值的数量
tag_t * *	        parent_array   Output to be freed输出并释放	    存储父亲TAG值的组数,使用UF_free释放
int * (整数型指针)	num_children	Output(输出)	                关联儿子的TAG值的数量
tag_t * *	        children_array	Output to be freed输出并释放	    存储儿子TAG值的组数,使用UF_free释放

实例遍历当前工作部件的特征及关系

	try
	{
		UF_initialize();
		//获得当前工作坐标系的部件TAG
		tag_t part_tag  = UF_ASSEM_ask_work_part();
		遍历工作坐标系的所有对象
		int enttype = UF_feature_type;
		tag_t feat1 = NULL_TAG;
		char *feat_type;
		int index = 0;
		tag_t master_feature = NULL_TAG;
		int num_parents = 0, num_children = 0;
		tag_t * parent_array, *children_array;
		do
		{
			UF_OBJ_cycle_objs_in_part(part_tag, enttype, &feat1);
			if (feat1 == NULL_TAG) break;
			/* 获得特征类型 */
			UF_MODL_ask_feat_type(feat1, &feat_type);
			char msg[256];
			sprintf(msg, "feature %d = %u is of type %s\n", index, feat1, feat_type);
			print(msg);
			++index;
			/* If the feature is an INSTANCE(instance), then get the master feature and its type */
			if (feat_type!="INSTANCE")
			{
				UF_MODL_ask_master(feat1, &master_feature);
				UF_MODL_ask_feat_type(master_feature, &feat_type);
				char msg1[256];
				sprintf(msg1, "master feature %u is of type = %s\n", master_feature, feat_type);
				print(msg1);
			}
			//特征查询与特征相关的联系
			UF_MODL_ask_feat_relatives(feat1, &num_parents,&parent_array, &num_children, &children_array);
			char msg2[256];
			sprintf(msg2,"parent array for %u contains %d members:\n",feat1, num_parents);
			print(msg2);
			if (num_parents > 0)
			{
				for (int i = 0; i < num_parents; i++)
				{
					UF_MODL_ask_feat_type(parent_array[i],&feat_type);
					char msg3[256];
					sprintf(msg3,"parent id %d = %u is of feature type %s\n",i, parent_array[i], feat_type);
					print(msg3);
				}
			}
			char msg4[256];
			sprintf(msg4,"children array for feature %u contains %d members:\n",feat1, num_children);
			print(msg4);
			if (num_children > 0)
			{
				for (int j = 0; j < num_children; j++)
				{
					UF_MODL_ask_feat_type(children_array[j], &feat_type);
					char msg5[256];
					sprintf(msg5,"child id %d = %u is of feature type %s\n", j, children_array[j], feat_type);
					print(msg5);
				}
			}
			UF_free(parent_array);
			UF_free(children_array);
		}while (feat1);
		UF_free(feat_type);

		UF_terminate();
	}
	catch (const NXException& e1)
	{
		UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
	}

7、UF_MODL_ask_feat_sysname(根据特征查询特征的系统名字)

概述:返回特征的全名(类型和时间戳)。这个名字是NX系统定义的名称,并不能反映重命名用户除非该功能是UDF可能应用到的功能。如果输入功能是用户定义特征(UDF)系统功能名称相比于任何名称“用户定义特征”被认为是微不足道的由用户施加。 UDF功能将返回用户应用功能名称。在一些情况下,特征类型的进一步改进时,只需要区分哪些功能是一个给定的功能使用。 例如,UF_MODL_ask_feat_type将表明一个特点是横扫,但进一步的需要的特征的细化知道UF_MODL_ask_extrusion或所述UF_MODL_ask_sweep...功能可以用于检索参数对于给定的横扫
对于给定的SWEEP。

适应环境:内部和外部环境

参考:UF_MODL_ask_feat_name
UF_MODL_ask_feat_type

tag_t (tag_t类型)	feature_eid	    Input(输入)	                特征的TAG值
char * *	        feature_name	Output to be freed输出并释放	    特征的全名,并使用UF_free释放内存
	UF_initialize();
	//创建块
	UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
	double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
	char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
	tag_t BlkTag = NULL_TAG;
	UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);

	//查找特征全名sysname
	char *sysname_name = NULL;
	UF_MODL_ask_feat_sysname(BlkTag, &sysname_name);
	//打印名字
	print(sysname_name);
	//释放内存
	UF_free(sysname_name);

	UF_terminate();

8、UF_MODL_ask_feat_tolerance(查询特征的公差)

概述:获得特征的公差

适用环境:内部和外部

tag_t (tag_t类型)	    feature_obj_id	    Input(输入)	特征的TAG值
logical *	            tolerance_exists	Output(输出)	返回TRUE表示特征存在距离公差
double * (实数型指针)	tolerance	        Output(输出)	特征距离公差
	//创建块
	UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
	double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
	char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
	tag_t BlkTag = NULL_TAG;
	UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);

	//查找特征公差
	logical tolerance_exists;
	double tolerance = 0;
	UF_MODL_ask_feat_tolerance(BlkTag, &tolerance_exists,&tolerance);
	//打印名字
	char msg[256];
	sprintf(msg, "feature_tolerance %f", tolerance);
	print(msg);

	UF_terminate();

这里试了好几次公差都为零,个人人为公差没有问题,当时人为是建模公差等同不过最后为0,如果有知道的可以交流,一般也用不到这个函数,这里只是个人学习笔记。

9、UF_MODL_ask_feature_sign查询特征的符号(是否求布尔)

概述;获取特性的符号。输入特征的对象标识符,这个例程检索“符号”。“符号”是表示所执行布尔运算类型的数值。

适用环境:内部和外部

tag_t (tag_t类型)	feature_obj_id	Input(输入)	特征的TAG值
UF_FEATURE_SIGN *	sign	        Output(输出)	特征的符号标识

//符号表标识如下:
UF_NULLSIGN = 0, create new target solid
UF_POSITIVE = 1, add to target solid
UF_NEGATIVE = 2, subtract from target solid
UF_UNSIGNED = 3, intersect with target solid
UF_DEFORM_POSITIVE = 9, deform on the positive side of target
UF_DEFORM_NEGATIVE = 10 deform on the negative side of target

10、UF_MODL_ask_feature_boolean(查询特征的布尔)

概述:返回关于实体特征的布尔状态的信息。

适用环境:内部和外部

参考:UF_MODL_ask_feat_name
feature_name_test.c

tag_t (tag_t类型)	feature_obj_id	Input(输入)	特征的TAG值
UF_FEATURE_SIGN *	boolean_status	Output(输出)	特征的布尔状态
//特征的布尔状态
UF_NO_BOOLEAN - feature has not been booleaned.
UF_TOP_TARGET - feature is not booleaned into any other features but has at least one tool as a child.
UF_UNITE - feature has been united to a target solid.
UF_SUBTRACT - feature has been subtracted from a target solid.
UF_INTERSECT - feature has been intersected with a target solid.
UF_DEFORM_POSITIVE - feature used to deform the positive side of the target sheet.
UF_DEFORM_NEGATIVE - feature used to deform the negative side of the target sheet.

11、UF_MODL_ask_features_of_mirror_set (查询特征镜像)

概述、这个函数要求镜集内的所有特征。例程将只返回输入特征,以请求输出特性使用UF_MODL_ask_all_members_of_set()。

适用环境:内部和外部

参考:UF_MODL_ask_all_members_of_set

12、UF_MODL_ask_features_of_exp (查询特征的使用的表达式)

概述:获取使用所提供表达式的所有特性

适用环境:内部和外部

参考:UF_MODL_ask_exps_of_feature
UF_MODL_ask_exps_of_part
please refer to example

13、UF_MODL_ask_feat_type (查询特征的类型)

概述、获得特征类型

适用环境:内部和外部

参考:UF_MODL_ask_feat_name
feature_name_test.c

tag_t (tag_t类型)	feature_obj_id	Input(输入)	                特征的TAG值
char * *	        feature_type	Output to be freed 输出并释放	特征的类型,适用UF_free释放内存
    UF_initialize();
	//创建块
	UF_FEATURE_SIGN Sign = UF_NULLSIGN;//设置布尔
	double Corner_pt[3] = { 1.0, 1.0, 1.0 };//设置原点
	char *Edge_Len[3] = { "100", "100", "100" };//设置长宽高
	tag_t BlkTag = NULL_TAG;
	UF_MODL_create_block(Sign, NULL_TAG, Corner_pt, Edge_Len, &BlkTag);
	//创建圆柱
	UF_FEATURE_SIGN sign = UF_NULLSIGN;//布尔方式 : 布尔 无
						   //UF_NULLSIGN    //布尔 无
						  //UF_POSITIVE    //布尔 求和
						  //UF_NEGATIVE    //布尔 求差
						  //UF_UNSIGNED    //布尔 求交
	double dPoint1[3] = { 0,0,0 };    //圆柱底面圆心
	char charH[256] = "100";      //第一次做圆柱的高度
	char charD[256] = "100";        //直径
	double dVector[3] = { 0,0,1 };   //圆柱方向
	tag_t  CylTag = NULL_TAG;  //圆柱特征标签
	UF_MODL_create_cylinder(sign, NULL_TAG, dPoint1, charH, charD, dVector, &CylTag);

	//查找特征类型
	char *feature_blocktype = NULL;
	UF_MODL_ask_feat_type(BlkTag, &feature_blocktype);
	char *feature_cyltype = NULL;
	UF_MODL_ask_feat_type(CylTag, &feature_cyltype);
	//打印名字
	print(feature_blocktype);
	print(feature_cyltype);


	UF_terminate();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白雪公主的后妈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值