2217231767 发表于 2026-5-5 17:03:55

NXOPEN C++问题求助

以下是使用多个平面创建拆分体, 创建后我想获取拆分后的所有实体,
以下加粗代码①或者②处, 不加这些代码, 拆分体正常生成,加上①或者②, 都会报错,报错如图,哪位大神帮忙看看错在哪里?


      UF_initialize();

      UF_DISP_set_display(UF_DISP_SUPPRESS_DISPLAY);

      tag_t linetag = 44539;
      double start_point = { 0.0 };
      double end_point = { 0.0 };
      Ask_Point_By_Percent(linetag, 0.0, start_point);
      Ask_Point_By_Percent(linetag, 1.0, end_point);


      double p1 = { 0.0 };
      double p2 = { 0.0 };
      int direction = 0.;
      if (start_point < end_point)
      {
                direction = 1;
                p1 = start_point;
                p1 = start_point;
                p1 = start_point;
                p2 = end_point;
                p2 = end_point;
                p2 = end_point;
      }
      else
      {
                direction = -1;
                p1 = end_point;
                p1 = end_point;
                p1 = end_point;
                p2 = start_point;
                p2 = start_point;
                p2 = start_point;


      }


      double dis = 100;
      double curve_len = 0.0;
      int num = 0;
      Ask_Curve_Length(linetag, &curve_len);
      num = (int)ceil(curve_len / dis);
      dis = curve_len / num;


      vector<;Point3d>points;
      Point3d temp;
      double output_point = { 0.0 };
      for (size_t i = 0; i < num; i++)
      {
                if (i != num - 1)
                {
                        Ask_Point_By_Arc_Length(p1, &direction, linetag, dis*(i + 1), output_point);
                        temp.X = output_point;
                        temp.Y = output_point;
                        temp.Z = output_point;
                        points.push_back(temp);
                }
                else
                {
                        temp.X = p2;
                        temp.Y = p2;
                        temp.Z = p2;
                        points.push_back(temp);


                }
      }



      //创建平面
      double plane_normal = { 0.0,0.0,1.0 };
      vector<tag_t>planes;
      tag_t planetag = NULL_TAG;
      double temppoint = { 0.0 };
      for (size_t i = 0; i < points.size(); i++)
      {
                temppoint = points.X;
                temppoint = points.Y;
                temppoint = points.Z;
                UF_MODL_create_fixed_dplane(temppoint, plane_normal, &planetag);
                planes.push_back(planetag);
      }


      //拆分体
      //复制体
      tag_t body = 44359;
      tag_t bodyTag = NULL_TAG;
      uf6511(&body, &bodyTag);
      vector<tag_t>bodies;
      vector<double>v_bodies;


      typedef struct vol
      {
                tag_t bodytag;
                double v;
                double p;
      }vol;


      Part *mypart = theSession->;Parts()->Work();




      NXOpen::Features::SplitBody *nullNXOpen_Features_SplitBody(NULL);
      NXOpen::Features::SplitBodyBuilder *splitBodyBuilder1;
      splitBodyBuilder1 = mypart->Features()->CreateSplitBodyBuilderUsingCollector(nullNXOpen_Features_SplitBody);


      std::vector<NXOpen::Body *> bodies1(1);
      NXOpen::Body *body1 = dynamic_cast<NXOpen::Body *>(NXObjectManager::Get(bodyTag));
      bodies1 = body1;
      NXOpen::BodyDumbRule *bodyDumbRule1;
      bodyDumbRule1 = mypart->ScRuleFactory()->CreateRuleBodyDumb(bodies1, true);


      NXOpen::ScCollector *scCollector1;
      scCollector1 = mypart->ScCollectors()->CreateCollector();
      std::vector<NXOpen::SelectionIntentRule *> rules1(1);
      rules1 = bodyDumbRule1;
      scCollector1->ReplaceRules(rules1, false);
      splitBodyBuilder1->SetTargetBodyCollector(scCollector1);


      //
      std::vector<NXOpen::DatumPlane *> faces1;
      DatumPlane *datumPlane1;
      for (size_t i = 0; i < planes.size() -2; i++)
      {
                datumPlane1 = dynamic_cast<NXOpen::DatumPlane *>(NXObjectManager::Get(planes));
                faces1.push_back(datumPlane1);
      }


      NXOpen::FaceDumbRule *faceDumbRule1;
      faceDumbRule1 = mypart->ScRuleFactory()->CreateRuleFaceDatum(faces1);


      std::vector<NXOpen::SelectionIntentRule *> rules2(1);
      rules2 = faceDumbRule1;
      splitBodyBuilder1->BooleanTool()->FacePlaneTool()->ToolFaces()->FaceCollector()->ReplaceRules(rules2, false);


      Features::Feature *nXObject1;
      nXObject1 = splitBodyBuilder1->CommitFeature();


      splitBodyBuilder1->Destroy();








         //①
      
      BodyCollection * objss = mypart->Bodies();
      vector<Body *> bbodys;
      for (BodyCollection::iterator it = objss->begin(); it != objss->end();it++)
      {
                bbodys.push_back(*it);
      }


      //②
       vector <Body *> Ibody = nXObject1->GetBodies();



      
      UF_DISP_set_display(UF_DISP_UNSUPPRESS_DISPLAY);
      UF_DISP_regenerate_display();


      UF_terminate();
      



