diff --git a/EGkGeoObjSave.h b/EGkGeoObjSave.h index 7f2b170..c6ca6fd 100644 --- a/EGkGeoObjSave.h +++ b/EGkGeoObjSave.h @@ -21,7 +21,7 @@ bool SaveGeoObj( IGeoObj* pGObj, const std::string& sFile, int nFlag = GDB_SV_BIN) { - // verifico validità oggetto + // verifico validità oggetto if ( pGObj == nullptr || ! pGObj->IsValid()) return false ; // creo GeomDB temporaneo @@ -47,7 +47,7 @@ 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 + // verifico validità oggetto if ( vpGObj[i] == nullptr || ! vpGObj[i]->IsValid() ) return false ; } @@ -75,4 +75,106 @@ SaveGeoObj( std::vector vpGObj, const std::string& sFile, int nFlag = 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 ; + } \ No newline at end of file