diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc
index 5d94542..b0ef58a 100644
Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ
diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj
index 728ab73..e4059da 100644
--- a/EgtGeomKernel.vcxproj
+++ b/EgtGeomKernel.vcxproj
@@ -266,6 +266,7 @@ copy $(TargetPath) \EgtProg\Dll64
Create
Create
+
diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters
index 36265ad..cef2e26 100644
--- a/EgtGeomKernel.vcxproj.filters
+++ b/EgtGeomKernel.vcxproj.filters
@@ -31,6 +31,9 @@
{cc84f71a-b149-4187-af26-736133e92672}
+
+ {c3d823d6-c3ba-45ac-b6c4-b8896e75404d}
+
@@ -156,6 +159,9 @@
File di origine\Base
+
+ File di origine\GeoCreate
+
diff --git a/GdbExecutor.cpp b/GdbExecutor.cpp
index 4453120..481b24a 100644
--- a/GdbExecutor.cpp
+++ b/GdbExecutor.cpp
@@ -32,6 +32,7 @@
#include "/EgtDev/Include/EgkDistPointCurve.h"
#include "/EgtDev/Include/EgkSurfTriMesh.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
+#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
using namespace std ;
@@ -1341,8 +1342,12 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
else if ( sCmd2 == "END") {
return SurfTriMeshEnd( vsParams) ;
}
+ // se creazione da zuppa di triangoli
+ else if ( sCmd2 == "TRIAS" || sCmd2 == "BYTRIANGLESOUP") {
+ return SurfTriMeshByTriangleSoup( vsParams) ;
+ }
// se creazione per triangolazione di un contorno chiuso e piano
- else if ( sCmd2 == "CONT" || sCmd2 == "BYCONTOUR") {
+ else if ( sCmd2 == "CONT" || sCmd2 == "BYCONTOUR") {
return SurfTriMeshByContour( vsParams) ;
}
// se creazione per estrusione
@@ -1474,6 +1479,70 @@ GdbExecutor::SurfTriMeshEnd( const STRVECTOR& vsParams)
return bOk ;
}
+//----------------------------------------------------------------------------
+bool
+GdbExecutor::SurfTriMeshByTriangleSoup( const STRVECTOR& vsParams)
+{
+ // 3 o 4 parametri : Id, ParentId, IdStm/s[, bErase]
+ if ( vsParams.size() != 3 && vsParams.size() != 4)
+ return false ;
+ // flag per cancellazione superfici originali
+ bool bErase = ( vsParams.size() >= 4 && vsParams[3] == "1") ;
+ // recupero lista nomi
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[2], vnNames))
+ return false ;
+ // recupero il riferimento del gruppo destinazione
+ Frame3d frDest ;
+ if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
+ return false ;
+ // Costruttore di trimesh da insieme disordinato di triangoli
+ StmFromTriangleSoup StmFts ;
+ if ( ! StmFts.Start())
+ return false ;
+ // Recupero tutti i triangoli delle superfici sorgenti e li inserisco nella nuova
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ // recupero la superficie sorgente
+ const ISurfTriMesh* pStmS = GetSurfTriMesh( m_pGDB->GetGeoObj( *Iter)) ;
+ if ( pStmS == nullptr)
+ return false ;
+ // recupero il riferimento della superficie sorgente
+ Frame3d frSou ;
+ if ( ! m_pGDB->GetGlobFrame( *Iter, frSou))
+ return false ;
+ // recupero tutti i triangoli
+ Triangle3d Tria ;
+ int nId = pStmS->GetFirstTriangle( Tria) ;
+ while ( nId != SVT_NULL) {
+ // aggiusto per i sistemi di riferimento
+ Tria.LocToLoc( frSou, frDest) ;
+ // inserisco il triangolo nella nuova superficie
+ if ( ! StmFts.AddTriangle( Tria))
+ return false ;
+ // passo al triangolo successivo
+ nId = pStmS->GetNextTriangle( nId, Tria) ;
+ }
+ }
+ // valido la superficie e calcolo le adiacenze
+ if ( ! StmFts.End())
+ return false ;
+ // inserisco la superficie trimesh nel DB
+ ISurfTriMesh* pSTM = StmFts.GetSurf() ;
+ if ( AddGeoObj( vsParams[0], vsParams[1], pSTM)) {
+ // se richiesto, cancello le curve originali
+ if ( bErase) {
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ if ( ! m_pGDB->Erase( *Iter))
+ return false ;
+ }
+ }
+ return true ;
+ }
+ else
+ return false ;
+}
+
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshByContour( const STRVECTOR& vsParams)
@@ -1710,12 +1779,22 @@ GdbExecutor::SurfTriMeshDoCompacting( const STRVECTOR& vsParams)
// 1 parametro : Id
if ( vsParams.size() != 1)
return false ;
- // recupero la superficie
- ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
- if ( pStm == nullptr)
+ // recupero lista nomi superfici
+ INTVECTOR vnNames ;
+ if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
- // eseguo la compattazione
- return pStm->DoCompacting() ;
+ // opero sui diversi oggetti
+ INTVECTOR::iterator Iter ;
+ for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
+ // recupero la superficie
+ ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( *Iter)) ;
+ if ( pStm == nullptr)
+ return false ;
+ // eseguo la compattazione
+ if ( ! pStm->DoCompacting())
+ return false ;
+ }
+ return true ;
}
//----------------------------------------------------------------------------
diff --git a/GdbExecutor.h b/GdbExecutor.h
index 71e4b57..b97163b 100644
--- a/GdbExecutor.h
+++ b/GdbExecutor.h
@@ -81,6 +81,7 @@ class GdbExecutor : public IGdbExecutor
bool SurfTriMeshAddVertex( const STRVECTOR& vsParams) ;
bool SurfTriMeshAddTriangle( const STRVECTOR& vsParams) ;
bool SurfTriMeshEnd( const STRVECTOR& vsParams) ;
+ bool SurfTriMeshByTriangleSoup( const STRVECTOR& vsParams) ;
bool SurfTriMeshByContour( const STRVECTOR& vsParams) ;
bool SurfTriMeshByExtrusion( const STRVECTOR& vsParams) ;
bool SurfTriMeshByTwoPaths( const STRVECTOR& vsParams) ;
diff --git a/GeomDB.cpp b/GeomDB.cpp
index e82bcf6..dfb8302 100644
--- a/GeomDB.cpp
+++ b/GeomDB.cpp
@@ -1210,16 +1210,23 @@ GeomDB::SetStatus( GdbObj* pGdbObj, int nStat)
if ( pGdbObj == nullptr)
return false ;
+ // recupero lo stato precedente
+ int nOldStat = GDB_ST_ON ;
+ pGdbObj->GetStatus( nOldStat) ;
+
// assegno lo stato
if ( ! pGdbObj->SetStatus( nStat))
return false ;
- // se il nuovo stato è selezionato, inserisco oggetto in lista selezionati
- if ( nStat == GDB_ST_SEL)
- m_SelManager.AddObj( pGdbObj) ;
- // altrimenti provo a toglierlo
- else
- m_SelManager.RemoveObj( pGdbObj) ;
+ // se lo stato è cambiato
+ if ( nStat != nOldStat) {
+ // se il nuovo stato è di selezionato, inserisco oggetto in lista selezionati
+ if ( nStat == GDB_ST_SEL)
+ m_SelManager.AddObj( pGdbObj) ;
+ // altrimenti provo a toglierlo
+ else
+ m_SelManager.RemoveObj( pGdbObj) ;
+ }
return true ;
}
@@ -1244,17 +1251,27 @@ GeomDB::RevertStatus( GdbObj* pGdbObj)
if ( pGdbObj == nullptr)
return false ;
+ // recupero lo stato precedente
+ int nOldStat = GDB_ST_ON ;
+ pGdbObj->GetStatus( nOldStat) ;
+
// ripristino lo stato precedente
if ( ! pGdbObj->RevertStatus())
return false ;
- // se il nuovo stato è selezionato, inserisco oggetto in lista selezionati
+ // recupero il nuovo stato
int nStat = GDB_ST_ON ;
- if ( pGdbObj->GetStatus( nStat) && nStat == GDB_ST_SEL)
- m_SelManager.AddObj( pGdbObj) ;
- // altrimenti provo a toglierlo
- else
- m_SelManager.RemoveObj( pGdbObj) ;
+ pGdbObj->GetStatus( nStat) ;
+
+ // se lo stato è cambiato
+ if ( nStat != nOldStat) {
+ // se il nuovo stato è di selezionato, inserisco oggetto in lista selezionati
+ if ( nStat == GDB_ST_SEL)
+ m_SelManager.AddObj( pGdbObj) ;
+ // altrimenti provo a toglierlo
+ else
+ m_SelManager.RemoveObj( pGdbObj) ;
+ }
return true ;
}
diff --git a/PointGrid3d.cpp b/PointGrid3d.cpp
index d82c21d..2802628 100644
--- a/PointGrid3d.cpp
+++ b/PointGrid3d.cpp
@@ -23,7 +23,8 @@ bool
PointGrid3d::Init( int nBuckets, double dCellDim)
{
m_dCellDim = dCellDim ;
- m_MMap.rehash( nBuckets) ;
+ try { m_MMap.rehash( nBuckets) ;}
+ catch(...) { return false ;}
return true ;
}
diff --git a/SelManager.h b/SelManager.h
index d6eebc6..d4a4541 100644
--- a/SelManager.h
+++ b/SelManager.h
@@ -1,13 +1,14 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
//----------------------------------------------------------------------------
-// File : SelManager.h Data : 19.03.14 Versione : 1.5c8
+// File : SelManager.h Data : 19.05.14 Versione : 1.5e7
// Contenuto : Dichiarazione e implementazione della classe SelManager.
//
//
//
// Modifiche : 19.03.14 DS Creazione modulo.
-//
+// 19.05.14 DS La AddObj non controlla eventuale precedente presenza
+// oggetto in lista, perchè già si fa tramite flag di GdbObj.
//
//----------------------------------------------------------------------------
@@ -31,18 +32,9 @@ class SelManager
m_Iter = m_SelList.end() ; }
int GetSize( void) const
{ return int ( m_SelList.size()) ; }
- bool IsObjInList( GdbObj* pGObj)
- { PGDBO_LIST::const_iterator Iter ;
- for ( Iter = m_SelList.begin() ; Iter != m_SelList.end() ; ++ Iter) {
- if ( *Iter == pGObj)
- return true ;
- }
- return false ; }
bool AddObj( GdbObj* pGObj)
{ if ( pGObj == nullptr)
return false ;
- if ( IsObjInList( pGObj))
- return true ;
try { m_SelList.push_back( pGObj) ; }
catch (...) { return false ;}
return true ; }
diff --git a/StmFromTriangleSoup.cpp b/StmFromTriangleSoup.cpp
new file mode 100644
index 0000000..3b55dad
--- /dev/null
+++ b/StmFromTriangleSoup.cpp
@@ -0,0 +1,95 @@
+//----------------------------------------------------------------------------
+// EgalTech 2013-2014
+//----------------------------------------------------------------------------
+// File : StmFromTriangleSoup.cpp Data : 19.05.14 Versione : 1.5e7
+// Contenuto : Implementazione della classe StmFromTriangleSoup, per creare
+// una superficie trimesh da un insieme disordinato di triangoli(STL).
+//
+//
+// Modifiche : 19.05.14 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+//--------------------------- Include ----------------------------------------
+#include "stdafx.h"
+#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
+
+//----------------------------------------------------------------------------
+StmFromTriangleSoup::StmFromTriangleSoup( void) : m_pSTM( nullptr)
+{
+}
+
+//----------------------------------------------------------------------------
+StmFromTriangleSoup::~StmFromTriangleSoup( void)
+{
+ if ( m_pSTM != nullptr)
+ delete m_pSTM ;
+ m_pSTM = nullptr ;
+}
+
+//----------------------------------------------------------------------------
+bool
+StmFromTriangleSoup::Start( int nBuckets)
+{
+ // creo la superficie trimesh
+ m_pSTM = CreateSurfTriMesh() ;
+ if ( m_pSTM == nullptr)
+ return false ;
+ // la inizializzo
+ if ( ! m_pSTM->Init( 3, 1))
+ return false ;
+ // inizializzo la griglia
+ return m_VertGrid.Init( nBuckets) ;
+}
+
+//----------------------------------------------------------------------------
+bool
+StmFromTriangleSoup::AddTriangle( Triangle3d& Tria)
+{
+ // verifico inizializzazione
+ if ( m_pSTM == nullptr)
+ return false ;
+ // ciclo sui tre vertici
+ int nIdV[3] ;
+ for ( int i = 0 ; i < 3 ; ++ i) {
+ // verifico se vertice già presente
+ int nId ;
+ if ( ! m_VertGrid.Find( Tria.GetP( i), 2 * EPS_SMALL, nId)) {
+ // aggiungo il vertice
+ if ( ( nIdV[i] = m_pSTM->AddVertex( Tria.GetP( i))) == SVT_NULL)
+ return false ;
+ m_VertGrid.InsertPoint( Tria.GetP( i), nIdV[i]) ;
+ }
+ else
+ nIdV[i] = nId ;
+ }
+
+ // se i vertici sono tutti diversi tra loro, inserisco il triangolo
+ if ( nIdV[0] != nIdV[1] && nIdV[0] != nIdV[2] && nIdV[1] != nIdV[2]) {
+ if ( m_pSTM->AddTriangle( nIdV) == SVT_NULL)
+ return false ;
+ }
+
+ return true ;
+}
+
+//----------------------------------------------------------------------------
+bool
+StmFromTriangleSoup::End( void)
+{
+ // verifico inizializzazione
+ if ( m_pSTM == nullptr)
+ return false ;
+ // sistemazioni finali della superficie
+ return m_pSTM->AdjustTopology() ;
+}
+
+//----------------------------------------------------------------------------
+ISurfTriMesh*
+StmFromTriangleSoup::GetSurf( void)
+{
+ ISurfTriMesh* pRet = m_pSTM ;
+ m_pSTM = nullptr ;
+ return pRet ;
+}
diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp
index a86984a..9822b2b 100644
--- a/SurfTriMesh.cpp
+++ b/SurfTriMesh.cpp
@@ -7,7 +7,7 @@
//
//
// Modifiche : 26.03.14 DS Creazione modulo.
-// 15.05.15 DS Corr. errore CreateByTwoCurves che dava loop infinito.
+// 15.05.14 DS Corr. errore CreateByTwoCurves che dava loop infinito.
//
//----------------------------------------------------------------------------