//---------------------------------------------------------------------------- // EgalTech 2025 //---------------------------------------------------------------------------- // File : SurfTriMeshOffset.cpp Data : 10.06.25 Versione : 2.7e4 // Contenuto : Implementazione funzione per Offset di Superfici TriMesh. // // // // Modifiche : 10.06.25 RE - Creazione modulo. // 10.06.25 RE - Offset di superfici chiuse. ( ver. 2.7e4) // 04.07.25 RE - Thickening Offset di superfici generiche. ( ver. 2.7g1) // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "SurfTriMesh.h" #include "VolZmap.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 dLinTol, int nType) { return ( CreateSurfTriMeshesOffset( { pStm}, dOffs, dLinTol, nType)) ; } //---------------------------------------------------------------------------- /* Funzione che crea il Fat Offset di una superficie TriMesh */ ISurfTriMesh* CreateSurfTriMeshThickeningOffset( const ISurfTriMesh* pStm, double dOffs, double dLinTol, int nType) { return ( CreateSurfTriMeshesThickeningOffset( { pStm}, dOffs, dLinTol, nType)) ; } //---------------------------------------------------------------------------- /* Funzione che crea l'Offset di un insieme di superfici */ ISurfTriMesh* CreateSurfTriMeshesOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dLinTol, int nType) { // se vettore delle superfici vuoto, non faccio nulla if ( vStm.empty()) return nullptr ; // controllo sul valore di tolleranza lineare double dMyLinTol = max( dLinTol, 10 * 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, dMyLinTol, 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 dLinTol, int nType) { // se vettore delle superfici vuoto, non faccio nulla if ( vStm.empty()) return nullptr ; // controllo sul valore di tolleranza lineare double dMyLinTol = max( dLinTol, 10 * 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, dMyLinTol, nType)) return nullptr ; // restituisco la superficie TriMesh return ( pVolZmap->GetSurfTriMesh()) ; }