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 ;