【C++ Ord UP7】Mesh面布尔运算

老师们,您好,如文件中所示,我想用蓝色的面将红色的mesh面分割为上下两半,但无论我怎么切换这两个Mesh面的方向,都只能得到上面的一部分,下面一部分无论如何得不到,请问下是什么原因呢?Mesh面切割得不到想要的结果2-保留4份.dgn

Parents
  • 您可以参考下面代码,然后在界面上修改一下蓝色的法向方向是可以获取下半部分:

     EditElementHandle eeh0(3956L, ACTIVEMODEL);
        EditElementHandle eeh1(3951L, ACTIVEMODEL);
        if (!eeh0.IsValid() || !eeh1.IsValid())
        {
            mdlDialog_dmsgsPrintA("eh0 or eh1 is invalid");
            return false;
        }
        eeh0.GetElementDescrP();
        MSElementDescrP mesh0 = eeh0.ExtractElementDescr();
        eeh1.GetElementDescrP();
        MSElementDescrP mesh1 = eeh1.ExtractElementDescr();
    
     
    
    
        StatusInt status = ERROR;
        PolyfaceArrays pArrays0;
        PolyfaceArrays pArrays1;
        DPoint3d color0, color1;
        int  pNumPerFace0, pNumPerFace1;
        memset(&pArrays0, 0, sizeof(pArrays0));
        memset(&pArrays1, 0, sizeof(pArrays1));
    
     
    
        status = mdlMesh_getPolyfaceArraysExt(mesh0, &pArrays0, &pNumPerFace0, NULL, NULL, NULL, NULL, NULL, false);
        status = mdlMesh_getPolyfaceArraysExt(mesh1, &pArrays1, &pNumPerFace1, NULL, NULL, NULL, NULL, NULL, false);
        color0 = mdlPop_getDColorFromElement(&mesh0->el, ACTIVEMODEL);
        color1 = mdlPop_getDColorFromElement(&mesh1->el, ACTIVEMODEL);
    
     
    
        MdlPopPolyBrepP pBrep0 = NULL, pBrep1 = NULL;
    
     
    
        MdlPopContextP  pContext = mdlPop_grabContext();
    
     
    
        MSElementDescrP outEdPP = NULL;
    
     
    
        if (SUCCESS == (status = mdlPop_polyBrepFromElementDescrEx(&pBrep0, pContext, &pArrays0, pNumPerFace0, &color0, false, false)) &&
            SUCCESS == (status = mdlPop_polyBrepFromElementDescrEx(&pBrep1, pContext, &pArrays1, pNumPerFace1, &color1, false, false)))
        {
            if (mdlPop_polyBrepFromPolyBrepBoolOp(pContext, pBrep0, pBrep1, 2, false, false, false, false))
            {
                mdlPop_elementDescrFromPolyBrep(&outEdPP, NULL, pBrep0, false, false);
                pBrep1 = NULL;          // brep1 is consumed#ifdef TIME_RECORD
    
     
    
            }
        }
    
     
    
        if (pBrep0)
            mdlPop_free(pBrep0);
        if (pBrep1)
            mdlPop_free(pBrep1);
    
     
    
        mdlMesh_dropPolyfaceArrays(&pArrays0);
        mdlMesh_dropPolyfaceArrays(&pArrays1);
        mdlPop_dropContext(pContext);
    
     
    
        if (NULL != outEdPP)
        {
            EditElementHandle eeh2(outEdPP, true, false, ACTIVEMODEL);
            eeh2.AddToModel();
        }

    Answer Verified By: cao li 

Reply
  • 您可以参考下面代码,然后在界面上修改一下蓝色的法向方向是可以获取下半部分:

     EditElementHandle eeh0(3956L, ACTIVEMODEL);
        EditElementHandle eeh1(3951L, ACTIVEMODEL);
        if (!eeh0.IsValid() || !eeh1.IsValid())
        {
            mdlDialog_dmsgsPrintA("eh0 or eh1 is invalid");
            return false;
        }
        eeh0.GetElementDescrP();
        MSElementDescrP mesh0 = eeh0.ExtractElementDescr();
        eeh1.GetElementDescrP();
        MSElementDescrP mesh1 = eeh1.ExtractElementDescr();
    
     
    
    
        StatusInt status = ERROR;
        PolyfaceArrays pArrays0;
        PolyfaceArrays pArrays1;
        DPoint3d color0, color1;
        int  pNumPerFace0, pNumPerFace1;
        memset(&pArrays0, 0, sizeof(pArrays0));
        memset(&pArrays1, 0, sizeof(pArrays1));
    
     
    
        status = mdlMesh_getPolyfaceArraysExt(mesh0, &pArrays0, &pNumPerFace0, NULL, NULL, NULL, NULL, NULL, false);
        status = mdlMesh_getPolyfaceArraysExt(mesh1, &pArrays1, &pNumPerFace1, NULL, NULL, NULL, NULL, NULL, false);
        color0 = mdlPop_getDColorFromElement(&mesh0->el, ACTIVEMODEL);
        color1 = mdlPop_getDColorFromElement(&mesh1->el, ACTIVEMODEL);
    
     
    
        MdlPopPolyBrepP pBrep0 = NULL, pBrep1 = NULL;
    
     
    
        MdlPopContextP  pContext = mdlPop_grabContext();
    
     
    
        MSElementDescrP outEdPP = NULL;
    
     
    
        if (SUCCESS == (status = mdlPop_polyBrepFromElementDescrEx(&pBrep0, pContext, &pArrays0, pNumPerFace0, &color0, false, false)) &&
            SUCCESS == (status = mdlPop_polyBrepFromElementDescrEx(&pBrep1, pContext, &pArrays1, pNumPerFace1, &color1, false, false)))
        {
            if (mdlPop_polyBrepFromPolyBrepBoolOp(pContext, pBrep0, pBrep1, 2, false, false, false, false))
            {
                mdlPop_elementDescrFromPolyBrep(&outEdPP, NULL, pBrep0, false, false);
                pBrep1 = NULL;          // brep1 is consumed#ifdef TIME_RECORD
    
     
    
            }
        }
    
     
    
        if (pBrep0)
            mdlPop_free(pBrep0);
        if (pBrep1)
            mdlPop_free(pBrep1);
    
     
    
        mdlMesh_dropPolyfaceArrays(&pArrays0);
        mdlMesh_dropPolyfaceArrays(&pArrays1);
        mdlPop_dropContext(pContext);
    
     
    
        if (NULL != outEdPP)
        {
            EditElementHandle eeh2(outEdPP, true, false, ACTIVEMODEL);
            eeh2.AddToModel();
        }

    Answer Verified By: cao li 

Children
No Data