EgtGeomKernel :

- prime sistemazioni per offset superfici trimesh tramite Zmap.
This commit is contained in:
Dario Sassi
2025-07-07 14:59:06 +02:00
parent b957cc75be
commit ff6307fcca
5 changed files with 90 additions and 74 deletions
+59 -51
View File
@@ -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 ;
}