//---------------------------------------------------------------------------- // 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" #include "/EgtDev/Include/EGkSurfFlatRegion.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[i].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 SaveSfrBooleans( const ISurfFlatRegion* pSfrA, const ISurfFlatRegion* pSfrB, const std::string& sFile, int nFlag = GDB_SV_BIN, Color cColA = Color( 0., .5, .75, .5), Color cColB = Color( 0., .5, 0., .5)) { // verifico validità superfici if ( pSfrA == nullptr || ! pSfrA->IsValid() || pSfrB == nullptr || ! pSfrB->IsValid()) return false ; // creo GeomDB temporaneo PtrOwner pGeomDB( CreateGeomDB()) ; if ( IsNull( pGeomDB)) return false ; // inserisco le superfici 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 nIdSfrA = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, static_cast( CloneSurfFlatRegion( pSfrA))) ; if ( nIdSfrA == GDB_ID_NULL) return false ; pGeomDB->SetMaterial( nIdSfrA, cColA) ; int nIdSfrB = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, static_cast( CloneSurfFlatRegion( pSfrB))) ; if ( nIdSfrB == GDB_ID_NULL) return false ; pGeomDB->SetMaterial( nIdSfrB, cColB) ; // vettor di indici aggiunti INTVECTOR vIds = { nIdSfrA, nIdSfrB} ; // 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> vvCol, 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 ; } } // creo GeomDB temporaneo PtrOwner pGeomDB( CreateGeomDB()) ; if ( IsNull( pGeomDB)) return false ; INTVECTOR vIds ; // 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 int nLayId = pGeomDB->AddGroup( GDB_ID_NULL, nPartId, Frame3d()) ; for ( int j = 0 ; j < int( vvpGObj[i].size()) ; ++ j ) { // inserisco gli oggetti corrispondenti int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, vvpGObj[i][j]) ; if ( nId == GDB_ID_NULL) return false ; // setto il colore ( se definito) if ( i < int( vvCol.size()) && j < int( vvCol[i].size())) pGeomDB->SetMaterial( nId, vvCol[i][j]) ; vIds.push_back( nId) ; } } // 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 vpGObj, std::vector vCol, const std::string& sFile, int nFlag = GDB_SV_BIN) { // verifico validità oggetti if ( int( vpGObj.size()) != int( vCol.size())) return false ; // creo GeomDB temporaneo PtrOwner pGeomDB( CreateGeomDB()) ; if ( IsNull( pGeomDB)) return false ; INTVECTOR vIds ; // creo il part int nPartId = pGeomDB->AddGroup( GDB_ID_NULL, GDB_ID_ROOT, Frame3d()) ; // creo il layer int nLayId = pGeomDB->AddGroup( GDB_ID_NULL, nPartId, Frame3d()) ; // scorro gli elementi da visualizzare for ( int i = 0 ; i < int( vpGObj.size()) ; ++ i) { if ( vpGObj[i] == nullptr || ! vpGObj[i]->IsValid()) continue ; // inserisco gli oggetti corrispondenti int nId = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, vpGObj[i]) ; if ( nId == GDB_ID_NULL) return false ; // setto il colore pGeomDB->SetMaterial( nId, vCol[i]) ; // aggiungo l'Id ottenuto vIds.push_back( nId) ; } // 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 ; }