找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 142|回复: 0

面域

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 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. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2024-12-28 14:20 , Processed in 0.128598 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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