【UG\NX二次开发】NXOpen 拆分体(splitBodyBuilder)

该代码段详细描述了一个在NXOpen中使用C++实现的函数,用于在SolidWorks中创建和处理SplitBody特征,通过FacePlane工具和ExtrudeRevolve工具对选定的实体进行拆分操作。

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

/*录制:创建拆分体*/
bool CreateSplitBody(tag_t bodyTag, std::vector<tag_t> sheetTag, std::vector<tag_t>& bdyVct,tag_t& SplitBodyFeatureTag)
{
	try
	{
		Session* theSession = Session::GetSession();
		Part* workPart(theSession->Parts()->Work());
		Part* displayPart(theSession->Parts()->Display());

		Features::SplitBody* nullFeatures_SplitBody(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::SplitBodyBuilder* splitBodyBuilder1;
		splitBodyBuilder1 = workPart->Features()->CreateSplitBodyBuilderUsingCollector(nullFeatures_SplitBody);

		Point3d origin1(0.0, 0.0, 0.0);
		Vector3d normal1(0.0, 0.0, 1.0);
		Plane* plane1;
		plane1 = workPart->Planes()->CreatePlane(origin1, normal1, SmartObject::UpdateOptionWithinModeling);

		splitBodyBuilder1->BooleanTool()->FacePlaneTool()->SetToolPlane(plane1);
		splitBodyBuilder1->BooleanTool()->ExtrudeRevolveTool()->ToolSection()->PrepareMappingData();
		splitBodyBuilder1->BooleanTool()->ExtrudeRevolveTool()->ToolSection()->SetDistanceTolerance(0.0254);
		splitBodyBuilder1->BooleanTool()->ExtrudeRevolveTool()->ToolSection()->SetChainingTolerance(0.0246);

		//目标体
		ScCollector* scCollector1;
		scCollector1 = workPart->ScCollectors()->CreateCollector();

		std::vector<Body*> bodies1(1);
		Body* body1(dynamic_cast<Body*>(NXObjectManager::Get(bodyTag)));
		bodies1[0] = body1;
		BodyDumbRule* bodyDumbRule1;
		bodyDumbRule1 = workPart->ScRuleFactory()->CreateRuleBodyDumb(bodies1);
		std::vector<SelectionIntentRule*> rules1(1);
		rules1[0] = bodyDumbRule1;
		scCollector1->ReplaceRules(rules1, false);
		splitBodyBuilder1->SetTargetBodyCollector(scCollector1);

		//工具体
		std::vector<SelectionIntentRule*> rules2(sheetTag.size());

		for (int i = 0; i < sheetTag.size(); ++i)
		{
			Body* body2(dynamic_cast<Body*>(NXObjectManager::Get(sheetTag[i])));
			FaceBodyRule* faceBodyRule1;
			faceBodyRule1 = workPart->ScRuleFactory()->CreateRuleFaceBody(body2);
			rules2[i] = faceBodyRule1;
		}
		splitBodyBuilder1->BooleanTool()->FacePlaneTool()->ToolFaces()->FaceCollector()->ReplaceRules(rules2, false);


		NXObject* nXObject1;
		nXObject1 = splitBodyBuilder1->Commit();
		UF_MODL_ask_current_feature(UF_ASSEM_ask_work_part(), &SplitBodyFeatureTag);
		//获取分割后的两个片体 或者 几个片体
		std::vector<Body*> test = dynamic_cast<Features::BodyFeature*>(splitBodyBuilder1->GetFeature())->GetBodies();
		size_t iCount(test.size());
		bdyVct.clear();
		for (size_t i(0); i < iCount; ++i) 
		{
			bdyVct.push_back(ask_obj_tag(test[i]));
		}
		splitBodyBuilder1->Destroy();
		plane1->DestroyPlane();
        
        ///获取分割后的两个片体 或者 几个片体(方法2
        //NXOpen::Features::BodyFeature * BodyFeature1 = dynamic_cast<NXOpen::Features::BodyFeature *>(CommitFeature);
        //vector<NXOpen::Body *> vBodies;
        //vBodies = BodyFeature1->GetBodies();
        //vSplitedBodys.clear();
        //for(int i=0;i<vBodies.size();i++)
        //{
        //	vSplitedBodys.push_back(vBodies[i]->Tag());
        //}
        //splitBodyBuilder1->Destroy();
	}
	catch (exception& ex)
	{
		UF_MODL_ask_current_feature(UF_ASSEM_ask_work_part(), &SplitBodyFeatureTag);
		//UF_UI_open_listing_window();
		//if (sheetTag.size() > 1)
		//{
		//	//UF_UI_write_listing_window("批量创建拆分体失败,采取单个拆分体\n");
		//}
		//else
		//	UF_UI_write_listing_window("创建单个拆分体失败\n");
		return 1;
	}
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

社恐猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值