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:
Dario Sassi
2020-11-30 08:31:39 +00:00
parent f0a1df86cc
commit 6c635dc9e4
3 changed files with 112 additions and 0 deletions
+111
View File
@@ -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