EgtGeomKernel 1.5j6 :
- corretta e migliorata gestione ID delle entità.
This commit is contained in:
Binary file not shown.
+4
-1
@@ -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() ;
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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 ;
|
||||
|
||||
@@ -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
@@ -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 ;
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user