//---------------------------------------------------------------------------- // EgalTech 2025 //---------------------------------------------------------------------------- // File : SurfTriMeshOffset.cpp Data : 07.07.25 Versione : 2.7g1 // Contenuto : Implementazione funzione per Offset di Superfici TriMesh. // // // // Modifiche : 10.06.25 RE Creazione modulo. // 10.06.25 RE Offset di superfici chiuse. // 04.07.25 RE Thickening Offset di superfici generiche. // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "VolZmap.h" #include "\EgtDev\Include\EGkSurfTriMeshAux.h" using namespace std ; //---------------------------------------------------------------------------- static ISurfTriMesh* SumStm( const CISURFTMPVECTOR& vStm) { // se vettore vuoto, non faccio nulla if ( vStm.empty()) return nullptr ; // definisco la superficie somma tra tutte ( la prima deve essere valida) PtrOwner pStmAdd( CreateSurfTriMesh()) ; if ( IsNull( pStmAdd)) return nullptr ; // scorro le superfici for ( const ISurfTriMesh* pStm : vStm) { if ( pStm == nullptr || ! pStm->IsValid() || pStm->GetTriangleCount() == 0) continue ; if ( ! pStmAdd->IsValid() || pStmAdd->GetTriangleCount() == 0) { if ( ! pStmAdd->CopyFrom( pStm)) return nullptr ; } else pStmAdd->Add( *pStm) ; } // restituisco la superficie ottenuta return ( Release( pStmAdd)) ; } //---------------------------------------------------------------------------- // Funzione che crea l'Offset di una superficie TriMesh //---------------------------------------------------------------------------- ISurfTriMesh* CreateSurfTriMeshOffset( const ISurfTriMesh* pStm, double dOffs, double dPrec, int nType) { return ( CreateSurfTriMeshesOffset( { pStm}, dOffs, dPrec, nType)) ; } //---------------------------------------------------------------------------- // Funzione che crea il Fat Offset di una superficie TriMesh //---------------------------------------------------------------------------- ISurfTriMesh* CreateSurfTriMeshThickeningOffset( const ISurfTriMesh* pStm, double dOffs, double dPrec, int nType) { return ( CreateSurfTriMeshesThickeningOffset( { pStm}, dOffs, dPrec, nType)) ; } //---------------------------------------------------------------------------- // Funzione che crea l'Offset di un insieme di superfici //---------------------------------------------------------------------------- ISurfTriMesh* CreateSurfTriMeshesOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dPrec, int nType) { // se vettore delle superfici vuoto, non faccio nulla if ( vStm.empty()) return nullptr ; // controllo sul valore di tolleranza lineare double dMyPrec = max( dPrec, 100 * EPS_SMALL) ; // --- NB. ( Il valore di Offset deve essere maggiore di 10 * EPS_SMALL in valore assoluto) // Nel caso sia minore, restituisco semplicemente la somma delle superfici // ( questo valore serve per rimanere coerente con l'Offset delle curve) if ( abs( dOffs) < 10 * EPS_SMALL) return SumStm( vStm) ; // creo lo Zmap associato alle superfici TriMesh PtrOwner pVolZmap( CreateVolZmap()) ; if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshOffset( vStm, dOffs, dMyPrec, nType)) return nullptr ; // restituisco la superficie TriMesh return ( pVolZmap->GetSurfTriMesh()) ; } //---------------------------------------------------------------------------- //* Funzione che crea il Fat Offset di un insieme di superfici //---------------------------------------------------------------------------- ISurfTriMesh* CreateSurfTriMeshesThickeningOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dPrec, int nType) { // se vettore delle superfici vuoto, non faccio nulla if ( vStm.empty()) return nullptr ; // controllo sul valore di tolleranza lineare double dMyPrec = max( dPrec, 100 * EPS_SMALL) ; // --- NB. ( Il valore di Offset deve essere maggiore di 10 * EPS_SMALL in valore assoluto) // Nel caso sia minore, restituisco semplicemente la somma delle superfici // ( questo valore serve per rimanere coerente con l'Offset delle curve) if ( abs( dOffs) < 10 * EPS_SMALL) return SumStm( vStm) ; // creo lo Zmap associato alle superfici TriMesh PtrOwner pVolZmap( CreateVolZmap()) ; if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshThickeningOffset( vStm, dOffs, dMyPrec, nType)) return nullptr ; // restituisco la superficie TriMesh return ( pVolZmap->GetSurfTriMesh()) ; }