EgtGeomKernel 1.5j6 :

- corretta e migliorata gestione ID delle entità.
This commit is contained in:
Dario Sassi
2014-10-30 08:48:08 +00:00
parent cf8fbdc335
commit dd0496d5eb
10 changed files with 139 additions and 39 deletions
BIN
View File
Binary file not shown.
+4 -1
View File
@@ -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() ;
+1 -1
View File
@@ -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 ;
+16 -8
View File
@@ -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 ;
}
+1 -1
View File
@@ -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 ;
+18 -1
View File
@@ -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 ;
+7 -1
View File
@@ -18,6 +18,7 @@
#include "/EgtDev/Include/EGkBBox3d.h"
#include <string>
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 ;
+80 -24
View File
@@ -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<GdbObj> pGdODest( pGdOSou->Clone( nIdDest, m_IdManager)) ;
PtrOwner<GdbObj> 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 ;
+8 -1
View File
@@ -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
} ;
+4 -1
View File
@@ -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