找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1350|回复: 1

[分享] BrUtilities

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-7-12 08:25:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
#include "stdafx.h"
#include "StdArx.h"

#include "BrUtilities.h"
#include "GeUtilities.h"


Acad::ErrorStatus
getSubentPath (const AcDbEntity* pEnt,
                           int &numIds,
                           AcDbFullSubentPath*& subentIds,
                           AcDb::SubentType subType,
                           short marker,
                           const AcGePoint3d& pickpnt,
                           const AcGeMatrix3d& vxform)
{
        AcDb3dSolid* pSolid = NULL;
        AcDbRegion* pRegion = NULL;
        AcDbBody* pBody = NULL;
        Acad::ErrorStatus es;
       
        if ((pSolid = AcDb3dSolid::cast(pEnt)) != NULL) {
                es = pSolid->getSubentPathsAtGsMarker(subType,
                        marker, pickpnt, vxform, numIds, subentIds);
        } else if ((pRegion = AcDbRegion::cast(pEnt)) != NULL) {
                es = pRegion->getSubentPathsAtGsMarker(
                        subType, marker, pickpnt, vxform, numIds, subentIds);
        } else if ((pBody = AcDbBody::cast(pEnt)) != NULL) {
                es = pBody->getSubentPathsAtGsMarker(
                        subType, marker, pickpnt, vxform, numIds, subentIds);
        } else {
                return Acad::eWrongObjectType;
        }
       
        return es;
}


AcBr::ErrorStatus
getNurbCurve3dFromBrEdge(AcBrEdge *pEdge,AcGeNurbCurve3d& Curve)
{
        AcBr::ErrorStatus bs=AcBr::eOk;
        bs = pEdge->getCurveAsNurb(Curve);
        return bs;
}

AcBr::ErrorStatus
getBrLoopsFromBrFace(AcBrFace* pFace, AcBrLoopPointerArray& BrLoops)
{
        AcBr::ErrorStatus es;
        AcBrFaceLoopTraverser flt;
        AcBrLoop *pLoop;
        es = flt.setFace(*pFace);
        if(es != Acad::eOk)        return es;
       
        BrLoops.setLogicalLength(0);
        for(;!flt.done();flt.next()) {
                pLoop = new AcBrLoop();
                es = flt.getLoop(*pLoop);
                if(es != Acad::eOk) {
                        for(int i=0;i<BrLoops.length();i++) delete BrLoops[i];
                        BrLoops.setLogicalLength(0);
                        return es;
                }
                BrLoops.append(pLoop);
        }

/*
        AcBr::LoopType type;
        int i,len;
        len = BrLoops.length();
        for (i=1; i<len; i++) {
                BrLoops[i]->getType(type);
                if (type == AcBr::kLoopExterior) {
                        BrLoops.swap(0,i);
                        break;
                }
        }
*/
       
        return es;
}

AcBr::ErrorStatus getBrEdgesFromBrLoop(AcBrLoop* pLoop, AcBrEdgePointerArray& BrEdges)
{
        AcBr::ErrorStatus bs;
        AcBrLoopEdgeTraverser let;
        AcBrEdge *pEdge;
       
        // Initialize the LoopEdge traverser
        if((bs = let.setLoop(*pLoop)) != AcBr::eOk)
                return bs;
       
        // Iterate through through the loop
        BrEdges.setLogicalLength(0);
        for(;!let.done();let.next()) {
                pEdge = new AcBrEdge();
                // get the current edge
                bs = let.getEdge(*pEdge);
                if(bs != AcBr::eOk) {
                        for(int i=0;i<BrEdges.length();i++)        delete BrEdges[i];
                        BrEdges.setLogicalLength(0);
                        return bs;
                }
                BrEdges.append(pEdge);
        }
       
        return bs;
}

