【UG\NX二次开发】导入组件到建模环境(步骤

tag_t instance[256];//导入组件后组件的tag
char* chapterName;//装配里面的instanceName
vector<tag_t> vecInstanceTag;//放四个组件的tag
vector<tag_t> vecPartSolidBody;//组件下的实体装的容器
vector<tag_t> vecWaveTag;//容器转链接后的tag(重要:12个体的tag)
tag_t part_tag;//装配里面的父部件的tag
double csysMtrix[9]; // z方向向量


//1.添加标准组件
void addComponentAssembly()
{
	//获取工作图层
	int layer_number;
	UF_LAYER_ask_work_layer(&layer_number);

	//获取工作部件
	part_tag = UF_ASSEM_ask_work_part();

	// 装配添加组件
	const char* refsetName = "Entire Part";
	chapterName = "name";
	const char* instanceName = chapterName;

	//获取part name
	int n = enum0->GetProperties()->GetEnum("Value");
	char name1[256];
	sprintf_s(name1, "standardprt\\thimble%d.prt", n);
	string partName1 = dll_fullpath + string(name1);
	ss << "partName1" << partName1 << endl;

	// 控制导入组件的方向
	double zVec[3] = { 0.0,0.0,1.0 };
	UF_MTX3_initialize_z(zVec, csysMtrix);
	UF_PART_load_status_t errorStatus;
	
	//导入点击的圆弧获取tag_t的instance,vecInstanceTag收集到了四个组件的tag值
	for (int i = 0; i < theLastArcThimb.size(); i++)
	{
		UF_ASSEM_add_part_to_assembly(part_tag, partName1.c_str(), refsetName, instanceName, theLastArcThimb[i].screenPoints, csysMtrix, layer_number, &instance[i], &errorStatus);
		vecInstanceTag.push_back(instance[i]);
	}
}
//2.编辑标准件的表达式
void editExp(tag_t instance)
{
	UF_initialize();
	
	//Assemblies::Component* component1(dynamic_cast<Assemblies::Component*>(NXObjectManager::Get(instance)));
	//
	//PartLoadStatus* partLoadStatus2;
	//theSession->Parts()->SetWorkComponent(component1, &partLoadStatus2);
	//delete partLoadStatus2;
	//设置为工作部件
	UF_ASSEM_set_work_part(instance);
		
	int type = enum0->GetProperties()->GetEnum("Value");
	if (type == 0)
	{
		char TD[256];
		sprintf_s(TD, "thimbleDiamter=%f", thimb.diameter);
		UF_MODL_edit_exp(TD);//使用NXOPEN修改最佳,此处懒得改了,UF函数容易出问题
		char TH[256];
		sprintf_s(TH, "thimbleHight=%f", hightofthimb);
		UF_MODL_edit_exp(TH);
		char TcD1[256];
		sprintf_s(TcD1, "thimbleCupDiamter=%f", thimb.diameter);
		UF_MODL_edit_exp(TcD1);
		char TcH1[256];
		sprintf_s(TcH1, "thimbleCupHight=%f", thimb.diameter);
		UF_MODL_edit_exp(TcH1);
		uc1601(TD,1);
		uc1601(TH, 1);
		uc1601(TcD1,1);
		uc1601(TcH1, 1);

	}
	UF_MODL_update();

	//处理显示装配
	Assemblies::Component* nullAssemblies_Component(NULL);
	PartLoadStatus* partLoadStatus1;
	theSession->Parts()->SetWorkComponent(nullAssemblies_Component, &partLoadStatus1);
	delete partLoadStatus1;
	
	UF_terminate();
}
//2.1抽取标准组件中的所有实体
vector<tag_t> GetInstanceBodies(tag_t compTag)
{
	int nn = 0;
	vector<tag_t> bodies;
	tag_t  tempOcc;
	if (compTag != NULL_TAG)
	{
		int type = 0, subType = 0;
		UF_OBJ_ask_type_and_subtype(compTag, &type, &subType);
		tag_t* instanceToOcc;
		if (type == 68)
		{
			int nnn = UF_ASSEM_ask_part_occs_of_inst(compTag, &instanceToOcc);
			if (nnn)
			{
				tempOcc = instanceToOcc[0];
			}
			else
			{
				//ccc::cecho::echo("没找到", nnn, NumLine);
			}
		}
		else if (type == 63)//occ
		{
			tempOcc = compTag;
		}
		tag_t member = NULL_TAG;
		UF_ASSEM_cycle_objs_in_comp(tempOcc, &member);
		while (member != NULL_TAG)
		{
			int type = 0, subType = 0;
			UF_OBJ_ask_type_and_subtype(member, &type, &subType);
			if (type == 70 && subType == UF_solid_body_subtype)
			{
				nn++;
				bodies.push_back(member);
			}
			UF_ASSEM_cycle_objs_in_comp(tempOcc, &member);
		}
		if ((int)bodies.size() == 0)
		{
			//ccc::cecho::echo("数量为", (int)bodies.size(), NumLine);
		}
	}
	else
	{
		uc1601("参数为空", 1);
	}
	return bodies;
}
//3.链接体
void waveGeomtryLink(tag_t waveTag)
{
	Session* theSession = Session::GetSession();
	Part* workPart(theSession->Parts()->Work());
	Part* displayPart(theSession->Parts()->Display());

	Features::Feature* nullFeatures_Feature(NULL);
	Features::WaveLinkBuilder* waveLinkBuilder1;
	waveLinkBuilder1 = workPart->BaseFeatures()->CreateWaveLinkBuilder(nullFeatures_Feature);

	Features::WaveDatumBuilder* waveDatumBuilder1;
	waveDatumBuilder1 = waveLinkBuilder1->WaveDatumBuilder();
	Features::CompositeCurveBuilder* compositeCurveBuilder1;
	compositeCurveBuilder1 = waveLinkBuilder1->CompositeCurveBuilder();
	Features::WaveSketchBuilder* waveSketchBuilder1;
	waveSketchBuilder1 = waveLinkBuilder1->WaveSketchBuilder();
	Features::WaveRoutingBuilder* waveRoutingBuilder1;
	waveRoutingBuilder1 = waveLinkBuilder1->WaveRoutingBuilder();
	Features::WavePointBuilder* wavePointBuilder1;
	wavePointBuilder1 = waveLinkBuilder1->WavePointBuilder();
	Features::ExtractFaceBuilder* extractFaceBuilder1;
	extractFaceBuilder1 = waveLinkBuilder1->ExtractFaceBuilder();
	Features::MirrorBodyBuilder* mirrorBodyBuilder1;
	mirrorBodyBuilder1 = waveLinkBuilder1->MirrorBodyBuilder();

	extractFaceBuilder1->SetFaceOption(Features::ExtractFaceBuilder::FaceOptionTypeFaceChain);
	waveLinkBuilder1->SetType(Features::WaveLinkBuilder::TypesBodyLink);
	extractFaceBuilder1->SetFaceOption(Features::ExtractFaceBuilder::FaceOptionTypeFaceChain);
	extractFaceBuilder1->SetAngleTolerance(45.0);
	waveDatumBuilder1->SetDisplayScale(2.0);
	extractFaceBuilder1->SetParentPart(Features::ExtractFaceBuilder::ParentPartTypeOtherPart);
	mirrorBodyBuilder1->SetParentPartType(Features::MirrorBodyBuilder::ParentPartOtherPart);

	extractFaceBuilder1->SetAssociative(true);
	extractFaceBuilder1->SetMakePositionIndependent(false);
	extractFaceBuilder1->SetFixAtCurrentTimestamp(false);
	extractFaceBuilder1->SetHideOriginal(false);
	extractFaceBuilder1->SetInheritDisplayProperties(false);
	SelectObjectList* selectObjectList1;
	selectObjectList1 = extractFaceBuilder1->BodyToExtract();
	extractFaceBuilder1->SetCopyThreads(true);

	Body* body1(dynamic_cast<Body*>(NXObjectManager::Get(waveTag)));
	bool added1;
	added1 = selectObjectList1->Add(body1);

	NXObject* nXObject1;
	nXObject1 = waveLinkBuilder1->Commit();
	tag_t bod_Tag1 = null_tag;
	UF_MODL_ask_feat_body(nXObject1->Tag(), &bod_Tag1);
	vecWaveTag.push_back(bod_Tag1);//这里将每个体的tag值收集到
	waveLinkBuilder1->Destroy();
}
//清空链接体
void removeLinkBodies() {
	if (linkBodies.size() > 0)
	{
		for (int i = 0; i < linkBodies.size(); i++) {
			UF_OBJ_delete_object(linkBodies[i]->Tag());
		}

	}
	linkBodies.clear();
}
//删除装配体
void removeComponent1()
{
	for (size_t i = 0; i < vecInstanceTag.size(); i++)
	{	
		Session* theSession = Session::GetSession();
		Part* workPart(theSession->Parts()->Work());
		Part* displayPart(theSession->Parts()->Display());
		bool notifyOnDelete1;
		notifyOnDelete1 = theSession->Preferences()->Modeling()->NotifyOnDelete();
		theSession->UpdateManager()->ClearErrorList();
		std::vector<NXObject*> objects1(1);
		Assemblies::Component* component1(dynamic_cast<Assemblies::Component*>(NXObjectManager::Get(vecInstanceTag[i])));
		if (component1 == NULL) return;
		//Assemblies::Component* component1(dynamic_cast<Assemblies::Component*>(workPart->ComponentAssembly()->RootComponent()->FindObject("COMPONENT thimble0 4")));
		objects1[0] = component1;
		int nErrs1;
		nErrs1 = theSession->UpdateManager()->AddToDeleteList(objects1);
		bool notifyOnDelete2;
		notifyOnDelete2 = theSession->Preferences()->Modeling()->NotifyOnDelete();

	}
	
}

//调用的主函数
void createThimble(struct Thimble)
{
	try
	{
		UF_initialize();
		addComponentAssembly();
		for (size_t i = 0; i < vecInstanceTag.size(); i++)
		{
			//抽取实体
			vector<tag_t>bodys=GetInstanceBodies(vecInstanceTag[i]);
			//清空链接体存放容器
			editExp(vecInstanceTag[i]);
			for (int i = 0; i < bodys.size(); i++)
			{
				waveGeomtryLink(bodys[i]);
			}
			//UF_MODL_unite_bodies(bodiesInPart[0]->Tag(), bodiesInPart[1]->Tag());
			//消除参数
			if (vecWaveTag.size() > 0) {
				uf_list_p_t bodyList = NULL;
				UF_MODL_create_list(&bodyList);
				for (int i = 0; i < vecWaveTag.size(); i++) 
				{
					UF_MODL_put_list_item(bodyList, vecWaveTag[i]);
					//char* value = (thimb.Brand).c_str();
				}
				UF_MODL_delete_body_parms(bodyList);
				UF_MODL_delete_list(&bodyList);
				vecWaveTag.clear();
			}

			
		}

		//获取组件路径
		int n = enum0->GetProperties()->GetEnum("Value");
		char name1[256];
		sprintf_s(name1, "standardprt\\thimble%d.prt", n);
		string partName1 = dll_fullpath + string(name1);
		//移除标准组件
		removeComponent1();
		UF_PART_close(UF_PART_ask_part_tag(partName1.c_str()), 0, 1);
		UF_UI_write_listing_window(ss.str().c_str());

		//设回原始工作坐标
		UF_CSYS_set_wcs(wcsTagbefore);
		UF_OBJ_delete_object(tempcsysTag);


		UF_terminate();

	}
	catch (exception& ex)
	{

	}

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

社恐猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值