diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index e3b9ab9..b63dc82 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -251,6 +251,7 @@ copy $(TargetPath) \EgtProg\Dll64 + @@ -326,6 +327,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters index 06e5222..f75ba10 100644 --- a/EgtGeomKernel.vcxproj.filters +++ b/EgtGeomKernel.vcxproj.filters @@ -132,6 +132,9 @@ File di origine\Base + + File di origine\Gdb + @@ -335,6 +338,9 @@ File di intestazione + + File di intestazione + diff --git a/GdbExecutor.cpp b/GdbExecutor.cpp index 45548ef..d19f06f 100644 --- a/GdbExecutor.cpp +++ b/GdbExecutor.cpp @@ -1685,7 +1685,6 @@ GdbExecutor::OutGroupScl( int nId, int nFlag) int nParentId ; int nGdbType ; Frame3d frFrame ; - GdbIterator Iter ; m_OutScl.Remark( "Start Group ---") ; @@ -1708,7 +1707,7 @@ GdbExecutor::OutGroupScl( int nId, int nFlag) } // emetto entità gruppo m_OutScl.Remark( "Entities :") ; - Iter.SetGDB( m_pGDB) ; + GdbIterator Iter( m_pGDB) ; bNext = Iter.GoToFirstInGroup( nId) ; while ( bNext) { nGdbType = Iter.GetGdbType() ; diff --git a/GdbIterator.cpp b/GdbIterator.cpp index 4b5d814..568918d 100644 --- a/GdbIterator.cpp +++ b/GdbIterator.cpp @@ -21,24 +21,29 @@ using namespace std ; //---------------------------------------------------------------------------- IGdbIterator* -CreateGdbIterator( void) +CreateGdbIterator( IGeomDB* pGDB) { - return static_cast ( new GdbIterator) ; + return static_cast ( new GdbIterator( pGDB) ) ; } //---------------------------------------------------------------------------- // GdbIterator //---------------------------------------------------------------------------- -GdbIterator::GdbIterator( void) +GdbIterator::GdbIterator( IGeomDB* pGDB) { - m_pGDB = nullptr ; + if ( pGDB != nullptr) + SetGDB( pGDB) ; + else + m_pGDB = nullptr ; + m_pCurrObj = nullptr ; } //---------------------------------------------------------------------------- GdbIterator::~GdbIterator( void) { - // TODO : togliere link da GdbGeom per essere notificato della cancellazione di nodi + if ( m_pGDB != nullptr) + m_pGDB->RemoveGdbIteratorFromList( this) ; } //---------------------------------------------------------------------------- @@ -46,8 +51,10 @@ bool GdbIterator::SetGDB( IGeomDB* pGDB) { m_pGDB = dynamic_cast( pGDB) ; + if ( m_pGDB == nullptr) + return false ; - return ( m_pGDB != nullptr) ; + return m_pGDB->AddGdbIteratorToList( this) ; } //---------------------------------------------------------------------------- @@ -188,6 +195,36 @@ GdbIterator::GoToPrev( void) return ( m_pCurrObj != nullptr) ; } +//---------------------------------------------------------------------------- +bool +GdbIterator::EraseAndGoToNext( void) +{ + if ( m_pGDB == nullptr || m_pCurrObj == nullptr) + return false ; + + // passo al successivo + GdbObj* pObjToErase = m_pCurrObj ; + m_pCurrObj = m_pCurrObj->GetNext() ; + // eseguo cancellazione + m_pGDB->Erase( pObjToErase) ; + return ( m_pCurrObj != nullptr) ; +} + +//---------------------------------------------------------------------------- +bool +GdbIterator::EraseAndGoToPrev( void) +{ + if ( m_pGDB == nullptr || m_pCurrObj == nullptr) + return false ; + + // passo al precedente + GdbObj* pObjToErase = m_pCurrObj ; + m_pCurrObj = m_pCurrObj->GetPrev() ; + // eseguo cancellazione + m_pGDB->Erase( pObjToErase) ; + return true ; +} + //---------------------------------------------------------------------------- int GdbIterator::GetGdbType( void) const diff --git a/GdbIterator.h b/GdbIterator.h index 1427bc0..63acd84 100644 --- a/GdbIterator.h +++ b/GdbIterator.h @@ -31,6 +31,8 @@ class GdbIterator : public IGdbIterator virtual bool GoToLastInGroup( int nIdGroup) ; virtual bool GoToLastInGroup( const IGdbIterator& iIter) ; virtual bool GoToPrev( void) ; + virtual bool EraseAndGoToNext( void) ; + virtual bool EraseAndGoToPrev( void) ; virtual int GetGdbType( void) const ; virtual IGeoObj* GetGeoObj( void) ; @@ -73,8 +75,10 @@ class GdbIterator : public IGdbIterator virtual bool RemoveInfo( const std::string& sKey) ; public : - GdbIterator( void) ; - + GdbIterator( IGeomDB* pGDB = nullptr) ; + void ResetCurrObjIfSame( GdbObj* pObj) + { if ( m_pCurrObj == pObj) + m_pCurrObj = nullptr ; } private : GeomDB* m_pGDB ; GdbObj* m_pCurrObj ; diff --git a/GeomDB.cpp b/GeomDB.cpp index 7084125..b993526 100644 --- a/GeomDB.cpp +++ b/GeomDB.cpp @@ -620,12 +620,30 @@ GeomDB::Erase( int nId) if ( pGdbObj == nullptr) return false ; + return Erase( pGdbObj) ; +} + +//---------------------------------------------------------------------------- +bool +GeomDB::Erase( GdbObj* pGdbObj) +{ + // deve essere valido + if ( pGdbObj == nullptr) + return false ; + + // non si può cancellare il gruppo radice + if ( pGdbObj == &m_GrpRadix) + return false ; + // elimino da mappa dei nomi - m_IdManager.RemoveObj( nId) ; + m_IdManager.RemoveObj( pGdbObj->m_nId) ; // eliminazione eventuale da lista dei selezionati m_SelManager.RemoveObj( pGdbObj) ; + // sistemazioni in eventuali GdbIterator con quell'oggetto corrente + m_IterManager.ResetObjIfSame( pGdbObj) ; + // lo tolgo dalla lista pGdbObj->Remove() ; diff --git a/GeomDB.h b/GeomDB.h index be733d2..67a7ada 100644 --- a/GeomDB.h +++ b/GeomDB.h @@ -16,14 +16,11 @@ #include "GdbGeo.h" #include "GdbGroup.h" #include "IdManager.h" +#include "IterManager.h" #include "SelManager.h" #include "/EgtDev/Include/EGkGeomDB.h" -#include -//---------------------------------------------------------------------------- -class CScan ; - //---------------------------------------------------------------------------- class GeomDB : public IGeomDB { @@ -120,14 +117,20 @@ class GeomDB : public IGeomDB GdbGroup* GetGdbGroup( int nId) { return dynamic_cast( GetGdbObj( nId)) ; } bool AddToGeomDB( GdbObj* pGObj, int nParentId) ; + bool Erase( GdbObj* pGObj) ; bool LoadHeader( Scanner& TheScanner) ; bool LoadOneObj( Scanner& TheScanner, bool& bEnd) ; bool SaveHeader( std::ostream& osOut) const ; bool SetStatus( GdbObj* pGdbObj, int nStat) ; bool RevertStatus( GdbObj* pGdbObj) ; + bool AddGdbIteratorToList( GdbIterator* pIter) + { return m_IterManager.AddGdbIterator( pIter) ; } + bool RemoveGdbIteratorFromList( GdbIterator* pIter) + { return m_IterManager.RemoveGdbIterator( pIter) ; } private : - GdbGroup m_GrpRadix ; // gruppo radice di tutto il DB - IdManager m_IdManager ; // gestore del nuovo Id - SelManager m_SelManager ; // gestore lista oggetti selezionati + GdbGroup m_GrpRadix ; // gruppo radice di tutto il DB + IdManager m_IdManager ; // gestore del nuovo Id + IterManager m_IterManager ; // gestore lista iteratori attivi + SelManager m_SelManager ; // gestore lista oggetti selezionati } ; diff --git a/IterManager.cpp b/IterManager.cpp new file mode 100644 index 0000000..24a2e1a --- /dev/null +++ b/IterManager.cpp @@ -0,0 +1,32 @@ +//---------------------------------------------------------------------------- +// EgalTech 2014-2014 +//---------------------------------------------------------------------------- +// File : IterManager.cpp Data : 23.03.14 Versione : 1.5c9 +// Contenuto : Implementazione di alcuni metodi della classe IterManager +// (non possono stare nell'header per problemi di richiami ricursivi) +// +// +// Modifiche : 20.03.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "IterManager.h" +#include "GdbIterator.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +bool +IterManager::ResetObjIfSame( GdbObj* pGdbObj) +{ + PGDBI_LIST::const_iterator Iter ; + for ( Iter = m_IterList.begin() ; Iter != m_IterList.end() ; ++ Iter) { + if ( *Iter != nullptr) { + (*Iter)->ResetCurrObjIfSame( pGdbObj) ; + } + } + return true ; +} diff --git a/IterManager.h b/IterManager.h new file mode 100644 index 0000000..2b86401 --- /dev/null +++ b/IterManager.h @@ -0,0 +1,56 @@ +//---------------------------------------------------------------------------- +// EgalTech 2014-2014 +//---------------------------------------------------------------------------- +// File : IterManager.h Data : 23.03.14 Versione : 1.5c9 +// Contenuto : Dichiarazione e implementazione della classe IterManager. +// +// +// +// Modifiche : 23.03.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include + +class GdbIterator ; +class GdbObj ; + +//---------------------------------------------------------------------------- +typedef std::list PGDBI_LIST ; + +//---------------------------------------------------------------------------- +class IterManager +{ + public : + bool IsGdbIteratorInList( GdbIterator* pIter) + { PGDBI_LIST::const_iterator Iter ; + for ( Iter = m_IterList.begin() ; Iter != m_IterList.end() ; ++ Iter) { + if ( *Iter == pIter) + return true ; + } + return false ; } + bool AddGdbIterator( GdbIterator* pIter) + { if ( pIter == nullptr) + return false ; + if ( IsGdbIteratorInList( pIter)) + return true ; + try { m_IterList.push_back( pIter) ; } + catch (...) { return false ;} + return true ; } + bool RemoveGdbIterator( GdbIterator* pIter) + { PGDBI_LIST::iterator Iter ; + for ( Iter = m_IterList.begin() ; Iter != m_IterList.end() ; ++ Iter) { + if ( *Iter == pIter) { + m_IterList.erase( Iter) ; + return true ; + } + } + return true ; } + bool ResetObjIfSame( GdbObj* pGdbObj) ; + + private : + PGDBI_LIST m_IterList ; +} ; diff --git a/SelManager.h b/SelManager.h index dbe2cdc..d6eebc6 100644 --- a/SelManager.h +++ b/SelManager.h @@ -13,9 +13,9 @@ #pragma once -#include "GdbObj.h" #include +class GdbObj ; //---------------------------------------------------------------------------- typedef std::list PGDBO_LIST ;