需要将零件的LoadMode转换为EditMode。
void ARKBox::SetTriNumber(CATBody *ipBody,ARKTrianglePlane **&opaTriangle,TriNumber &oTriNumber)
{
double sag=0.1;
CATICGMBodyTessellator *pTessellator=::CATCGMCreateBodyTessellator(ipBody,sag,CATPIBY4);
pTessellator -> Run();
CATLISTP(CATCell) FacesCells;
ipBody -> GetAllCells(FacesCells,2);
int isize=FacesCells.Size();
CATBoolean isPlanar;
CATCGMTessPointIter * pVertices = NULL;
CATCGMTessStripeIter * pStrips = NULL;
CATCGMTessFanIter * pFans = NULL;
CATCGMTessPolyIter * pPolygons = NULL;
CATCGMTessTrianIter * pTriangles = NULL;
float (* aCoord)[3] = NULL;
int * aNuPts = NULL;
CATLONG32 nb=0;
for (int i=1;i<=isize;++i)
{
CATFace *pFace=NULL;
pFace=(CATFace *)FacesCells[i];
pTessellator -> GetFace(pFace,isPlanar,&pVertices,&pStrips,&pFans,&pPolygons,&pTriangles);
if(NULL != pStrips)
{
CATLONG32 nbs=0;
while (0==(pStrips -> IsExhausted()))
{
nbs+=pStrips -> GetStriNbPts();
nbs-=2;
pStrips -> GoToNext();
}
nb+=nbs;
}
if(NULL != pTriangles)
{
CATLONG32 nbt=0;
pTriangles -> Reset();
while (0==(pTriangles -> IsExhausted()))
{
nbt++;
pTriangles -> GoToNext();
}
nb+=nbt;
}
if(NULL != pFans)
{
CATLONG32 nbf=0;
while (0==(pFans -> IsExhausted()))
{
nbf+=pFans -> GetFanNbPts();
nbf-=1;
pFans -> GoToNext();
}
nb+=nbf;
}
}
oTriNumber=nb;
_TriangleNum=nb;
_aindex=new int[_TriangleNum];
for (int i=0;i<_TriangleNum;++i)
{
_aindex[i]=i;
}
opaTriangle=new ARKTrianglePlane *[nb];
int index=0;
for (int i=1;i<=isize;++i)
{
CATFace *pFace=NULL;
pFace=(CATFace *)FacesCells[i];
pTessellator -> GetFace(pFace,isPlanar,&pVertices,&pStrips,&pFans,&pPolygons,&pTriangles);
if(NULL != pVertices)
{
CATLONG32 nbp=pVertices -> GetNbPoint();
aCoord = new float[nbp][3];
pVertices -> GetPointXyzAll(aCoord);
}
pStrips -> Reset();
if(NULL != pStrips)
{
CATLONG32 nbs=0;
while (0==(pStrips -> IsExhausted()))
{
nbs=CATMax(nbs,pStrips -> GetStriNbPts());
pStrips -> GoToNext();
}
aNuPts=new int[nbs];
pStrips -> Reset();
while (0==(pStrips -> IsExhausted()))
{
nbs=pStrips -> GetStriNbPts();
pStrips -> GetStriNuPts(aNuPts);
for (int j=0;j<nbs-2;j++)
{
opaTriangle[index]=new ARKTrianglePlane(aCoord[aNuPts[j]],aCoord[aNuPts[j+1]],aCoord[aNuPts[j+2]]);
index++;
}
pStrips -> GoToNext();
}
delete [] aNuPts;
aNuPts = NULL;
}
pTriangles -> Reset();
if(NULL != pTriangles)
{
while (0==(pTriangles -> IsExhausted()))
{
int aNuP[3];
pTriangles -> GetTrianNuPts(aNuP);
opaTriangle[index]=new ARKTrianglePlane(aCoord[aNuP[0]],aCoord[aNuP[1]],aCoord[aNuP[2]]);
index++;
pTriangles -> GoToNext();
}
}
pFans -> Reset();
if(NULL != pFans)
{
CATLONG32 nbf=0;
while (0==(pFans -> IsExhausted()))
{
nbf=CATMax(nbf,pFans -> GetFanNbPts());
pFans -> GoToNext();
}
aNuPts=new int[nbf];
pFans -> Reset();
while (0==(pFans -> IsExhausted()))
{
nbf=pFans -> GetFanNbPts();
pFans -> GetFanNuPts(aNuPts);
int j;
for (j=0;j<nbf-2;j++)
{
opaTriangle[index]=new ARKTrianglePlane(aCoord[aNuPts[0]],aCoord[aNuPts[j+1]],aCoord[aNuPts[j+2]]);
index++;
}
opaTriangle[index]=new ARKTrianglePlane(aCoord[aNuPts[0]],aCoord[aNuPts[1]],aCoord[aNuPts[j+1]]);
index++;
pFans -> GoToNext();
}
delete [] aNuPts;
aNuPts = NULL;
}
delete [] aCoord;
aCoord = NULL;
}
pTessellator -> Release();
pTessellator = NULL;
}