NX/UG二次开发——孔特征查找

  • 孔特征查找
  • 代码所需包含的额外头文件
  • 1.获得模型的所有圆柱面的Tag值。
  • 2.获得圆柱面的所有边。
  • 3.判断每个边是否为整圆。
  • do_it函数


孔特征查找

在二次开发过程中会遇到需要获取模型孔特征的Tag值,以方便对获取到的孔特征进行编辑。下面介绍一种获取孔特征的方法。主要分为三个过程:1.获得模型的所有圆柱面的Tag值。2.获得圆柱面的所有边。3.判断每个边是否为整圆。

代码所需包含的额外头文件

#include <uf_obj.h>
#include <uf_assem.h>
#include <uf_modl.h>
#include <uf_ui.h>
#include <uf_eval.h>

1.获得模型的所有圆柱面的Tag值。

std::vector<tag_t> get_cylindrical_face()//创建一个获得所有圆柱面的方法,返回值为所有圆柱面Tag的vector容器。
{
	tag_t objectTAG = NULL_TAG;
	int thetype, thesubtype, face_type;
	std::vector<tag_t> face_collection;

	UF_OBJ_cycle_objs_in_part(UF_ASSEM_ask_work_part(), UF_solid_type, &objectTAG);//遍历获得工作部件上类型为solid_type的Tag。
	while (objectTAG != NULL_TAG)
	{
		UF_OBJ_ask_type_and_subtype(objectTAG, &thetype, &thesubtype);//获得块的类型和子类型。
		if (thesubtype == UF_solid_face_subtype)//判断子类型是否为UF_solid_face_subtype。
		{
			UF_MODL_ask_face_type(objectTAG, &face_type);//获得子类型为UF_solid_face_subtype的对象的面类型。

			if (face_type == UF_MODL_CYLINDRICAL_FACE)
			{
				face_collection.push_back(objectTAG);//如果面类型为圆柱面,将该Tag存入vector容器。
			}
		}
		UF_OBJ_cycle_objs_in_part(UF_ASSEM_ask_work_part(), UF_circle_type, &objectTAG);
	}
	return face_collection;//返回容器。
}

2.获得圆柱面的所有边。

std::vector<tag_t> get_circle_edge(std::vector<tag_t> face_collection)//创建一个获得圆柱面的所有边的方法。形参为所有圆柱面的vector容器,返回值为所有圆柱面所有边Tag的vector容器。
{
	std::vector<tag_t> edge_collection;
	for (int i = 0; i < size(face_collection); i++)
	{
		uf_list_p_t  edge_list;
		int count;
		tag_t edge_tag;

		UF_MODL_ask_face_edges(face_collection[i], &edge_list);//获得每个圆柱面包含所有边的链表。
		UF_MODL_ask_list_count(edge_list, &count);//获得链表的大小。
		for (int j = 0; j < count; j++)
		{
			UF_MODL_ask_list_item(edge_list, j, &edge_tag);//获得链表里的Tag值
			edge_collection.push_back(edge_tag);//将该Tag值存入vector容器。
		}
		UF_MODL_delete_list(&edge_list);//删除链表。
	}
	return edge_collection;//返回所有边的vector容器。
}

3.判断每个边是否为整圆。

bool judge_circle_edge(tag_t edge_tag)//创建判断每个边是否为整圆的方法。形参是边的Tag,返回值为布尔值。
{
	UF_EVAL_p_t evaluator;
	UF_EVAL_initialize(edge_tag, &evaluator);//使用UF_EVAL_ask_arc()函数需要先进行初始化

	UF_EVAL_arc_t arcCoords;
	UF_EVAL_ask_arc(evaluator, &arcCoords);//arc结构体中有曲线的参数(圆中,半径,是否整圆等相关信息)

	bool boolVal = false;
	if (arcCoords.is_periodic)//判断是否为圆
	{
		double arcCenter[3] = { 0.00 };
		arcCenter[0] = arcCoords.center[0];
		arcCenter[1] = arcCoords.center[1];
		arcCenter[2] = arcCoords.center[2];
		double arcx_axis[3] = { 0.00 };
		arcx_axis[0] = arcCoords.x_axis[0];
		arcx_axis[1] = arcCoords.x_axis[1];
		arcx_axis[2] = arcCoords.x_axis[2];
		double arcy_axis[3] = { 0.00 };
		arcy_axis[0] = arcCoords.y_axis[0];
		arcy_axis[1] = arcCoords.y_axis[1];
		arcy_axis[2] = arcCoords.y_axis[2];
		double arcR[1] = { 0.00 };
		arcR[0] = arcCoords.radius;
		//确定给定的数据是否来自圆形曲线或边缘
		bool boolIsArc;
		UF_EVAL_is_arc(evaluator, &boolIsArc);
		if (fabs(arcCoords.limits[0]) < 0.001 && fabs(arcCoords.limits[1] - 2 * PI) < 0.001)//判断是否是整圆
		{
			boolVal = true;//此圆是整圆。
		}

		UF_EVAL_free(evaluator);//释放评估器。
	}

	return boolVal;
}

do_it函数

void MyClass::do_it()
{

	// TODO: add your code here
	
	UF_initialize();
	UF_UI_open_listing_window();
	char msg[256];
	std::vector<tag_t> face_collection = get_cylindrical_face();
	std::vector<tag_t> edges_collection = get_circle_edge(face_collection);
	std::vector<tag_t> circle_edge_collection;

	bool boolVal;

	for (int i = 0; i < size(edges_collection); i++)//循环包含圆柱体所有的边的容器。
	{
		boolVal = judge_circle_edge(edges_collection[i]);//判断是否为整圆。
		if (boolVal)
		{
			circle_edge_collection.push_back(edges_collection[i]);//如果是整圆,将该Tag值收集到vector容器中。
			sprintf(msg, "圆的tag为%d", edges_collection[i]);//打印
			UF_UI_write_listing_window(msg);
		}
	}
	sprintf(msg, "整圆的个数为%d", (int)size(circle_edge_collection));//打印。
	UF_UI_write_listing_window(msg);

	UF_terminate();
}