EgtGeomKernel 2.2f4 :
- aggiunta gestione secondo colore in operazioni booleane tra superfici trimesh.
This commit is contained in:
+45
-9
@@ -38,7 +38,7 @@ GEOOBJ_REGISTER( SRF_TRIMESH, NGE_S_TRM, SurfTriMesh) ;
|
||||
SurfTriMesh::SurfTriMesh( void)
|
||||
: m_nStatus( TO_VERIFY), m_dLinTol( STM_STD_LIN_TOL), m_dBoundaryAng( STM_STD_BOUNDARY_ANG),
|
||||
m_dSmoothAng( STM_STD_SMOOTH_ANG), m_bOriented( false), m_bClosed( false), m_bFaceted( false),
|
||||
m_nTimeStamp( 0), m_nTempProp( 0), m_pHGrd3d( nullptr), m_nParts( -1)
|
||||
m_nTimeStamp( 0), m_nTempProp( 0), m_nMaxTFlag( 0), m_nParts( -1), m_pHGrd3d( nullptr)
|
||||
{
|
||||
m_dCosBndAng = cos( m_dBoundaryAng * DEGTORAD) ;
|
||||
m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ;
|
||||
@@ -76,6 +76,8 @@ SurfTriMesh::Init( int nNumVert, int nNumTria, int nNumFacet)
|
||||
// completo inizializzazione
|
||||
m_nStatus = OK ;
|
||||
m_bClosed = false ;
|
||||
m_nMaxTFlag = 0 ;
|
||||
m_nParts = -1 ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
@@ -127,7 +129,7 @@ SurfTriMesh::SetVertex( int nInd, const StmVert& vV)
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
SurfTriMesh::AddTriangle( const int nIdVert[3])
|
||||
SurfTriMesh::AddTriangle( const int nIdVert[3], int nTFlag)
|
||||
{
|
||||
// verifico che i tre indici siano diversi
|
||||
if ( nIdVert[0] == nIdVert[1] ||
|
||||
@@ -160,8 +162,10 @@ SurfTriMesh::AddTriangle( const int nIdVert[3])
|
||||
m_OGrMgr.Reset() ;
|
||||
ResetHashGrids3d() ;
|
||||
// inserisco il triangolo
|
||||
try { m_vTria.emplace_back( nIdVert) ;}
|
||||
try { m_vTria.emplace_back( nIdVert, nTFlag) ;}
|
||||
catch(...) { return SVT_NULL ;}
|
||||
// aggiorno massimo TFlag
|
||||
m_nMaxTFlag = max( m_nMaxTFlag, nTFlag) ;
|
||||
// ne determino l'indice
|
||||
return int( m_vTria.size() - 1) ;
|
||||
}
|
||||
@@ -193,6 +197,8 @@ SurfTriMesh::SetTriangle( int nInd, const StmTria& tT)
|
||||
}
|
||||
// inserisco il triangolo
|
||||
m_vTria[nInd] = tT ;
|
||||
// aggiorno massimo TFlag
|
||||
m_nMaxTFlag = max( m_nMaxTFlag, tT.nTFlag) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -368,14 +374,28 @@ SurfTriMesh::GetVertexCount( void) const
|
||||
int
|
||||
SurfTriMesh::GetTriangleCount( void) const
|
||||
{
|
||||
// calcolo il numero dei triangoli cancellati
|
||||
int nErased = 0 ;
|
||||
// calcolo il numero dei triangoli validi
|
||||
int nCount = 0 ;
|
||||
for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) {
|
||||
if ( m_vTria[nId].nIdVert[0] == SVT_DEL)
|
||||
++ nErased ;
|
||||
if ( m_vTria[nId].nIdVert[0] != SVT_DEL)
|
||||
++ nCount ;
|
||||
}
|
||||
|
||||
return ( GetTriangleSize() - nErased) ;
|
||||
return nCount ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
int
|
||||
SurfTriMesh::GetTriangleCount( int nTFlag) const
|
||||
{
|
||||
// calcolo il numero dei triangoli con flag indicato e non cancellati
|
||||
int nCount = 0 ;
|
||||
for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) {
|
||||
if ( m_vTria[nId].nIdVert[0] != SVT_DEL && m_vTria[nId].nTFlag == nTFlag)
|
||||
++ nCount ;
|
||||
}
|
||||
|
||||
return nCount ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -466,6 +486,7 @@ SurfTriMesh::GetTriangle( int nId, Triangle3d& Tria) const
|
||||
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
|
||||
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
|
||||
m_vTria[nId].vtN) ;
|
||||
Tria.SetGrade( m_vTria[nId].nTFlag) ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -492,6 +513,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const
|
||||
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
|
||||
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
|
||||
m_vTria[nId].vtN) ;
|
||||
Tria.SetGrade( m_vTria[nId].nTFlag) ;
|
||||
// ritorno indice triangolo corrente
|
||||
return nId ;
|
||||
}
|
||||
@@ -508,6 +530,7 @@ SurfTriMesh::GetTriangle( int nId, Triangle3dEx& Tria) const
|
||||
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
|
||||
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
|
||||
m_vTria[nId].vtN) ;
|
||||
Tria.SetGrade( m_vTria[nId].nTFlag) ;
|
||||
GetTriangleBoundaryEdges( nId, const_cast<TriFlags3d&>( Tria.GetTriFlags())) ;
|
||||
GetTriangleSmoothNormals( nId, const_cast<TriNormals3d&>( Tria.GetTriNormals())) ;
|
||||
return true ;
|
||||
@@ -536,6 +559,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3dEx& Tria) const
|
||||
m_vVert[m_vTria[nId].nIdVert[1]].ptP,
|
||||
m_vVert[m_vTria[nId].nIdVert[2]].ptP,
|
||||
m_vTria[nId].vtN) ;
|
||||
Tria.SetGrade( m_vTria[nId].nTFlag) ;
|
||||
GetTriangleBoundaryEdges( nId, const_cast<TriFlags3d&>( Tria.GetTriFlags())) ;
|
||||
GetTriangleSmoothNormals( nId, const_cast<TriNormals3d&>( Tria.GetTriNormals())) ;
|
||||
// ritorno indice triangolo corrente
|
||||
@@ -987,6 +1011,7 @@ SurfTriMesh::CopyFrom( const SurfTriMesh& stmSrc)
|
||||
m_vFacet = stmSrc.m_vFacet ;
|
||||
m_nTimeStamp = stmSrc.m_nTimeStamp ;
|
||||
m_nTempProp = stmSrc.m_nTempProp ;
|
||||
m_nMaxTFlag = stmSrc.m_nMaxTFlag ;
|
||||
m_nParts = stmSrc.m_nParts ;
|
||||
return true ;
|
||||
}
|
||||
@@ -1114,6 +1139,7 @@ SurfTriMesh::Load( NgeReader& ngeIn)
|
||||
{
|
||||
// imposto ricalcolo della grafica, della connessione e di hashgrids3d
|
||||
m_OGrMgr.Reset() ;
|
||||
m_nMaxTFlag = 0 ;
|
||||
m_nParts = -1 ;
|
||||
ResetHashGrids3d() ;
|
||||
// leggo la prossima linea ( 2 parametri : dLinTol e dSmoothAng)
|
||||
@@ -3601,7 +3627,7 @@ SurfTriMesh::ClonePart( int nPart) const
|
||||
int nNewInd[3] = { pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[0]].ptP),
|
||||
pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[1]].ptP),
|
||||
pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[2]].ptP)} ;
|
||||
if ( pSurfTM->AddTriangle( nNewInd) == SVT_NULL)
|
||||
if ( pSurfTM->AddTriangle( nNewInd, m_vTria[i].nTFlag) == SVT_NULL)
|
||||
return nullptr ;
|
||||
}
|
||||
}
|
||||
@@ -3612,3 +3638,13 @@ SurfTriMesh::ClonePart( int nPart) const
|
||||
// Restituisco la nuova superficie
|
||||
return Release( pSurfTM) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfTriMesh::ResetTFlags( void)
|
||||
{
|
||||
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i)
|
||||
m_vTria[i].nTFlag = 0 ;
|
||||
m_nMaxTFlag = 0 ;
|
||||
return true ;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user