Files
EgtGeomKernel/StmFromTriangleSoup.cpp
T
DarioS 0c1ad4dd86 EgtGeomKernel :
- corretta GetSurfTriMeshBeveledRectSwept con tappi piatti
- corretta AddSurfTriMesh di StmFromTriangleSoup per bOk non inizializzato.
2023-06-13 18:28:41 +02:00

157 lines
4.8 KiB
C++

//----------------------------------------------------------------------------
// EgalTech 2014-2023
//----------------------------------------------------------------------------
// File : StmFromTriangleSoup.cpp Data : 07.05.23 Versione : 2.5e2
// Contenuto : Implementazione della classe StmFromTriangleSoup, per creare
// una superficie trimesh da un insieme di triangoli
// (può essere disordinato come STL o può essere una superficie).
//
// Modifiche : 19.05.14 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
//----------------------------------------------------------------------------
StmFromTriangleSoup::StmFromTriangleSoup( void) : m_pSTM( nullptr)
{
}
//----------------------------------------------------------------------------
StmFromTriangleSoup::~StmFromTriangleSoup( void)
{
if ( m_pSTM != nullptr)
delete m_pSTM ;
m_pSTM = nullptr ;
}
//----------------------------------------------------------------------------
bool
StmFromTriangleSoup::Start( int nBuckets)
{
// creo la superficie trimesh
m_pSTM = CreateSurfTriMesh() ;
if ( m_pSTM == nullptr)
return false ;
// la inizializzo
if ( ! m_pSTM->Init( 3, 1))
return false ;
// inizializzo la griglia
return m_VertGrid.Init( nBuckets) ;
}
//----------------------------------------------------------------------------
bool
StmFromTriangleSoup::AddTriangle( const Triangle3d& Tria)
{
// verifico inizializzazione
if ( m_pSTM == nullptr)
return false ;
// ciclo sui tre vertici
int nIdV[3] ;
for ( int i = 0 ; i < 3 ; ++ i) {
// verifico se vertice già presente
int nId ;
if ( ! m_VertGrid.Find( Tria.GetP( i), 2 * EPS_SMALL, nId)) {
// aggiungo il vertice
if ( ( nIdV[i] = m_pSTM->AddVertex( Tria.GetP( i))) == SVT_NULL)
return false ;
m_VertGrid.InsertPoint( Tria.GetP( i), nIdV[i]) ;
}
else
nIdV[i] = nId ;
}
// se i vertici sono tutti diversi tra loro, inserisco il triangolo
if ( nIdV[0] != nIdV[1] && nIdV[0] != nIdV[2] && nIdV[1] != nIdV[2]) {
if ( m_pSTM->AddTriangle( nIdV, Tria.GetGrade()) == SVT_NULL)
return false ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
StmFromTriangleSoup::AddTriangle( const Point3d& ptP0, const Point3d& ptP1, const Point3d& ptP2)
{
// verifico inizializzazione
if ( m_pSTM == nullptr)
return false ;
// ciclo sui tre vertici
int nIdV[3] ;
if ( ( nIdV[0] = AddVertex( ptP0)) == SVT_NULL)
return false ;
if ( ( nIdV[1] = AddVertex( ptP1)) == SVT_NULL)
return false ;
if ( ( nIdV[2] = AddVertex( ptP2)) == SVT_NULL)
return false ;
// se i vertici sono tutti diversi tra loro, inserisco il triangolo
if ( nIdV[0] != nIdV[1] && nIdV[0] != nIdV[2] && nIdV[1] != nIdV[2]) {
if ( m_pSTM->AddTriangle( nIdV) == SVT_NULL)
return false ;
}
return true ;
}
//----------------------------------------------------------------------------
int
StmFromTriangleSoup::AddVertex( const Point3d& ptP)
{
// verifico se già presente
int nId ;
if ( m_VertGrid.Find( ptP, 2 * EPS_SMALL, nId))
return nId ;
// aggiungo il vertice
if ( ( nId = m_pSTM->AddVertex( ptP)) == SVT_NULL)
return SVT_NULL ;
m_VertGrid.InsertPoint( ptP, nId) ;
return nId ;
}
//----------------------------------------------------------------------------
bool
StmFromTriangleSoup::AddSurfTriMesh( const ISurfTriMesh& stmSource)
{
// verifico inizializzazione
if ( m_pSTM == nullptr)
return false ;
// verifico superficie sorgente
if ( &stmSource == nullptr || ! stmSource.IsValid())
return false ;
// recupero tutti i triangoli della superficie
bool bOk = true ;
Triangle3d Tria ;
int nT = stmSource.GetFirstTriangle( Tria) ;
while ( nT != SVT_NULL) {
// inserisco il triangolo nella zuppa
bOk = AddTriangle( Tria) && bOk ;
// passo al triangolo successivo
nT = stmSource.GetNextTriangle( nT, Tria) ;
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
StmFromTriangleSoup::End( void)
{
// verifico inizializzazione
if ( m_pSTM == nullptr)
return false ;
// sistemazioni finali della superficie
return m_pSTM->AdjustTopology() ;
}
//----------------------------------------------------------------------------
ISurfTriMesh*
StmFromTriangleSoup::GetSurf( void)
{
ISurfTriMesh* pRet = m_pSTM ;
m_pSTM = nullptr ;
return pRet ;
}