⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 brutilities.cpp

📁 能在MDT5/6环境下对已经存在地曲面进行全部和局部区域展开
💻 CPP
字号:
#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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -