|
- #include "brbrep.h"
- #include "brvtx.h"
- #include "brface.h"
- #include "bredge.h"
- #include "brletrav.h"
- #include "brbftrav.h"
- #include "brfltrav.h"
-
-
- AcDbObjectIdArray FymRegion::AddRegion(const AcDbObjectIdArray& objIds)//传入面域边界数据库对象id列表
- {
- AcDbObjectIdArray regionArrs;//用于生成面域对象的数组
- AcDbVoidPtrArray curves;//指向面域曲线边界的指针列表
- AcDbVoidPtrArray regions;//指向新创建面域对象的指针列表
- AcDbEntity* pEnt = NULL;//关闭边界曲线实体对象的临时指针
- AcDbRegion* pRegion = NULL;//面域对象指针,用于将其添加到模型空间
- for (int i = 0; i < objIds.length(); i++)// 遍历边界对象
- { // 提取每个边界对象的指针
- acdbOpenObject(pEnt, objIds.at(i), AcDb::kForRead);
- // 判断指针是否为曲线类的派生类(面域边界的必要条件)
- if (pEnt->isKindOf(AcDbCurve::desc()))
- { // 将指针类型强制转换为曲线类对象
- AcDbCurve* pCurve = AcDbCurve::cast(pEnt);
- curves.append(pCurve);// 添加到指针列表中
- }
- }
- // 用AcDbRegion的方法创建面域:用指针列表curves创建面域
- Acad::ErrorStatus es = AcDbRegion::createFromCurves(curves, regions);
- if (es == Acad::eOk)
- {
- for (int i = 0; i < regions.length(); i++)
- {
- // pRegion = AcDbRegion::cast((AcDbRegion*)regions.at(i));
- pRegion = (AcDbRegion*)regions.at(i);
- pRegion->setDatabaseDefaults(); //重置pRegion对象的所有设置为默认值
- AcDbObjectId regId;
- regId = FymDatabase::PostToModelSpace(pRegion);
- regionArrs.append(regId);
- }
- }
- else
- { // 如果创建失败,释放指针指向的内存空间
- for (int i = 0; i < regions.length(); i++)
- {
- delete(AcRxObject*)regions.at(i);
- }
-
- }
- // 关闭对象
- for (int i = 0; i < curves.length(); i++)
- {
- pEnt = (AcDbEntity*)curves.at(i);
- pEnt->close();
- }
- return regionArrs;
- }
-
- //通过遍历给定的面域的所有面和边,来获取面域中所有的点
- void FymRegion::GetRegionPoints(AcDbRegion* pRegion, AcGePoint3dArray& points)
- {
- AcBrBrep* pBrep = new AcBrBrep;
- pBrep->set(*pRegion);//数据复制
- AcBrBrepFaceTraverser brFaTrav;
- for (brFaTrav.setBrep(*pBrep); !brFaTrav.done(); brFaTrav.next())
- //使用brFaTrav遍历AcBrBrep的所有面
- {//在面遍历循环内部,创建AcBrFaceLoopTraverser对象并获取当前面的信息
- AcBrFaceLoopTraverser faLoTrav;
- AcBrFace face;
- brFaTrav.getFace(face);
- //使用faLoTrav遍历当前面的所有环。
- for (faLoTrav.setFace(face); !faLoTrav.done(); faLoTrav.next())
- {
- AcBrLoopEdgeTraverser loEdTrav;
- //在环遍历循环内部,创建AcBrLoopEdgeTraverser对象并尝试设置当前环
- // 。如果设置成功,进入下一轮循环。
- if (loEdTrav.setLoop(faLoTrav) == AcBr::eOk)
- {
- for (; !loEdTrav.done(); loEdTrav.next())
- //使用loEdTrav遍历环的所有边
- {
- AcBrEdge edge;
- loEdTrav.getEdge(edge);//获取当前边的信息
- AcBrVertex start;
- edge.getVertex1(start);//获取边的起始顶点
- AcGePoint3d pt;
- start.getPoint(pt);//获取起始顶点的坐标
- points.append(pt);//将该点的坐标添加到输出数组中
- }
- } // 否则就是一个孤立的循环
- }
- }
- delete pBrep;
- }
复制代码 |
|