diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index b8b6bc4..b9099fc 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -345,6 +345,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters index 6120010..68e0c44 100644 --- a/EgtGeomKernel.vcxproj.filters +++ b/EgtGeomKernel.vcxproj.filters @@ -550,7 +550,7 @@ File di origine\Geo - File di origine\Geo + File di origine\GeoOffset @@ -1232,6 +1232,9 @@ File di intestazione + + File di intestazione\Include + diff --git a/SurfTriMeshOffset.cpp b/SurfTriMeshOffset.cpp index 56213cf..dba93f3 100644 --- a/SurfTriMeshOffset.cpp +++ b/SurfTriMeshOffset.cpp @@ -1,21 +1,21 @@ //---------------------------------------------------------------------------- // EgalTech 2025 //---------------------------------------------------------------------------- -// File : SurfTriMeshOffset.cpp Data : 10.06.25 Versione : 2.7e4 +// 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. ( ver. 2.7e4) -// 04.07.25 RE - Thickening Offset di superfici generiche. ( ver. 2.7g1) +// 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 "SurfTriMesh.h" #include "VolZmap.h" +#include "\EgtDev\Include\EGkSurfTriMeshAux.h" using namespace std ; @@ -46,31 +46,34 @@ SumStm( const CISURFTMPVECTOR& vStm) } //---------------------------------------------------------------------------- -/* Funzione che crea l'Offset di una superficie TriMesh */ +// Funzione che crea l'Offset di una superficie TriMesh +//---------------------------------------------------------------------------- ISurfTriMesh* -CreateSurfTriMeshOffset( const ISurfTriMesh* pStm, double dOffs, double dLinTol, int nType) +CreateSurfTriMeshOffset( const ISurfTriMesh* pStm, double dOffs, double dPrec, int nType) { - return ( CreateSurfTriMeshesOffset( { pStm}, dOffs, dLinTol, nType)) ; + return ( CreateSurfTriMeshesOffset( { pStm}, dOffs, dPrec, nType)) ; } //---------------------------------------------------------------------------- -/* Funzione che crea il Fat Offset di una superficie TriMesh */ +// Funzione che crea il Fat Offset di una superficie TriMesh +//---------------------------------------------------------------------------- ISurfTriMesh* -CreateSurfTriMeshThickeningOffset( const ISurfTriMesh* pStm, double dOffs, double dLinTol, int nType) +CreateSurfTriMeshThickeningOffset( const ISurfTriMesh* pStm, double dOffs, double dPrec, int nType) { - return ( CreateSurfTriMeshesThickeningOffset( { pStm}, dOffs, dLinTol, nType)) ; + return ( CreateSurfTriMeshesThickeningOffset( { pStm}, dOffs, dPrec, nType)) ; } //---------------------------------------------------------------------------- -/* Funzione che crea l'Offset di un insieme di superfici */ +// Funzione che crea l'Offset di un insieme di superfici +//---------------------------------------------------------------------------- ISurfTriMesh* -CreateSurfTriMeshesOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dLinTol, int nType) +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 dMyLinTol = max( dLinTol, 10 * EPS_SMALL) ; + 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) @@ -79,7 +82,7 @@ CreateSurfTriMeshesOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dLi // creo lo Zmap associato alle superfici TriMesh PtrOwner pVolZmap( CreateVolZmap()) ; - if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshOffset( vStm, dOffs, dMyLinTol, nType)) + if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshOffset( vStm, dOffs, dMyPrec, nType)) return nullptr ; // restituisco la superficie TriMesh @@ -87,15 +90,16 @@ CreateSurfTriMeshesOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dLi } //---------------------------------------------------------------------------- -/* Funzione che crea il Fat Offset di un insieme di superfici */ +//* Funzione che crea il Fat Offset di un insieme di superfici +//---------------------------------------------------------------------------- ISurfTriMesh* -CreateSurfTriMeshesThickeningOffset( const CISURFTMPVECTOR& vStm, double dOffs, double dLinTol, int nType) +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 dMyLinTol = max( dLinTol, 10 * EPS_SMALL) ; + 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) @@ -104,9 +108,9 @@ CreateSurfTriMeshesThickeningOffset( const CISURFTMPVECTOR& vStm, double dOffs, // creo lo Zmap associato alle superfici TriMesh PtrOwner pVolZmap( CreateVolZmap()) ; - if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshThickeningOffset( vStm, dOffs, dMyLinTol, nType)) + if ( IsNull( pVolZmap) || ! pVolZmap->CreateFromTriMeshThickeningOffset( vStm, dOffs, dMyPrec, nType)) return nullptr ; // restituisco la superficie TriMesh return ( pVolZmap->GetSurfTriMesh()) ; -} \ No newline at end of file +} diff --git a/VolZmap.h b/VolZmap.h index d8ecd70..64d4dfb 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -82,8 +82,8 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool CreateEmpty( const Point3d& ptO, double dDimX, double dDimY, double dDimZ, double dStep, bool bTriDex) override ; bool CreateFromFlatRegion( const ISurfFlatRegion& Surf, double dDimZ, double dStep, bool bTriDex) override ; bool CreateFromTriMesh( const ISurfTriMesh& Surf, double dStep, bool bTriDex, double dExtraBox = 0.) override ; - bool CreateFromTriMeshOffset( const CISURFTMPVECTOR& vSurf, double dOffs, double dTol, int nType = ISurfTriMesh::OFF_FILLET) override ; - bool CreateFromTriMeshThickeningOffset( const CISURFTMPVECTOR& vSurf, double dOffs, double dTol, int nType = ISurfTriMesh::OFF_FILLET) override ; + bool CreateFromTriMeshOffset( const CISURFTMPVECTOR& vSurf, double dOffs, double dTol, int nType = STMOFF_FILLET) override ; + bool CreateFromTriMeshThickeningOffset( const CISURFTMPVECTOR& vSurf, double dOffs, double dTol, int nType = STMOFF_FILLET) override ; int GetBlockCount( void) const override ; int GetBlockUpdatingCounter( int nBlock) const override ; bool GetBlockTriangles( int nBlock, TRIA3DEXVECTOR& vTria) const override ; diff --git a/VolZmapOffset.cpp b/VolZmapOffset.cpp index 61223bb..3907beb 100644 --- a/VolZmapOffset.cpp +++ b/VolZmapOffset.cpp @@ -24,7 +24,8 @@ using namespace std ; //---------------------------------------------------------------------------- -/* Funzione per sottrarre intervalli lungo un Dexel per l'offset di una superficie TriMesh */ +// Funzione per sottrarre intervalli lungo un Dexel per l'offset di una superficie TriMesh +//---------------------------------------------------------------------------- bool VolZmap::SubtractIntervalsForOffset( int nGrid, int nI, int nJ, double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax, @@ -35,7 +36,8 @@ VolZmap::SubtractIntervalsForOffset( int nGrid, int nI, int nJ, } //---------------------------------------------------------------------------- -/* Funzione per aggiungere intervalli lungo un Dexel per l'offset di una superficie TriMesh */ +// Funzione per aggiungere intervalli lungo un Dexel per l'offset di una superficie TriMesh +//---------------------------------------------------------------------------- bool VolZmap::AddIntervalsForOffset( int nGrid, int nI, int nJ, double dMin, double dMax, const Vector3d& vtNMin, const Vector3d& vtNMax, @@ -46,8 +48,9 @@ VolZmap::AddIntervalsForOffset( int nGrid, int nI, int nJ, } //---------------------------------------------------------------------------- -/* Funzione per la creazione di una sfera di Offset centrata sul vertice di una TriMesh con cui - aggiungere o sottrarre intervalli lungo i Dexel coinvolti */ +// Funzione per la creazione di una sfera di Offset centrata sul vertice di una TriMesh con cui +// aggiungere o sottrarre intervalli lungo i Dexel coinvolti +//---------------------------------------------------------------------------- bool VolZmap::CreateOffsSphereOnVertex( const Point3d& ptV, double dOffs, int nGrid, int nTool) { @@ -86,8 +89,9 @@ VolZmap::CreateOffsSphereOnVertex( const Point3d& ptV, double dOffs, int nGrid, } //---------------------------------------------------------------------------- -/* Funzione per la creazione di un cilindro di Offset sul vertice di una TriMesh con cui - aggiungere o sottrarre intervalli lungo i Dexel coinvolti */ +// Funzione per la creazione di un cilindro di Offset sul vertice di una TriMesh con cui +// aggiungere o sottrarre intervalli lungo i Dexel coinvolti. +//---------------------------------------------------------------------------- bool VolZmap::CreateOffsCylinderOnEdge( const Point3d& ptP1, const Point3d& ptP2, double dOffs, int nGrid, int nTool) @@ -140,10 +144,11 @@ VolZmap::CreateOffsCylinderOnEdge( const Point3d& ptP1, const Point3d& ptP2, dou } //---------------------------------------------------------------------------- -/* Funzione per inizializzare lo ZMap a partire da un vettore di superfici TriMesh */ -/* L'idea è quella di creare uno ZMap a partire dal Box complessivo delle superfici TriMesh : -* - le superfici chiuse possono già inserire i rispettivi spilloni -* - le superfici aperte non danno contributo */ +// Funzione per inizializzare lo ZMap a partire da un vettore di superfici TriMesh +// L'idea è quella di creare uno ZMap a partire dal Box complessivo delle superfici TriMesh : +// - le superfici chiuse possono già inserire i rispettivi spilloni +// - le superfici aperte non danno contributo +//---------------------------------------------------------------------------- bool VolZmap::InitVolZMapOffs( const CISURFTMPVECTOR& vSurf, double dOffs, double dTol) { @@ -207,8 +212,9 @@ VolZmap::InitVolZMapOffs( const CISURFTMPVECTOR& vSurf, double dOffs, double dTo } //---------------------------------------------------------------------------- -/* Funzione per inizializzare lo ZMap a partire da un vettore di superfici TriMesh */ -/* L'idea è quella di creare uno ZMap vuoto a partire dal Box complessivo delle superfici TriMesh */ +// Funzione per inizializzare lo ZMap a partire da un vettore di superfici TriMesh +// L'idea è quella di creare uno ZMap vuoto a partire dal Box complessivo delle superfici TriMesh +//---------------------------------------------------------------------------- bool VolZmap::InitVolZMapThickeningOffs( const CISURFTMPVECTOR& vSurf, double dOffs, double dTol) { @@ -240,8 +246,10 @@ VolZmap::InitVolZMapThickeningOffs( const CISURFTMPVECTOR& vSurf, double dOffs, return ( CreateEmpty( BBoxGlob.GetMin(), BBoxGlob.GetDimX(), BBoxGlob.GetDimY(), BBoxGlob.GetDimZ(), dTol, true)) ; } -/* [Fillet] Funzione per aggiornare mediante Sfere, Cilindri e Facce di estrusione lo ZMap corrente - mediante una superficie chiusa */ +//---------------------------------------------------------------------------- +// [Fillet] Funzione per aggiornare mediante Sfere, Cilindri e Facce di estrusione lo ZMap corrente +// mediante una superficie aperta +//---------------------------------------------------------------------------- bool VolZmap::UpdateVolZMapByOpenSurfFilletOffset( const ISurfTriMesh* Surf, double dOffs, double dTol) { @@ -249,8 +257,10 @@ VolZmap::UpdateVolZMapByOpenSurfFilletOffset( const ISurfTriMesh* Surf, double d return false ; } -/* [Fillet] Funzione per aggiornare mediante Sfere, Cilindri e Facce di estrusione lo ZMap corrente - mediante una superficie chiusa */ +//---------------------------------------------------------------------------- +// [Fillet] Funzione per aggiornare mediante Sfere, Cilindri e Facce di estrusione lo ZMap corrente +// mediante una superficie chiusa +//---------------------------------------------------------------------------- bool VolZmap::UpdateVolZMapByClosedSurfFilletOffset( const ISurfTriMesh* Surf, double dOffs, double dTol) { @@ -260,25 +270,25 @@ VolZmap::UpdateVolZMapByClosedSurfFilletOffset( const ISurfTriMesh* Surf, double if ( ! Surf->IsValid() || Surf->GetTriangleCount() == 0) return true ; - /* Assunzioni : - - Idea Generale di Offset - - Su ogni vertice viene definita una sfera ( con raggio pari al valore di Offset e - centro il vertice corrente) - - Su ogni lato viene definito un cilindro ( con raggio di base pari al valore di Offset - e asse definito dall'edge stesso) - - Su ogni faccia viene definita una superficie di estrusione ( dove le due basi sono - definite dalla traslazione sia in positivo che in negativo della faccia lungo la sua normale) - - - Segno dell'Offset : - - Positivo ( si sommano gli intervalli corrisipondenti alle entità create) - - Negativo ( si sottraggono gli intervalli corrispondenti alle enetità create) - - - Semplificazione entità : - La creazione di Sfere e Cilindri potrebbe essere resa più "corretta" definitendo solo - "spicchi 3d" di sfera e "spicchi 3d" di cilindri. Dato che le operazioni di somma, sottrazioni e - calcolo delle normali per gli spilloni sono elementari su queste figure, si rischia di appesantire - troppo i conti introducendo variabili angolari che non sommando tutte le parti. - */ + // Assunzioni : + // - Idea Generale di Offset + // - Su ogni vertice viene definita una sfera ( con raggio pari al valore di Offset e + // centro il vertice corrente) + // - Su ogni lato viene definito un cilindro ( con raggio di base pari al valore di Offset + // e asse definito dall'edge stesso) + // - Su ogni faccia viene definita una superficie di estrusione ( dove le due basi sono + // definite dalla traslazione sia in positivo che in negativo della faccia lungo la sua normale) + // + // - Segno dell'Offset : + // - Positivo ( si sommano gli intervalli corrisipondenti alle entità create) + // - Negativo ( si sottraggono gli intervalli corrispondenti alle enetità create) + // + // - Semplificazione entità : + // La creazione di Sfere e Cilindri potrebbe essere resa più "corretta" definitendo solo + // "spicchi 3d" di sfera e "spicchi 3d" di cilindri. Dato che le operazioni di somma, sottrazioni e + // calcolo delle normali per gli spilloni sono elementari su queste figure, si rischia di appesantire + // troppo i conti introducendo variabili angolari che non sommando tutte le parti. + // // definisco vettore di frame Locali alle 3 griglie FRAME3DVECTOR vFrGrid( 4) ; @@ -372,8 +382,9 @@ VolZmap::UpdateVolZMapByClosedSurfFilletOffset( const ISurfTriMesh* Surf, double return true ; } -/* [Fillet Thickening] Funzione per aggiornare mediante Sfere, Cilindri e Facce di estrusione lo ZMap corrente - mediante una superficie generica (aperta o chiusa) */ +//---------------------------------------------------------------------------- +// [Fillet Thickening] Funzione per aggiornare mediante Sfere, Cilindri e Facce di estrusione lo ZMap corrente +// mediante una superficie generica (aperta o chiusa) //---------------------------------------------------------------------------- bool VolZmap::UpdateVolZMapBySurfThickeningFilletOffset( const ISurfTriMesh* Surf, double dOffs, double dTol) @@ -470,13 +481,12 @@ VolZmap::UpdateVolZMapBySurfThickeningFilletOffset( const ISurfTriMesh* Surf, do } //---------------------------------------------------------------------------- -/* Funzione per la creazine di uno Zmap di Offset (positivo o negativo) a partire da un - vettore di superfici TriMesh (aperte o chiuse) */ -/* - Definizione : - - Lo Zmap di Offset ( positivo o negativo) di una superficie chiusa è automaticamente l'Offset stesso - - Lo Zmap di Offset ( positivo o negativo) di una superficie aperta è ????? ( da capire...) -*/ +// Funzione per la creazine di uno Zmap di Offset (positivo o negativo) a partire da un +// vettore di superfici TriMesh (aperte o chiuse). +// Definizione : +// - Lo Zmap di Offset ( positivo o negativo) di una superficie chiusa è automaticamente l'Offset stesso +// - Lo Zmap di Offset ( positivo o negativo) di una superficie aperta è ????? ( da capire...) +//---------------------------------------------------------------------------- bool VolZmap::CreateFromTriMeshOffset( const CISURFTMPVECTOR& vSurf, double dOffs, double dTol, int nType) { @@ -503,7 +513,7 @@ VolZmap::CreateFromTriMeshOffset( const CISURFTMPVECTOR& vSurf, double dOffs, do continue ; // aggiorno lo ZMap if ( Surf->IsClosed()) { - if ( nType == ISurfTriMesh::OFF_FILLET) { + if ( nType == STMOFF_FILLET) { if ( ! UpdateVolZMapByClosedSurfFilletOffset( Surf, dOffs, dTol)) return false ; } @@ -518,8 +528,9 @@ VolZmap::CreateFromTriMeshOffset( const CISURFTMPVECTOR& vSurf, double dOffs, do } //---------------------------------------------------------------------------- -/* Funzione per la creazine di uno Zmap di Fat Offset a partire da un - vettore di superfici TriMesh (aperte o chiuse) */ +// Funzione per la creazine di uno Zmap di Fat Offset a partire da un +// vettore di superfici TriMesh (aperte o chiuse). +//---------------------------------------------------------------------------- bool VolZmap::CreateFromTriMeshThickeningOffset( const CISURFTMPVECTOR& vSurf, double dOffs, double dTol, int nType) { @@ -546,7 +557,7 @@ VolZmap::CreateFromTriMeshThickeningOffset( const CISURFTMPVECTOR& vSurf, double continue ; // aggiorno lo Zmap - if ( nType == ISurfTriMesh::OFF_FILLET) { + if ( nType == STMOFF_FILLET) { if ( ! UpdateVolZMapBySurfThickeningFilletOffset( Surf, dOffs, dTol)) return false ; } @@ -555,6 +566,3 @@ VolZmap::CreateFromTriMeshThickeningOffset( const CISURFTMPVECTOR& vSurf, double m_nShape = OFFSET ; return true ; } - - -