admin 发表于 2024-3-6 11:47:42

面域

#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]
查看完整版本: 面域