EgtGeomKernel 1.6d8 :
- possibilità di salvare solo un gruppo o una entità del progetto.
This commit is contained in:
+73
-32
@@ -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à
|
||||
|
||||
Reference in New Issue
Block a user