AcBr::ErrorStatus
getNurbCurve3dsFromBrEdges(AcBrEdgePointerArray& Edges,AcGeNurbCurve3dArray& Curves)
{
        AcGeNurbCurve3d curve;
        AcGeCurve3d *pCurve;
        AcGeInterval intrvl;
        AcGePoint3dArray pnts;
        AcGe::EntityId type;

        Curves.setLogicalLength(0);
        for(int i=0;i<Edges.length();i++) {
                if (Edges[i]->isNull()) {
                        Curves.setLogicalLength(0);
                        return AcBr::eInvalidInput;
                }

                Edges[i]->getCurveType(type);
                Edges[i]->getCurve(pCurve);
                pnts.setLogicalLength(0);
                switch(type) {
                case AcGe::kLineSeg3d :
                        pnts.setLogicalLength(2);
                        pCurve->hasStartPoint(pnts[0]);
                        pCurve->hasEndPoint(pnts[1]);
                        break;
                case AcGe::kPointEnt3d :
                        continue;
                case AcGe::kCircArc3d :
                        pCurve->getSamplePoints(9,pnts);
                        break;
                case AcGe::kEllipArc3d :
                        pCurve->getSamplePoints(9,pnts);
                        break;
                case AcGe::kNurbCurve3d :
                        pCurve->getSamplePoints(9,pnts);
                        break;
                default:
                        break;
                }
                delete pCurve;
                if (pnts.length()) {
                        curve = AcGeNurbCurve3d(pnts);
                        Curves.append(curve);
                }
        }
        if(i==0) return AcBr::eInvalidInput;

        return AcBr::eOk;
}

AcBr::ErrorStatus
getPntsArrayFromBrEdges(AcBrEdgePointerArray& Edges,ChGePnts3dArray& Curves)
{
        AcGeCurve3d *pCurve;
        AcGePoint3dArray pnts;
       
        Curves.setLogicalLength(0);
        for(int i=0;i<Edges.length();i++) {
                if (Edges[i]->isNull()) {
                        Curves.setLogicalLength(0);
                        return AcBr::eInvalidInput;
                }
       
                Edges[i]->getCurve(pCurve);
                getPntsFromCurve(pCurve,pnts);
                delete pCurve;
                Curves.append(pnts);
        }
        if(i==0) return AcBr::eInvalidInput;
       
        return AcBr::eOk;
}

AcBr::ErrorStatus
getGeLoopFromBrLoop(AcBrLoop* pBrLoop, ChGeLoop3d& GeLoop)
{
        AcBr::ErrorStatus es;
        AcBrEdgePointerArray edges;

        es = getBrEdgesFromBrLoop(pBrLoop,edges);
        GeLoop.setLogicalLength(0);
        if(es != AcBr::eOk) return es;

        es = getPntsArrayFromBrEdges(edges,GeLoop);

        int i,ilen,j;
        ilen = GeLoop.length();
        for (i=0; i<ilen-1; i++) {
                if (!GeLoop[i].last().isEqualTo(GeLoop[i+1].first())) {
                        for (j=i+2; j<ilen; j++) {
                                if (GeLoop[i].last().isEqualTo(GeLoop[j].first())) {
                                        GeLoop.swap(i+1,j);
                                        break;
                                }
                        }
                }
        }

        for (i=0; i<ilen-1; i++) {
                if (!GeLoop[i].last().isEqualTo(GeLoop[i+1].first())) {
                        return AcBr::eInvalidInput;
                }
        }
        if (!GeLoop.first().first().isEqualTo(GeLoop.last().last())) {
                return AcBr::eInvalidInput;
        }


/*
        AcBrLoopVertexTraverser lvt;
        es = lvt.setLoop(*pBrLoop);
        if (es == AcBr::eOk) {
                AcBrVertex brV;
                AcGePoint3dArray tmpPnts;
                lvt.getVertex(brV);
                tmpPnts.setLogicalLength(1);
                brV.getPoint(tmpPnts[0]);
                for (i=0; i<ilen; i++) {
                        if (GeLoop[i].first().isEqualTo(tmpPnts.first())) {
                                GeLoop.insertAt(i,tmpPnts);
                                break;
                        }
                }
                if (GeLoop.length() == ilen) {
                        return AcBr::eInvalidInput;
                }
        }
*/

        return AcBr::eOk;
}


// 一旦某个BrLoop出错,则返回错误,GeLoop置空
AcBr::ErrorStatus
getGeLoopsFromBrLoops(AcBrLoopPointerArray& BrLoops, ChGeLoop3dArray& GeLoops)
{
        AcBr::ErrorStatus es;
        int i, num;
        num = BrLoops.length();
        GeLoops.setLogicalLength(num);
        for(i=0;i<num;i++) {
                es = getGeLoopFromBrLoop(BrLoops[i],GeLoops[i]);
                if(es!=AcBr::eOk) {
                        GeLoops.setLogicalLength(0);
                        return es;
                }
        }
       
        return es;
}

