//---------------------------------------------------------------------------- // EgalTech 2017-2022 //---------------------------------------------------------------------------- // File : EGkGeoObjSave.h Data : 25.04.22 Versione : 2.4d4 // Contenuto : Funzione per salvare su file un Oggetto Geometrico. // // // // Modifiche : 30.10.17 DS Creazione modulo. // 25.04.22 DS Aggiunti controlli. // //---------------------------------------------------------------------------- #pragma once #include "/EgtDev/Include/EGkGeomDB.h" #include "/EgtDev/Include/EgtPointerOwner.h" //---------------------------------------------------------------------------- bool SaveGeoObj( IGeoObj* pGObj, const std::string& sFile, int nFlag = GDB_SV_BIN) { // verifico validità oggetto if ( pGObj == nullptr || ! pGObj->IsValid()) return false ; // creo GeomDB temporaneo PtrOwner pGeomDB( CreateGeomDB()) ; if ( IsNull( pGeomDB)) return false ; // inserisco l'oggetto nel GeomDB (sotto pezzo/layer) int nPartId = pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, Frame3d()) ; int nLayId = pGeomDB->AddGroup( GDB_ID_NULL, nPartId, Frame3d()) ; int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, pGObj) ; if ( nId == GDB_ID_NULL) return false ; // eseguo il salvataggio bool bOk = pGeomDB->Save( nId, sFile, nFlag) ; // rimuovo l'oggetto dal GeomDB bOk = ( pGeomDB->RemoveGeoObjAndErase( nId) != nullptr) && bOk ; return bOk ; } //---------------------------------------------------------------------------- bool SaveGeoObj( std::vector vpGObj, const std::string& sFile, int nFlag = GDB_SV_BIN) { for ( int i = 0 ; i < int( vpGObj.size()); ++i) { // verifico validità oggetto if ( vpGObj[i] == nullptr || ! vpGObj[i]->IsValid() ) return false ; } // creo GeomDB temporaneo PtrOwner pGeomDB( CreateGeomDB()) ; if ( IsNull( pGeomDB)) return false ; INTVECTOR vIds ; int nLayId = 0 ; for ( int i = 0 ; i < int( vpGObj.size()); ++i) { // inserisco l'oggetto nel GeomDB (sotto pezzo/layer) if ( i == 0) { int nPartId = pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, Frame3d()) ; nLayId = pGeomDB->AddGroup( GDB_ID_NULL, nPartId, Frame3d()) ; } int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, vpGObj[i]) ; vIds.push_back( nId) ; if ( nId == GDB_ID_NULL) return false ; } // eseguo il salvataggio bool bOk = pGeomDB->Save( vIds, sFile, nFlag) ; // rimuovo l'oggetto dal GeomDB for ( int i = 0 ; i < int( vIds.size()); ++i) bOk = ( pGeomDB->RemoveGeoObjAndErase( vIds[i]) != nullptr ) && bOk ; return bOk ; } //---------------------------------------------------------------------------- bool SaveGeoObj( std::vector> vvpGObj, std::vector vCol, const std::string& sFile, int nFlag = GDB_SV_BIN) { // verifico validità oggetti for ( int i = 0 ; i < int( vvpGObj.size()) ; ++ i) { for ( int j = 0 ; j < int( vvpGObj[i].size()) ; ++ j) { if ( vvpGObj[i][j] == nullptr || ! vvpGObj[i][j]->IsValid()) return false ; } } if ( int( vCol.size()) <= int( vvpGObj.size())) { for ( int i = int( vCol.size()) ; i < int( vvpGObj.size()) ; ++ i) vCol.push_back( BLACK) ; } else return false ; // creo GeomDB temporaneo PtrOwner pGeomDB( CreateGeomDB()) ; if ( IsNull( pGeomDB)) return false ; INTVECTOR vIds ; int nLayId = 0 ; // creo il part int nPartId = pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, Frame3d()) ; // per ogni elemento i-esimo, creo un layer for ( int i = 0 ; i < int( vvpGObj.size()) ; ++i) { // creo il layer nLayId = pGeomDB->AddGroup( GDB_ID_NULL, nPartId, Frame3d()) ; pGeomDB->SetMaterial( nLayId, vCol[i]) ; for ( int j = 0 ; j < int( vvpGObj.size()) ; ++ j) { // inserisco gli oggetti corrispondenti int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, vvpGObj[i][j]) ; vIds.push_back( nId) ; if ( nId == GDB_ID_NULL) return false ; } } // eseguo il salvataggio bool bOk = pGeomDB->Save( vIds, sFile, nFlag) ; // rimuovo l'oggetto dal GeomDB for ( int i = 0 ; i < int( vIds.size()) ; ++i) bOk = ( pGeomDB->RemoveGeoObjAndErase( vIds[i]) != nullptr) && bOk ; return bOk ; } //---------------------------------------------------------------------------- bool SaveCurveCompo( ICRVCOMPOPOVECTOR& vCompo, bool bUniform, const std::string& sFile, int nFlag = GDB_SV_BIN) { // controllo validità delle curve std::vector vpGObj ; for ( int i = 0 ; i < int( vCompo.size()) ; ++ i) { if ( vCompo[i] == nullptr || ! vCompo[i]->IsValid()) return false ; vpGObj.emplace_back( static_cast( vCompo[i]->Clone())) ; } // creo GeomDB temporaneo PtrOwner pGeomDB( CreateGeomDB()) ; if ( IsNull( pGeomDB)) return false ; INTVECTOR vIds ; // se curve con colore uniforme if ( bUniform) return SaveGeoObj( vpGObj, sFile, nFlag) ; // altrimenti scorro le sottocurve e le coloro in base alle temp prop int nPartId = pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, Frame3d()) ; int nLayId = 0 ; for ( int i = 0 ; i < int( vCompo.size()) ; ++i) { // inserisco l'oggetto nel GeomDB (sotto pezzo/layer) nLayId = pGeomDB->AddGroup( GDB_ID_NULL, nPartId, Frame3d()) ; for ( int u = 0 ; u < vCompo[i]->GetCurveCount() ; ++ u) { const ICurve* pCrv = vCompo[i]->GetCurve( u) ; if ( pCrv == nullptr) return false ; int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, pCrv->Clone()) ; pGeomDB->SetMaterial( nId, ( pCrv->GetTempProp( 0) == 1 ? RED : ( pCrv->GetTempProp( 0)) == 0 ? BLUE : WHITE)) ; vIds.push_back( nId) ; if ( nId == GDB_ID_NULL) return false ; } } // eseguo il salvataggio bool bOk = pGeomDB->Save( vIds, sFile, nFlag) ; // rimuovo l'oggetto dal GeomDB for ( int i = 0 ; i < int( vIds.size()); ++i) bOk = ( pGeomDB->RemoveGeoObjAndErase( vIds[i]) != nullptr) && bOk ; return bOk ; }