/*录制:创建拆分体*/
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;
}
【UG\NX二次开发】NXOpen 拆分体(splitBodyBuilder)
于 2023-11-09 15:21:32 首次发布