AcBr::ErrorStatus
getBrFaceFromRegion(AcDbRegion *pRg, AcBrFace*& pBrFace)
{
        short marker;
        AcGePoint3d pickpnt;
        AcGeMatrix3d vxform;
        int numIds;
        AcDbFullSubentPath *subentIds;
        Acad::ErrorStatus es;
       
        marker = 1;
        es = pRg->getSubentPathsAtGsMarker(AcDb::kFaceSubentType,marker,
                pickpnt,vxform,numIds,subentIds);
        if (numIds==1) {
                pBrFace = new AcBrFace;
                pBrFace->setSubentPath(subentIds[0]);
                delete [] subentIds;
               
                return AcBr::eOk;
        } else if (numIds>1) {
                delete [] subentIds;
        }
       
        return AcBr::eInvalidObject;
}


AcBr::ErrorStatus
getBrFacesFromRegion(AcDbRegion *pRg, AcDbVoidPtrArray& pBrFaces)
{
        short marker;
        AcGePoint3d pickpnt;
        AcGeMatrix3d vxform;
        int numIds;
        AcDbFullSubentPath *subentIds;
        AcDbFullSubentPathArray subentIdArr;

        marker = 0;
        do {
                marker++;
                pRg->getSubentPathsAtGsMarker(AcDb::kFaceSubentType,marker,
                        pickpnt,vxform,numIds,subentIds);
                if (numIds==0) break;
                for (register j=0; j<numIds; j++) {
                        if ( !subentIdArr.contains(subentIds[j]) ) {
                                subentIdArr.append(subentIds[j]);
                        }
                }
                delete [] subentIds;
        } while(true);
       
        numIds = subentIdArr.length();
        if (numIds==0) return AcBr::eWrongObjectType;

        AcBrFace *pFace;
        int i;
        for (i=0; i<numIds; i++) {
                pFace = new AcBrFace;
                pFace->setSubentPath(subentIdArr[i]);
                pBrFaces.append(pFace);
        }

        return AcBr::eOk;
}


