📄 brutilities.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 + -