EgtGeomKernel 1.6d8 :

- possibilità di salvare solo un gruppo o una entità del progetto.
This commit is contained in:
Dario Sassi
2015-04-30 20:41:23 +00:00
parent 21b34288bd
commit d446b03086
10 changed files with 112 additions and 51 deletions
+73 -32
View File
@@ -27,6 +27,7 @@
#include "/EgtDev/Include/SELkKeyProc.h"
#include "/EgtDev/Include/EgtKeyCodes.h"
#include <new>
#include <stack>
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<const GdbGroup*> 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à