找回密码
 立即注册

QQ登录

只需一步,快速开始

微信扫码登录

搜索
查看: 196|回复: 8

[求助] NXOPEN C++问题求助

[复制链接]

4

主题

16

回帖

976

积分

五级士官

积分
976
发表于 5 天前 | 显示全部楼层 |阅读模式
以下是使用多个平面创建拆分体, 创建后我想获取拆分后的所有实体,
以下加粗代码①或者②处, 不加这些代码, 拆分体正常生成,加上①或者②, 都会报错,报错如图,哪位大神帮忙看看错在哪里?


        UF_initialize();

        UF_DISP_set_display(UF_DISP_SUPPRESS_DISPLAY);

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


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


        }


        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<oint3d>points;
        Point3d temp;
        double output_point[3] = { 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[0];
                        temp.Y = output_point[1];
                        temp.Z = output_point[2];
                        points.push_back(temp);
                }
                else
                {
                        temp.X = p2[0];
                        temp.Y = p2[1];
                        temp.Z = p2[2];
                        points.push_back(temp);


                }
        }



        //创建平面
        double plane_normal[3] = { 0.0,0.0,1.0 };
        vector<tag_t>planes;
        tag_t planetag = NULL_TAG;
        double temppoint[3] = { 0.0 };
        for (size_t i = 0; i < points.size(); i++)
        {
                temppoint[0] = points.X;
                temppoint[1] = points.Y;
                temppoint[2] = 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[3];
        }vol;


        Part *mypart = theSession->arts()->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[0] = body1;
        NXOpen::BodyDumbRule *bodyDumbRule1;
        bodyDumbRule1 = mypart->ScRuleFactory()->CreateRuleBodyDumb(bodies1, true);


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


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


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


        std::vector<NXOpen::SelectionIntentRule *> rules2(1);
        rules2[0] = 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();
        



Error.png

9

主题

1452

回帖

4621

积分

中尉

积分
4621
发表于 4 天前 | 显示全部楼层
我使用vector的时候里面存放的东西都是一个一个放的,不知道你这样一起放是否可以。另外你上面的代码bbodys就是容器,以经收集了实体了。

4

主题

16

回帖

976

积分

五级士官

积分
976
 楼主| 发表于 4 天前 | 显示全部楼层
白色治愈之风 发表于 2026-5-6 08:18
我使用vector的时候里面存放的东西都是一个一个放的,不知道你这样一起放是否可以。另外你上面的代码bbodys ...

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

9

主题

1452

回帖

4621

积分

中尉

积分
4621
发表于 4 天前 | 显示全部楼层
2217231767 发表于 2026-5-6 10:52
①处与②处是两种方式获取实体方式,我先使用的②处,报错了,  所以尝试使用①处, 结果也是报错,
如果删除 ...

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

9

主题

1452

回帖

4621

积分

中尉

积分
4621
发表于 4 天前 | 显示全部楼层
UF_OBJ_cycle_objs_in_part,也可以试试这个函数

4

主题

42

回帖

2720

积分

少尉

积分
2720
发表于 4 天前 | 显示全部楼层
分割体使用UF_MODL_split_body更简洁些,也有对用的切割体输出

4

主题

16

回帖

976

积分

五级士官

积分
976
 楼主| 发表于 4 天前 | 显示全部楼层
白色治愈之风 发表于 2026-5-6 12:08
拆分之后是直接去参变成体还是拆分之后仍然是特征

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

4

主题

16

回帖

976

积分

五级士官

积分
976
 楼主| 发表于 4 天前 | 显示全部楼层
白色治愈之风 发表于 2026-5-6 12:15
UF_OBJ_cycle_objs_in_part,也可以试试这个函数

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

4

主题

16

回帖

976

积分

五级士官

积分
976
 楼主| 发表于 4 天前 | 显示全部楼层
不小明我们不约 发表于 2026-5-6 13:08
分割体使用UF_MODL_split_body更简洁些,也有对用的切割体输出

ufun这个函数试过, 每次只能用一个面拆分, 我是用好几百个面拆分, 就得循环拆分, 效率慢,所以改用NXOpen c++方式, 拆分倒是快了,但获取体卡住了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

咨询QQ:1359218528|发帖须知!|Archiver|手机版|小黑屋|UG爱好者论坛 ( 京ICP备10217105号-2 )

GMT+8, 2026-5-10 10:57

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表