52b0802dfb
- piccola correzione.
256 lines
9.1 KiB
C++
256 lines
9.1 KiB
C++
//----------------------------------------------------------------------------
|
|
// 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<IGeomDB> 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<IGeoObj*> 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<IGeomDB> 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<std::vector<IGeoObj*>> vvpGObj, std::vector<Color> 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<IGeomDB> 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<IGeomDB> 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<IGeoObj*>( CloneSurfFlatRegion( pSfrA))) ;
|
|
if ( nIdSfrA == GDB_ID_NULL)
|
|
return false ;
|
|
pGeomDB->SetMaterial( nIdSfrA, cColA) ;
|
|
int nIdSfrB = pGeomDB->AddGeoObj( GDB_ID_NULL, nLayId, static_cast<IGeoObj*>( 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<std::vector<IGeoObj*>> vvpGObj, std::vector<std::vector<Color>> 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<IGeomDB> 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<IGeoObj*> vpGObj, std::vector<Color> 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<IGeomDB> 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 ;
|
|
} |