【UG\NX二次开发】添加组件到指定点

tag_t partTag;
vector<tag_t> allpart_ins;//prt中所有部件的实例
/*获取dll完整路径*/
string GetProgramPath()
{
	char filePath[MAX_PATH];
	GetModuleFileNameA(_AtlBaseModule.GetModuleInstance(), filePath, MAX_PATH);
	std::string strDllPath(filePath);
	strDllPath = strDllPath.substr(0, strDllPath.find_last_of("\\") + 1);
	return strDllPath;
}

//添加组件
void addcmp(double point[3], char* title)
{
	string dllPath = GetProgramPath();
	dllPath += "part\\";
	dllPath.append(title);

	UF_PART_load_status_t error_status;
	UF_PART_open_quiet(dllPath.c_str(), &partTag, &error_status);

	double mtx[6] = { xDir[0], xDir[1], xDir[2], yDir[0], yDir[1], yDir[2] };
	int layer = 0;
	tag_t instance = NULL_TAG;
	UF_ASSEM_add_part_to_assembly(UF_PART_ask_display_part(), dllPath.c_str(), "MODEL", "1", point, mtx, layer, &instance, &error_status);
	allpart_ins.clear();
	if (instance != NULL_TAG)
	{
		allpart_ins.push_back(instance);
	}
	//释放
	UF_PART_free_load_status(&error_status);
}

/*查找部件中的实体对象*/
void get_Cmp_Bodys(tag_t ins, vector<tag_t>& vec)
{
	vec.clear();
	//UF_faceted_model_type    139  UF_faceted_model_jt_body_subtype   3
	//tag_t* part_occs;
	//UF_ASSEM_ask_occs_of_part(UF_ASSEM_ask_work_part(), part, &part_occs);
	tag_t* part_occs;
	UF_ASSEM_ask_part_occs_of_inst(ins, &part_occs);
	tag_t member = NULL_TAG;

	UF_ASSEM_cycle_objs_in_comp(part_occs[0], &member);

	int num = 0;

	int type = UF_solid_type;
	int subtype;

	while (member != NULL_TAG)
	{
		UF_OBJ_ask_type_and_subtype(member, &type, &subtype);
		if (subtype == UF_solid_body_subtype)
		{
			num++;
			vec.push_back(member);
		}

		UF_ASSEM_cycle_objs_in_comp(part_occs[0], &member);
	}


}

//输入体TAG链接体 ,返回链接体TAG
std::vector<tag_t> get_Link_body(std::vector<tag_t> body_tag)
{
	std::vector<tag_t> links;
	if (body_tag.size() > 0)
	{
		Session* theSession = Session::GetSession();
		Part* workPart(theSession->Parts()->Work());
		Part* displayPart(theSession->Parts()->Display());

		Features::Feature* nullFeatures_Feature(NULL);

		if (!workPart->Preferences()->Modeling()->GetHistoryMode())
		{
			throw NXException::Create("Create or edit of a Feature was recorded in History Mode but playback is in History-Free Mode.");
		}

		Features::WaveLinkBuilder* waveLinkBuilder1 = workPart->BaseFeatures()->CreateWaveLinkBuilder(nullFeatures_Feature);
		Features::WaveDatumBuilder* waveDatumBuilder1 = waveLinkBuilder1->WaveDatumBuilder();
		Features::CompositeCurveBuilder* compositeCurveBuilder1 = waveLinkBuilder1->CompositeCurveBuilder();
		Features::WaveSketchBuilder* waveSketchBuilder1 = waveLinkBuilder1->WaveSketchBuilder();
		Features::WaveRoutingBuilder* waveRoutingBuilder1 = waveLinkBuilder1->WaveRoutingBuilder();
		Features::WavePointBuilder* wavePointBuilder1 = waveLinkBuilder1->WavePointBuilder();
		Features::ExtractFaceBuilder* extractFaceBuilder1 = waveLinkBuilder1->ExtractFaceBuilder();
		Features::MirrorBodyBuilder* 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->SetMakePositionIndependent(false);
		extractFaceBuilder1->SetHideOriginal(false);
		extractFaceBuilder1->SetInheritDisplayProperties(false);
		extractFaceBuilder1->SetAssociative(false);
		extractFaceBuilder1->SetFixAtCurrentTimestamp(true);
		SelectObjectList* selectObjectList1 = extractFaceBuilder1->BodyToExtract();
		extractFaceBuilder1->SetCopyThreads(true);
		std::vector<TaggedObject*> objects1;
		for (int i = 0; i < body_tag.size(); i++)
		{
			Body* body1 = (Body*)NXObjectManager::Get(body_tag[i]);
			objects1.push_back(body1);
		}
		selectObjectList1->Add(objects1);
		NXObject* nXObject1 = waveLinkBuilder1->Commit();

		std::vector<NXOpen::NXObject*> nxobjects = waveLinkBuilder1->GetCommittedObjects();
		for (int i = 0; i < nxobjects.size(); i++)
		{
			tag_t temp = nxobjects[i]->Tag();
			UF_MODL_ask_feat_body(temp, &temp);
			links.push_back(temp);
		}
		waveLinkBuilder1->Destroy();
	}
	return links;
}


void main()
{
	addcmp(point, title);  //添加组件
	vector<tag_t> entitys;
	vector<tag_t> linkBodys;
	for (size_t k = 0; k < allpart_ins.size(); k++)
	{
		get_Cmp_Bodys(allpart_ins[k], entitys);  //查找部件中的实体对象
		linkBodys = get_Link_body(entitys);  //链接体
		for (size_t z = 0; z < linkBodys.size(); z++)
		{
            //移参
			uf_list_p_t body_list;
			UF_MODL_create_list(&body_list);
			UF_MODL_put_list_item(body_list, linkBodys[z]);
			UF_MODL_delete_body_parms(body_list);
			UF_MODL_delete_list(&body_list);
			all_lock_rings.push_back(linkBodys[z]);
			//UF_DISP_set_highlight(linkBodys[z], 1);
		}
	}
	//删除组件,关闭组件窗口
	for (size_t z = 0; z < allpart_ins.size(); z++)
	{
		UF_ASSEM_remove_instance(allpart_ins.at(z));//删除组件
	}

	if (partTag)
	{
        //关闭部件窗口
	    UF_PART_close(partTag, 0, 1);
		partTag = NULL_TAG;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

社恐猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值