AcBr::ErrorStatus
getBrEntityFromEnt (const AcDbEntity* pEnt,
                                        AcDb::SubentType subType,
                                        AcBrEntity*& pBrEnt,
                                        short marker,
                                        const AcGePoint3d& pickpnt,
                                        const AcGeMatrix3d& vxform)
{

        int numIds;
        AcDbFullSubentPath *subentIds;
        Acad::ErrorStatus es;
        AcBr::ErrorStatus brEs;
       
        es = getSubentPath(pEnt,numIds,subentIds,subType,
                marker,pickpnt,vxform);

        if (numIds==1) {
                switch(subType) {
                case AcDb::kNullSubentType:
                        pBrEnt = new AcBrBrep();
                        break;
                case AcDb::kFaceSubentType:
                        pBrEnt = new AcBrFace();
                        break;
                case AcDb::kEdgeSubentType:
                        pBrEnt = new AcBrEdge();
                        break;  
                default:
                        delete [] subentIds;
                        return AcBr::eWrongSubentityType;
                }
                brEs = pBrEnt->set(subentIds[0]);
                delete [] subentIds;
                return brEs;
        } else if (numIds>1) {
                delete [] subentIds;
        }
       
        return AcBr::eInvalidObject;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-7-12 08:25:55 | 显示全部楼层
#ifndef BR_UTILITIES_H
#define BR_UTILITIES_H

//////////////////////////////////////////////////////////////////////////
//
// 与Brep, AcBr相关的函数
//
// Note:
//               
//////////////////////////////////////////////////////////////////////////


#include "TypeDef.h"

#ifdef _DBXEXP_
#define DLLIMPEXP __declspec(dllexport)
#else
#define DLLIMPEXP
#endif


/*
*        Purpose:
*                get the subentPath from entity,
*                只对Region, solid 和body有效.
*        Argument:
*                pEnt                [in], 实体指针
*                numIds                [out], 返回的subentPath个数
*                subentIds        [out], 返回的subentPath指针数组
*                subType                [in], 需要返回的subentPath类型
*                marker                [in], Gs marker
*                pickpnt                [in], pick point, 只对solid有用
*                vxform                [in], view form, 只对solid有用
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP Acad::ErrorStatus
getSubentPath (const AcDbEntity* pEnt,
                           int &numIds,
                           AcDbFullSubentPath*& subentIds,
                           AcDb::SubentType subType,
                           short marker=1,
                           const AcGePoint3d& pickpnt=AcGePoint3d::kOrigin,
                           const AcGeMatrix3d& vxform=AcGeMatrix3d::kIdentity);


/*
*        Purpose:
*                get NurbsCurve3d from BrEdge.
*        Argument:
*                pEdge        [in], 实体AcBrEdge指针
*                Curve        [out], 得到的Curve
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP AcBr::ErrorStatus
getNurbCurve3dFromBrEdge(AcBrEdge *pEdge,AcGeNurbCurve3d& Curve);


/*
*        Purpose:
*                从AcBrFace, 得到实体AcBrLoops.
*        Argument:
*                pFace        [in], 实体AcBrFace指针
*                BrLoops        [out], 实体AcBrLoop数组
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP AcBr::ErrorStatus
getBrLoopsFromBrFace(AcBrFace* pFace, AcBrLoopPointerArray& BrLoops);


/*
*        Purpose:
*                从AcBrLoop, 得到实体AcBrEdges.
*        Argument:
*                pLoop        [in], 实体AcBrLoop指针
*                BrEdges        [out], 实体AcBrEdge数组
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP AcBr::ErrorStatus
getBrEdgesFromBrLoop(AcBrLoop* pLoop, AcBrEdgePointerArray& BrEdges);


/*
*        Purpose:
*                get NurbsCurve3ds from BrEdges.
*        Argument:
*                Edges        [in], 实体AcBrEdgePointerArray
*                Curves        [out], 得到的Curves
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP AcBr::ErrorStatus
getNurbCurve3dsFromBrEdges(AcBrEdgePointerArray& Edges,
                                                   AcGeNurbCurve3dArray& Curves);


/*
*        Purpose:
*                get Points Array from AcBrEdges.
*                the length of points Array is equal to AcBrEdges.
*        Argument:
*                Edges        [in], 实体AcBrEdgePointerArray.
*                Curves        [out], 得到的Curves points Array.
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP AcBr::ErrorStatus
getPntsArrayFromBrEdges(AcBrEdgePointerArray& Edges,
                                                ChGePnts3dArray& Curves);


/*
*        Purpose:
*                get the AcGeLoop3d from AcBrLoop.
*        Argument:
*                pBrLoop        [in], AcBrLoop pointer.
*                GeLoop        [out], AcGeLoop3d
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP AcBr::ErrorStatus
getGeLoopFromBrLoop(AcBrLoop* pBrLoop, ChGeLoop3d& GeLoop);


/*
*        Purpose:
*                get the AcGeLoop3dArray from AcBrLoopPointerArray.
*        Argument:
*                BrLoops        [in], AcBrLoopPointerArray.
*                GeLoops        [out], AcGeLoop3d array pointer.
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP AcBr::ErrorStatus
getGeLoopsFromBrLoops(AcBrLoopPointerArray& BrLoops,
                                          ChGeLoop3dArray& GeLoops);


/*
*        Purpose:
*                从region对象获取AcBrFace对象,该对象必须存在于数据库中,
*                可以没有owner. 成功时注意释放AcBrLoop对象内存空间.
*        Argument:
*                pRg                [in], region对象指针.
*                pBrFace        [out], 返回的AcBrLoop对象指针.
*        Return:
*                eOk, 成功
*                其他,失败, loops长度为0
*/
extern DLLIMPEXP AcBr::ErrorStatus
getBrFaceFromRegion(AcDbRegion *pRg, AcBrFace*& pBrFace);

/*
*        Purpose:
*                从region对象获取AcBrFace对象指针数组,该对象必须存在于数据库中,
*                可以没有owner. 成功时注意释放AcBrLoop对象内存空间.
*        Argument:
*                pRg                        [in], region对象指针.
*                pBrFaces        [out], 返回的AcBrLoop对象指针数组.
*        Return:
*                eOk, 成功
*                其他,失败, loops长度为0
*/
extern DLLIMPEXP AcBr::ErrorStatus
getBrFacesFromRegion(AcDbRegion *pRg, AcDbVoidPtrArray& pBrFaces);

/*
*        Purpose:
*                获取实体AcBrFace, 只对Region, solid 和body有效.
*        Argument:
*                pEnt                [in], 实体指针
*                subType                [in], 需要返回的subentPath类型
*                pBrEnt                [out], 返回的AcBrEntity
*                marker                [in], Gs marker
*                pickpnt                [in], pick point, 只对solid有用
*                vxform                [in], view form, 只对solid有用
*        Return:
*                Returns eOk if success.
*/
extern DLLIMPEXP AcBr::ErrorStatus
getBrEntityFromEnt (const AcDbEntity* pEnt,
                                        AcDb::SubentType subType,
                                        AcBrEntity*& pBrEnt,
                                        short marker=1,
                                        const AcGePoint3d& pickpnt=AcGePoint3d::kOrigin,
                                        const AcGeMatrix3d& vxform=AcGeMatrix3d::kIdentity);

#endif // BR_UTILITIES_H
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-10 05:42 , Processed in 0.363383 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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