白色治愈之风 发表于 2026-5-6 08:18:49

我使用vector的时候里面存放的东西都是一个一个放的,不知道你这样一起放是否可以。另外你上面的代码bbodys就是容器,以经收集了实体了。

2217231767 发表于 2026-5-6 10:52:54

白色治愈之风 发表于 2026-5-6 08:18
我使用vector的时候里面存放的东西都是一个一个放的,不知道你这样一起放是否可以。另外你上面的代码bbodys ...

①处与②处是两种方式获取实体方式,我先使用的②处,报错了,所以尝试使用①处, 结果也是报错,
如果删除了①和②, 拆分体是可以创建成功的,拆分样式详见下图,
我是用很多平面拆分一个实体, 拆分后想将拆分后的所有实体收集起来, 结果报错卡住了

白色治愈之风 发表于 2026-5-6 12:08:30

2217231767 发表于 2026-5-6 10:52
①处与②处是两种方式获取实体方式,我先使用的②处,报错了,所以尝试使用①处, 结果也是报错,
如果删除 ...

拆分之后是直接去参变成体还是拆分之后仍然是特征

白色治愈之风 发表于 2026-5-6 12:15:53

UF_OBJ_cycle_objs_in_part,也可以试试这个函数

不小明我们不约 发表于 2026-5-6 13:08:44

分割体使用UF_MODL_split_body更简洁些,也有对用的切割体输出:lol

2217231767 发表于 2026-5-6 17:39:24

白色治愈之风 发表于 2026-5-6 12:08
拆分之后是直接去参变成体还是拆分之后仍然是特征

拆分之后没有去参,还是特征

2217231767 发表于 2026-5-6 17:42:55

白色治愈之风 发表于 2026-5-6 12:15
UF_OBJ_cycle_objs_in_part,也可以试试这个函数

好的, 我原想是根据拆分体直接获取拆分特征所产生的实体,
用你提供的ufun方式, 就得先获取拆分之前的所有体, 拆分后再获取所有体, 两者比较才能获取拆分特征所产生的实体:lol

2217231767 发表于 2026-5-6 17:45:25

不小明我们不约 发表于 2026-5-6 13:08
分割体使用UF_MODL_split_body更简洁些,也有对用的切割体输出

ufun这个函数试过, 每次只能用一个面拆分, 我是用好几百个面拆分, 就得循环拆分, 效率慢,所以改用NXOpen c++方式, 拆分倒是快了,但获取体卡住了:lol
页: [1]
查看完整版本: NXOPEN C++问题求助