//---------------------------------------------------------------------------- // EgalTech 2014-2022 //---------------------------------------------------------------------------- // 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. // //---------------------------------------------------------------------------- //--------------------------- 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 chiusa */ ISurfTriMesh* CreateSurfTriMeshOffset( const ISurfTriMesh* pStm, double dOffs, double dLinTol) { return CreateSurfTriMeshesOffset( { pStm}, dOffs, dLinTol) ; } //---------------------------------------------------------------------------- /* Funzione che crea l'Offset di un insieme di superfici */ ISurfTriMesh* CreateSurfTriMeshesOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dLinTol) { // 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) ; // --- NB. Per la creazione dello Zmap รจ necessario che le superfici siano chiuse PtrOwner pVolZmap( CreateVolZmap()) ; if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshOffset( vStm, dOffs, dMyLinTol)) return nullptr ; // restituisco la superficie TriMesh return ( pVolZmap->GetSurfTriMesh()) ; }