NX/UG二次开发:NX的方式替换面
2026/6/3 19:47:14 网站建设 项目流程

//获取面的法向
void GetPosNormalOfMidUv(tag_t tFace,double pos[3],double normal[3])
{
double u1[ 3 ];
double v1[ 3 ];
double u2[ 3 ];
double v2[ 3 ];
double radii[ 2 ];
double uv[ 4 ];

UF_CALL(UF_MODL_ask_face_uv_minmax (tFace,uv));
double param[ 2 ]={(uv[0]+uv[1])*0.5, (uv[2]+uv[3])*0.5};
UF_CALL(UF_MODL_ask_face_props (tFace,param,pos,u1,v1,u2,v2,normal,radii));
}


//替换面
bool ReplaceFace(tag_t NeedReplaceFace,tag_t ToolFace,bool ReverseDir)
{
double TargetFaceDir[3] = { 0 };
double TargetFacePt[3] = { 0 };
GetPosNormalOfMidUv(NeedReplaceFace,TargetFacePt,TargetFaceDir);

double ToolFaceDir[3] = { 0 };
double ToolFacePt[3] = { 0 };
GetPosNormalOfMidUv(ToolFace,ToolFacePt,ToolFaceDir);

double dot = NULL;
double ReplaceDir[3] = { 0 };
UF_VEC3_sub(ToolFacePt,TargetFacePt,ReplaceDir);
UF_VEC3_dot(ReplaceDir,TargetFaceDir,&dot);
if (dot < 0)
{
ReverseDir = true;
}

Session *theSession = Session::GetSession();
Part *workPart(theSession->Parts()->Work());
Part *displayPart(theSession->Parts()->Display());
UF_UNDO_mark_id_t mark_id;
UF_UNDO_set_mark(UF_UNDO_visible, NULL, &mark_id);
Features::ReplaceFaceBuilder *replaceFaceBuilder1;
Features::Feature *nullFeatures_Feature(NULL);
try
{
replaceFaceBuilder1 = workPart->Features()->CreateReplaceFaceBuilder(nullFeatures_Feature);

replaceFaceBuilder1->OffsetDistance()->SetRightHandSide("0");

std::vector<Face *> faces1(1);
Face *face1(dynamic_cast<Face *>(NXObjectManager::Get(NeedReplaceFace)));
faces1[0] = 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 *>(NXObjectManager::Get(ToolFace)));
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(ReverseDir);

NXOpen::Features::Feature * CommitFeature;
CommitFeature = replaceFaceBuilder1->CommitFeature();

NXOpen::Features::BodyFeature * BodyFeature1 = dynamic_cast<NXOpen::Features::BodyFeature *>(CommitFeature);
vector<NXOpen::Body *> vBodies;
vBodies = BodyFeature1->GetBodies();
vector<tag_t>vUfBodys;
for(int i=0;i<vBodies.size();i++)
{
vUfBodys.push_back(vBodies[i]->Tag());
}
replaceFaceBuilder1->Destroy();
return true;
}
catch (const std::exception&ex)
{
uc1601((char *)ex.what(),0);
UF_UNDO_undo_to_mark (mark_id,NULL);
return false;
}
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询