EgtGeomKernel 2.2k5 :
- aggiunta funzione GeomDB::Save con vettore di ID da salvare (come parenti devono avere in comune solo la radice).
This commit is contained in:
+111
@@ -29,6 +29,7 @@
|
||||
#include "/EgtDev/Include/EgtKeyCodes.h"
|
||||
#include <new>
|
||||
#include <stack>
|
||||
#include <unordered_set>
|
||||
|
||||
using namespace std ;
|
||||
|
||||
@@ -365,6 +366,116 @@ GeomDB::Save( int nId, const string& sFileOut, int nFlag) const
|
||||
return ngeOut.Close() ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GeomDB::Save( const INTVECTOR& vId, const string& sFileOut, int nFlag) const
|
||||
{
|
||||
// verifico la chiave e le opzioni
|
||||
unsigned int nOpt1, nOpt2 ;
|
||||
int nOptExpDays ;
|
||||
int nRet = GetKeyOptions( GetEGkKey(), KEY_BASELIB_PROD, KEY_BASELIB_VER, KEY_BASELIB_LEV,
|
||||
nOpt1, nOpt2, nOptExpDays) ;
|
||||
if ( nRet != KEY_OK) {
|
||||
string sErr = "Error on Key (GKS/" + ToString( nRet) + ")" ;
|
||||
LOG_ERROR( GetEGkLogger(), sErr.c_str()) ;
|
||||
return false ;
|
||||
}
|
||||
if ( (nOpt1 & KEYOPT_EGK_SAVE) == 0 || nOptExpDays < GetCurrDay()) {
|
||||
string sErr = "Error on Key (GKS/OPT)" ;
|
||||
LOG_ERROR( GetEGkLogger(), sErr.c_str()) ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
// Verifico che i diversi oggetti da esportare non abbiano parenti in comune tranne la radice
|
||||
unordered_set<int> usParentId ;
|
||||
for ( const auto nId : vId) {
|
||||
// recupero l'oggetto
|
||||
const GdbObj* pGO = GetGdbObj( nId) ;
|
||||
if ( pGO != nullptr) {
|
||||
if ( ! usParentId.insert( pGO->m_nId).second)
|
||||
return false ;
|
||||
// risalgo alla radice
|
||||
const GdbObj* pParent = pGO->GetParent() ;
|
||||
while ( pParent != nullptr) {
|
||||
if ( pParent->m_nId != GDB_ID_ROOT && ! usParentId.insert( pParent->m_nId).second)
|
||||
return false ;
|
||||
pParent = pParent->GetParent() ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// assegno Id base (nessuna riduzione degli Id)
|
||||
int nBaseId = GDB_ID_ROOT ;
|
||||
|
||||
// apertura file
|
||||
NgeWriter ngeOut ;
|
||||
if ( ! ngeOut.Init( sFileOut, nFlag)) {
|
||||
LOG_ERROR( GetEGkLogger(), "GeomDbSave : Error on Init ")
|
||||
return false ;
|
||||
}
|
||||
|
||||
// intestazione
|
||||
if ( ! SaveHeader( ngeOut))
|
||||
return false ;
|
||||
|
||||
// materiali custom
|
||||
if ( ! m_MatManager.Save( ngeOut))
|
||||
return false ;
|
||||
|
||||
// ciclo sugli oggetti da esportare
|
||||
for ( const auto nId : vId) {
|
||||
|
||||
// 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 ;
|
||||
if ( pGdbGeo->GetCalcLevel( nGrpLevel) && 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, nBaseId, ngeOut) ||
|
||||
! pGdbObj->Save( nBaseId, 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 ;
|
||||
if ( pGdbGroup->GetCalcLevel( nGrpLevel) && nGrpLevel != GDB_LV_TEMP) {
|
||||
if ( ! SaveGroupHierarchy( pGdbGroup, nBaseId, ngeOut))
|
||||
return false ;
|
||||
}
|
||||
// altrimenti dichiaro gruppo da saltare
|
||||
else
|
||||
pGdbGroup = nullptr ;
|
||||
}
|
||||
// ciclo di scrittura degli oggetti del gruppo
|
||||
if ( pGdbGroup != nullptr) {
|
||||
if ( ! pGdbGroup->SaveChildren( nBaseId, ngeOut))
|
||||
return false ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// terminazione
|
||||
if ( ! SaveFooter( ngeOut))
|
||||
return false ;
|
||||
|
||||
// chiusura file
|
||||
return ngeOut.Close() ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
GeomDB::SaveGroupHierarchy( const GdbGroup* pGdbGroup, int nBaseId, NgeWriter& ngeOut) const
|
||||
|
||||
Reference in New Issue
Block a user