Compare commits

...

1 Commits

Author SHA1 Message Date
Riccardo Elitropi 3e924113d3 EgtGeomKernel :
- Aggiunte funzioni per identificazione di Parts e Shells nelle TriMesh.
2024-05-28 11:01:50 +02:00
3 changed files with 340 additions and 68 deletions
+244 -13
View File
@@ -24,6 +24,7 @@
#include "GeoConst.h" #include "GeoConst.h"
#include "/EgtDev/Include/EGkDistPointLine.h" #include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkDistLineLine.h" #include "/EgtDev/Include/EGkDistLineLine.h"
#include "/EgtDev/Include/EGkDistPointSurfTm.h"
#include "/EgtDev/Include/EGkIntersLinePlane.h" #include "/EgtDev/Include/EGkIntersLinePlane.h"
#include "/EgtDev/Include/EGkPointGrid3d.h" #include "/EgtDev/Include/EGkPointGrid3d.h"
#include "/EgtDev/Include/EGkPolygon3d.h" #include "/EgtDev/Include/EGkPolygon3d.h"
@@ -45,7 +46,7 @@ SurfTriMesh::SurfTriMesh( void)
: m_nStatus( TO_VERIFY), m_dLinTol( STM_STD_LIN_TOL), m_dBoundaryAng( STM_STD_BOUNDARY_ANG), : m_nStatus( TO_VERIFY), m_dLinTol( STM_STD_LIN_TOL), m_dBoundaryAng( STM_STD_BOUNDARY_ANG),
m_dSmoothAng( STM_STD_SMOOTH_ANG), m_bShowEdges( false), m_bOriented( false), m_bClosed( false), m_dSmoothAng( STM_STD_SMOOTH_ANG), m_bShowEdges( false), m_bOriented( false), m_bClosed( false),
m_bFaceted( false), m_bFacEdged( false), m_nTimeStamp( 0), m_nTempProp{0,0}, m_dTempParam{0,0}, m_bFaceted( false), m_bFacEdged( false), m_nTimeStamp( 0), m_nTempProp{0,0}, m_dTempParam{0,0},
m_nMaxTFlag( 0), m_nParts( -1), m_pHGrd3d( nullptr) m_nMaxTFlag( 0), m_nParts( -1), m_nShells( -1), m_pHGrd3d( nullptr)
{ {
m_dCosBndAng = cos( m_dBoundaryAng * DEGTORAD) ; m_dCosBndAng = cos( m_dBoundaryAng * DEGTORAD) ;
m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ; m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ;
@@ -85,6 +86,7 @@ SurfTriMesh::Init( int nNumVert, int nNumTria, int nNumFacet)
m_bClosed = false ; m_bClosed = false ;
m_nMaxTFlag = 0 ; m_nMaxTFlag = 0 ;
m_nParts = -1 ; m_nParts = -1 ;
m_nShells = -1 ;
return true ; return true ;
} }
@@ -116,6 +118,7 @@ SurfTriMesh::Clear( void)
m_dTempParam[1] = 0 ; m_dTempParam[1] = 0 ;
m_nMaxTFlag = 0 ; m_nMaxTFlag = 0 ;
m_nParts = -1 ; m_nParts = -1 ;
m_nShells = -1 ;
return true ; return true ;
} }
@@ -126,6 +129,7 @@ SurfTriMesh::AddVertex( const Point3d& ptVert, double dU, double dV)
// imposto ricalcolo // imposto ricalcolo
m_nStatus = TO_VERIFY ; m_nStatus = TO_VERIFY ;
m_nParts = - 1 ; m_nParts = - 1 ;
m_nShells = -1 ;
m_OGrMgr.Reset() ; m_OGrMgr.Reset() ;
ResetHashGrids3d() ; ResetHashGrids3d() ;
// inserisco il vertice // inserisco il vertice
@@ -157,6 +161,7 @@ SurfTriMesh::MoveVertex( int nInd, const Point3d& ptNewVert)
// imposto ricalcolo // imposto ricalcolo
m_nStatus = TO_VERIFY ; m_nStatus = TO_VERIFY ;
m_nParts = - 1 ; m_nParts = - 1 ;
m_nShells = - 1 ;
m_bFaceted = false ; m_bFaceted = false ;
m_bFacEdged = false ; m_bFacEdged = false ;
m_OGrMgr.Reset() ; m_OGrMgr.Reset() ;
@@ -226,6 +231,7 @@ SurfTriMesh::AddTriangle( const int nIdVert[3], int nTFlag)
// imposto ricalcolo // imposto ricalcolo
m_nStatus = TO_VERIFY ; m_nStatus = TO_VERIFY ;
m_nParts = - 1 ; m_nParts = - 1 ;
m_nShells = -1 ;
m_OGrMgr.Reset() ; m_OGrMgr.Reset() ;
ResetHashGrids3d() ; ResetHashGrids3d() ;
// inserisco il triangolo // inserisco il triangolo
@@ -317,6 +323,7 @@ SurfTriMesh::RemoveTriangle( int nId)
m_bFacEdged = false ; m_bFacEdged = false ;
// invalido calcolo connettività // invalido calcolo connettività
m_nParts = - 1 ; m_nParts = - 1 ;
m_nShells = -1 ;
return true ; return true ;
} }
@@ -906,6 +913,7 @@ SurfTriMesh::CloneTriangle( int nT) const
pSurfTM->m_dSmoothAng = m_dSmoothAng ; pSurfTM->m_dSmoothAng = m_dSmoothAng ;
pSurfTM->m_dCosSmAng = m_dCosSmAng ; pSurfTM->m_dCosSmAng = m_dCosSmAng ;
pSurfTM->m_nParts = 1 ; pSurfTM->m_nParts = 1 ;
pSurfTM->m_nShells = 1 ;
// Copio il triangolo // Copio il triangolo
int nNewInd[3] = { pSurfTM->AddVertex( m_vVert[m_vTria[nT].nIdVert[0]].ptP), int nNewInd[3] = { pSurfTM->AddVertex( m_vVert[m_vTria[nT].nIdVert[0]].ptP),
@@ -1304,6 +1312,7 @@ SurfTriMesh::CopyFrom( const SurfTriMesh& stmSrc)
m_nTempProp[1] = stmSrc.m_nTempProp[1] ; m_nTempProp[1] = stmSrc.m_nTempProp[1] ;
m_nMaxTFlag = stmSrc.m_nMaxTFlag ; m_nMaxTFlag = stmSrc.m_nMaxTFlag ;
m_nParts = stmSrc.m_nParts ; m_nParts = stmSrc.m_nParts ;
m_nShells = stmSrc.m_nShells ;
m_dTempParam[0] = stmSrc.m_dTempParam[0] ; m_dTempParam[0] = stmSrc.m_dTempParam[0] ;
m_dTempParam[1] = stmSrc.m_dTempParam[1] ; m_dTempParam[1] = stmSrc.m_dTempParam[1] ;
return true ; return true ;
@@ -1341,10 +1350,12 @@ SurfTriMesh::Dump( string& sOut, bool bMM, const char* szNewLine) const
// segnalo eventuale incongruenza di orientamento // segnalo eventuale incongruenza di orientamento
if ( ! m_bOriented) if ( ! m_bOriented)
sOut += string( "Inconsistent Orientation") + szNewLine ; sOut += string( "Inconsistent Orientation") + szNewLine ;
// segnalo numero di parti se più di una // segnalo numero di parti
int nParts = GetPartCount() ; int nParts = GetPartCount() ;
if ( nParts > 1) sOut += string( "Parts=") + ToString( nParts) + szNewLine ;
sOut += string( "Parts =") + ToString( nParts) + szNewLine ; // segnalo numero di gusci
int nShells = GetShellCount() ;
sOut += string( "Shells=") + ToString( nShells) + szNewLine ;
// numero di vertici // numero di vertici
sOut += "Vert : Nbr=" + ToString( GetVertexCount()) + sOut += "Vert : Nbr=" + ToString( GetVertexCount()) +
" Size=" + ToString( GetVertexSize()) + szNewLine ; " Size=" + ToString( GetVertexSize()) + szNewLine ;
@@ -1455,6 +1466,7 @@ SurfTriMesh::Load( NgeReader& ngeIn)
m_OGrMgr.Clear() ; m_OGrMgr.Clear() ;
m_nMaxTFlag = 0 ; m_nMaxTFlag = 0 ;
m_nParts = -1 ; m_nParts = -1 ;
m_nShells = -1 ;
ResetHashGrids3d() ; ResetHashGrids3d() ;
// leggo la prossima linea ( 2 parametri : dLinTol e dSmoothAng) // leggo la prossima linea ( 2 parametri : dLinTol e dSmoothAng)
// tolleranza lineare di costruzione // tolleranza lineare di costruzione
@@ -1615,6 +1627,7 @@ SurfTriMesh::Validate( bool bCorrect)
// invalido calcolo connessione // invalido calcolo connessione
m_nParts = - 1 ; m_nParts = - 1 ;
m_nShells = -1 ;
return ( m_nStatus == OK) ; return ( m_nStatus == OK) ;
} }
@@ -1890,6 +1903,7 @@ SurfTriMesh::AdjustTopology( void)
m_bFacEdged = false ; m_bFacEdged = false ;
// invalido calcolo connessione // invalido calcolo connessione
m_nParts = - 1 ; m_nParts = - 1 ;
m_nShells = - 1 ;
// verifica indici // verifica indici
if ( ! Validate( true)) if ( ! Validate( true))
return false ; return false ;
@@ -3641,6 +3655,17 @@ SurfTriMesh::GetPartCount( void) const
return m_nParts ; return m_nParts ;
} }
//----------------------------------------------------------------------------
int
SurfTriMesh::GetShellCount( void) const
{
if ( ! IsValid())
return 0 ;
if ( m_nShells == - 1 && ! VerifyConnection())
return 0 ;
return m_nShells ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
SurfTriMesh::VerifyConnection( void) const SurfTriMesh::VerifyConnection( void) const
@@ -3649,19 +3674,21 @@ SurfTriMesh::VerifyConnection( void) const
return false ; return false ;
// reset connessione // reset connessione
for ( auto Tria : m_vTria) for ( auto& Tria : m_vTria) {
Tria.nPart = SVT_NULL ; Tria.nPart = SVT_NULL ;
Tria.nShell = SVT_NULL ;
}
// ciclo sui triangoli // ciclo sui triangoli per determinare le shells
m_nParts = 0 ; m_nShells = 0 ;
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) { for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) {
// salto triangoli cancellati o gi assegnati // salto triangoli cancellati o già assegnati
if ( m_vTria[i].nIdVert[0] == SVT_DEL || if ( m_vTria[i].nIdVert[0] == SVT_DEL ||
m_vTria[i].nPart != SVT_NULL) m_vTria[i].nShell != SVT_NULL)
continue ; continue ;
// assegno indice di parte connessa al triangolo // assegno indice di parte connessa al triangolo
m_vTria[i].nPart = m_nParts ; m_vTria[i].nShell = m_nShells ;
++ m_nParts ; ++ m_nShells ;
// set di triangoli da aggiornare // set di triangoli da aggiornare
set<int> stTria ; set<int> stTria ;
stTria.insert( i) ; stTria.insert( i) ;
@@ -3673,13 +3700,137 @@ SurfTriMesh::VerifyConnection( void) const
// aggiorno i triangoli adiacenti // aggiorno i triangoli adiacenti
for ( int j = 0 ; j < 3 ; ++ j) { for ( int j = 0 ; j < 3 ; ++ j) {
int nAdjT = m_vTria[nT].nIdAdjac[j] ; int nAdjT = m_vTria[nT].nIdAdjac[j] ;
if ( nAdjT != SVT_NULL && m_vTria[nAdjT].nPart == SVT_NULL) { if ( nAdjT != SVT_NULL && m_vTria[nAdjT].nShell == SVT_NULL) {
m_vTria[nAdjT].nPart = m_vTria[nT].nPart ; m_vTria[nAdjT].nShell = m_vTria[nT].nShell ;
stTria.insert( nAdjT) ; stTria.insert( nAdjT) ;
} }
} }
} }
} }
// identifico le parti
m_nParts = 0 ;
if ( m_nShells == 1) { // se ho solo una shell allora ho una sola parte
m_nParts = 1 ;
for ( auto& Tria : m_vTria)
Tria.nPart = Tria.nShell ;
}
else { // se ho più shells devo controllare la loro posizione
// salvo solo le Shells chiuse e per ognuna di esse il loro volume e l'indice della shell
// < stmShell, ( nShellInd, dVol) >
// NB. I Volumi sono sempre finiti, il segno del volume mi dice solo se sto considerando
// la parte interna o esterna della superficie
typedef pair<PtrOwner<ISurfTriMesh>, pair<int, double>> SHELLINFO ;
vector<SHELLINFO> vClosedShells ;
vClosedShells.reserve( m_nShells) ;
INTVECTOR vOpenShells ; // vettore di indici di Shell aperte
for ( int s = 0 ; s < GetShellCount() ; ++ s) {
// recupero la Shell
PtrOwner<ISurfTriMesh> pStmShell( CloneShell( s)) ;
if ( IsNull( pStmShell) || ! pStmShell->IsValid())
return false ;
double dVol = 0. ;
// se chiusa calcolo il suo volume con segno
if ( pStmShell->IsClosed()) {
pStmShell->GetVolume( dVol) ;
vClosedShells.emplace_back( make_pair( Release( pStmShell), make_pair( s, dVol))) ;
}
// se aperta, non rientra nella classficazione ( sarà coincidente ad una Part)
else
vOpenShells.push_back( s) ;
}
// ordino il vettore in senso decrescente per volume, in valore assoluto
// NB. tutte le shell con volume negativo sono state invertite !
sort( vClosedShells.begin(), vClosedShells.end(),
[]( const SHELLINFO& a, const SHELLINFO& b) {
return abs( a.second.second) > abs( b.second.second) ;
}) ;
// se la superficie in prima posizione è negativa, allora le inverto tutte; il numero di
// Parts non cambia nel conto
if ( ! vClosedShells.empty() && vClosedShells.front().second.second < - EPS_SMALL)
for ( auto& Shell : vClosedShells)
Shell.first->Invert() ;
// creo una matrice di interi ; ogni riga corrisponde ad una Parte, dove in posizione 0 c'è
// la shell esterna e nelle successive le rispettiva shells interne
INTMATRIX vnShellIndMat ;
bool bFirstShell ; // flag per indicare se la shell corrente è esterna
int nIndExtShell = -1 ; // indice del vettore di shell chiuse della shell esterna
INTVECTOR vIndIntShells ; // vettore di indici di shell chiuse interne alla shell esterna corrente
do {
bFirstShell = true ;
for ( int i = 0 ; i < int( vClosedShells.size()) ; ++ i) {
// recupero l'indice della shell e verifico che sia valido
int j = vClosedShells[i].second.first ;
if ( j < 0)
continue ;
// lo inserisco come esterno...
if ( bFirstShell) {
vnShellIndMat.push_back({ j}) ;
vClosedShells[i].second.first = -1 ;
bFirstShell = false ;
nIndExtShell = i ;
vIndIntShells.clear() ;
}
// altrimento verifico se la shell è interna o no
else {
// la shell è interna se è sia interna alla shell esterna corrente ( della riga di
// vnShellIndMat ) e allo stesso tempo esterna a tutte le shell già inserite nella riga
// attuale.
Point3d ptCheck ;
vClosedShells[i].first->GetFirstVertex( ptCheck) ;
// 1) verifica rispetto alla shell esterna
DistPointSurfTm distCalculator( ptCheck, *vClosedShells[nIndExtShell].first) ;
if ( ! distCalculator.IsPointInside())
continue ;
// 2) verifica rispetto a tutte la shell già trovate interne
bool bOk = true ;
for ( int k = 1 ; k < int( vIndIntShells.size()) ; ++ k) {
DistPointSurfTm distCalculator( ptCheck, *vClosedShells[vIndIntShells[k]].first) ;
// NB. tutte le shell hanno volume negativo !
if ( ! distCalculator.IsPointInside()) {
bOk = false ;
break ;
}
}
if ( bOk) {
// inserisco nella matrice
vnShellIndMat.back().push_back( j) ;
vClosedShells[i].second.first = - 1 ;
vIndIntShells.push_back( i) ;
}
}
}
} while ( ! bFirstShell) ;
// scorro le righe della matrice e assegno la Part ( ovvero la riga )
int nPart = 0 ;
for ( nPart = 0 ; nPart < int( vnShellIndMat.size()) ; ++ nPart) {
++ m_nParts ;
for ( int j = 0 ; j < int( vnShellIndMat[nPart].size()) ; ++ j) {
for ( auto& Tria : m_vTria) {
if ( Tria.nShell == j)
Tria.nPart = nPart ;
}
}
}
// per tutte le superfici aperte, assegno loro una Parte
for ( int i = 0 ; i < int( vOpenShells.size()) ; ++ i) {
++ m_nParts ;
for ( auto& Tria : m_vTria) {
if ( Tria.nShell == i)
Tria.nPart = i + ( nPart ++ ) ;
}
}
}
return true ; return true ;
} }
@@ -3715,6 +3866,38 @@ SurfTriMesh::RemovePart( int nPart)
return true ; return true ;
} }
//----------------------------------------------------------------------------
bool
SurfTriMesh::RemoveShell( int nShell)
{
if ( ! IsValid())
return false ;
// Il numero delle componenti deve essere maggiore di zero o calcolabile
if ( m_nShells == -1 && ! VerifyConnection())
return false ;
// Se la componente non esiste, errore
if ( m_nShells <= 0 || nShell < 0 || nShell >= m_nShells)
return false ;
int nShellsOld = m_nShells ;
// Rimuovo i triangoli della componente nPart
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) {
if ( m_vTria[i].nShell == nShell)
RemoveTriangle( i) ;
}
// Aggiorno il numero di componenti
m_nShells = nShellsOld - 1 ;
// imposto ricalcolo della grafica e di hashgrids3d
m_OGrMgr.Reset() ;
ResetHashGrids3d() ;
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
SurfTriMesh* SurfTriMesh*
SurfTriMesh::ClonePart( int nPart) const SurfTriMesh::ClonePart( int nPart) const
@@ -3742,6 +3925,7 @@ SurfTriMesh::ClonePart( int nPart) const
pSurfTM->m_dSmoothAng = m_dSmoothAng ; pSurfTM->m_dSmoothAng = m_dSmoothAng ;
pSurfTM->m_dCosSmAng = m_dCosSmAng ; pSurfTM->m_dCosSmAng = m_dCosSmAng ;
pSurfTM->m_nParts = 1 ; pSurfTM->m_nParts = 1 ;
pSurfTM->m_nShells = 1 ;
// Copio i triangoli // Copio i triangoli
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) { for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) {
@@ -3761,6 +3945,53 @@ SurfTriMesh::ClonePart( int nPart) const
return Release( pSurfTM) ; return Release( pSurfTM) ;
} }
//----------------------------------------------------------------------------
SurfTriMesh*
SurfTriMesh::CloneShell( int nShell) const
{
if ( ! IsValid())
return nullptr ;
// Il numero delle componenti deve essere maggiore di zero o calcolabile
if ( m_nShells == -1 && ! VerifyConnection())
return nullptr ;
// Se la componente non esiste, errore
if ( m_nShells <= 0 || nShell < 0 || nShell >= m_nShells)
return nullptr ;
// Creo nuovo oggetto SurfTriMesh
PtrOwner<SurfTriMesh> pSurfTM( new( nothrow) SurfTriMesh) ;
if ( IsNull( pSurfTM))
return nullptr ;
// Copio il valore dei membri
pSurfTM->m_dLinTol = m_dLinTol ;
pSurfTM->m_dBoundaryAng = m_dBoundaryAng ;
pSurfTM->m_dCosBndAng = m_dCosBndAng ;
pSurfTM->m_dSmoothAng = m_dSmoothAng ;
pSurfTM->m_dCosSmAng = m_dCosSmAng ;
pSurfTM->m_nParts = 1 ;
pSurfTM->m_nShells = 1 ;
// Copio i triangoli
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) {
if ( m_vTria[i].nIdVert[0] != SVT_DEL && m_vTria[i].nShell == nShell) {
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, m_vTria[i].nTFlag) == SVT_NULL)
return nullptr ;
}
}
// Aggiusto la superficie
pSurfTM->DoCompacting() ;
// Restituisco la nuova superficie
return Release( pSurfTM) ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
SurfTriMesh::ResetTFlags( void) SurfTriMesh::ResetTFlags( void)
+14 -6
View File
@@ -52,16 +52,16 @@ class StmTria
public : public :
StmTria( void) StmTria( void)
: nIdVert{ SVT_NULL, SVT_NULL, SVT_NULL}, nIdAdjac{ SVT_NULL, SVT_NULL, SVT_NULL}, nETempFlag{ 0, 0, 0}, : nIdVert{ SVT_NULL, SVT_NULL, SVT_NULL}, nIdAdjac{ SVT_NULL, SVT_NULL, SVT_NULL}, nETempFlag{ 0, 0, 0},
vtN(), nIdFacet( SVT_NULL), nTFlag( 0), nEFlag( 0), nPart( SVT_NULL), nTemp( 0), nTempPart{ 0} {} vtN(), nIdFacet( SVT_NULL), nTFlag( 0), nEFlag( 0), nShell( SVT_NULL), nPart( SVT_NULL), nTemp( 0), nTempShell{ 0}, nTempPart{ 0} {}
StmTria( const int nIdV[3]) StmTria( const int nIdV[3])
: nIdVert{ nIdV[0], nIdV[1], nIdV[2]}, nIdAdjac{ SVT_NULL, SVT_NULL, SVT_NULL}, nETempFlag{ 0, 0, 0}, : nIdVert{ nIdV[0], nIdV[1], nIdV[2]}, nIdAdjac{ SVT_NULL, SVT_NULL, SVT_NULL}, nETempFlag{ 0, 0, 0},
vtN(), nIdFacet( SVT_NULL), nTFlag( 0), nEFlag( 0), nPart( SVT_NULL), nTemp( 0), nTempPart{ 0} {} vtN(), nIdFacet( SVT_NULL), nTFlag( 0), nEFlag( 0), nShell( SVT_NULL), nPart( SVT_NULL), nTemp( 0), nTempShell{ 0}, nTempPart{ 0} {}
StmTria( const int nIdV[3], int nTF) StmTria( const int nIdV[3], int nTF)
: nIdVert{ nIdV[0], nIdV[1], nIdV[2]}, nIdAdjac{ SVT_NULL, SVT_NULL, SVT_NULL}, nETempFlag{ 0, 0, 0}, : nIdVert{ nIdV[0], nIdV[1], nIdV[2]}, nIdAdjac{ SVT_NULL, SVT_NULL, SVT_NULL}, nETempFlag{ 0, 0, 0},
vtN(), nIdFacet( SVT_NULL), nTFlag( nTF), nEFlag( 0), nPart( SVT_NULL), nTemp( 0), nTempPart{ 0} {} vtN(), nIdFacet( SVT_NULL), nTFlag( nTF), nEFlag( 0), nShell( SVT_NULL), nPart( SVT_NULL), nTemp( 0), nTempShell{ 0}, nTempPart{ 0} {}
StmTria( const int nIdV[3], const int nIdA[3], const Vector3d& vtV, int nTF, int nEF) StmTria( const int nIdV[3], const int nIdA[3], const Vector3d& vtV, int nTF, int nEF)
: nIdVert{ nIdV[0], nIdV[1], nIdV[2]}, nIdAdjac{ nIdA[0], nIdA[1], nIdA[2]}, nETempFlag{ 0, 0, 0}, : nIdVert{ nIdV[0], nIdV[1], nIdV[2]}, nIdAdjac{ nIdA[0], nIdA[1], nIdA[2]}, nETempFlag{ 0, 0, 0},
vtN( vtV), nIdFacet( SVT_NULL), nTFlag( nTF), nEFlag( nEF), nPart( SVT_NULL), nTemp( 0), nTempPart{ 0} {} vtN( vtV), nIdFacet( SVT_NULL), nTFlag( nTF), nEFlag( nEF), nShell( SVT_NULL), nPart( SVT_NULL), nTemp( 0), nTempShell{ 0}, nTempPart{ 0} {}
public : public :
int nIdVert[3] ; int nIdVert[3] ;
int nIdAdjac[3] ; int nIdAdjac[3] ;
@@ -70,9 +70,12 @@ class StmTria
int nIdFacet ; int nIdFacet ;
int nTFlag ; int nTFlag ;
int nEFlag ; int nEFlag ;
mutable int nShell ;
mutable int nPart ; mutable int nPart ;
mutable int nTemp ; mutable int nTemp ;
mutable int nTempShell ;
mutable int nTempPart ; mutable int nTempPart ;
} ; } ;
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@@ -317,8 +320,11 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
bool GetAllTriaOverlapBox( const BBox3d& b3Box, INTVECTOR& vT) const override ; bool GetAllTriaOverlapBox( const BBox3d& b3Box, INTVECTOR& vT) const override ;
const BBox3d& GetAllTriaBox( void) const override ; const BBox3d& GetAllTriaBox( void) const override ;
int GetPartCount( void) const override ; int GetPartCount( void) const override ;
int GetShellCount( void) const override ;
bool RemovePart( int nPart) override ; bool RemovePart( int nPart) override ;
bool RemoveShell( int nShell) override ;
SurfTriMesh* ClonePart( int nPart) const override ; SurfTriMesh* ClonePart( int nPart) const override ;
SurfTriMesh* CloneShell( int nShell) const override ;
bool SetTFlag( int nId, int nTFlag) override ; bool SetTFlag( int nId, int nTFlag) override ;
bool GetTFlag( int nId, int& nFlag) const override ; bool GetTFlag( int nId, int& nFlag) const override ;
int GetMaxTFlag( void) const override int GetMaxTFlag( void) const override
@@ -405,6 +411,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
bool AmbiguosTriangleManager( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Surf) ; bool AmbiguosTriangleManager( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Surf) ;
bool IntersectTriMeshTriangle( SurfTriMesh& Other) ; bool IntersectTriMeshTriangle( SurfTriMesh& Other) ;
bool IdentifyParts( void) const ; bool IdentifyParts( void) const ;
bool IdentifyShells( void) const ;
bool RemoveDoubleTriangles( bool& bModified) ; bool RemoveDoubleTriangles( bool& bModified) ;
bool RemoveTJunctions( bool& bModified) ; bool RemoveTJunctions( bool& bModified) ;
bool FlipTriangles( int nTA, int nTB) ; bool FlipTriangles( int nTA, int nTB) ;
@@ -435,9 +442,10 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW
int m_nTempProp[2] ; // vettore proprietà temporanee int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei double m_dTempParam[2] ; // vettore parametri temporanei
int m_nMaxTFlag ; // massimo valore dei TFlag dei triangoli int m_nMaxTFlag ; // massimo valore dei TFlag dei triangoli
mutable int m_nParts ; // numero di parti connesse (-1 se da calcolare) mutable int m_nParts ; // numero di parti intese come volumi (-1 se da calcolare)
mutable int m_nShells ; // numero di gusci connessi (-1 se da calcolare)
mutable HashGrids3d* m_pHGrd3d ; // Hash Grid 3d nel suo riferimento mutable HashGrids3d* m_pHGrd3d ; // Hash Grid 3d nel suo riferimento
mutable BBox3d m_b3HGrd3d ; // Box3d collegato a Hash Grid 3d mutable BBox3d m_b3HGrd3d ; // Box3d collegato a Hash Grid 3d
} ; } ;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
+82 -49
View File
@@ -478,7 +478,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
Surf.m_vTria[nNewAloneTriaNum].nETempFlag[0] = 0 ; Surf.m_vTria[nNewAloneTriaNum].nETempFlag[0] = 0 ;
Surf.m_vTria[nNewAloneTriaNum].nETempFlag[1] = 0 ; Surf.m_vTria[nNewAloneTriaNum].nETempFlag[1] = 0 ;
Surf.m_vTria[nNewAloneTriaNum].nETempFlag[2] = 0 ; Surf.m_vTria[nNewAloneTriaNum].nETempFlag[2] = 0 ;
Surf.m_vTria[nNewAloneTriaNum].nTempPart = nDist[nAloneVert] ; Surf.m_vTria[nNewAloneTriaNum].nTempShell = nDist[nAloneVert] ;
bModif = true ; bModif = true ;
} }
int nNewCoupleId1[3] = { Surf.AddVertex( ptIntSt), Surf.AddVertex( trTria.GetP( ( nAloneVert + 1) % 3)), Surf.AddVertex( trTria.GetP( ( nAloneVert + 2) % 3)) } ; int nNewCoupleId1[3] = { Surf.AddVertex( ptIntSt), Surf.AddVertex( trTria.GetP( ( nAloneVert + 1) % 3)), Surf.AddVertex( trTria.GetP( ( nAloneVert + 2) % 3)) } ;
@@ -487,7 +487,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
Surf.m_vTria[nNewCoupleTriaNum1].nETempFlag[0] = 0 ; Surf.m_vTria[nNewCoupleTriaNum1].nETempFlag[0] = 0 ;
Surf.m_vTria[nNewCoupleTriaNum1].nETempFlag[1] = 0 ; Surf.m_vTria[nNewCoupleTriaNum1].nETempFlag[1] = 0 ;
Surf.m_vTria[nNewCoupleTriaNum1].nETempFlag[2] = 0 ; Surf.m_vTria[nNewCoupleTriaNum1].nETempFlag[2] = 0 ;
Surf.m_vTria[nNewCoupleTriaNum1].nTempPart = - nDist[nAloneVert] ; Surf.m_vTria[nNewCoupleTriaNum1].nTempShell = - nDist[nAloneVert] ;
bModif = true ; bModif = true ;
} }
int nNewCoupleId2[3] = { Surf.AddVertex( ptIntSt), Surf.AddVertex( trTria.GetP( ( nAloneVert + 2) % 3)), Surf.AddVertex( ptIntEn) } ; int nNewCoupleId2[3] = { Surf.AddVertex( ptIntSt), Surf.AddVertex( trTria.GetP( ( nAloneVert + 2) % 3)), Surf.AddVertex( ptIntEn) } ;
@@ -496,7 +496,7 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
Surf.m_vTria[nNewCoupleTriaNum2].nETempFlag[0] = 0 ; Surf.m_vTria[nNewCoupleTriaNum2].nETempFlag[0] = 0 ;
Surf.m_vTria[nNewCoupleTriaNum2].nETempFlag[1] = 0 ; Surf.m_vTria[nNewCoupleTriaNum2].nETempFlag[1] = 0 ;
Surf.m_vTria[nNewCoupleTriaNum2].nETempFlag[2] = 0 ; Surf.m_vTria[nNewCoupleTriaNum2].nETempFlag[2] = 0 ;
Surf.m_vTria[nNewCoupleTriaNum2].nTempPart = - nDist[nAloneVert] ; Surf.m_vTria[nNewCoupleTriaNum2].nTempShell = - nDist[nAloneVert] ;
bModif = true ; bModif = true ;
} }
continue ; continue ;
@@ -562,18 +562,18 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
vnDegVec.resize( 1) ; vnDegVec.resize( 1) ;
} }
else { else {
Surf.m_vTria[it->first].nTempPart = 0 ; Surf.m_vTria[it->first].nTempShell = 0 ;
continue ; continue ;
} }
vbInOut.resize( 1) ; vbInOut.resize( 1) ;
vbInOut[0] = true ; vbInOut[0] = true ;
if ( ! DecomposeLoop( cvOpenChain, vnDegVec, cvBoundClosedLoopVec, vbInOut)) { if ( ! DecomposeLoop( cvOpenChain, vnDegVec, cvBoundClosedLoopVec, vbInOut)) {
Surf.m_vTria[it->first].nTempPart = 0 ; Surf.m_vTria[it->first].nTempShell = 0 ;
continue ; continue ;
} }
} }
else { else {
Surf.m_vTria[it->first].nTempPart = 0 ; Surf.m_vTria[it->first].nTempShell = 0 ;
continue ; continue ;
} }
} }
@@ -731,9 +731,9 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
Surf.m_vTria[nNewTriaNum].nETempFlag[1] = 0 ; Surf.m_vTria[nNewTriaNum].nETempFlag[1] = 0 ;
Surf.m_vTria[nNewTriaNum].nETempFlag[2] = 0 ; Surf.m_vTria[nNewTriaNum].nETempFlag[2] = 0 ;
if ( vbInOut[nLoop]) if ( vbInOut[nLoop])
Surf.m_vTria[nNewTriaNum].nTempPart = 1 ; Surf.m_vTria[nNewTriaNum].nTempShell = 1 ;
else else
Surf.m_vTria[nNewTriaNum].nTempPart = - 1 ; Surf.m_vTria[nNewTriaNum].nTempShell = - 1 ;
bModif = true ; bModif = true ;
} }
} }
@@ -828,9 +828,9 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
Surf.m_vTria[nNewTriaNum].nETempFlag[1] = 0 ; Surf.m_vTria[nNewTriaNum].nETempFlag[1] = 0 ;
Surf.m_vTria[nNewTriaNum].nETempFlag[2] = 0 ; Surf.m_vTria[nNewTriaNum].nETempFlag[2] = 0 ;
if ( bCodirectedNormals) if ( bCodirectedNormals)
Surf.m_vTria[nNewTriaNum].nTempPart = -1 ; Surf.m_vTria[nNewTriaNum].nTempShell = -1 ;
else else
Surf.m_vTria[nNewTriaNum].nTempPart = 1 ; Surf.m_vTria[nNewTriaNum].nTempShell = 1 ;
bModif = true ; bModif = true ;
} }
} }
@@ -983,9 +983,9 @@ SurfTriMesh::RetriangulationForBooleanOperation( CHAINMAP& LoopLines, TRIA3DVECT
Surf.m_vTria[nNewTriaNum].nETempFlag[1] = 0 ; Surf.m_vTria[nNewTriaNum].nETempFlag[1] = 0 ;
Surf.m_vTria[nNewTriaNum].nETempFlag[2] = 0 ; Surf.m_vTria[nNewTriaNum].nETempFlag[2] = 0 ;
if ( bCordirectedNormals_intLoop) if ( bCordirectedNormals_intLoop)
Surf.m_vTria[nNewTriaNum].nTempPart = 1 ; Surf.m_vTria[nNewTriaNum].nTempShell = 1 ;
else else
Surf.m_vTria[nNewTriaNum].nTempPart = -1 ; Surf.m_vTria[nNewTriaNum].nTempShell = -1 ;
bModif = true ; bModif = true ;
} }
} }
@@ -1038,7 +1038,7 @@ SurfTriMesh::AmbiguosTriangleManager( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Su
for ( auto it = Ambiguos.begin() ; it != Ambiguos.end() ; ++ it) { for ( auto it = Ambiguos.begin() ; it != Ambiguos.end() ; ++ it) {
// Se il triangolo ha l'indice diverso da zero vuol dire che oltre a un // Se il triangolo ha l'indice diverso da zero vuol dire che oltre a un
// contatto edge-edge ha avuto dei contatti che lo hanno già classificato. // contatto edge-edge ha avuto dei contatti che lo hanno già classificato.
if ( Surf.m_vTria[it->first].nTempPart != 0) if ( Surf.m_vTria[it->first].nTempShell != 0)
continue ; continue ;
// Recupero il triangolo corrente // Recupero il triangolo corrente
Triangle3d trTria ; Triangle3d trTria ;
@@ -1102,11 +1102,11 @@ SurfTriMesh::AmbiguosTriangleManager( TRIA3DVECTORMAP& Ambiguos, SurfTriMesh& Su
for ( int i = 0 ; i < 3 ; ++ i) { for ( int i = 0 ; i < 3 ; ++ i) {
if ( nTriaClassificationByEdges[i] == 0) if ( nTriaClassificationByEdges[i] == 0)
continue ; continue ;
Surf.m_vTria[it->first].nTempPart = nTriaClassificationByEdges[i] ; Surf.m_vTria[it->first].nTempShell = nTriaClassificationByEdges[i] ;
int j ; int j ;
for ( j = i + 1 ; j < 3 ; ++ j) { for ( j = i + 1 ; j < 3 ; ++ j) {
if ( nTriaClassificationByEdges[j] != 0 && nTriaClassificationByEdges[i] != nTriaClassificationByEdges[j]) { if ( nTriaClassificationByEdges[j] != 0 && nTriaClassificationByEdges[i] != nTriaClassificationByEdges[j]) {
Surf.m_vTria[it->first].nTempPart = 0 ; Surf.m_vTria[it->first].nTempShell = 0 ;
break ; break ;
} }
} }
@@ -1146,13 +1146,13 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
// Setto il triangolo come né fuori né dentro // Setto il triangolo come né fuori né dentro
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) { for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
m_vTria[nTA].nTempPart = 0 ; m_vTria[nTA].nTempShell = 0 ;
m_vTria[nTA].nETempFlag[0] = 0 ; m_vTria[nTA].nETempFlag[0] = 0 ;
m_vTria[nTA].nETempFlag[1] = 0 ; m_vTria[nTA].nETempFlag[1] = 0 ;
m_vTria[nTA].nETempFlag[2] = 0 ; m_vTria[nTA].nETempFlag[2] = 0 ;
} }
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) { for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
SurfB.m_vTria[nTB].nTempPart = 0 ; SurfB.m_vTria[nTB].nTempShell = 0 ;
SurfB.m_vTria[nTB].nETempFlag[0] = 0 ; SurfB.m_vTria[nTB].nETempFlag[0] = 0 ;
SurfB.m_vTria[nTB].nETempFlag[1] = 0 ; SurfB.m_vTria[nTB].nETempFlag[1] = 0 ;
SurfB.m_vTria[nTB].nETempFlag[2] = 0 ; SurfB.m_vTria[nTB].nETempFlag[2] = 0 ;
@@ -1260,9 +1260,9 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
abs( ( trTriaA.GetP( ( nVA + 1) % 3) - trTriaB.GetP( 0)) * trTriaB.GetN()) < EPS_SMALL) abs( ( trTriaA.GetP( ( nVA + 1) % 3) - trTriaB.GetP( 0)) * trTriaB.GetN()) < EPS_SMALL)
break ; break ;
} }
m_vTria[nTA].nTempPart = ( ( trTriaA.GetP( nSegMaxDist) - trTriaB.GetP( 0)) * trTriaB.GetN() < - EPS_SMALL ? 1 : - 1) ; m_vTria[nTA].nTempShell = ( ( trTriaA.GetP( nSegMaxDist) - trTriaB.GetP( 0)) * trTriaB.GetN() < - EPS_SMALL ? 1 : - 1) ;
if ( nVA >= 0 && nVA <= 2) if ( nVA >= 0 && nVA <= 2)
m_vTria[nTA].nETempFlag[nVA] = m_vTria[nTA].nTempPart ; m_vTria[nTA].nETempFlag[nVA] = m_vTria[nTA].nTempShell ;
} }
} }
// caso di Intersezione interno-edge ( per superficie A con B) // caso di Intersezione interno-edge ( per superficie A con B)
@@ -1285,9 +1285,9 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
abs( ( trTriaB.GetP( ( nVB + 1) % 3) - trTriaA.GetP( 0)) * trTriaA.GetN()) < EPS_SMALL) abs( ( trTriaB.GetP( ( nVB + 1) % 3) - trTriaA.GetP( 0)) * trTriaA.GetN()) < EPS_SMALL)
break ; break ;
} }
SurfB.m_vTria[vNearTria[nTB]].nTempPart = ( ( trTriaB.GetP( nSegMaxDist) - trTriaA.GetP( 0)) * trTriaA.GetN() < - EPS_SMALL ? 1 : - 1) ; SurfB.m_vTria[vNearTria[nTB]].nTempShell = ( ( trTriaB.GetP( nSegMaxDist) - trTriaA.GetP( 0)) * trTriaA.GetN() < - EPS_SMALL ? 1 : - 1) ;
if ( nVB >= 0 && nVB <= 2) if ( nVB >= 0 && nVB <= 2)
SurfB.m_vTria[vNearTria[nTB]].nETempFlag[nVB] = SurfB.m_vTria[vNearTria[nTB]].nTempPart ; SurfB.m_vTria[vNearTria[nTB]].nETempFlag[nVB] = SurfB.m_vTria[vNearTria[nTB]].nTempShell ;
} }
} }
// Intersezione edge-edge: salvo indice e vettore triangoli // Intersezione edge-edge: salvo indice e vettore triangoli
@@ -1338,7 +1338,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
nInOutNum = ( distCalculator.IsPointOnLeftSide() ? 1 : -1) ; nInOutNum = ( distCalculator.IsPointOnLeftSide() ? 1 : -1) ;
} }
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA)
m_vTria[nTA].nTempPart = nInOutNum ; m_vTria[nTA].nTempShell = nInOutNum ;
nInOutNum = 0 ; nInOutNum = 0 ;
for ( int v = 0 ; v < int( SurfB.m_vVert.size()) && nInOutNum == 0 ; ++ v) { for ( int v = 0 ; v < int( SurfB.m_vVert.size()) && nInOutNum == 0 ; ++ v) {
@@ -1348,7 +1348,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
nInOutNum = ( distCalculator.IsPointOnLeftSide() ? 1 : -1) ; nInOutNum = ( distCalculator.IsPointOnLeftSide() ? 1 : -1) ;
} }
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB)
SurfB.m_vTria[nTB].nTempPart = nInOutNum ; SurfB.m_vTria[nTB].nTempShell = nInOutNum ;
} }
// Se c'è stata una ritriangolazione di almeno un triangolo, NON siamo nel caso di tutto dentro o tutto fuori. // Se c'è stata una ritriangolazione di almeno un triangolo, NON siamo nel caso di tutto dentro o tutto fuori.
@@ -1389,12 +1389,12 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other)
Point3d ptTempA, ptTempB ; Point3d ptTempA, ptTempB ;
int nIntTypeAB = IntersTriaTria( trTriaA, trTriaB, ptTempA, ptTempB, vTriaAB) ; int nIntTypeAB = IntersTriaTria( trTriaA, trTriaB, ptTempA, ptTempB, vTriaAB) ;
if ( nIntTypeAB == ITTT_OVERLAPS) { if ( nIntTypeAB == ITTT_OVERLAPS) {
m_vTria[nTA].nTempPart = 2 ; m_vTria[nTA].nTempShell = 2 ;
SurfB.m_vTria[vNearTria[nTB]].nTempPart = 2 ; SurfB.m_vTria[vNearTria[nTB]].nTempShell = 2 ;
} }
else if ( nIntTypeAB == ITTT_COUNTER_OVERLAPS) { else if ( nIntTypeAB == ITTT_COUNTER_OVERLAPS) {
m_vTria[nTA].nTempPart = -2 ; m_vTria[nTA].nTempShell = -2 ;
SurfB.m_vTria[vNearTria[nTB]].nTempPart = -2 ; SurfB.m_vTria[vNearTria[nTB]].nTempShell = -2 ;
} }
} }
} }
@@ -1437,6 +1437,39 @@ SurfTriMesh::IdentifyParts( void) const
return true ; return true ;
} }
//----------------------------------------------------------------------------
bool
SurfTriMesh::IdentifyShells( void) const
{
for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) {
// salto triangoli cancellati o già assegnati
if ( m_vTria[i].nIdVert[0] == SVT_DEL ||
abs( m_vTria[i].nTempShell) != 1)
continue ;
// set di triangoli da aggiornare
set<int> stTria ;
stTria.insert( i) ;
while ( ! stTria.empty()) {
// tolgo un triangolo dal set
const auto iIt = stTria.begin() ;
int nT = *iIt ;
stTria.erase( iIt) ;
// aggiorno i triangoli adiacenti
for ( int j = 0 ; j < 3 ; ++ j) {
if ( m_vTria[nT].nETempFlag[j] != 0)
continue ;
int nAdjT = m_vTria[nT].nIdAdjac[j] ;
if ( nAdjT != SVT_NULL && m_vTria[nAdjT].nTempShell == 0) {
m_vTria[nAdjT].nTempShell = m_vTria[nT].nTempShell ;
stTria.insert( nAdjT) ;
}
}
}
}
return true ;
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool bool
SurfTriMesh::Add( const ISurfTriMesh& Other) SurfTriMesh::Add( const ISurfTriMesh& Other)
@@ -1481,16 +1514,16 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
IntersectTriMeshTriangle( SurfB) ; IntersectTriMeshTriangle( SurfB) ;
// assegno un medesimo indice ai triangoli che non interferiscono con altri // assegno un medesimo indice ai triangoli che non interferiscono con altri
IdentifyParts() ; IdentifyShells() ;
SurfB.IdentifyParts() ; SurfB.IdentifyShells() ;
// rimozione dei triangoli di A con proprietà 1 e -2 ( e gestione dei triangoli ambigui, 0) // rimozione dei triangoli di A con proprietà 1 e -2 ( e gestione dei triangoli ambigui, 0)
int nTriaNumA = GetTriangleSize() ; int nTriaNumA = GetTriangleSize() ;
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) { for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
if ( m_vTria[nTA].nTempPart == 1 || m_vTria[nTA].nTempPart == - 2) if ( m_vTria[nTA].nTempShell == 1 || m_vTria[nTA].nTempShell == - 2)
RemoveTriangle( nTA) ; RemoveTriangle( nTA) ;
// se triangolo ambiguo // se triangolo ambiguo
if ( m_vTria[nTA].nTempPart == 0) { if ( m_vTria[nTA].nTempShell == 0) {
Triangle3d TriaA ; Triangle3d TriaA ;
GetTriangle( nTA, TriaA) ; GetTriangle( nTA, TriaA) ;
// rimuovo il triangolo se interno a surfB ( basta controllare un solo vertice(?) ) // rimuovo il triangolo se interno a surfB ( basta controllare un solo vertice(?) )
@@ -1504,10 +1537,10 @@ SurfTriMesh::Add( const ISurfTriMesh& Other)
int nPrevMaxTFlag = m_nMaxTFlag ; int nPrevMaxTFlag = m_nMaxTFlag ;
int nTriaNumB = SurfB.GetTriangleSize() ; int nTriaNumB = SurfB.GetTriangleSize() ;
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) { for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
bool bAdd = ( SurfB.m_vTria[nTB].nTempPart == - 1) ; bool bAdd = ( SurfB.m_vTria[nTB].nTempShell == - 1) ;
if ( ! bAdd) { if ( ! bAdd) {
// se ambiguo // se ambiguo
if ( SurfB.m_vTria[nTB].nTempPart == 0) { if ( SurfB.m_vTria[nTB].nTempShell == 0) {
// aggiungo se il triangolo è a surfA ( basta controllare un solo vertice(?) ) // aggiungo se il triangolo è a surfA ( basta controllare un solo vertice(?) )
DistPointSurfTm distCalculator( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[0]].ptP, SurfA_cl) ; DistPointSurfTm distCalculator( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[0]].ptP, SurfA_cl) ;
bAdd = ! distCalculator.IsPointOnLeftSide() ; bAdd = ! distCalculator.IsPointOnLeftSide() ;
@@ -1588,16 +1621,16 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
IntersectTriMeshTriangle( SurfB) ; IntersectTriMeshTriangle( SurfB) ;
// assegno un medesimo indice ai triangoli che non interferiscono con altri // assegno un medesimo indice ai triangoli che non interferiscono con altri
IdentifyParts() ; IdentifyShells() ;
SurfB.IdentifyParts() ; SurfB.IdentifyShells() ;
// rimozione dei triangoli di A con proprietà -1 e -2 (e gestione dei triangoli ambigui, 0) // rimozione dei triangoli di A con proprietà -1 e -2 (e gestione dei triangoli ambigui, 0)
int nTriaNumA = GetTriangleSize() ; int nTriaNumA = GetTriangleSize() ;
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) { for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
if ( m_vTria[nTA].nTempPart == - 1 || m_vTria[nTA].nTempPart == - 2) if ( m_vTria[nTA].nTempShell == - 1 || m_vTria[nTA].nTempShell == - 2)
RemoveTriangle( nTA) ; RemoveTriangle( nTA) ;
// se triangolo ambiguo // se triangolo ambiguo
else if ( m_vTria[nTA].nTempPart == 0) { else if ( m_vTria[nTA].nTempShell == 0) {
Triangle3d TriaA ; Triangle3d TriaA ;
GetTriangle( nTA, TriaA) ; GetTriangle( nTA, TriaA) ;
// rimuovo il triangolo se fuori a surfB ( basta controllare un solo vertice(?) ) // rimuovo il triangolo se fuori a surfB ( basta controllare un solo vertice(?) )
@@ -1611,8 +1644,8 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other)
int nPrevMaxTFlag = m_nMaxTFlag ; int nPrevMaxTFlag = m_nMaxTFlag ;
int nTriaNumB = SurfB.GetTriangleSize() ; int nTriaNumB = SurfB.GetTriangleSize() ;
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) { for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
bool bAdd = ( SurfB.m_vTria[nTB].nTempPart == 1) ; bool bAdd = ( SurfB.m_vTria[nTB].nTempShell == 1) ;
if ( ! bAdd && SurfB.m_vTria[nTB].nTempPart == 0) { if ( ! bAdd && SurfB.m_vTria[nTB].nTempShell == 0) {
// aggiungo se il triangolo è interno a surfA ( basta controllare un solo vertice(?) ) // aggiungo se il triangolo è interno a surfA ( basta controllare un solo vertice(?) )
DistPointSurfTm distCalculator( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[0]].ptP, SurfA_cl) ; DistPointSurfTm distCalculator( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[0]].ptP, SurfA_cl) ;
bAdd = distCalculator.IsPointOnLeftSide() ; bAdd = distCalculator.IsPointOnLeftSide() ;
@@ -1685,16 +1718,16 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other)
IntersectTriMeshTriangle( SurfB) ; IntersectTriMeshTriangle( SurfB) ;
// assegno un medesimo indice ai triangoli che non interferiscono con altri // assegno un medesimo indice ai triangoli che non interferiscono con altri
IdentifyParts() ; IdentifyShells() ;
SurfB.IdentifyParts() ; SurfB.IdentifyShells() ;
// rimozione dei triangoli di A con proprietà 1 e 2 ( e gestione triangoli ambigui, 0) // rimozione dei triangoli di A con proprietà 1 e 2 ( e gestione triangoli ambigui, 0)
int nTriaNumA = GetTriangleSize() ; int nTriaNumA = GetTriangleSize() ;
for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) { for ( int nTA = 0 ; nTA < nTriaNumA ; ++ nTA) {
if ( m_vTria[nTA].nTempPart == 1 || m_vTria[nTA].nTempPart == 2) if ( m_vTria[nTA].nTempShell == 1 || m_vTria[nTA].nTempShell == 2)
RemoveTriangle( nTA) ; RemoveTriangle( nTA) ;
// se triangolo ambiguo... // se triangolo ambiguo...
if ( m_vTria[nTA].nTempPart == 0) { if ( m_vTria[nTA].nTempShell == 0) {
Triangle3d TriaA ; Triangle3d TriaA ;
GetTriangle( nTA, TriaA) ; GetTriangle( nTA, TriaA) ;
// rimuovo il triangolo se interno a SurfB ( basta controllare un solo vertice(?) ) // rimuovo il triangolo se interno a SurfB ( basta controllare un solo vertice(?) )
@@ -1708,10 +1741,10 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other)
int nPrevMaxTFlag = m_nMaxTFlag ; int nPrevMaxTFlag = m_nMaxTFlag ;
int nTriaNumB = SurfB.GetTriangleSize() ; int nTriaNumB = SurfB.GetTriangleSize() ;
for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) { for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) {
bool bAdd = SurfB.m_vTria[nTB].nTempPart == 1 ; bool bAdd = SurfB.m_vTria[nTB].nTempShell == 1 ;
if ( ! bAdd) { if ( ! bAdd) {
// se ambiguo // se ambiguo
if ( SurfB.m_vTria[nTB].nTempPart == 0) { if ( SurfB.m_vTria[nTB].nTempShell == 0) {
// aggiungo il triangolo se interno alla SurfA ( basta controllare un solo vertice(?) ) // aggiungo il triangolo se interno alla SurfA ( basta controllare un solo vertice(?) )
DistPointSurfTm distCalculator( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[0]].ptP, SurfA_cl) ; DistPointSurfTm distCalculator( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[0]].ptP, SurfA_cl) ;
bAdd = distCalculator.IsPointOnLeftSide() ; bAdd = distCalculator.IsPointOnLeftSide() ;
@@ -1768,14 +1801,14 @@ SurfTriMesh::GetSurfClassification( const ISurfTriMesh& ClassifierSurf,
SurfC.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ; SurfC.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
IntersectTriMeshTriangle( SurfC) ; IntersectTriMeshTriangle( SurfC) ;
IdentifyParts() ; IdentifyShells() ;
Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ; Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ;
int nTriaNum = GetTriangleSize() ; int nTriaNum = GetTriangleSize() ;
for ( int nT = 0 ; nT < nTriaNum ; ++ nT) { for ( int nT = 0 ; nT < nTriaNum ; ++ nT) {
if ( m_vTria[nT].nIdVert[0] == SVT_DEL) if ( m_vTria[nT].nIdVert[0] == SVT_DEL)
continue ; continue ;
switch ( m_vTria[nT].nTempPart) { switch ( m_vTria[nT].nTempShell) {
case -2 : case -2 :
vTriaOnM.push_back( nT) ; vTriaOnM.push_back( nT) ;
break ; break ;
@@ -1820,13 +1853,13 @@ SurfTriMesh::CutWithOtherSurf( const ISurfTriMesh& CutterSurf, bool bInVsOut, bo
SurfC.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ; SurfC.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ;
IntersectTriMeshTriangle( SurfC) ; IntersectTriMeshTriangle( SurfC) ;
IdentifyParts() ; IdentifyShells() ;
int nPartToRemove = ( bInVsOut ? -1 : 1) ; int nPartToRemove = ( bInVsOut ? -1 : 1) ;
int nCoplanarPartToRemove = ( bSaveOnEq ? ( nPartToRemove ? -2 : 2) : 5) ; int nCoplanarPartToRemove = ( bSaveOnEq ? ( nPartToRemove ? -2 : 2) : 5) ;
int nTriaNum = GetTriangleSize() ; int nTriaNum = GetTriangleSize() ;
for ( int nT = 0 ; nT < nTriaNum ; ++ nT) { for ( int nT = 0 ; nT < nTriaNum ; ++ nT) {
if ( m_vTria[nT].nTempPart == nPartToRemove || m_vTria[nT].nTempPart == nCoplanarPartToRemove) if ( m_vTria[nT].nTempShell == nPartToRemove || m_vTria[nT].nTempShell == nCoplanarPartToRemove)
RemoveTriangle( nT) ; RemoveTriangle( nT) ;
} }