diff --git a/Attribs.cpp b/Attribs.cpp index 898605f..b77cb4a 100644 --- a/Attribs.cpp +++ b/Attribs.cpp @@ -95,26 +95,36 @@ bool Attribs::Save( NgeWriter& ngeOut) const { // flag presenza attributi - ngeOut.WriteKey( NGE_A) ; + if ( ! ngeOut.WriteKey( NGE_A)) + return false ; // livello - ngeOut.WriteUchar( m_Data[LEVEL], ",") ; + if ( ! ngeOut.WriteUchar( m_Data[LEVEL], ",")) + return false ; // modo - ngeOut.WriteUchar( m_Data[MODE], ",") ; + if ( ! ngeOut.WriteUchar( m_Data[MODE], ",")) + return false ; // stato (se SEL è convertito in ON) int nStat = (( m_Data[STATUS] > GDB_ST_ON) ? GDB_ST_ON : m_Data[STATUS]) ; - ngeOut.WriteUchar( nStat, ",") ; + if ( ! ngeOut.WriteUchar( nStat, ",")) + return false ; // marcatura (sempre OFF) - ngeOut.WriteUchar( GDB_MK_OFF, ";") ; + if ( ! ngeOut.WriteUchar( GDB_MK_OFF, ";")) + return false ; // materiale - ngeOut.WriteInt( m_Material, ";") ; + if ( ! ngeOut.WriteInt( m_Material, ";")) + return false ; // colore - ngeOut.WriteCol( m_Color, ";") ; + if ( ! ngeOut.WriteCol( m_Color, ";")) + return false ; // numero di stringhe di info (nelle linee successive) - ngeOut.WriteInt( int( m_slInfo.size()), ";", true) ; + if ( ! ngeOut.WriteInt( int( m_slInfo.size()), ";", true)) + return false ; // stringhe di info STRLIST::const_iterator iIter ; - for ( iIter = m_slInfo.begin() ; iIter != m_slInfo.end() ; ++ iIter) - ngeOut.WriteString( *iIter, nullptr, true) ; + for ( iIter = m_slInfo.begin() ; iIter != m_slInfo.end() ; ++ iIter) { + if ( ! ngeOut.WriteString( *iIter, nullptr, true)) + return false ; + } return true ; } diff --git a/CurveArc.cpp b/CurveArc.cpp index 48f9282..e58d17a 100644 --- a/CurveArc.cpp +++ b/CurveArc.cpp @@ -487,17 +487,23 @@ bool CurveArc::Save( NgeWriter& ngeOut) const { // centro - ngeOut.WritePoint( m_PtCen, ";") ; + if ( ! ngeOut.WritePoint( m_PtCen, ";")) + return false ; // versore Normale - ngeOut.WriteVector( m_VtN, ";") ; + if ( ! ngeOut.WriteVector( m_VtN, ";")) + return false ; // raggio - ngeOut.WriteDouble( m_dRad, ";") ; + if ( ! ngeOut.WriteDouble( m_dRad, ";")) + return false ; // versore Iniziale - ngeOut.WriteVector( m_VtS, ";") ; + if ( ! ngeOut.WriteVector( m_VtS, ";")) + return false ; // angolo al centro - ngeOut.WriteDouble( m_dAngCenDeg, ";") ; + if ( ! ngeOut.WriteDouble( m_dAngCenDeg, ";")) + return false ; // deltaN - ngeOut.WriteDouble( m_dDeltaN, ";", true) ; + if ( ! ngeOut.WriteDouble( m_dDeltaN, ";", true)) + return false ; return true ; } diff --git a/CurveBezier.cpp b/CurveBezier.cpp index 5644ade..74f9148 100644 --- a/CurveBezier.cpp +++ b/CurveBezier.cpp @@ -352,15 +352,21 @@ bool CurveBezier::Save( NgeWriter& ngeOut) const { // flag razionale - ngeOut.WriteBool( m_bRat, ";") ; + if ( ! ngeOut.WriteBool( m_bRat, ";")) + return false ; // grado - ngeOut.WriteInt( m_nDeg, ";", true) ; + if ( ! ngeOut.WriteInt( m_nDeg, ";", true)) + return false ; // ciclo sui punti di controllo ( con pesi se razionale) for ( int i = 0 ; i <= m_nDeg ; ++ i) { - if ( ! m_bRat) - ngeOut.WritePoint( m_aPtCtrl[i], ";", true) ; - else - ngeOut.WritePointW( m_aPtCtrl[i], m_aWeCtrl[i], ";", true) ; + if ( ! m_bRat) { + if ( ! ngeOut.WritePoint( m_aPtCtrl[i], ";", true)) + return false ; + } + else { + if ( ! ngeOut.WritePointW( m_aPtCtrl[i], m_aWeCtrl[i], ";", true)) + return false ; + } } return true ; diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 2a6189e..11a3314 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -411,7 +411,8 @@ bool CurveComposite::Save( NgeWriter& ngeOut) const { // numero di curve - ngeOut.WriteInt( m_nCounter, nullptr, true) ; + if ( ! ngeOut.WriteInt( m_nCounter, nullptr, true)) + return false ; // ciclo sulle curve componenti int i = 0 ; const ICurve* pCrvSmpl = GetFirstCurve() ; @@ -421,10 +422,12 @@ CurveComposite::Save( NgeWriter& ngeOut) const if ( pCSmplRW == nullptr) return false ; // emetto tipo della curva semplice - ngeOut.WriteKey( pCSmplRW->GetNgeId()) ; + if ( ! ngeOut.WriteKey( pCSmplRW->GetNgeId())) + return false ; // assegno ed emetto nome della curva semplice string sCrvName = "#" + ToString( ++i) ; - ngeOut.WriteString( sCrvName, nullptr, true) ; + if ( ! ngeOut.WriteString( sCrvName, nullptr, true)) + return false ; // salvataggio della curva semplice if ( ! pCSmplRW->Save( ngeOut)) return false ; diff --git a/CurveLine.cpp b/CurveLine.cpp index 3cecb6c..019c056 100644 --- a/CurveLine.cpp +++ b/CurveLine.cpp @@ -165,8 +165,10 @@ bool CurveLine::Save( NgeWriter& ngeOut) const { // parametri : punti iniziale e finale - ngeOut.WritePoint( m_PtStart, ";") ; - ngeOut.WritePoint( m_PtEnd, ";", true) ; + if ( ! ngeOut.WritePoint( m_PtStart, ";")) + return false ; + if ( ! ngeOut.WritePoint( m_PtEnd, ";", true)) + return false ; return true ; } diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 73a0e96..d36b9fc 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index bae4925..a80881c 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -165,6 +165,7 @@ copy $(TargetPath) \EgtProg\Dll64 true CompileAsCpp Speed + AnySuitable Windows @@ -200,6 +201,7 @@ copy $(TargetPath) \EgtProg\Dll32 true CompileAsCpp Speed + AnySuitable Windows diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters index 338ca4c..1c40fce 100644 --- a/EgtGeomKernel.vcxproj.filters +++ b/EgtGeomKernel.vcxproj.filters @@ -34,6 +34,9 @@ {cc84f71a-b149-4187-af26-736133e92672} + + {7284f71c-3fd5-4bb9-bfe6-2c8c312985cc} + diff --git a/ExtText.cpp b/ExtText.cpp index 40d22cd..6a6b5e2 100644 --- a/ExtText.cpp +++ b/ExtText.cpp @@ -220,27 +220,38 @@ bool ExtText::Save( NgeWriter& ngeOut) const { // punto di inserimento - ngeOut.WritePoint( m_ptP, ";") ; + if ( ! ngeOut.WritePoint( m_ptP, ";")) + return false ; // flag posizione inserimento - ngeOut.WriteInt( m_nInsPos, ";") ; + if ( ! ngeOut.WriteInt( m_nInsPos, ";")) + return false ; // versore normale - ngeOut.WriteVector( m_vtN, ";") ; + if ( ! ngeOut.WriteVector( m_vtN, ";")) + return false ; // versore di direzione - ngeOut.WriteVector( m_vtD, ";", true) ; + if ( ! ngeOut.WriteVector( m_vtD, ";", true)) + return false ; // testo - ngeOut.WriteString( m_sText, nullptr, true) ; + if ( ! ngeOut.WriteString( m_sText, nullptr, true)) + return false ; // font - ngeOut.WriteString( m_sFont, ";") ; + if ( ! ngeOut.WriteString( m_sFont, ";")) + return false ; // spessore del font - ngeOut.WriteInt( m_nWeight, ",") ; + if ( ! ngeOut.WriteInt( m_nWeight, ",")) + return false ; // flag di italico - ngeOut.WriteBool( m_bItalic, ",") ; + if ( ! ngeOut.WriteBool( m_bItalic, ",")) + return false ; // altezza del font - ngeOut.WriteDouble( m_dHeight, ",") ; + if ( ! ngeOut.WriteDouble( m_dHeight, ",")) + return false ; // rapporto larghezza su altezza del font - ngeOut.WriteDouble( m_dRatio, ",") ; + if ( ! ngeOut.WriteDouble( m_dRatio, ",")) + return false ; // avanzamento addizionale tra caratteri - ngeOut.WriteDouble( m_dAddAdvance, ";", true) ; + if ( ! ngeOut.WriteDouble( m_dAddAdvance, ";", true)) + return false ; return true ; } diff --git a/GdbExecutor.cpp b/GdbExecutor.cpp index d74be6b..aebf250 100644 --- a/GdbExecutor.cpp +++ b/GdbExecutor.cpp @@ -4313,14 +4313,17 @@ GdbExecutor::ExecuteSave( const string& sCmd2, const STRVECTOR& vsParams) string sFile = vsParams[0] ; m_pParser->DirReplace( sFile) ; // il secondo parametro, opzionale, indica il formato del file - bool bBinary = false ; + int nFlag = GDB_SV_CMPTXT ; if ( vsParams.size() == 2) { - string sBinary = vsParams[1] ; - ToUpper( sBinary) ; - bBinary = ( sBinary == "B" || sBinary == "BINARY") ; + string sFlag = vsParams[1] ; + ToUpper( sFlag) ; + if ( sFlag == "T" || sFlag == "TEXT") + nFlag = GDB_SV_TXT ; + else if ( sFlag == "B" || sFlag == "BINARY") + nFlag = GDB_SV_BIN ; } // esecuzione salvataggio - return m_pGDB->Save( sFile, bBinary) ; + return m_pGDB->Save( sFile, nFlag) ; } //---------------------------------------------------------------------------- diff --git a/GdbGeo.cpp b/GdbGeo.cpp index 6c37f56..8696d9e 100644 --- a/GdbGeo.cpp +++ b/GdbGeo.cpp @@ -93,16 +93,20 @@ GdbGeo::Save( NgeWriter& ngeOut) const return false ; // tipo entità e identificativi - ngeOut.WriteKey( pGObjRW->GetNgeId()) ; - ngeOut.WriteInt( m_nId, "@") ; - ngeOut.WriteInt( GetParentId(), nullptr, true) ; + if ( ! ngeOut.WriteKey( pGObjRW->GetNgeId())) + return false ; + if ( ! ngeOut.WriteInt( m_nId, "@")) + return false ; + if ( ! ngeOut.WriteInt( GetParentId(), nullptr, true)) + return false ; // attributi if ( ! GdbObj::SaveAttribs( ngeOut)) return false ; // parametri geometrici - ngeOut.WriteKey( NGE_G) ; + if ( ! ngeOut.WriteKey( NGE_G)) + return false ; return pGObjRW->Save( ngeOut) ; } diff --git a/GdbGroup.cpp b/GdbGroup.cpp index 24c8278..c26b5d2 100644 --- a/GdbGroup.cpp +++ b/GdbGroup.cpp @@ -105,34 +105,37 @@ GdbGroup::Clone( int nId, IdManager& IdMgr) const bool GdbGroup::Save( NgeWriter& ngeOut) const { - bool bOk = true ; - // tipo entità e identificativi - ngeOut.WriteKey( NGE_A_GRP) ; - ngeOut.WriteInt( m_nId, "@") ; - ngeOut.WriteInt( GetParentId(), nullptr, true) ; + if ( ! ngeOut.WriteKey( NGE_A_GRP)) + return false ; + if ( ! ngeOut.WriteInt( m_nId, "@")) + return false ; + if ( ! ngeOut.WriteInt( GetParentId(), nullptr, true)) + return false ; // attributi if ( ! GdbObj::SaveAttribs( ngeOut)) - bOk = false ; + return false ; // dati geometrici - ngeOut.WriteKey( NGE_G) ; + if ( ! ngeOut.WriteKey( NGE_G)) + return false ; // puntatore alla prima copia (per ora NULL) - ngeOut.WriteInt( GDB_ID_NULL, nullptr, true) ; + if ( ! ngeOut.WriteInt( GDB_ID_NULL, nullptr, true)) + return false ; // frame if ( ! m_gfrFrame.Save( ngeOut)) - bOk = false ; + return false ; // salvataggio dei figli const GdbObj* pGdbObj = GetFirstObj() ; while ( pGdbObj != nullptr) { if ( ! pGdbObj->Save( ngeOut)) - bOk = false ; + return false ; pGdbObj = pGdbObj->GetNext() ; } - return bOk ; + return true ; } //---------------------------------------------------------------------------- diff --git a/GdbMaterialMgr.cpp b/GdbMaterialMgr.cpp index dd4d7d2..bbd5679 100644 --- a/GdbMaterialMgr.cpp +++ b/GdbMaterialMgr.cpp @@ -49,22 +49,31 @@ bool GdbMaterialMgr::Save( NgeWriter& ngeOut) const { // intestazione libreria - ngeOut.WriteKey( NGE_MAT_LIB) ; + if ( ! ngeOut.WriteKey( NGE_MAT_LIB)) + return false ; // numero di materiali custom int nCustNum = int( m_GdbMats.size()) - m_nStdNum ; - ngeOut.WriteInt( nCustNum, ";", true) ; + if ( ! ngeOut.WriteInt( nCustNum, ";", true)) + return false ; // scrittura dei materiali custom for ( int i = m_nStdNum ; i < int( m_GdbMats.size()) ; ++ i) { // Nome, Id, Tipo (1=materiale senza texture) string sMatName = ( m_GdbMats[i].sName.empty() ? "$$" : m_GdbMats[i].sName) ; - ngeOut.WriteString( sMatName, ",") ; - ngeOut.WriteInt( i + 1, ",") ; - ngeOut.WriteInt( 1, ";", true) ; + if ( ! ngeOut.WriteString( sMatName, ",")) + return false ; + if ( ! ngeOut.WriteInt( i + 1, ",")) + return false ; + if ( ! ngeOut.WriteInt( 1, ";", true)) + return false ; // dati del materiale - ngeOut.WriteCol( m_GdbMats[i].matM.GetAmbient(), ";") ; - ngeOut.WriteCol( m_GdbMats[i].matM.GetDiffuse(), ";") ; - ngeOut.WriteCol( m_GdbMats[i].matM.GetSpecular(), ";") ; - ngeOut.WriteDouble( m_GdbMats[i].matM.GetShininess(), ";", true, 1) ; + if ( ! ngeOut.WriteCol( m_GdbMats[i].matM.GetAmbient(), ";")) + return false ; + if ( ! ngeOut.WriteCol( m_GdbMats[i].matM.GetDiffuse(), ";")) + return false ; + if ( ! ngeOut.WriteCol( m_GdbMats[i].matM.GetSpecular(), ";")) + return false ; + if ( ! ngeOut.WriteDouble( m_GdbMats[i].matM.GetShininess(), ";", true, 1)) + return false ; } return true ; diff --git a/GeoFrame3d.cpp b/GeoFrame3d.cpp index 3735f66..379db60 100644 --- a/GeoFrame3d.cpp +++ b/GeoFrame3d.cpp @@ -153,9 +153,7 @@ GeoFrame3d::GetNgeId( void) const bool GeoFrame3d::Save( NgeWriter& ngeOut) const { - ngeOut.WriteFrame( m_frF, ";", true) ; - - return true ; + return ngeOut.WriteFrame( m_frF, ";", true) ; } //---------------------------------------------------------------------------- diff --git a/GeoPoint3d.cpp b/GeoPoint3d.cpp index 121f175..b0939ea 100644 --- a/GeoPoint3d.cpp +++ b/GeoPoint3d.cpp @@ -121,9 +121,7 @@ bool GeoPoint3d::Save( NgeWriter& ngeOut) const { // parametri : punto - ngeOut.WritePoint( m_ptP, ";", true) ; - - return true ; + return ngeOut.WritePoint( m_ptP, ";", true) ; } //---------------------------------------------------------------------------- diff --git a/GeoVector3d.cpp b/GeoVector3d.cpp index 58a8518..d6ee141 100644 --- a/GeoVector3d.cpp +++ b/GeoVector3d.cpp @@ -138,8 +138,10 @@ bool GeoVector3d::Save( NgeWriter& ngeOut) const { // parametri : vettore - ngeOut.WriteVector( m_vtV, ";") ; - ngeOut.WritePoint( m_ptBase, ";", true) ; + if ( ! ngeOut.WriteVector( m_vtV, ";")) + return false ; + if ( ! ngeOut.WritePoint( m_ptBase, ";", true)) + return false ; return true ; } diff --git a/GeomDB.cpp b/GeomDB.cpp index 850fb3a..e636afb 100644 --- a/GeomDB.cpp +++ b/GeomDB.cpp @@ -194,11 +194,11 @@ GeomDB::LoadOneObj( NgeReader& ngeIn, bool& bEnd) //---------------------------------------------------------------------------- bool -GeomDB::Save( const std::string& sFileOut, bool bBinary) const +GeomDB::Save( const std::string& sFileOut, int nFlag) const { // apertura file NgeWriter ngeOut ; - if ( ! ngeOut.Init( sFileOut, bBinary)) { + if ( ! ngeOut.Init( sFileOut, nFlag)) { LOG_ERROR( GetEGkLogger(), "GeomDbSave : Error on Init ") return false ; } @@ -242,17 +242,24 @@ bool GeomDB::SaveHeader( NgeWriter& ngeOut) const { // intestazione - ngeOut.WriteKey( NGE_START) ; - ngeOut.WriteString( NGE_GEOMDB, ",") ; - ngeOut.WriteInt( NGE_MAJOR_VER, ".") ; - ngeOut.WriteInt( NGE_MINOR_VER, ".") ; - ngeOut.WriteInt( NGE_PATCH_VER, ";", true) ; + if ( ! ngeOut.WriteKey( NGE_START)) + return false ; + if ( ! ngeOut.WriteString( NGE_GEOMDB, ",")) + return false ; + if ( ! ngeOut.WriteInt( NGE_MAJOR_VER, ".")) + return false ; + if ( ! ngeOut.WriteInt( NGE_MINOR_VER, ".")) + return false ; + if ( ! ngeOut.WriteInt( NGE_PATCH_VER, ";", true)) + return false ; // materiale di default come colore Color colDef( 0, 0, 0, 0) ; GetDefaultMaterial( colDef) ; - ngeOut.WriteKey( NGE_MAT_DEF) ; - ngeOut.WriteCol( colDef, ";", true) ; + if ( ! ngeOut.WriteKey( NGE_MAT_DEF)) + return false ; + if ( ! ngeOut.WriteCol( colDef, ";", true)) + return false ; return true ; } @@ -262,9 +269,7 @@ bool GeomDB::SaveFooter( NgeWriter& ngeOut) const { // terminazione - ngeOut.WriteKey( NGE_END) ; - - return true ; + return ngeOut.WriteKey( NGE_END) ; } //---------------------------------------------------------------------------- diff --git a/GeomDB.h b/GeomDB.h index 8401478..2c7d68f 100644 --- a/GeomDB.h +++ b/GeomDB.h @@ -32,7 +32,7 @@ class GeomDB : public IGeomDB virtual bool Init( void) ; virtual bool Clear( void) ; virtual bool Load( const std::string& sFileIn) ; - virtual bool Save( const std::string& sFileOut, bool bBinary = true) const ; + virtual bool Save( const std::string& sFileOut, int nFlag = GDB_SV_BIN) const ; virtual bool ExistsObj( int nId) const ; virtual int AddGroup( int nId, int nParentId, const Frame3d& frFrame) ; virtual int InsertGroup( int nId, int nRefId, int nSonBeforeAfter, const Frame3d& frFrame) ; diff --git a/NgeReader.cpp b/NgeReader.cpp index 1cd03b0..8c8cb20 100644 --- a/NgeReader.cpp +++ b/NgeReader.cpp @@ -73,6 +73,10 @@ NgeReader::NgeType( const std::string& sFile) // chiusura del file InFile.close() ; + // verifico se file compresso (gz) + if ( cBuff[0] == '\x1F' && cBuff[1] == '\x8B') + return NGE_ASCII ; + // verifico se iniziano con "START" string sBuff = cBuff ; size_t nPos = sBuff.find( "START") ; diff --git a/NgeWriter.cpp b/NgeWriter.cpp index 265291d..aea533c 100644 --- a/NgeWriter.cpp +++ b/NgeWriter.cpp @@ -15,246 +15,262 @@ #include "stdafx.h" #include "NgeWriter.h" #include "NgeKeyW.h" +#include "/EgtDev/Include/EGkGdbConst.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EgnStringConverter.h" +#include "/EgtDev/Extern/Zlib/Include/zlib.h" using namespace std ; +//---------------------------------------------------------------------------- +inline bool +WriteStringOutTxt( gzFile OutTxtFile, const char* szVal, const char* szSep, bool bEndL) +{ + // verifico apertura file + if ( OutTxtFile == nullptr) + return false ; + // scrivo stringa + if ( gzputs( OutTxtFile, szVal) == Z_ERRNO) + return false ; + // se fornito, scrivo separatore + if ( szSep != nullptr && szSep[0] != '\0') { + if ( gzputs( OutTxtFile, szSep) == Z_ERRNO) + return false ; + } + // se richiesto, scrivo fine linea + if ( bEndL) { + if ( gzputs( OutTxtFile, "\r\n") == Z_ERRNO) + return false ; + } + return true ; +} + //---------------------------------------------------------------------------- bool -NgeWriter::Init( const std::string& sFileOut, bool bBinary) +NgeWriter::Init( const string& sFileOut, int nFlag) { // salvo tipo file - m_bBinary = bBinary ; + m_bBinary = ( nFlag == GDB_SV_BIN) ; // apertura del file di uscita - ios_base::openmode nMode = ios::out | ( m_bBinary ? ios::binary : 0) ; - int nProt = _SH_DENYWR ; - m_OutFile.open( stringtoW( sFileOut), nMode, nProt) ; - return m_OutFile.good() ; + if ( m_bBinary) { + ios_base::openmode nMode = ios::out | ( m_bBinary ? ios::binary : 0) ; + int nProt = _SH_DENYWR ; + m_OutBinFile.open( stringtoW( sFileOut), nMode, nProt) ; + return m_OutBinFile.good() ; + } + else { + if ( nFlag == GDB_SV_TXT) + m_OutTxtFile = gzopen_w( stringtoW( sFileOut), "wbT") ; + else // GDB_SV_CMPTXT + m_OutTxtFile = gzopen_w( stringtoW( sFileOut), "wb") ; + if ( m_OutTxtFile == nullptr) + return false ; + const int DIM_BUFFER = 65536 ; + if ( gzbuffer( m_OutTxtFile, DIM_BUFFER) != Z_OK) + return false ; + const int COMPR_LEVEL = 3 ; // 0 = no compression ... 9 = max compression + if ( gzsetparams( m_OutTxtFile, COMPR_LEVEL, Z_DEFAULT_STRATEGY) != Z_OK) + return false ; + return true ; + } } //---------------------------------------------------------------------------- bool NgeWriter::Close( void) { - bool bOk = ( m_OutFile.good() && m_OutFile.is_open()) ; - - if ( m_OutFile.is_open()) - m_OutFile.close() ; - - return bOk ; + if ( m_bBinary) { + bool bOk = ( m_OutBinFile.good() && m_OutBinFile.is_open()) ; + if ( m_OutBinFile.is_open()) + m_OutBinFile.close() ; + return bOk ; + } + else { + if ( m_OutTxtFile != nullptr) { + bool bOk = ( gzclose( m_OutTxtFile) == Z_OK) ; + m_OutTxtFile = nullptr ; + return bOk ; + } + return true ; + } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WriteUchar( unsigned char ucVal, const char* szSep, bool bEndL) { - if ( ! m_OutFile.is_open()) - return ; - - if ( m_bBinary) - m_OutFile.write( (char*) &ucVal, sizeof( ucVal)) ; + if ( m_bBinary) { + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &ucVal, sizeof( ucVal)) ; + return m_OutBinFile.good() ; + } else { - m_OutFile << ToString( ucVal) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( ucVal).c_str(), szSep, bEndL) ; } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WriteBool( bool bVal, const char* szSep, bool bEndL) { - if ( ! m_OutFile.is_open()) - return ; - - if ( m_bBinary) - m_OutFile.write( (char*) &bVal, sizeof( bVal)) ; + if ( m_bBinary) { + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &bVal, sizeof( bVal)) ; + return m_OutBinFile.good() ; + } else { - m_OutFile << ToString( bVal) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( bVal).c_str(), szSep, bEndL) ; } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WriteInt( int nVal, const char* szSep, bool bEndL) { - if ( ! m_OutFile.is_open()) - return ; - - if ( m_bBinary) - m_OutFile.write( (char*) &nVal, sizeof( nVal)) ; + if ( m_bBinary) { + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &nVal, sizeof( nVal)) ; + return m_OutBinFile.good() ; + } else { - m_OutFile << ToString( nVal) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( nVal).c_str(), szSep, bEndL) ; } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WriteDouble( double dVal, const char* szSep, bool bEndL, int nPrec) { - if ( ! m_OutFile.is_open()) - return ; - - if ( m_bBinary) - m_OutFile.write( (char*) &dVal, sizeof( dVal)) ; - else { - m_OutFile << ToString( dVal, nPrec) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; - } -} - -//---------------------------------------------------------------------------- -void -NgeWriter::WriteString( const std::string& sVal, const char* szSep, bool bEndL) -{ - if ( ! m_OutFile.is_open()) - return ; - if ( m_bBinary) { - int nDim = int( sVal.size()) ; - m_OutFile.write( (char*) &nDim, sizeof( nDim)) ; - m_OutFile.write( sVal.c_str(), sVal.size()) ; + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &dVal, sizeof( dVal)) ; + return m_OutBinFile.good() ; } else { - m_OutFile << sVal ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( dVal, nPrec).c_str(), szSep, bEndL) ; } } //---------------------------------------------------------------------------- -void +bool +NgeWriter::WriteString( const string& sVal, const char* szSep, bool bEndL) +{ + if ( m_bBinary) { + if ( ! m_OutBinFile.is_open()) + return false ; + int nDim = int( sVal.size()) ; + m_OutBinFile.write( (char*) &nDim, sizeof( nDim)) ; + m_OutBinFile.write( sVal.c_str(), sVal.size()) ; + return m_OutBinFile.good() ; + } + else { + return WriteStringOutTxt( m_OutTxtFile, sVal.c_str(), szSep, bEndL) ; + } +} + +//---------------------------------------------------------------------------- +bool NgeWriter::WriteVector( const Vector3d& vtV, const char* szSep, bool bEndL, int nPrec) { - if ( ! m_OutFile.is_open()) - return ; - - if ( m_bBinary) - m_OutFile.write( (char*) &vtV.v, sizeof( vtV.v)) ; + if ( m_bBinary) { + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &vtV.v, sizeof( vtV.v)) ; + return m_OutBinFile.good() ; + } else { - m_OutFile << ToString( vtV, nPrec) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( vtV, nPrec).c_str(), szSep, bEndL) ; } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WritePoint( const Point3d& ptP, const char* szSep, bool bEndL, int nPrec) { - if ( ! m_OutFile.is_open()) - return ; - - if ( m_bBinary) - m_OutFile.write( (char*) &ptP.v, sizeof( ptP.v)) ; + if ( m_bBinary) { + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &ptP.v, sizeof( ptP.v)) ; + return m_OutBinFile.good() ; + } else { - m_OutFile << ToString( ptP, nPrec) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( ptP, nPrec).c_str(), szSep, bEndL) ; } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WritePointW( const Point3d& ptP, double dW, const char* szSep, bool bEndL, int nPrecP, int nPrecW) { - if ( ! m_OutFile.is_open()) - return ; - if ( m_bBinary) { - m_OutFile.write( (char*) &ptP.v, sizeof( ptP.v)) ; - m_OutFile.write( (char*) &dW, sizeof( dW)) ; + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &ptP.v, sizeof( ptP.v)) ; + m_OutBinFile.write( (char*) &dW, sizeof( dW)) ; + return m_OutBinFile.good() ; } else { - m_OutFile << ToString( ptP, dW, nPrecP, nPrecW) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( ptP, dW, nPrecP, nPrecW).c_str(), szSep, bEndL) ; } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WriteFrame( const Frame3d& frF, const char* szSep, bool bEndL, int nPrecP, int nPrecV) { - if ( ! m_OutFile.is_open()) - return ; - if ( m_bBinary) { - m_OutFile.write( (char*) &frF.Orig().v, sizeof( frF.Orig().v)) ; - m_OutFile.write( (char*) &frF.VersX().v, sizeof( frF.VersX().v)) ; - m_OutFile.write( (char*) &frF.VersY().v, sizeof( frF.VersY().v)) ; - m_OutFile.write( (char*) &frF.VersZ().v, sizeof( frF.VersZ().v)) ; + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &frF.Orig().v, sizeof( frF.Orig().v)) ; + m_OutBinFile.write( (char*) &frF.VersX().v, sizeof( frF.VersX().v)) ; + m_OutBinFile.write( (char*) &frF.VersY().v, sizeof( frF.VersY().v)) ; + m_OutBinFile.write( (char*) &frF.VersZ().v, sizeof( frF.VersZ().v)) ; + return m_OutBinFile.good() ; } else { - m_OutFile << ToString( frF, nPrecP, nPrecV) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( frF, nPrecP, nPrecV).c_str(), szSep, bEndL) ; } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WriteKey( int nKey) { - if ( ! m_OutFile.is_open()) - return ; - if ( nKey < 0 || nKey > NGE_LAST_ID) - return ; + return false ; - if ( m_bBinary) - m_OutFile.write( (char*) &NgeBinKeyW[nKey], sizeof( int)) ; + if ( m_bBinary) { + if ( ! m_OutBinFile.is_open()) + return false ; + m_OutBinFile.write( (char*) &NgeBinKeyW[nKey], sizeof( int)) ; + return m_OutBinFile.good() ; + } else { - m_OutFile << NgeAscKeyW[nKey] ; - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, NgeAscKeyW[nKey].c_str(), nullptr, true) ; } } //---------------------------------------------------------------------------- -void +bool NgeWriter::WriteCol( const Color& cCol, const char* szSep, bool bEndL) { - if ( ! m_OutFile.is_open()) - return ; - if ( m_bBinary) { + if ( ! m_OutBinFile.is_open()) + return false ; unsigned char ucCol[4] ; ucCol[0] = cCol.GetIntRed() ; ucCol[1] = cCol.GetIntGreen() ; ucCol[2] = cCol.GetIntBlue() ; ucCol[3] = cCol.GetIntAlpha() ; - m_OutFile.write( (char*) ucCol, sizeof( ucCol)) ; + m_OutBinFile.write( (char*) ucCol, sizeof( ucCol)) ; + return m_OutBinFile.good() ; } else { - m_OutFile << ToString( cCol) ; - if ( szSep != nullptr) - m_OutFile << szSep ; - if ( bEndL) - m_OutFile << endl ; + return WriteStringOutTxt( m_OutTxtFile, ToString( cCol).c_str(), szSep, bEndL) ; } } diff --git a/NgeWriter.h b/NgeWriter.h index bd617fb..f906385 100644 --- a/NgeWriter.h +++ b/NgeWriter.h @@ -18,29 +18,34 @@ #include "/EgtDev/Include/EGkColor.h" #include +struct gzFile_s ; + //---------------------------------------------------------------------------- class NgeWriter { public : - NgeWriter( void) : m_bBinary( false) {} + NgeWriter( void) : m_bBinary( false), m_OutTxtFile( nullptr) {} ~NgeWriter( void) { Close() ; } - bool Init( const std::string& sFileOut, bool bBinary) ; + bool Init( const std::string& sFileOut, int nFlag) ; bool Close( void) ; - void WriteUchar( unsigned char ucVal, const char* szSep, bool bEndL = false) ; - void WriteBool( bool bVal, const char* szSep, bool bEndL = false) ; - void WriteInt( int nVal, const char* szSep, bool bEndL = false) ; - void WriteDouble( double dVal, const char* szSep, bool bEndL = false, int nPrec = 6) ; - void WriteVector( const Vector3d& vtV, const char* szSep, bool bEndL = false, int nPrec = 9) ; - void WritePoint( const Point3d& ptP, const char* szSep, bool bEndL = false, int nPrec = 6) ; - void WritePointW( const Point3d& ptP, double dW, const char* szSep, bool bEndL = false, + bool WriteUchar( unsigned char ucVal, const char* szSep, bool bEndL = false) ; + bool WriteBool( bool bVal, const char* szSep, bool bEndL = false) ; + bool WriteInt( int nVal, const char* szSep, bool bEndL = false) ; + bool WriteDouble( double dVal, const char* szSep, bool bEndL = false, int nPrec = 6) ; + bool WriteVector( const Vector3d& vtV, const char* szSep, bool bEndL = false, int nPrec = 9) ; + bool WritePoint( const Point3d& ptP, const char* szSep, bool bEndL = false, int nPrec = 6) ; + bool WritePointW( const Point3d& ptP, double dW, const char* szSep, bool bEndL = false, int nPrecP = 6, int nPrecW = 9) ; - void WriteFrame( const Frame3d& frF, const char* szSep, bool bEndL, int nPrecP = 6, int nPrecV = 9) ; - void WriteString( const std::string& sVal, const char* szSep, bool bEndL = false) ; - void WriteKey( int nKey /* bEndL = true*/) ; - void WriteCol( const Color& cCol, const char* szSep, bool bEndL = false) ; + bool WriteFrame( const Frame3d& frF, const char* szSep, bool bEndL, int nPrecP = 6, int nPrecV = 9) ; + bool WriteString( const std::string& sVal, const char* szSep, bool bEndL = false) ; + bool WriteKey( int nKey /* bEndL = true*/) ; + bool WriteCol( const Color& cCol, const char* szSep, bool bEndL = false) ; private : bool m_bBinary ; - std::ofstream m_OutFile ; + // per file binari + std::ofstream m_OutBinFile ; + // per file ASCII + gzFile_s* m_OutTxtFile ; } ; diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index 038672e..d6cf097 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -404,34 +404,41 @@ bool SurfTriMesh::Save( NgeWriter& ngeOut) const { // tolleranza lineare di costruzione - ngeOut.WriteDouble( m_dLinTol, ";") ; + if ( ! ngeOut.WriteDouble( m_dLinTol, ";")) + return false ; // angolo limite per mediare le normali - ngeOut.WriteDouble( m_dSmoothAng, ";", true) ; + if ( ! ngeOut.WriteDouble( m_dSmoothAng, ";", true)) + return false ; // flag aperta/chiusa - ngeOut.WriteBool( m_bClosed, ";") ; + if ( ! ngeOut.WriteBool( m_bClosed, ";")) + return false ; // numero di vertici - ngeOut.WriteInt( GetVertexSize(), ";") ; + if ( ! ngeOut.WriteInt( GetVertexSize(), ";")) + return false ; // numero di triangoli - ngeOut.WriteInt( GetTriangleSize(), ";", true) ; + if ( ! ngeOut.WriteInt( GetTriangleSize(), ";", true)) + return false ; // ciclo sui vertici for ( int i = 0 ; i < int( m_vVert.size()) ; ++ i) { - ngeOut.WriteInt( i, ";") ; - ngeOut.WritePoint( m_vVert[i].ptP, ";") ; - ngeOut.WriteInt( m_vVert[i].nIdTria, ";") ; - ngeOut.WriteInt( m_vVert[i].nFlag, ";", true) ; + if ( ! ngeOut.WriteInt( i, ";") || + ! ngeOut.WritePoint( m_vVert[i].ptP, ";") || + ! ngeOut.WriteInt( m_vVert[i].nIdTria, ";") || + ! ngeOut.WriteInt( m_vVert[i].nFlag, ";", true)) + return false ; } // ciclo sui triangoli for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) { - ngeOut.WriteInt( i, ";") ; - ngeOut.WriteInt( m_vTria[i].nIdVert[0], ",") ; - ngeOut.WriteInt( m_vTria[i].nIdVert[1], ",") ; - ngeOut.WriteInt( m_vTria[i].nIdVert[2], ";") ; - ngeOut.WriteInt( m_vTria[i].nIdAdjac[0], ",") ; - ngeOut.WriteInt( m_vTria[i].nIdAdjac[1], ",") ; - ngeOut.WriteInt( m_vTria[i].nIdAdjac[2], ";") ; - ngeOut.WriteVector( m_vTria[i].vtN, ";") ; - ngeOut.WriteInt( m_vTria[i].nTFlag, ";") ; - ngeOut.WriteInt( m_vTria[i].nEFlag, ";", true) ; + if ( ! ngeOut.WriteInt( i, ";") || + ! ngeOut.WriteInt( m_vTria[i].nIdVert[0], ",") || + ! ngeOut.WriteInt( m_vTria[i].nIdVert[1], ",") || + ! ngeOut.WriteInt( m_vTria[i].nIdVert[2], ";") || + ! ngeOut.WriteInt( m_vTria[i].nIdAdjac[0], ",") || + ! ngeOut.WriteInt( m_vTria[i].nIdAdjac[1], ",") || + ! ngeOut.WriteInt( m_vTria[i].nIdAdjac[2], ";") || + ! ngeOut.WriteVector( m_vTria[i].vtN, ";") || + ! ngeOut.WriteInt( m_vTria[i].nTFlag, ";") || + ! ngeOut.WriteInt( m_vTria[i].nEFlag, ";", true)) + return false ; } return true ; diff --git a/stdafx.h b/stdafx.h index 4d461a4..8712f37 100644 --- a/stdafx.h +++ b/stdafx.h @@ -28,5 +28,6 @@ #include "/EgtDev/Include/EgtLibVer.h" +#pragma comment(lib, EGTEXTDIR "zlib/lib/zlib" EGTLIBVER ".lib") #pragma comment(lib, EGTLIBDIR "EgtGeneral" EGTLIBVER ".lib") #pragma comment(lib, EGTLIBDIR "EgtNumKernel" EGTLIBVER ".lib")