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. // //----------------------------------------------------------------------------