From dd0496d5eb8d05290089ab6ec065fc754fbfe5dc Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 30 Oct 2014 08:48:08 +0000 Subject: [PATCH] =?UTF-8?q?EgtGeomKernel=201.5j6=20:=20-=20corretta=20e=20?= =?UTF-8?q?migliorata=20gestione=20ID=20delle=20entit=C3=A0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EgtGeomKernel.rc | Bin 11718 -> 11718 bytes GdbGeo.cpp | 5 ++- GdbGeo.h | 2 +- GdbGroup.cpp | 24 +++++++---- GdbGroup.h | 2 +- GdbObj.cpp | 19 ++++++++- GdbObj.h | 8 +++- GeomDB.cpp | 104 ++++++++++++++++++++++++++++++++++++----------- GeomDB.h | 9 +++- IdManager.h | 5 ++- 10 files changed, 139 insertions(+), 39 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 2a7a67cfffb216449347c6501be55a9def3efed4..0e47299c4b2625ab198bc3681f3e398218897666 100644 GIT binary patch delta 105 zcmX>WeJpyz4>m@#&A0i^Gfl4H(wY20QjO7U@qhsjGHHLdohEhZGjY6*g$9n S3%UqUVUILaAr^DCaRUIQpCc9k delta 105 zcmX>WeJpyz4>m^A&A0i^Gfl4H(wY20QjO7c@qhsjGHHLdohEhZGjY6*g$9n S3%UqUVUILaAr^DCaRUIO^CJ!b diff --git a/GdbGeo.cpp b/GdbGeo.cpp index 22d7998..17d1c01 100644 --- a/GdbGeo.cpp +++ b/GdbGeo.cpp @@ -43,7 +43,7 @@ GdbGeo::~GdbGeo( void) //---------------------------------------------------------------------------- GdbGeo* -GdbGeo::Clone( int nId, IdManager& IdMgr) const +GdbGeo::Clone( int nId) const { // alloco oggetto Gdb GdbGeo* pGdbGeo = new(nothrow) GdbGeo ; @@ -57,6 +57,9 @@ GdbGeo::Clone( int nId, IdManager& IdMgr) const pGdbGeo->m_nId = nId ; // l'aggiornamento del manager di Id viene fatto all'inserimento nel DB + // assegno il riferimento al DB geometrico + pGdbGeo->SetGeomDB( m_pGDB) ; + // copio oggetto Geo if ( m_pGeoObj != nullptr) { pGdbGeo->m_pGeoObj = m_pGeoObj->Clone() ; diff --git a/GdbGeo.h b/GdbGeo.h index 27c988e..801d80e 100644 --- a/GdbGeo.h +++ b/GdbGeo.h @@ -24,7 +24,7 @@ class GdbGeo : public GdbObj { public : virtual ~GdbGeo( void) ; - virtual GdbGeo* Clone( int nId, IdManager& IdMgr) const ; + virtual GdbGeo* Clone( int nId) const ; virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( int nNgeId, NgeReader& ngeIn, int& nParentId) ; virtual bool GetLocalBBox( BBox3d& b3Loc, int nFlag, int nLev = 0) const ; diff --git a/GdbGroup.cpp b/GdbGroup.cpp index bc73ca0..3c58d07 100644 --- a/GdbGroup.cpp +++ b/GdbGroup.cpp @@ -14,6 +14,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "GdbGroup.h" +#include "GeomDB.h" #include "IdManager.h" #include "NgeWriter.h" #include "NgeReader.h" @@ -39,16 +40,16 @@ GdbGroup::~GdbGroup( void) bool GdbGroup::Clear( void) { - // disalloco gli oggetti + // disalloco gli oggetti (dal fondo) GdbObj* pObj ; - pObj = GetFirstObj() ; + pObj = GetLastObj() ; while ( pObj != nullptr) { // lo rimuovo dalla lista pObj->Remove() ; // lo disalloco delete pObj ; - // passo al nuovo primo - pObj = GetFirstObj() ; + // passo al nuovo ultimo + pObj = GetLastObj() ; } return true ; @@ -56,8 +57,12 @@ GdbGroup::Clear( void) //---------------------------------------------------------------------------- GdbGroup* -GdbGroup::Clone( int nId, IdManager& IdMgr) const +GdbGroup::Clone( int nId) const { + // verifico validità riferimento a DB geometrico + if ( m_pGDB == nullptr) + return nullptr ; + // alloco gruppo Gdb GdbGroup* pGdbGroup = new(nothrow) GdbGroup ; if ( pGdbGroup == nullptr) @@ -68,7 +73,10 @@ GdbGroup::Clone( int nId, IdManager& IdMgr) const // assegno nuovo Id pGdbGroup->m_nId = nId ; - IdMgr.UpdateMaxId( nId) ; + m_pGDB->m_IdManager.UpdateMaxId( nId) ; + + // assegno il riferimento al DB geometrico + pGdbGroup->SetGeomDB( m_pGDB) ; // copio dati gruppo pGdbGroup->m_frF = m_frF ; @@ -77,7 +85,7 @@ GdbGroup::Clone( int nId, IdManager& IdMgr) const const GdbObj* pObj = GetFirstObj() ; while ( pObj != nullptr) { // eseguo copia - GdbObj* pNewObj = pObj->Clone( IdMgr.GetNewId(), IdMgr) ; + GdbObj* pNewObj = pObj->Clone( m_pGDB->m_IdManager.GetNewId()) ; if ( pNewObj == nullptr) { delete pGdbGroup ; return nullptr ; @@ -89,7 +97,7 @@ GdbGroup::Clone( int nId, IdManager& IdMgr) const return nullptr ; } // lo inserisco nella mappa degli Id - if ( ! IdMgr.AddObj( pNewObj->m_nId, pNewObj)) { + if ( ! m_pGDB->m_IdManager.AddObj( pNewObj->m_nId, pNewObj)) { delete pGdbGroup ; return nullptr ; } diff --git a/GdbGroup.h b/GdbGroup.h index 420fbf3..8c498ec 100644 --- a/GdbGroup.h +++ b/GdbGroup.h @@ -25,7 +25,7 @@ class GdbGroup : public GdbObj public : virtual ~GdbGroup( void) ; - virtual GdbGroup* Clone( int nId, IdManager& IdMgr) const ; + virtual GdbGroup* Clone( int nId) const ; virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( int nNgeId, NgeReader& ngeIn, int& nParentId) ; virtual bool GetLocalBBox( BBox3d& b3Loc, int nFlag, int nLev = 0) const ; diff --git a/GdbObj.cpp b/GdbObj.cpp index 2d5c0d6..9c2b377 100644 --- a/GdbObj.cpp +++ b/GdbObj.cpp @@ -13,6 +13,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" +#include "GeomDB.h" #include "GdbObj.h" #include "GdbGroup.h" #include "Attribs.h" @@ -25,16 +26,27 @@ using namespace std ; //---------------------------------------------------------------------------- GdbObj::GdbObj( void) : m_nId( GDB_ID_NULL), m_pAttribs( nullptr), - m_pNext( nullptr), m_pPrev( nullptr), m_pParent( nullptr) + m_pGDB( nullptr), m_pNext( nullptr), m_pPrev( nullptr), m_pParent( nullptr) { } //---------------------------------------------------------------------------- GdbObj::~GdbObj( void) { + // cancello gli attributi if ( m_pAttribs != nullptr) delete m_pAttribs ; m_pAttribs = nullptr ; + // aggiorno managers del Db geometrico di appartenenza + if ( m_pGDB != nullptr) { + // elimino da mappa dei nomi + m_pGDB->m_IdManager.RemoveObj( m_nId) ; + // eliminazione eventuale da lista dei selezionati + m_pGDB->m_SelManager.RemoveObj( this) ; + // sistemazioni in eventuali GdbIterator con quell'oggetto corrente + m_pGDB->m_IterManager.ResetObjIfSame( this) ; + } + m_pGDB = nullptr ; } //---------------------------------------------------------------------------- @@ -60,6 +72,11 @@ GdbObj::CopyFrom( const GdbObj* pSou) m_pAttribs = pSou->m_pAttribs->Clone() ; if ( m_pAttribs == nullptr) return false ; + // se selezionato, deve diventare solo visibile + if ( m_pAttribs->GetStatus() == GDB_ST_SEL) + m_pAttribs->SetStatus( GDB_ST_ON) ; + // marcatura sempre disabilitata + m_pAttribs->ResetMark() ; } return true ; diff --git a/GdbObj.h b/GdbObj.h index c19e675..6130bed 100644 --- a/GdbObj.h +++ b/GdbObj.h @@ -18,6 +18,7 @@ #include "/EgtDev/Include/EGkBBox3d.h" #include +class GeomDB ; class GdbGroup ; class IdManager ; class Attribs ; @@ -29,7 +30,7 @@ class GdbObj { public : virtual ~GdbObj( void) ; - virtual GdbObj* Clone( int nId, IdManager& IdMgr) const = 0 ; + virtual GdbObj* Clone( int nId) const = 0 ; virtual bool Save( NgeWriter& ngeOut) const = 0 ; virtual bool Load( int nNgeId, NgeReader& ngeIn, int& nParentId) = 0 ; virtual bool GetLocalBBox( BBox3d& b3Loc, int nFlag, int nLev = 0) const = 0 ; @@ -90,6 +91,8 @@ class GdbObj bool RemoveInfo( const std::string& sKey) ; public : + void SetGeomDB( GeomDB* pGDB) + { m_pGDB = pGDB ; } GdbObj* GetNext( void) { return m_pNext ; } const GdbObj* GetNext( void) const @@ -113,6 +116,9 @@ class GdbObj int m_nId ; Attribs* m_pAttribs ; + protected : + GeomDB* m_pGDB ; + private : GdbObj* m_pNext ; GdbObj* m_pPrev ; diff --git a/GeomDB.cpp b/GeomDB.cpp index a19760d..2fb706e 100644 --- a/GeomDB.cpp +++ b/GeomDB.cpp @@ -49,6 +49,7 @@ CreateGeomDB( void) //---------------------------------------------------------------------------- GeomDB::GeomDB( void) { + m_GrpRadix.SetGeomDB( this) ; m_GrpRadix.m_nId = GDB_ID_ROOT ; m_GrpRadix.SetMaterial( Color()) ; } @@ -56,6 +57,7 @@ GeomDB::GeomDB( void) //---------------------------------------------------------------------------- GeomDB::~GeomDB( void) { + // pulisco tutto Clear() ; } @@ -77,14 +79,14 @@ GeomDB::Init( void) bool GeomDB::Clear( void) { - // pulisco mappa degli identificatori - m_IdManager.Clear() ; - // pulisco lista dei selezionati - m_SelManager.Clear() ; - // cancello i materiali custom - m_MatManager.Clear() ; // disalloco i gruppi e gli oggetti m_GrpRadix.Clear() ; + // pulisco lista dei selezionati + m_SelManager.Clear() ; + // pulisco mappa degli identificatori + m_IdManager.Clear() ; + // cancello i materiali custom + m_MatManager.Clear() ; return true ; } @@ -331,7 +333,7 @@ GeomDB::InsertInGeomDB( GdbObj* pGObj, int nRefId, int nSonBeforeAfter, bool bTe if ( pGObj == nullptr) return false ; - // se richista, verifica validità e unicità del nome + // se richiesta, verifica validità e unicità del nome if ( bTestId && ( pGObj->m_nId <= GDB_ID_ROOT || ExistsObj( pGObj->m_nId))) return false ; @@ -344,6 +346,9 @@ GeomDB::InsertInGeomDB( GdbObj* pGObj, int nRefId, int nSonBeforeAfter, bool bTe if ( pGRef == nullptr) return false ; + // assegno il riferimento al DB geometrico + pGObj->SetGeomDB( this) ; + // inserisco prima del riferimento if ( nSonBeforeAfter <= GDB_BEFORE) { if ( ! pGObj->InsertBefore( pGRef)) @@ -511,6 +516,70 @@ GeomDB::GetPrev( int nId) const return ( pGdbPrev->m_nId) ; } +//---------------------------------------------------------------------------- +int +GeomDB::GetFirstGroupInGroup( int nIdGroup) const +{ + // recupero il primo oggetto del gruppo + int nIdFirst = GetFirstInGroup( nIdGroup) ; + while ( nIdFirst != GDB_ID_NULL) { + // se di tipo gruppo + if ( GetGdbType( nIdFirst) == GDB_TY_GROUP) + return nIdFirst ; + // passo al successivo + nIdFirst = GetNext( nIdFirst) ; + } + return GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +int +GeomDB::GetNextGroup( int nId) const +{ + // recupero il prossimo oggetto + int nIdNext = GetNext( nId) ; + while ( nIdNext != GDB_ID_NULL) { + // se di tipo gruppo + if ( GetGdbType( nIdNext) == GDB_TY_GROUP) + return nIdNext ; + // passo al successivo + nIdNext = GetNext( nIdNext) ; + } + return GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +int +GeomDB::GetLastGroupInGroup( int nIdGroup) const +{ + // recupero l'ultimo oggetto del gruppo + int nIdLast = GetLastInGroup( nIdGroup) ; + while ( nIdLast != GDB_ID_NULL) { + // se di tipo gruppo + if ( GetGdbType( nIdLast) == GDB_TY_GROUP) + return nIdLast ; + // passo al successivo + nIdLast = GetPrev( nIdLast) ; + } + return GDB_ID_NULL ; +} + +//---------------------------------------------------------------------------- +int +GeomDB::GetPrevGroup( int nId) const +{ + // recupero il precedente oggetto + int nIdPrev = GetPrev( nId) ; + while ( nIdPrev != GDB_ID_NULL) { + // se di tipo gruppo + if ( GetGdbType( nIdPrev) == GDB_TY_GROUP) + return nIdPrev ; + // passo al successivo + nIdPrev = GetPrev( nIdPrev) ; + } + return GDB_ID_NULL ; +} + //---------------------------------------------------------------------------- int GeomDB::GetGdbType( int nId) const @@ -715,7 +784,7 @@ GeomDB::Copy( int nIdSou, int nIdDest, int nRefId, int nSonBeforeAfter, bool bGl return false ; // eseguo la copia - PtrOwner pGdODest( pGdOSou->Clone( nIdDest, m_IdManager)) ; + PtrOwner pGdODest( pGdOSou->Clone( nIdDest)) ; if ( IsNull( pGdODest)) return GDB_ID_NULL ; @@ -823,27 +892,14 @@ GeomDB::Erase( int nId) bool GeomDB::Erase( GdbObj* pGdbObj) { - // deve essere valido - if ( pGdbObj == nullptr) + // deve essere valido e non il gruppo radice + if ( pGdbObj == nullptr || pGdbObj == &m_GrpRadix) return false ; - // non si può cancellare il gruppo radice - if ( pGdbObj == &m_GrpRadix) - return false ; - - // elimino da mappa dei nomi - 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() ; - // lo disalloco (distruttore virtuale) + // lo disalloco (distruttore virtuale) con sistemazione mappa nomi, lista selezionati e GdbIterator delete pGdbObj ; return true ; diff --git a/GeomDB.h b/GeomDB.h index 94757bc..650364f 100644 --- a/GeomDB.h +++ b/GeomDB.h @@ -26,6 +26,9 @@ class GeomDB : public IGeomDB { friend class GdbIterator ; + friend class GdbObj ; + friend class GdbGroup ; + friend class GdbGeo ; public : virtual ~GeomDB( void) ; @@ -42,6 +45,10 @@ class GeomDB : public IGeomDB virtual int GetNext( int nId) const ; virtual int GetLastInGroup( int nIdGroup) const ; virtual int GetPrev( int nId) const ; + virtual int GetFirstGroupInGroup( int nIdGroup) const ; + virtual int GetNextGroup( int nId) const ; + virtual int GetLastGroupInGroup( int nIdGroup) const ; + virtual int GetPrevGroup( int nId) const ; virtual int GetGdbType( int nId) const ; virtual IGeoObj* GetGeoObj( int nId) ; virtual const IGeoObj* GetGeoObj( int nId) const ; @@ -196,9 +203,9 @@ class GeomDB : public IGeomDB { return m_IterManager.RemoveGdbIterator( pIter) ; } private : - 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 GdbMaterialMgr m_MatManager ; // gestore lista materiali + GdbGroup m_GrpRadix ; // gruppo radice di tutto il DB } ; diff --git a/IdManager.h b/IdManager.h index a2ecedd..b733be8 100644 --- a/IdManager.h +++ b/IdManager.h @@ -43,7 +43,10 @@ class IdManager m_nMaxId = nId ; return m_GdbIdMap.insert( INTPGDBO_UMAP::value_type( nId, pGObj)).second ; } bool RemoveObj( int nId) - { m_GdbIdMap.erase( nId) ; return true ; } + { m_GdbIdMap.erase( nId) ; + if ( nId == m_nMaxId && m_nMaxId > 0) + -- m_nMaxId ; + return true ; } int GetNewId( void) { return ( ++ m_nMaxId) ; } int GetMaxId( void) const