天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 135|回复: 0

面域

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-3-6 11:47:42 | 显示全部楼层 |阅读模式
    1. #include "brbrep.h"
    2. #include "brvtx.h"
    3. #include "brface.h"
    4. #include "bredge.h"
    5. #include "brletrav.h"
    6. #include "brbftrav.h"
    7. #include "brfltrav.h"
    8. AcDbObjectIdArray FymRegion::AddRegion(const AcDbObjectIdArray& objIds)//传入面域边界数据库对象id列表
    9. {
    10.         AcDbObjectIdArray regionArrs;//用于生成面域对象的数组
    11.         AcDbVoidPtrArray curves;//指向面域曲线边界的指针列表
    12.         AcDbVoidPtrArray regions;//指向新创建面域对象的指针列表
    13.         AcDbEntity* pEnt = NULL;//关闭边界曲线实体对象的临时指针
    14.         AcDbRegion* pRegion = NULL;//面域对象指针,用于将其添加到模型空间
    15.         for (int i = 0; i < objIds.length(); i++)// 遍历边界对象
    16.         {   // 提取每个边界对象的指针
    17.                 acdbOpenObject(pEnt, objIds.at(i), AcDb::kForRead);
    18.                 // 判断指针是否为曲线类的派生类(面域边界的必要条件)
    19.                 if (pEnt->isKindOf(AcDbCurve::desc()))
    20.                 {   // 将指针类型强制转换为曲线类对象
    21.                         AcDbCurve* pCurve = AcDbCurve::cast(pEnt);
    22.                         curves.append(pCurve);// 添加到指针列表中
    23.                 }
    24.         }
    25.         // 用AcDbRegion的方法创建面域:用指针列表curves创建面域
    26.         Acad::ErrorStatus es = AcDbRegion::createFromCurves(curves, regions);
    27.         if (es == Acad::eOk)
    28.         {
    29.                 for (int i = 0; i < regions.length(); i++)
    30.                 {
    31.                         // pRegion = AcDbRegion::cast((AcDbRegion*)regions.at(i));
    32.                         pRegion = (AcDbRegion*)regions.at(i);
    33.                         pRegion->setDatabaseDefaults(); //重置pRegion对象的所有设置为默认值
    34.                         AcDbObjectId regId;
    35.                         regId = FymDatabase::PostToModelSpace(pRegion);
    36.                         regionArrs.append(regId);
    37.                 }
    38.         }
    39.         else
    40.         {   // 如果创建失败,释放指针指向的内存空间
    41.                 for (int i = 0; i < regions.length(); i++)
    42.                 {
    43.                         delete(AcRxObject*)regions.at(i);
    44.                 }
    45.         }
    46.         // 关闭对象
    47.         for (int i = 0; i < curves.length(); i++)
    48.         {
    49.                 pEnt = (AcDbEntity*)curves.at(i);
    50.                 pEnt->close();
    51.         }
    52.         return regionArrs;
    53. }
    54. //通过遍历给定的面域的所有面和边,来获取面域中所有的点
    55. void FymRegion::GetRegionPoints(AcDbRegion* pRegion, AcGePoint3dArray& points)
    56. {
    57.         AcBrBrep* pBrep = new AcBrBrep;
    58.         pBrep->set(*pRegion);//数据复制
    59.         AcBrBrepFaceTraverser brFaTrav;
    60.         for (brFaTrav.setBrep(*pBrep); !brFaTrav.done(); brFaTrav.next())
    61.                 //使用brFaTrav遍历AcBrBrep的所有面
    62.         {//在面遍历循环内部,创建AcBrFaceLoopTraverser对象并获取当前面的信息
    63.                 AcBrFaceLoopTraverser faLoTrav;
    64.                 AcBrFace face;
    65.                 brFaTrav.getFace(face);
    66.                 //使用faLoTrav遍历当前面的所有环。
    67.                 for (faLoTrav.setFace(face); !faLoTrav.done(); faLoTrav.next())
    68.                 {
    69.                         AcBrLoopEdgeTraverser loEdTrav;
    70.                         //在环遍历循环内部,创建AcBrLoopEdgeTraverser对象并尝试设置当前环
    71.                         // 。如果设置成功,进入下一轮循环。
    72.                         if (loEdTrav.setLoop(faLoTrav) == AcBr::eOk)
    73.                         {
    74.                                 for (; !loEdTrav.done(); loEdTrav.next())
    75.                                         //使用loEdTrav遍历环的所有边
    76.                                 {
    77.                                         AcBrEdge edge;
    78.                                         loEdTrav.getEdge(edge);//获取当前边的信息
    79.                                         AcBrVertex start;
    80.                                         edge.getVertex1(start);//获取边的起始顶点
    81.                                         AcGePoint3d pt;
    82.                                         start.getPoint(pt);//获取起始顶点的坐标
    83.                                         points.append(pt);//将该点的坐标添加到输出数组中
    84.                                 }
    85.                         } // 否则就是一个孤立的循环   
    86.                 }
    87.         }
    88.         delete pBrep;
    89. }
    复制代码

     

     

     

     

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

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 08:02 , Processed in 0.124988 second(s), 27 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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