diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 3ae2c73..0131236 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/GdbExecutor.cpp b/GdbExecutor.cpp index 94a85d7..f882267 100644 --- a/GdbExecutor.cpp +++ b/GdbExecutor.cpp @@ -5248,7 +5248,7 @@ GdbExecutor::ExecuteSave( const string& sCmd2, const STRVECTOR& vsParams) nFlag = GDB_SV_BIN ; } // esecuzione salvataggio - return m_pGDB->Save( sFile, nFlag) ; + return m_pGDB->Save( GDB_ID_ROOT, sFile, nFlag) ; } //---------------------------------------------------------------------------- diff --git a/GdbGeo.cpp b/GdbGeo.cpp index 341f0d8..96ee91a 100644 --- a/GdbGeo.cpp +++ b/GdbGeo.cpp @@ -74,7 +74,7 @@ GdbGeo::Clone( int nId) const //---------------------------------------------------------------------------- GeoObjType -GdbGeo::GetType( void) const +GdbGeo::GetGeoType( void) const { // non esiste l'oggetto geometrico if ( m_pGeoObj == nullptr) diff --git a/GdbGeo.h b/GdbGeo.h index 801d80e..df6be2e 100644 --- a/GdbGeo.h +++ b/GdbGeo.h @@ -25,6 +25,8 @@ class GdbGeo : public GdbObj public : virtual ~GdbGeo( void) ; virtual GdbGeo* Clone( int nId) const ; + virtual GdbType GetGdbType( void) const + { return GDB_TY_GEO ; } 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 ; @@ -44,7 +46,7 @@ class GdbGeo : public GdbObj public : GdbGeo( void) ; - GeoObjType GetType( void) const ; + GeoObjType GetGeoType( void) const ; public : IGeoObj* m_pGeoObj ; diff --git a/GdbGroup.cpp b/GdbGroup.cpp index 225b8b6..f79e7db 100644 --- a/GdbGroup.cpp +++ b/GdbGroup.cpp @@ -133,6 +133,13 @@ GdbGroup::Clone( int nId) const //---------------------------------------------------------------------------- bool GdbGroup::Save( NgeWriter& ngeOut) const +{ + return ( SaveEmpty( ngeOut) && SaveChildren( ngeOut)) ; +} + +//---------------------------------------------------------------------------- +bool +GdbGroup::SaveEmpty( NgeWriter& ngeOut) const { // tipo entità e identificativi if ( ! ngeOut.WriteKey( NGE_A_GRP)) @@ -156,14 +163,26 @@ GdbGroup::Save( NgeWriter& ngeOut) const if ( ! ngeOut.WriteFrame( m_frF, ";", true)) return false ; - // salvataggio dei figli + return true ; +} + +//---------------------------------------------------------------------------- +bool +GdbGroup::SaveChildren( NgeWriter& ngeOut) const +{ + // ciclo sui figli const GdbObj* pGdbObj = GetFirstObj() ; while ( pGdbObj != nullptr) { - if ( ! pGdbObj->Save( ngeOut)) - return false ; + // recupero il livello dell'oggetto + int nLevel = GDB_LV_USER ; + pGdbObj->GetLevel( nLevel) ; + // se non temporaneo, lo salvo + if ( nLevel != GDB_LV_TEMP) { + if ( ! pGdbObj->Save( ngeOut)) + return false ; + } pGdbObj = pGdbObj->GetNext() ; } - return true ; } diff --git a/GdbGroup.h b/GdbGroup.h index 8c498ec..7a7e335 100644 --- a/GdbGroup.h +++ b/GdbGroup.h @@ -26,6 +26,8 @@ class GdbGroup : public GdbObj public : virtual ~GdbGroup( void) ; virtual GdbGroup* Clone( int nId) const ; + virtual GdbType GetGdbType( void) const + { return GDB_TY_GROUP ; } 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 ; @@ -50,6 +52,8 @@ class GdbGroup : public GdbObj public : GdbGroup( void) ; + bool SaveEmpty( NgeWriter& ngeOut) const ; + bool SaveChildren( NgeWriter& ngeOut) const ; bool Clear( void) ; void ObjCountInc( void) { ++ m_nObjCount ; } diff --git a/GdbIterator.cpp b/GdbIterator.cpp index 1b54c13..ce238bd 100644 --- a/GdbIterator.cpp +++ b/GdbIterator.cpp @@ -646,16 +646,7 @@ GdbIterator::GetGdbType( void) const { if ( m_pGDB == nullptr || m_pCurrObj == nullptr) return GDB_TY_NONE ; - - // se oggetto geometrico - if ( GetGdbGeo( m_pCurrObj) != nullptr) - return GDB_TY_GEO ; - // se gruppo - else if ( GetGdbGroup( m_pCurrObj) != nullptr) - return GDB_TY_GROUP ; - // altro - else - return GDB_TY_NONE ; + return m_pCurrObj->GetGdbType() ; } //---------------------------------------------------------------------------- @@ -665,7 +656,7 @@ GdbIterator::GetGeoType( void) const if ( m_pGDB == nullptr || m_pCurrObj == nullptr) return GEO_NONE ; if ( GetGdbGeo( m_pCurrObj) != nullptr) - return GetGdbGeo( m_pCurrObj)->GetType() ; + return GetGdbGeo( m_pCurrObj)->GetGeoType() ; else return GEO_NONE ; } diff --git a/GdbObj.h b/GdbObj.h index f562270..6f52a03 100644 --- a/GdbObj.h +++ b/GdbObj.h @@ -34,6 +34,7 @@ class GdbObj public : virtual ~GdbObj( void) ; virtual GdbObj* Clone( int nId) const = 0 ; + virtual GdbType GetGdbType( void) 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 ; @@ -115,6 +116,8 @@ class GdbObj public : void SetGeomDB( GeomDB* pGDB) { m_pGDB = pGDB ; } + GeomDB* GetGeomDB( void) const + { return m_pGDB ; } GdbObj* GetNext( void) { return m_pNext ; } const GdbObj* GetNext( void) const diff --git a/GeomDB.cpp b/GeomDB.cpp index d148010..49f7cb3 100644 --- a/GeomDB.cpp +++ b/GeomDB.cpp @@ -27,6 +27,7 @@ #include "/EgtDev/Include/SELkKeyProc.h" #include "/EgtDev/Include/EgtKeyCodes.h" #include +#include using namespace std ; @@ -258,7 +259,7 @@ GeomDB::LoadOneObj( NgeReader& ngeIn, int nGroupId, int nBaseGdbId, const INTVEC //---------------------------------------------------------------------------- bool -GeomDB::Save( const string& sFileOut, int nFlag) const +GeomDB::Save( int nId, const string& sFileOut, int nFlag) const { // verifico la chiave e le opzioni unsigned int nOpt1, nOpt2 ; @@ -284,37 +285,86 @@ GeomDB::Save( const string& sFileOut, int nFlag) const } // intestazione - bool bOk = SaveHeader( ngeOut) ; + if ( ! SaveHeader( ngeOut)) + return false ; // materiali custom if ( ! m_MatManager.Save( ngeOut)) - bOk = false ; + return false ; - // ciclo di scrittura degli oggetti - const GdbObj* pGdbObj = m_GrpRadix.GetFirstObj() ; - while ( pGdbObj != nullptr) { - // recupero il livello dell'oggetto - int nLevel = GDB_LV_USER ; - pGdbObj->GetLevel( nLevel) ; - // se non temporaneo - if ( nLevel != GDB_LV_TEMP) { - // salvo l'oggetto - if ( ! pGdbObj->Save( ngeOut)) - bOk = false ; + // recupero l'oggetto + const GdbObj* pGdbObj = GetGdbObj( nId) ; + + // se oggetto geometrico + if ( pGdbObj != nullptr && pGdbObj->GetGdbType() == GDB_TY_GEO) { + // recupero l'oggetto geometrico + const GdbGeo* pGdbGeo = ::GetGdbGeo( pGdbObj) ; + // se non è temporaneo lo salvo insieme con la sua gerarchia + int nGrpLevel = pGdbGeo->GetCalcLevel( nGrpLevel) ; + if ( nGrpLevel != GDB_LV_TEMP) { + // recupero il padre + const GdbGroup* pGdbGroup = pGdbObj->GetParent() ; + // salvo il padre dopo la sua gerarchia e poi l'oggetto + if ( ! SaveGroupHierarchy( pGdbGroup, ngeOut) || + ! pGdbObj->Save( ngeOut)) + return false ; + } + } + + // se altrimenti gruppo + else if ( pGdbObj != nullptr && pGdbObj->GetGdbType() == GDB_TY_GROUP) { + // recupero il gruppo + const GdbGroup* pGdbGroup = ::GetGdbGroup( pGdbObj) ; + // se non è il gruppo radice + if ( pGdbGroup != &m_GrpRadix) { + // se non è temporaneo lo salvo insieme con la sua gerarchia + int nGrpLevel = pGdbGroup->GetCalcLevel( nGrpLevel) ; + if ( nGrpLevel != GDB_LV_TEMP) { + if ( ! SaveGroupHierarchy( pGdbGroup, ngeOut)) + return false ; + } + // altrimenti dichiaro gruppo da saltare + else + pGdbGroup = nullptr ; + } + // ciclo di scrittura degli oggetti del gruppo + if ( pGdbGroup != nullptr) { + if ( ! pGdbGroup->SaveChildren(ngeOut)) + return false ; } - // passo al successivo - pGdbObj = pGdbObj->GetNext() ; } // terminazione if ( ! SaveFooter( ngeOut)) - bOk = false ; + return false ; // chiusura file - if ( ! ngeOut.Close()) - bOk = false ; + return ngeOut.Close() ; +} - return bOk ; +//---------------------------------------------------------------------------- +bool +GeomDB::SaveGroupHierarchy( const GdbGroup* pGdbGroup, NgeWriter& ngeOut) const +{ + // costruisco la gerarchia del gruppo + typedef stack PGGSTACK ; + PGGSTACK GrpStack ; + try { + while ( pGdbGroup != nullptr && pGdbGroup != &m_GrpRadix) { + GrpStack.push( pGdbGroup) ; + pGdbGroup = pGdbGroup->GetParent() ; + } + } + catch ( ...) { + return false ; + } + // salvo la gerarchia del gruppo + while ( ! GrpStack.empty()) { + if ( ! GrpStack.top()->SaveEmpty( ngeOut)) + return false ; + GrpStack.pop() ; + } + return true ; } //---------------------------------------------------------------------------- @@ -764,16 +814,7 @@ GeomDB::GetGdbType( int nId) const const GdbObj* pGdbObj = GetGdbObj( nId) ; if ( pGdbObj == nullptr) return GDB_TY_NONE ; - - // se oggetto geometrico - if ( ::GetGdbGeo( pGdbObj) != nullptr) - return GDB_TY_GEO ; - // se gruppo - else if ( ::GetGdbGroup( pGdbObj) != nullptr) - return GDB_TY_GROUP ; - // altro - else - return GDB_TY_NONE ; + return pGdbObj->GetGdbType() ; } //---------------------------------------------------------------------------- @@ -786,7 +827,7 @@ GeomDB::GetGeoType( int nId) const return GEO_NONE ; // se oggetto geometrico if ( ::GetGdbGeo( pGdbObj) != nullptr) - return ::GetGdbGeo( pGdbObj)->GetType() ; + return ::GetGdbGeo( pGdbObj)->GetGeoType() ; else return GEO_NONE ; } @@ -1585,7 +1626,7 @@ GeomDB::SelectGroupObjs( int nId, int nFilter, bool bOnlyIfVisible) continue ; // altrimenti richiesti solo oggetti geometrici di un particolare tipo GdbGeo* pGObj = ::GetGdbGeo( pGdbObj) ; - if ( pGObj == nullptr || pGObj->GetType() != nFilter) + if ( pGObj == nullptr || pGObj->GetGeoType() != nFilter) continue ; } // se richiesta verifica visibilità diff --git a/GeomDB.h b/GeomDB.h index f40968f..82e64d2 100644 --- a/GeomDB.h +++ b/GeomDB.h @@ -35,7 +35,7 @@ class GeomDB : public IGeomDB virtual bool Init( void) ; virtual bool Clear( void) ; virtual bool Load( const std::string& sFileIn, int nGroupId = GDB_ID_ROOT) ; - virtual bool Save( const std::string& sFileOut, int nFlag = GDB_SV_BIN) const ; + virtual bool Save( int nId, const std::string& sFileOut, int nFlag = GDB_SV_BIN) const ; virtual bool ExistsObj( int nId) const ; virtual int AddGroup( int nId, int nParentId, const Frame3d& frFrame) ; virtual int InsertGroup( int nId, int nRefId, int nSonBeforeAfter, const Frame3d& frFrame) ; @@ -213,6 +213,7 @@ class GeomDB : public IGeomDB bool EmptyGroup( GdbObj* pGdbObj) ; bool LoadHeader( NgeReader& ngeIn, bool bSave) ; bool LoadOneObj( NgeReader& ngeIn, int nGroupId, int nBaseGdbId, const INTVECTOR& vBaseMatId, bool& bEnd) ; + bool SaveGroupHierarchy( const GdbGroup* pGdbGroup, NgeWriter& ngeOut) const ; bool SaveHeader( NgeWriter& ngeOut) const ; bool SaveFooter( NgeWriter& ngeOut) const ; bool SetStatus( GdbObj* pGdbObj, int nStat) ;