面域
#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;
}
页:
[1]