//设置工作部件
void setWorkPart(tag_t Tag)
{
tag_t objTag = NULL_TAG;
int type = 0;
int subtype = 0;
UF_OBJ_ask_type_and_subtype(Tag, &type, &subtype);
if (type == UF_feature_type) {
UF_MODL_ask_feat_body(Tag, &objTag);
}
else {
UF_MODL_ask_face_body(Tag, &objTag);
}
tag_t zhuangpei = NULL_TAG;
if (objTag != NULL_TAG)
{
tag_t partTag = NULL_TAG;
partTag = UF_ASSEM_ask_part_occurrence(objTag);//求体所在的组件
if (partTag != NULL_TAG)
{
zhuangpei = UF_ASSEM_ask_prototype_of_occ(partTag);
if (zhuangpei != NULL_TAG)
{
tag_t previous_work_part;
previous_work_part = UF_ASSEM_ask_work_part();
UF_ASSEM_set_work_part_quietly(zhuangpei, &previous_work_part);
//UF_ASSEM_set_work_part(zhuangpei);//
}
}
}
}
//恢复工作部件
void ReCoverWorkPart()
{
Session* theSession = Session::GetSession();
Part* workPart(theSession->Parts()->Work());
Part* displayPart(theSession->Parts()->Display());
Assemblies::Component* nullAssemblies_Component(NULL);
PartLoadStatus* partLoadStatus2;
theSession->Parts()->SetWorkComponent(nullAssemblies_Component, &partLoadStatus2);
workPart = theSession->Parts()->Work();
delete partLoadStatus2;
}
//替换面
int ReplaceFace(vector<tag_t>AllFace, tag_t face, bool flag, double distance, bool direction01_flag, tag_t& featrueTag, bool printErrorInfo) {
UF_UNDO_mark_id_t mark_id;
UF_UNDO_set_mark(UF_UNDO_visible, NULL, &mark_id);
featrueTag = NULL_TAG;
setWorkPart(AllFace[0]);
try
{
Session* theSession = Session::GetSession();
Part* workPart(theSession->Parts()->Work());
Part* displayPart(theSession->Parts()->Display());
Features::Feature* nullFeatures_Feature(NULL);
Features::ReplaceFaceBuilder* replaceFaceBuilder1;
replaceFaceBuilder1 = workPart->Features()->CreateReplaceFaceBuilder(nullFeatures_Feature);
//要替换的面
std::vector<Face*> faces1(AllFace.size());
for (int i = 0; i < AllFace.size(); i++)
{
Face* face1(dynamic_cast<Face*>(NXObjectManager::Get(AllFace[i])));
faces1[i] = face1;
}
FaceDumbRule* faceDumbRule1;
faceDumbRule1 = workPart->ScRuleFactory()->CreateRuleFaceDumb(faces1);
std::vector<SelectionIntentRule*> rules1(1);
rules1[0] = faceDumbRule1;
replaceFaceBuilder1->FaceToReplace()->ReplaceRules(rules1, false);
//替换面
std::vector<Face*> faces2(1);
Face* face2(dynamic_cast<Face*>(NXOpen::NXObjectManager::Get(face)));
faces2[0] = face2;
FaceDumbRule* faceDumbRule2;
faceDumbRule2 = workPart->ScRuleFactory()->CreateRuleFaceDumb(faces2);
std::vector<SelectionIntentRule*> rules2(1);
rules2[0] = faceDumbRule2;
replaceFaceBuilder1->ReplacementFaces()->ReplaceRules(rules2, false);
replaceFaceBuilder1->SetReverseDirection(flag);
//传偏置距离
if (!direction01_flag) {
distance = -distance;
}
char distanceTemp[64];
sprintf(distanceTemp, "%f", distance);
replaceFaceBuilder1->OffsetDistance()->SetRightHandSide(distanceTemp);
NXObject* nXObject1;
nXObject1 = replaceFaceBuilder1->Commit();
if (nXObject1)
{
featrueTag = nXObject1->Tag();
}
Expression* expression1(replaceFaceBuilder1->OffsetDistance());
replaceFaceBuilder1->Destroy();
}
catch (const std::exception& ex)
{
ReCoverWorkPart();
UF_UNDO_undo_to_mark(mark_id, NULL);
if (printErrorInfo)
uc1601((char*)ex.what(), 1);
return 0;
}
ReCoverWorkPart();
return 1;
}
【UG\NX二次开发】NXOPEN 替换面(replaceFaceBuilder1)
于 2024-04-25 16:18:47 首次发布