ff6307fcca
- prime sistemazioni per offset superfici trimesh tramite Zmap.
117 lines
4.7 KiB
C++
117 lines
4.7 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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<ISurfTriMesh> 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<IVolZmap> 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<IVolZmap> pVolZmap( CreateVolZmap()) ;
|
|
if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshThickeningOffset( vStm, dOffs, dMyPrec, nType))
|
|
return nullptr ;
|
|
|
|
// restituisco la superficie TriMesh
|
|
return ( pVolZmap->GetSurfTriMesh()) ;
|
|
}
|