diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index e39fb9e..42bbfb4 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/GeomDB.cpp b/GeomDB.cpp index b1dd084..1405659 100644 --- a/GeomDB.cpp +++ b/GeomDB.cpp @@ -29,6 +29,7 @@ #include "/EgtDev/Include/EgtKeyCodes.h" #include #include +#include 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 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 diff --git a/GeomDB.h b/GeomDB.h index d604144..206e49e 100644 --- a/GeomDB.h +++ b/GeomDB.h @@ -36,6 +36,7 @@ class GeomDB : public IGeomDB bool Clear( void) override ; bool Load( const std::string& sFileIn, int nGroupId = GDB_ID_ROOT) override ; bool Save( int nId, const std::string& sFileOut, int nFlag = GDB_SV_BIN) const override ; + bool Save( const INTVECTOR& vId, const std::string& sFileOut, int nFlag = GDB_SV_BIN) const override ; bool ExistsObj( int nId) const override ; int AddGroup( int nId, int nParentId, const Frame3d& frFrame) override ; int InsertGroup( int nId, int nRefId, int nSonBeforeAfter, const Frame3d& frFrame) override ;