设为首页收藏本站

中国膜结构网

 找回密码
 立即注册
膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 77|回复: 0

用BREP API去掉3DSOLID的洞(附代码)

[复制链接]
  • TA的每日心情
    开心
    2021-3-9 08:49
  • 签到天数: 1442 天

    连续签到: 21 天

    [LV.10]以坛为家III

    发表于 2021-1-19 19:36 | 显示全部楼层 |阅读模式
    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构咨询服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系QQ:463017170.

    1. void removeHoles()
    2. {
    3.     AcDb3dSolid* pSolid;
    4.     AcDbObjectId solidId;
    5.     AcBr::ErrorStatus bs;
    6.     AcBrBrep brep;
    7.     AcBrBrepFaceTraverser bft;
    8.     AcBrFaceLoopTraverser flt;
    9.     AcBrLoopEdgeTraverser let;
    10.     AcBrEdgeLoopTraverser elt;

    11.     AcBrFace face;
    12.     AcBrLoop loop,loop2;
    13.     AcBrEdge edge;
    14.     AcBr::LoopType loopType;
    15.     AcArray<AcDbSubentId*> faces;
    16.     AcBrFace faceToRemove;


    17.     if((pSolid = selectSolid("\nSelect a solid",solidId,AcDb::kForWrite)) == NULL)
    18.     {
    19.         acutPrintf("\nSelection failed");
    20.         return;
    21.     }

    22.     // Initialize the Brep
    23.     AcDbFullSubentPath path(solidId,AcDbSubentId());

    24.     try
    25.     {
    26.         bs = brep.setSubentPath(path);
    27.         if(bs != AcBr::eOk)
    28.         {
    29.             acutPrintf("\nsetSubentPath failed");
    30.             throw bs;
    31.         }

    32.         // Initialize the BrepFace traverser
    33.         bs = bft.setBrep(brep);
    34.         if(bs != AcBr::eOk)
    35.         {
    36.             acutPrintf("\nsetBrep failed");
    37.             throw bs;
    38.         }


    39.         // Traverse all faces
    40.         for(;!bft.done();bft.next())
    41.         {
    42.             bs = bft.getFace(face);
    43.             if(bs != Acad::eOk)
    44.             {
    45.                 acutPrintf("\ngetFace failed");
    46.                 throw bs;
    47.             }

    48.             // Initialize the face-loop traverser
    49.             bs = flt.setFace(face);
    50.             if(bs != Acad::eOk)
    51.             {
    52.                 acutPrintf("\nsetFace failed");
    53.                 throw bs;
    54.             }

    55.             // Traverse all loops of the actual face
    56.             for(;!flt.done();flt.next())
    57.             {
    58.                 bs = flt.getLoop(loop);
    59.                 if(bs != Acad::eOk)
    60.                 {
    61.                     acutPrintf("\ngetLoop failed");
    62.                     throw bs;
    63.                 }

    64.                 loop.getType(loopType);

    65.                 // If we got an outer loop continue with the face traversing
    66.                 if(loopType != AcBr::kLoopInterior)
    67.                     break;

    68.                 // Traverse all edges of current interior loop
    69.                 bs = let.setLoop(flt);
    70.                 if(bs != AcBr::eOk)
    71.                 {
    72.                     acutPrintf("\nsetLoop failed");
    73.                     throw bs;
    74.                 }
    75.             
    76.                 for(;!let.done();let.next())
    77.                 {
    78.                     bs = let.getEdge(edge);
    79.                     if(bs != Acad::eOk)
    80.                     {
    81.                         acutPrintf("\ngetEdge failed");
    82.                         throw bs;
    83.                     }

    84.                     // Traverse all loops of current edge
    85.                     bs = elt.setEdge(edge);
    86.                     if(bs != AcBr::eOk)
    87.                         acutPrintf("\nsetEdgeAndLoop failed");

    88.                     for(;!elt.done();elt.next())
    89.                     {
    90.                         bs = elt.getLoop(loop2);
    91.                         if(bs != AcBr::eOk)
    92.                         {
    93.                             acutPrintf("\ngetLoop failed");
    94.                             throw bs;
    95.                         }
    96.                         // if it is the same loop as the loop processed by flt
    97.                         // continue
    98.                         if(loop.isEqualTo(&loop2))
    99.                             continue;
    100.                         loop2.getFace(faceToRemove);
    101.                             faceToRemove.getSubentPath(path);

    102.                         Adesk::Boolean isInList = Adesk::kFalse;
    103.                         
    104.                         for(int i=0;i<faces.length();i++)
    105.                         {
    106.                             if(path.subentId() == *(faces))
    107.                                 isInList = Adesk::kTrue;
    108.                         }
    109.                         if(!isInList)
    110.                             faces.append(new AcDbSubentId(path.subentId()));
    111.                     }
    112.                 }
    113.             }
    114.         }

    115.         acutPrintf("\nGot %d faces ",faces.length());
    116.         pSolid->removeFaces(faces);
    117.     }
    118.     catch(AcBr::ErrorStatus bs)
    119.     {
    120.         acutPrintf(" bs = %d",bs);
    121.     }
    122.     pSolid->close();
    123. }
    复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    推荐膜材品牌上一条 /5 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构协会

    QQ|申请友链|Archiver|手机版|中国膜结构论坛

    GMT+8, 2021-3-9 13:17 , Processed in 0.294774 second(s), 27 queries .

    Powered by 中国膜结构网->膜材采购->膜结构设计->膜结构安装->膜结构维修

    © 2014-2020 膜结构协会->进口膜材->国产膜材->PVDF膜材->PTFE膜材->ETFE膜材.

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