diff --git a/Attribs.cpp b/Attribs.cpp index e73f53b..2fccf77 100644 --- a/Attribs.cpp +++ b/Attribs.cpp @@ -14,6 +14,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "Attribs.h" +#include "NgeWriter.h" #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EGkStringUtils3d.h" @@ -81,30 +82,29 @@ Attribs::Dump( string& sOut, const char* szNewLine) const //---------------------------------------------------------------------------- bool -Attribs::Save( ostream& osOut) const +Attribs::Save( NgeWriter& ngeOut) const { // flag presenza attributi - osOut << "A" << endl ; - + ngeOut.WriteKey( NGE_A, true) ; // livello - osOut << ToString( m_Data[LEVEL]) << "," ; + ngeOut.WriteUchar( m_Data[LEVEL], ",") ; // modo - osOut << ToString( m_Data[MODE]) << "," ; + ngeOut.WriteUchar( m_Data[MODE], ",") ; // stato (se SEL è convertito in ON) int nStat = (( m_Data[STATUS] > GDB_ST_ON) ? GDB_ST_ON : m_Data[STATUS]) ; - osOut << ToString( nStat) << "," ; + ngeOut.WriteUchar( nStat, ",") ; // marcatura (sempre OFF) - osOut << ToString( GDB_MK_OFF) << ";" ; + ngeOut.WriteUchar( GDB_MK_OFF, ";") ; // materiale - osOut << ToString( m_Material) << ";" ; + ngeOut.WriteInt( m_Material, ";") ; // colore - osOut << ToString( m_Color) << ";" ; + ngeOut.WriteCol( m_Color, ";") ; // numero di stringhe di info (nelle linee successive) - osOut << ToString( int( m_slInfo.size())) << ";" << endl ; + ngeOut.WriteInt( int( m_slInfo.size()), ";", true) ; // stringhe di info STRLIST::const_iterator iIter ; for ( iIter = m_slInfo.begin() ; iIter != m_slInfo.end() ; ++ iIter) - osOut << *iIter << endl ; + ngeOut.WriteString( *iIter, nullptr, true) ; return true ; } diff --git a/Attribs.h b/Attribs.h index 1fd3a8e..0a8a360 100644 --- a/Attribs.h +++ b/Attribs.h @@ -18,6 +18,7 @@ #include "/EgtDev/Include/EGnScan.h" #include "/EgtDev/Include/EGnStringBase.h" +class NgeWriter ; //---------------------------------------------------------------------------- #define CLIP( nV, nMIN, nMAX) (( nV < nMIN) ? nMIN : (( nV > nMAX) ? nMAX : nV)) @@ -40,7 +41,7 @@ class Attribs *pAttribs = *(const_cast(this)) ; return pAttribs ; } bool Dump( std::string& sOut, const char* szNewLine) const ; - bool Save( std::ostream& osOut) const ; + bool Save( NgeWriter& ngeOut) const ; bool Load( Scanner& TheScanner) ; void SetLevel( int nLev) { m_OldData[LEVEL] = m_Data[LEVEL] ; diff --git a/BinaryRW.h b/BinaryRW.h new file mode 100644 index 0000000..0c8ccb4 --- /dev/null +++ b/BinaryRW.h @@ -0,0 +1,49 @@ +//---------------------------------------------------------------------------- +// EgalTech 2014-2014 +//---------------------------------------------------------------------------- +// File : BinaryRW.h Data : 12.04.14 Versione : 1.5d3 +// Contenuto : Funzioni per lettura e scrittura di file binari. +// +// +// +// Modifiche : 12.04.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include "/EgtDev/Include/EGkColor.h" +#include + +//---------------------------------------------------------------------------- +inline void +WriteUchar( std::ostream& osOut, unsigned char cVal) +{ + osOut.write( (char*) &cVal, sizeof( cVal)) ; +} + +//---------------------------------------------------------------------------- +inline void +WriteInt( std::ostream& osOut, int nVal) +{ + osOut.write( (char*) &nVal, sizeof( nVal)) ; +} + +//---------------------------------------------------------------------------- +inline void +WriteString( std::ostream& osOut, const std::string sVal) +{ + WriteInt( osOut, int( sVal.size())) ; + osOut.write( sVal.c_str(), sVal.size()) ; +} + +//---------------------------------------------------------------------------- +inline void +WriteCol( std::ostream& osOut, Color cCol) +{ + WriteUchar( osOut, cCol.GetIntRed()) ; + WriteUchar( osOut, cCol.GetIntGreen()) ; + WriteUchar( osOut, cCol.GetIntBlue()) ; + WriteUchar( osOut, cCol.GetIntAlpha()) ; +} diff --git a/CurveArc.cpp b/CurveArc.cpp index df25b04..f5bc734 100644 --- a/CurveArc.cpp +++ b/CurveArc.cpp @@ -16,13 +16,14 @@ #include "CurveArc.h" #include "GeoConst.h" #include "GeoObjFactory.h" +#include "NgeWriter.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include using namespace std ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( CRV_ARC, "C_ARC", CurveArc) ; +GEOOBJ_REGISTER( CRV_ARC, NGE_C_ARC, CurveArc) ; //---------------------------------------------------------------------------- @@ -162,6 +163,13 @@ CurveArc::Copy( const CurveArc& caSrc) caSrc.m_VtS, caSrc.m_dAngCenDeg, caSrc.m_dDeltaN) ; } +//---------------------------------------------------------------------------- +GeoObjType +CurveArc::GetType( void) const +{ + return static_cast( GEOOBJ_GETTYPE( CurveArc)) ; +} + //---------------------------------------------------------------------------- const string& CurveArc::GetTitle( void) const @@ -185,29 +193,30 @@ CurveArc::Dump( string& sOut, const char* szNewLine) const return true ; } + //---------------------------------------------------------------------------- -const string& -CurveArc::GetKey( void) const +int +CurveArc::GetNgeId( void) const { - return GEOOBJ_GETKEY( CurveArc) ; + return GEOOBJ_GETNGEID( CurveArc) ; } //---------------------------------------------------------------------------- bool -CurveArc::Save( ostream& osOut) const +CurveArc::Save( NgeWriter& ngeOut) const { // centro - osOut << ToString( m_PtCen) << ";" ; + ngeOut.WritePoint( m_PtCen, ";") ; // versore Normale - osOut << ToString( m_VtN) << ";" ; + ngeOut.WriteVector( m_VtN, ";") ; // raggio - osOut << ToString( m_dRad) << ";" ; + ngeOut.WriteDouble( m_dRad, ";") ; // versore Iniziale - osOut << ToString( m_VtS) << ";" ; + ngeOut.WriteVector( m_VtS, ";") ; // angolo al centro - osOut << ToString( m_dAngCenDeg) << ";" ; + ngeOut.WriteDouble( m_dAngCenDeg, ";") ; // deltaN - osOut << ToString( m_dDeltaN) << ";" << endl ; + ngeOut.WriteDouble( m_dDeltaN, ";", true) ; return true ; } diff --git a/CurveArc.h b/CurveArc.h index 47f3d96..17d46ea 100644 --- a/CurveArc.h +++ b/CurveArc.h @@ -16,22 +16,22 @@ #include "ObjGraphicsMgr.h" #include "CurveAux.h" #include "DllMain.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkCurveArc.h" //---------------------------------------------------------------------------- -class CurveArc : public ICurveArc +class CurveArc : public ICurveArc, public IGeoObjRW { public : // IGeoObj virtual ~CurveArc( void) ; virtual CurveArc* Clone( void) const ; - virtual GeoObjType GetType( void) const - { return CRV_ARC ; } + virtual GeoObjType GetType( void) const ; virtual bool IsValid( void) const { return ( m_nStatus == OK) ; } virtual const std::string& GetTitle( void) const ; virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ; - virtual const std::string& GetKey( void) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual int GetNgeId( void) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( Scanner& TheScanner) ; virtual bool GetLocalBBox( BBox3d& b3Loc) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const ; diff --git a/CurveBezier.cpp b/CurveBezier.cpp index 2ca595b..7840128 100644 --- a/CurveBezier.cpp +++ b/CurveBezier.cpp @@ -17,6 +17,7 @@ #include "GeoConst.h" #include "DistPointLine.h" #include "GeoObjFactory.h" +#include "NgeWriter.h" #include "PolynomialPoint3d.h" #include "/EgtDev/Include/EGkCurveArc.h" #include "/EgtDev/Include/ENkPolynomial.h" @@ -26,7 +27,7 @@ using namespace std ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( CRV_BEZ, "C_BEZ", CurveBezier) ; +GEOOBJ_REGISTER( CRV_BEZ, NGE_C_BEZ, CurveBezier) ; //---------------------------------------------------------------------------- CurveBezier::CurveBezier( void) @@ -303,6 +304,13 @@ CurveBezier::Copy( const CurveBezier& cbSrc) return true ; } +//---------------------------------------------------------------------------- +GeoObjType +CurveBezier::GetType( void) const +{ + return static_cast( GEOOBJ_GETTYPE( CurveBezier)) ; +} + //---------------------------------------------------------------------------- const string& CurveBezier::GetTitle( void) const @@ -331,26 +339,26 @@ CurveBezier::Dump( string& sOut, const char* szNewLine) const } //---------------------------------------------------------------------------- -const string& -CurveBezier::GetKey( void) const +int +CurveBezier::GetNgeId( void) const { - return GEOOBJ_GETKEY( CurveBezier) ; + return GEOOBJ_GETNGEID( CurveBezier) ; } //---------------------------------------------------------------------------- bool -CurveBezier::Save( ostream& osOut) const +CurveBezier::Save( NgeWriter& ngeOut) const { // flag razionale - osOut << ToString( m_bRat) << ";" ; + ngeOut.WriteBool( m_bRat, ";") ; // grado - osOut << ToString( m_nDeg) << ";" << endl ; + ngeOut.WriteInt( m_nDeg, ";", true) ; // ciclo sui punti di controllo ( con pesi se razionale) for ( int i = 0 ; i <= m_nDeg ; ++ i) { if ( ! m_bRat) - osOut << ToString( m_aPtCtrl[i]) << ";" << endl ; + ngeOut.WritePoint( m_aPtCtrl[i], ";", true) ; else - osOut << ToString( m_aPtCtrl[i], m_aWeCtrl[i]) << ";" << endl ; + ngeOut.WritePointW( m_aPtCtrl[i], m_aWeCtrl[i], ";", true) ; } return true ; diff --git a/CurveBezier.h b/CurveBezier.h index d8d4d94..4473cf6 100644 --- a/CurveBezier.h +++ b/CurveBezier.h @@ -17,23 +17,23 @@ #include "CurveAux.h" #include "PolynomialPoint3d.h" #include "DllMain.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkCurveBezier.h" #include "/EgtDev/Include/EgtNumCollection.h" //---------------------------------------------------------------------------- -class CurveBezier : public ICurveBezier +class CurveBezier : public ICurveBezier, public IGeoObjRW { public : // IGeoObj virtual ~CurveBezier( void) ; virtual CurveBezier* Clone( void) const ; - virtual GeoObjType GetType( void) const - { return CRV_BEZ ; } + virtual GeoObjType GetType( void) const ; virtual bool IsValid( void) const { return ( m_nStatus == OK) ; } virtual const std::string& GetTitle( void) const ; virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ; - virtual const std::string& GetKey( void) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual int GetNgeId( void) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( Scanner& TheScanner) ; virtual bool GetLocalBBox( BBox3d& b3Loc) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const ; diff --git a/CurveComposite.cpp b/CurveComposite.cpp index c529e3a..c2eb8eb 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -16,6 +16,7 @@ #include "CurveComposite.h" #include "GeoConst.h" #include "GeoObjFactory.h" +#include "NgeWriter.h" #include "/EgtDev/Include/EGnStringUtils.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include "/EgtDev/Include/EGkCurveArc.h" @@ -25,7 +26,7 @@ using namespace std ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( CRV_COMPO, "C_CMP", CurveComposite) ; +GEOOBJ_REGISTER( CRV_COMPO, NGE_C_CMP, CurveComposite) ; //---------------------------------------------------------------------------- CurveComposite::CurveComposite( void) @@ -235,6 +236,13 @@ CurveComposite::Copy( const CurveComposite& ccSrc) return true ; } +//---------------------------------------------------------------------------- +GeoObjType +CurveComposite::GetType( void) const +{ + return static_cast( GEOOBJ_GETTYPE( CurveComposite)) ; +} + //---------------------------------------------------------------------------- const string& CurveComposite::GetTitle( void) const @@ -266,29 +274,33 @@ CurveComposite::Dump( string& sOut, const char* szNewLine) const } //---------------------------------------------------------------------------- -const string& -CurveComposite::GetKey( void) const +int +CurveComposite::GetNgeId( void) const { - return GEOOBJ_GETKEY( CurveComposite) ; + return GEOOBJ_GETNGEID( CurveComposite) ; } //---------------------------------------------------------------------------- bool -CurveComposite::Save( ostream& osOut) const +CurveComposite::Save( NgeWriter& ngeOut) const { // numero di curve - osOut << ToString( m_nCounter) << endl ; + ngeOut.WriteInt( m_nCounter, nullptr, true) ; // ciclo sulle curve componenti int i = 0 ; const ICurve* pCrvSmpl = GetFirstCurve() ; while ( pCrvSmpl != nullptr) { + // recupero il gestore di lettura/scrittura dell'entità + const IGeoObjRW* pCSmplRW = dynamic_cast( pCrvSmpl) ; + if ( pCSmplRW == nullptr) + return false ; // emetto tipo della curva semplice - osOut << pCrvSmpl->GetKey() << endl ; + ngeOut.WriteKey( pCSmplRW->GetNgeId(), true) ; // assegno ed emetto nome della curva semplice string sCrvName = "#" + ToString( ++i) ; - osOut << sCrvName << endl ; + ngeOut.WriteString( sCrvName, nullptr, true) ; // salvataggio della curva semplice - if ( ! pCrvSmpl->Save( osOut)) + if ( ! pCSmplRW->Save( ngeOut)) return false ; // passo alla successiva pCrvSmpl = GetNextCurve() ; @@ -330,7 +342,8 @@ CurveComposite::Load( Scanner& TheScanner) // recupero la linea con il nome bool bOk = TheScanner.GetLine( sLine) ; // ne leggo i dati - bOk = bOk && pGeoO->Load( TheScanner) ; + IGeoObjRW* pGObjRW = dynamic_cast( pGeoO) ; + bOk = bOk && ( pGObjRW != nullptr && pGObjRW->Load( TheScanner)) ; // verifico sia una curva ICurve* pCrv = ::GetCurve( pGeoO) ; bOk = bOk && ( pCrv != nullptr && pCrv->IsSimple()) ; diff --git a/CurveComposite.h b/CurveComposite.h index f50e3c5..9ab9c96 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -16,24 +16,24 @@ #include "ObjGraphicsMgr.h" #include "CurveAux.h" #include "DllMain.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkCurveComposite.h" #include "/EgtDev/Include/EgtLogger.h" #include //---------------------------------------------------------------------------- -class CurveComposite : public ICurveComposite +class CurveComposite : public ICurveComposite, public IGeoObjRW { public : // IGeoObj virtual ~CurveComposite( void) ; virtual CurveComposite* Clone( void) const ; - virtual GeoObjType GetType( void) const - { return CRV_COMPO ; } + virtual GeoObjType GetType( void) const ; virtual bool IsValid( void) const { return ( m_nStatus == OK) ; } virtual const std::string& GetTitle( void) const ; virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ; - virtual const std::string& GetKey( void) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual int GetNgeId( void) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( Scanner& TheScanner) ; virtual bool GetLocalBBox( BBox3d& b3Loc) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const ; diff --git a/CurveLine.cpp b/CurveLine.cpp index 518ab6b..5a37042 100644 --- a/CurveLine.cpp +++ b/CurveLine.cpp @@ -15,13 +15,14 @@ #include "stdafx.h" #include "CurveLine.h" #include "GeoObjFactory.h" +#include "NgeWriter.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include using namespace std ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( CRV_LINE, "C_LIN", CurveLine) ; +GEOOBJ_REGISTER( CRV_LINE, NGE_C_LIN, CurveLine) ; //---------------------------------------------------------------------------- CurveLine::CurveLine( void) @@ -84,6 +85,13 @@ CurveLine::Copy( const CurveLine& clSrc) return Set( clSrc.m_PtStart, clSrc.m_PtEnd) ; } +//---------------------------------------------------------------------------- +GeoObjType +CurveLine::GetType( void) const +{ + return static_cast( GEOOBJ_GETTYPE( CurveLine)) ; +} + //---------------------------------------------------------------------------- const string& CurveLine::GetTitle( void) const @@ -104,19 +112,19 @@ CurveLine::Dump( string& sOut, const char* szNewLine) const } //---------------------------------------------------------------------------- -const string& -CurveLine::GetKey( void) const +int +CurveLine::GetNgeId( void) const { - return GEOOBJ_GETKEY( CurveLine) ; + return GEOOBJ_GETNGEID( CurveLine) ; } //---------------------------------------------------------------------------- bool -CurveLine::Save( ostream& osOut) const +CurveLine::Save( NgeWriter& ngeOut) const { // parametri : punti iniziale e finale - osOut << ToString( m_PtStart) << ";"; - osOut << ToString( m_PtEnd) << ";" << endl ; + ngeOut.WritePoint( m_PtStart, ";") ; + ngeOut.WritePoint( m_PtEnd, ";", true) ; return true ; } diff --git a/CurveLine.h b/CurveLine.h index f3f3bf2..6159e52 100644 --- a/CurveLine.h +++ b/CurveLine.h @@ -16,22 +16,22 @@ #include "ObjGraphicsMgr.h" #include "CurveAux.h" #include "DllMain.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkCurveLine.h" //---------------------------------------------------------------------------- -class CurveLine : public ICurveLine +class CurveLine : public ICurveLine, public IGeoObjRW { public : // IGeoObj virtual ~CurveLine( void) ; virtual CurveLine* Clone( void) const ; - virtual GeoObjType GetType( void) const - { return CRV_LINE ; } + virtual GeoObjType GetType( void) const ; virtual bool IsValid( void) const { return ( m_nStatus == OK) ; } virtual const std::string& GetTitle( void) const ; virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ; - virtual const std::string& GetKey( void) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual int GetNgeId( void) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( Scanner& TheScanner) ; virtual bool GetLocalBBox( BBox3d& b3Loc) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const ; diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 87783ae..dccc2ef 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj index 27e99bd..2b66eb3 100644 --- a/EgtGeomKernel.vcxproj +++ b/EgtGeomKernel.vcxproj @@ -266,6 +266,7 @@ copy $(TargetPath) \EgtProg\Dll64 + @@ -328,10 +329,13 @@ copy $(TargetPath) \EgtProg\Dll64 + + + @@ -340,6 +344,7 @@ copy $(TargetPath) \EgtProg\Dll64 + diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters index 56eca04..559893f 100644 --- a/EgtGeomKernel.vcxproj.filters +++ b/EgtGeomKernel.vcxproj.filters @@ -141,6 +141,9 @@ File di origine\Base + + File di origine\Gdb + @@ -359,6 +362,18 @@ File di intestazione + + File di intestazione + + + File di intestazione + + + File di intestazione + + + File di intestazione + diff --git a/GdbExecutor.cpp b/GdbExecutor.cpp index ebc67bb..5a1dbc9 100644 --- a/GdbExecutor.cpp +++ b/GdbExecutor.cpp @@ -1875,11 +1875,18 @@ GdbExecutor::ExecuteLoad( const std::string& sCmd2, const STRVECTOR& vsParams) bool GdbExecutor::ExecuteSave( const std::string& sCmd2, const STRVECTOR& vsParams) { - // 1 parametro ( NomeFile) - if ( vsParams.size() != 1) + // almeno 1 parametro ( NomeFile) + if ( vsParams.size() < 1) return false ; + // il secondo parametro, opzionale, indica il formato del file + bool bBinary = false ; + if ( vsParams.size() == 2) { + string sBinary = vsParams[1] ; + ToUpper( sBinary) ; + bBinary = ( sBinary == "B" || sBinary == "BINARY") ; + } // esecuzione salvataggio - return m_pGDB->Save( vsParams[0]) ; + return m_pGDB->Save( vsParams[0], bBinary) ; } //---------------------------------------------------------------------------- diff --git a/GdbGeo.cpp b/GdbGeo.cpp index 45099ec..ae33e13 100644 --- a/GdbGeo.cpp +++ b/GdbGeo.cpp @@ -17,6 +17,8 @@ #include "GeoObjFactory.h" #include "CurveAux.h" #include "Attribs.h" +#include "NgeWriter.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkGdbFunct.h" #include "/EgtDev/Include/EGnStringUtils.h" #include @@ -81,25 +83,25 @@ GdbGeo::GetType( void) const //---------------------------------------------------------------------------- bool -GdbGeo::Save( std::ostream& osOut) const +GdbGeo::Save( NgeWriter& ngeOut) const { - bool bOk = true ; + // recupero il gestore di lettura/scrittura dell'entità + IGeoObjRW* pGObjRW = dynamic_cast( m_pGeoObj) ; + if ( pGObjRW == nullptr) + return false ; - // tipo entità - osOut << m_pGeoObj->GetKey() << endl ; - // nome - osOut << m_nId << "@" << GetParentId() << endl ; + // tipo entità e identificativi + ngeOut.WriteKey( pGObjRW->GetNgeId(), true) ; + ngeOut.WriteInt( m_nId, "@") ; + ngeOut.WriteInt( GetParentId(), nullptr, true) ; // attributi - if ( ! GdbObj::SaveAttribs( osOut)) - bOk = false ; + if ( ! GdbObj::SaveAttribs( ngeOut)) + return false ; // parametri geometrici - osOut << "G" << endl ; - if ( ! m_pGeoObj->Save( osOut)) - bOk = false ; - - return bOk ; + ngeOut.WriteKey( NGE_G, true) ; + return pGObjRW->Save( ngeOut) ; } //---------------------------------------------------------------------------- @@ -150,7 +152,8 @@ GdbGeo::Load( const std::string& sType, Scanner& TheScanner, int& nParentId) return false ; // parametri geometrici - return m_pGeoObj->Load( TheScanner) ; + IGeoObjRW* pGObjRW = dynamic_cast( m_pGeoObj) ; + return ( pGObjRW != nullptr && pGObjRW->Load( TheScanner)) ; } //---------------------------------------------------------------------------- diff --git a/GdbGeo.h b/GdbGeo.h index 017c802..644a0e6 100644 --- a/GdbGeo.h +++ b/GdbGeo.h @@ -25,7 +25,7 @@ class GdbGeo : public GdbObj public : virtual ~GdbGeo( void) ; virtual GdbGeo* Clone( int nId, IdManager& IdMgr) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( const std::string& sType, Scanner& TheScanner, int& nParentId) ; virtual bool GetLocalBBox( BBox3d& b3Loc, int nFlag, int nLev = 0) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag, int nLev = 0) const ; diff --git a/GdbGroup.cpp b/GdbGroup.cpp index 08734d9..796a023 100644 --- a/GdbGroup.cpp +++ b/GdbGroup.cpp @@ -15,8 +15,9 @@ #include "stdafx.h" #include "GdbGroup.h" #include "IdManager.h" +#include "NgeWriter.h" #include "/EgtDev/Include/EGkGdbFunct.h" -#include "\EgtDev\Include\EGnStringUtils.h" +#include "/EgtDev/Include/EGnStringUtils.h" using namespace std ; @@ -101,28 +102,28 @@ GdbGroup::Clone( int nId, IdManager& IdMgr) const //---------------------------------------------------------------------------- bool -GdbGroup::Save( std::ostream& osOut) const +GdbGroup::Save( NgeWriter& ngeOut) const { bool bOk = true ; - // tipo entità - osOut << GetKey() << endl ; - // identificativi - osOut << m_nId << "@" << GetParentId() << endl ; + // tipo entità e identificativi + ngeOut.WriteKey( NGE_A_GRP, true) ; + ngeOut.WriteInt( m_nId, "@") ; + ngeOut.WriteInt( GetParentId(), nullptr, true) ; // attributi - if ( ! GdbObj::SaveAttribs( osOut)) + if ( ! GdbObj::SaveAttribs( ngeOut)) bOk = false ; // dati del riferimento - osOut << "G" << endl ; - if ( ! m_gfrFrame.Save( osOut)) + ngeOut.WriteKey( NGE_G, true) ; + if ( ! m_gfrFrame.Save( ngeOut)) bOk = false ; // salvataggio dei figli const GdbObj* pGdbObj = GetFirstObj() ; while ( pGdbObj != nullptr) { - if ( ! pGdbObj->Save( osOut)) + if ( ! pGdbObj->Save( ngeOut)) bOk = false ; pGdbObj = pGdbObj->GetNext() ; } diff --git a/GdbGroup.h b/GdbGroup.h index f2d98b3..11c3071 100644 --- a/GdbGroup.h +++ b/GdbGroup.h @@ -26,7 +26,7 @@ class GdbGroup : public GdbObj public : virtual ~GdbGroup( void) ; virtual GdbGroup* Clone( int nId, IdManager& IdMgr) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( const std::string& sType, Scanner& TheScanner, int& nParentId) ; virtual bool GetLocalBBox( BBox3d& b3Loc, int nFlag, int nLev = 0) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag, int nLev = 0) const ; @@ -63,10 +63,6 @@ class GdbGroup : public GdbObj const GdbObj* GetLastObj( void) const { return m_pLastObj ; } - public : - static const std::string& GetKey( void) - { static std::string s_sKey = "A_GRP" ; return s_sKey ; } - public : const Frame3d& GetFrame( void) const { return m_gfrFrame.GetFrame() ; } diff --git a/GdbObj.cpp b/GdbObj.cpp index 9dccfd3..c1a589a 100644 --- a/GdbObj.cpp +++ b/GdbObj.cpp @@ -205,10 +205,10 @@ GdbObj::Remove( void) // Attribs //---------------------------------------------------------------------------- bool -GdbObj::SaveAttribs( std::ostream& osOut) const +GdbObj::SaveAttribs( NgeWriter& ngeOut) const { if ( m_pAttribs != nullptr) - return m_pAttribs->Save( osOut) ; + return m_pAttribs->Save( ngeOut) ; return true ; } diff --git a/GdbObj.h b/GdbObj.h index 8406b09..21049fe 100644 --- a/GdbObj.h +++ b/GdbObj.h @@ -19,10 +19,10 @@ #include "/EgtDev/Include/EGkBBox3d.h" #include - class GdbGroup ; class IdManager ; class Attribs ; +class NgeWriter ; //---------------------------------------------------------------------------- class GdbObj @@ -30,7 +30,7 @@ class GdbObj public : virtual ~GdbObj( void) ; virtual GdbObj* Clone( int nId, IdManager& IdMgr) const = 0 ; - virtual bool Save( std::ostream& osOut) const = 0 ; + virtual bool Save( NgeWriter& ngeOut) const = 0 ; virtual bool Load( const std::string& sType, Scanner& TheScanner, int& nParentId) = 0 ; virtual bool GetLocalBBox( BBox3d& b3Loc, int nFlag, int nLev = 0) const = 0 ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag, int nLev = 0) const = 0 ; @@ -48,7 +48,7 @@ class GdbObj bool Copy( const GdbObj* pSou) ; public : - bool SaveAttribs( std::ostream& osOut) const ; + bool SaveAttribs( NgeWriter& ngeOut) const ; bool LoadAttribs( Scanner& TheScanner) ; Attribs* GetAttribs( void) { return m_pAttribs ; } diff --git a/GeoFrame3d.cpp b/GeoFrame3d.cpp index d2dc59a..2eaca06 100644 --- a/GeoFrame3d.cpp +++ b/GeoFrame3d.cpp @@ -15,6 +15,7 @@ #include "stdafx.h" #include "GeoFrame3d.h" #include "GeoObjFactory.h" +#include "NgeWriter.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkPolyLine.h" #include @@ -22,7 +23,7 @@ using namespace std ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( GEO_FRAME3D, "G_FRM", GeoFrame3d) ; +GEOOBJ_REGISTER( GEO_FRAME3D, NGE_G_FRM, GeoFrame3d) ; //---------------------------------------------------------------------------- GeoFrame3d::GeoFrame3d( void) @@ -92,6 +93,13 @@ GeoFrame3d::Copy( const GeoFrame3d& gfSrc) return Set( gfSrc.m_frF) ; } +//---------------------------------------------------------------------------- +GeoObjType +GeoFrame3d::GetType( void) const +{ + return static_cast( GEOOBJ_GETTYPE( GeoFrame3d)) ; +} + //---------------------------------------------------------------------------- const string& GeoFrame3d::GetTitle( void) const @@ -114,17 +122,17 @@ GeoFrame3d::Dump( string& sOut, const char* szNewLine) const } //---------------------------------------------------------------------------- -const string& -GeoFrame3d::GetKey( void) const +int +GeoFrame3d::GetNgeId( void) const { - return GEOOBJ_GETKEY( GeoFrame3d) ; + return GEOOBJ_GETNGEID( GeoFrame3d) ; } //---------------------------------------------------------------------------- bool -GeoFrame3d::Save( ostream& osOut) const +GeoFrame3d::Save( NgeWriter& ngeOut) const { - osOut << ToString( m_frF) << ";" << endl ; + ngeOut.WriteFrame( m_frF, ";", true) ; return true ; } diff --git a/GeoFrame3d.h b/GeoFrame3d.h index 353f92a..9c191b7 100644 --- a/GeoFrame3d.h +++ b/GeoFrame3d.h @@ -15,23 +15,23 @@ #include "ObjGraphicsMgr.h" #include "DllMain.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkGeoFrame3d.h" //---------------------------------------------------------------------------- -class GeoFrame3d : public IGeoFrame3d +class GeoFrame3d : public IGeoFrame3d, public IGeoObjRW { public : // IGeoObj virtual ~GeoFrame3d( void) ; virtual GeoFrame3d* Clone( void) const ; - virtual GeoObjType GetType( void) const - { return GEO_FRAME3D ; } + virtual GeoObjType GetType( void) const ; virtual bool IsValid( void) const { return ( m_frF.GetType() != Frame3d::ERR) ; } virtual const std::string& GetTitle( void) const ; virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ; - virtual const std::string& GetKey( void) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual int GetNgeId( void) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( Scanner& TheScanner) ; virtual bool GetLocalBBox( BBox3d& b3Loc) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const ; diff --git a/GeoObjFactory.h b/GeoObjFactory.h index d1f0f74..ec63d3f 100644 --- a/GeoObjFactory.h +++ b/GeoObjFactory.h @@ -13,34 +13,41 @@ #pragma once +#include "NgeKeyW.h" +#include "/EgtDev/Include/EGkGeoObj.h" #include #include -#include "/EgtDev/Include/EGkGeoObj.h" //---------------------------------------------------------------------------- -#define GEOOBJ_REGISTER(nKey,sKey,T) static const bool bReg_##T = GeoObjRegister::DoRegister(nKey,sKey) -#define GEOOBJ_GETTYPE( T) GeoObjRegister::GetType() -#define GEOOBJ_GETKEY( T) GeoObjRegister::GetKey() -#define GEOOBJ_KEYTOTYPE( sKey) GeoObjFactory::KeyToType( sKey) -#define GEOOBJ_CREATE( nKey) GeoObjFactory::Create( nKey) +#define GEOOBJ_REGISTER( nKey, nNgeId, T) static const bool bReg_##T = \ + GeoObjRegister::DoRegister( nKey, nNgeId) +#define GEOOBJ_GETTYPE( T) GeoObjRegister::GetType() +#define GEOOBJ_GETKEY( T) GeoObjRegister::GetKey() +#define GEOOBJ_GETNGEID( T) GeoObjRegister::GetNgeId() +#define GEOOBJ_KEYTOTYPE( sKey) GeoObjFactory::KeyToType( sKey) +#define GEOOBJ_NGEIDTOTYPE( nNgeId) GeoObjFactory::NgeIdToType( nNgeId) +#define GEOOBJ_CREATE( nKey) GeoObjFactory::Create( nKey) //---------------------------------------------------------------------------- template class GeoObjRegister { public : - static bool DoRegister( int nKey, std::string sKey) - { if ( ! GeoObjFactory::Register( nKey, sKey, Create)) + static bool DoRegister( int nKey, int nNgeId) + { if ( ! GeoObjFactory::Register( nKey, NgeAscKeyW[nNgeId], nNgeId, Create)) return false ; GetTypePrivate() = nKey ; - GetKeyPrivate() = sKey ; + GetKeyPrivate() = NgeAscKeyW[nNgeId] ; + GetNgeIdPrivate() = nNgeId ; return true ; } static IGeoObj* Create( void) { return new(nothrow) T ; } - static const int& GetType( void) + static int GetType( void) { return GetTypePrivate() ; } static const std::string& GetKey( void) { return GetKeyPrivate() ; } + static int GetNgeId( void) + { return GetNgeIdPrivate() ; } private : GeoObjRegister( void) {} @@ -51,6 +58,9 @@ class GeoObjRegister static std::string& GetKeyPrivate( void) { static std::string s_sKey ; return s_sKey ; } + static int& GetNgeIdPrivate( void) + { static int s_nNgeId ; + return s_nNgeId ; } } ; //---------------------------------------------------------------------------- @@ -60,8 +70,9 @@ class GeoObjFactory // definizione del tipo funzione di creazione typedef IGeoObj* ( *GeoCreator) ( void) ; // per registrare le funzioni di creazione - static bool Register( int nKey, std::string sKey, GeoCreator Creator) + static bool Register( int nKey, std::string sKey, int nNgeId, GeoCreator Creator) { return GetKeyTypeMap().insert( std::pair< std::string, int>( sKey, nKey)).second && + GetNgeIdTypeMap().insert( std::pair< int, int>( nNgeId, nKey)).second && GetCreatorMap().insert( std::pair< int, GeoCreator>( nKey, Creator)).second ; } // per restituire il tipo data la chiave static int KeyToType( std::string sKey) @@ -69,6 +80,12 @@ class GeoObjFactory if ( Iter != GetKeyTypeMap().end()) return Iter->second ; return 0 ; } + // per restituire il tipo dato l'indice Nge + static int NgeIdToType( int nNgeId) + { NgeIdTypeMap::iterator Iter = GetNgeIdTypeMap().find( nNgeId) ; + if ( Iter != GetNgeIdTypeMap().end()) + return Iter->second ; + return 0 ; } // per creare l'oggetto richiesto static IGeoObj* Create( int nKey) { CreatorMap::iterator Iter = GetCreatorMap().find( nKey) ; @@ -87,6 +104,12 @@ class GeoObjFactory static KeyTypeMap& GetKeyTypeMap( void) { static KeyTypeMap s_KeyTypeMap ; return s_KeyTypeMap ; } + // definizione del tipo mappa con coppie NgeId, tipo + typedef std::unordered_map NgeIdTypeMap ; + // metodo di accesso alla mappa statica + static NgeIdTypeMap& GetNgeIdTypeMap( void) + { static NgeIdTypeMap s_NgeIdTypeMap ; + return s_NgeIdTypeMap ; } // definizione del tipo mappa con coppie tipo, funzione di creazione typedef std::unordered_map CreatorMap ; // metodo di accesso alla mappa statica diff --git a/GeoObjRW.h b/GeoObjRW.h new file mode 100644 index 0000000..0f0c269 --- /dev/null +++ b/GeoObjRW.h @@ -0,0 +1,27 @@ +//---------------------------------------------------------------------------- +// EgalTech 2014-2014 +//---------------------------------------------------------------------------- +// File : GeoObjRW.h Data : 14.03.14 Versione : 1.5d5 +// Contenuto : Dichiarazione della interfaccia IGeoObjRW. +// +// +// +// Modifiche : 20.11.13 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include "/EgtDev/Include/EGnScan.h" + +class NgeWriter ; + +//----------------------------------------------------------------------------- +class __declspec( novtable) IGeoObjRW +{ + public : + virtual int GetNgeId( void) const = 0 ; + virtual bool Save( NgeWriter& ngeOut) const = 0 ; + virtual bool Load( Scanner& TheScanner) = 0 ; +} ; diff --git a/GeoPoint3d.cpp b/GeoPoint3d.cpp index 5232e59..cc2cc97 100644 --- a/GeoPoint3d.cpp +++ b/GeoPoint3d.cpp @@ -15,13 +15,14 @@ #include "stdafx.h" #include "GeoPoint3d.h" #include "GeoObjFactory.h" +#include "NgeWriter.h" #include "\EgtDev\Include\EGkStringUtils3d.h" #include using namespace std ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( GEO_PNT3D, "G_PNT", GeoPoint3d) ; +GEOOBJ_REGISTER( GEO_PNT3D, NGE_G_PNT, GeoPoint3d) ; //---------------------------------------------------------------------------- GeoPoint3d::GeoPoint3d( void) @@ -82,6 +83,13 @@ GeoPoint3d::Copy( const GeoPoint3d& clSrc) return Set( clSrc.m_ptP) ; } +//---------------------------------------------------------------------------- +GeoObjType +GeoPoint3d::GetType( void) const +{ + return static_cast( GEOOBJ_GETTYPE( GeoPoint3d)) ; +} + //---------------------------------------------------------------------------- const string& GeoPoint3d::GetTitle( void) const @@ -101,18 +109,18 @@ GeoPoint3d::Dump( string& sOut, const char* szNewLine) const } //---------------------------------------------------------------------------- -const string& -GeoPoint3d::GetKey( void) const +int +GeoPoint3d::GetNgeId( void) const { - return GEOOBJ_GETKEY( GeoPoint3d) ; + return GEOOBJ_GETNGEID( GeoPoint3d) ; } //---------------------------------------------------------------------------- bool -GeoPoint3d::Save( ostream& osOut) const +GeoPoint3d::Save( NgeWriter& ngeOut) const { // parametri : punto - osOut << ToString( m_ptP) << ";" << endl ; + ngeOut.WritePoint( m_ptP, ";", true) ; return true ; } diff --git a/GeoPoint3d.h b/GeoPoint3d.h index b79f22a..02f5b7f 100644 --- a/GeoPoint3d.h +++ b/GeoPoint3d.h @@ -15,23 +15,23 @@ #include "ObjGraphicsMgr.h" #include "DllMain.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" //---------------------------------------------------------------------------- -class GeoPoint3d : public IGeoPoint3d +class GeoPoint3d : public IGeoPoint3d, public IGeoObjRW { public : // IGeoObj virtual ~GeoPoint3d( void) ; virtual GeoPoint3d* Clone( void) const ; - virtual GeoObjType GetType( void) const - { return GEO_PNT3D ; } + virtual GeoObjType GetType( void) const ; virtual bool IsValid( void) const { return true ; } virtual const std::string& GetTitle( void) const ; virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ; - virtual const std::string& GetKey( void) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual int GetNgeId( void) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( Scanner& TheScanner) ; virtual bool GetLocalBBox( BBox3d& b3Loc) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const ; diff --git a/GeoVector3d.cpp b/GeoVector3d.cpp index b95ebc0..46282b5 100644 --- a/GeoVector3d.cpp +++ b/GeoVector3d.cpp @@ -15,6 +15,7 @@ #include "stdafx.h" #include "GeoVector3d.h" #include "GeoObjFactory.h" +#include "NgeWriter.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkPolyLine.h" #include @@ -22,7 +23,7 @@ using namespace std ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( GEO_VECT3D, "G_VEC", GeoVector3d) ; +GEOOBJ_REGISTER( GEO_VECT3D, NGE_G_VEC, GeoVector3d) ; //---------------------------------------------------------------------------- GeoVector3d::GeoVector3d( void) @@ -83,6 +84,13 @@ GeoVector3d::Copy( const GeoVector3d& clSrc) return Set( clSrc.m_vtV) ; } +//---------------------------------------------------------------------------- +GeoObjType +GeoVector3d::GetType( void) const +{ + return static_cast( GEOOBJ_GETTYPE( GeoVector3d)) ; +} + //---------------------------------------------------------------------------- const string& GeoVector3d::GetTitle( void) const @@ -102,18 +110,18 @@ GeoVector3d::Dump( string& sOut, const char* szNewLine) const } //---------------------------------------------------------------------------- -const string& -GeoVector3d::GetKey( void) const +int +GeoVector3d::GetNgeId( void) const { - return GEOOBJ_GETKEY( GeoVector3d) ; + return GEOOBJ_GETNGEID( GeoVector3d) ; } //---------------------------------------------------------------------------- bool -GeoVector3d::Save( ostream& osOut) const +GeoVector3d::Save( NgeWriter& ngeOut) const { // parametri : vettore - osOut << ToString( m_vtV) << ";" << endl ; + ngeOut.WriteVector( m_vtV, ";", true) ; return true ; } diff --git a/GeoVector3d.h b/GeoVector3d.h index 236c451..854beff 100644 --- a/GeoVector3d.h +++ b/GeoVector3d.h @@ -15,22 +15,22 @@ #include "ObjGraphicsMgr.h" #include "DllMain.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkGeoVector3d.h" //---------------------------------------------------------------------------- -class GeoVector3d : public IGeoVector3d +class GeoVector3d : public IGeoVector3d, public IGeoObjRW { public : // IGeoObj virtual ~GeoVector3d( void) ; virtual GeoVector3d* Clone( void) const ; - virtual GeoObjType GetType( void) const - { return GEO_VECT3D ; } + virtual GeoObjType GetType( void) const ; virtual bool IsValid( void) const { return true ; } virtual const std::string& GetTitle( void) const ; virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ; - virtual const std::string& GetKey( void) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual int GetNgeId( void) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( Scanner& TheScanner) ; virtual bool GetLocalBBox( BBox3d& b3Loc) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const ; diff --git a/GeomDB.cpp b/GeomDB.cpp index f635267..bac2d97 100644 --- a/GeomDB.cpp +++ b/GeomDB.cpp @@ -17,7 +17,9 @@ #include "GdbGeo.h" #include "DllMain.h" #include "Attribs.h" +#include "NgeWriter.h" #include "/EgtDev/Include/EgnStringUtils.h" +#include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EgnStringConverter.h" #include "/EgtDev/Include/EgtPointerOwner.h" #include @@ -182,7 +184,7 @@ GeomDB::LoadOneObj( Scanner& TheScanner, bool& bEnd) return true ; } // se gruppo - else if ( sType == GdbGroup::GetKey()) { + else if ( sType == "A_GRP") { pGdbObj = new( nothrow) GdbGroup ; } // se copia TODO ("X_CPY").. @@ -210,16 +212,15 @@ GeomDB::LoadOneObj( Scanner& TheScanner, bool& bEnd) //---------------------------------------------------------------------------- bool -GeomDB::Save( const std::string& sFileOut) const +GeomDB::Save( const std::string& sFileOut, bool bBinary) const { // apertura file - ofstream ofSave ; - ofSave.open( stringtoW( sFileOut)) ; - if ( ! ofSave.good()) + NgeWriter ngeOut ; + if ( ! ngeOut.Init( sFileOut, bBinary)) return false ; // intestazione - bool bOk = SaveHeader( ofSave) ; + bool bOk = SaveHeader( ngeOut) ; // ciclo di scrittura degli oggetti const GdbObj* pGdbObj = m_GrpRadix.GetFirstObj() ; @@ -230,36 +231,50 @@ GeomDB::Save( const std::string& sFileOut) const // se non temporaneo if ( nLevel != GDB_LV_TEMP) { // salvo l'oggetto - if ( ! pGdbObj->Save( ofSave)) + if ( ! pGdbObj->Save( ngeOut)) bOk = false ; } // passo al successivo pGdbObj = pGdbObj->GetNext() ; } - ofSave << "END" << endl ; + + // terminazione + if ( ! SaveFooter( ngeOut)) + bOk = false ; // chiusura file - ofSave.close() ; + if ( ! ngeOut.Close()) + bOk = false ; return bOk ; } //---------------------------------------------------------------------------- bool -GeomDB::SaveHeader( ostream& osOut) const +GeomDB::SaveHeader( NgeWriter& ngeOut) const { // intestazione - osOut << "START" << endl ; - osOut << "GeomDB,1.5.3.9;" << endl ; + ngeOut.WriteKey( NGE_START, true) ; + ngeOut.WriteString( NGE_GEOMDB, ",") ; + ngeOut.WriteInt( NGE_MAJOR_VER, ".") ; + ngeOut.WriteInt( NGE_MINOR_VER, ".") ; + ngeOut.WriteInt( NGE_PATCH_VER, ";", true) ; // materiale di default come colore - osOut << "MAT_DEF" << endl ; Color colDef( 0, 0, 0, 0) ; - GetDefaultMaterial( colDef) ; - osOut << ToString( colDef.GetIntRed()) << "," ; - osOut << ToString( colDef.GetIntGreen()) << "," ; - osOut << ToString( colDef.GetIntBlue()) << "," ; - osOut << ToString( colDef.GetIntAlpha()) << ";" << endl ; + GetDefaultMaterial( colDef) ; + ngeOut.WriteKey( NGE_MAT_DEF, true) ; + ngeOut.WriteCol( colDef, ";", true) ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +GeomDB::SaveFooter( NgeWriter& ngeOut) const +{ + // terminazione + ngeOut.WriteKey( NGE_END, true) ; return true ; } diff --git a/GeomDB.h b/GeomDB.h index 3810a6b..ff409d6 100644 --- a/GeomDB.h +++ b/GeomDB.h @@ -20,6 +20,7 @@ #include "SelManager.h" #include "/EgtDev/Include/EGkGeomDB.h" +class NgeWriter ; //---------------------------------------------------------------------------- class GeomDB : public IGeomDB @@ -31,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) const ; + virtual bool Save( const std::string& sFileOut, bool bBinary = true) const ; virtual bool ExistsObj( int nId) const ; virtual int AddGroup( int nId, int nParentId, const Frame3d& frFrame) ; virtual int AddGeoObj( int nId, int nParentId, IGeoObj* pGeoObj) ; @@ -132,7 +133,8 @@ class GeomDB : public IGeomDB bool Erase( GdbObj* pGObj) ; bool LoadHeader( Scanner& TheScanner) ; bool LoadOneObj( Scanner& TheScanner, bool& bEnd) ; - bool SaveHeader( std::ostream& osOut) const ; + bool SaveHeader( NgeWriter& ngeOut) const ; + bool SaveFooter( NgeWriter& ngeOut) const ; bool SetStatus( GdbObj* pGdbObj, int nStat) ; bool RevertStatus( GdbObj* pGdbObj) ; bool AddGdbIteratorToList( GdbIterator* pIter) diff --git a/NgeConst.h b/NgeConst.h new file mode 100644 index 0000000..e3557e0 --- /dev/null +++ b/NgeConst.h @@ -0,0 +1,44 @@ +//---------------------------------------------------------------------------- +// EgalTech 2014-2014 +//---------------------------------------------------------------------------- +// File : NgeConst.h Data : 12.04.14 Versione : 1.5d3 +// Contenuto : Costanti per file Nge. +// +// +// +// Modifiche : 12.04.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include + +//---------------------------------------------------------------------------- +// Costanti per file NGE +//---------------------------------------------------------------------------- +// versione +const int NGE_MAJOR_VER = 1 ; +const int NGE_MINOR_VER = 5 ; +const int NGE_PATCH_VER = 4 ; +// nome GDB +const std::string NGE_GEOMDB = "GeomDB" ; +// indici KeyWord +const int NGE_START = 0 ; +const int NGE_END = 1 ; +const int NGE_MAT_DEF = 2 ; +const int NGE_A = 3 ; +const int NGE_G = 4 ; +const int NGE_P = 5 ; +const int NGE_A_GRP = 6 ; +const int NGE_X_CPY = 7 ; +const int NGE_G_VEC = 8 ; +const int NGE_G_PNT = 9 ; +const int NGE_G_FRM = 10 ; +const int NGE_C_LIN = 11 ; +const int NGE_C_ARC = 12 ; +const int NGE_C_BEZ = 13 ; +const int NGE_C_CMP = 14 ; +const int NGE_S_TRM = 15 ; +const int NGE_LAST_ID = 15 ; // ultimo valore diff --git a/NgeKeyW.h b/NgeKeyW.h new file mode 100644 index 0000000..d019b13 --- /dev/null +++ b/NgeKeyW.h @@ -0,0 +1,63 @@ +//---------------------------------------------------------------------------- +// EgalTech 2014-2014 +//---------------------------------------------------------------------------- +// File : NgeKeyW.h Data : 13.04.14 Versione : 1.5d5 +// Contenuto : Parole chiave per file Nge. +// +// +// +// Modifiche : 13.04.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include "NgeConst.h" +#include "/EgtDev/Include/EGkGeoObjType.h" +#include + +//---------------------------------------------------------------------------- +// KeyWord per file NGE ASCII +//---------------------------------------------------------------------------- +const std::string NgeAscKeyW[] = { "START", // NGE_START + "END", // NGE_END + "MAT_DEF", // NGE_MAT_DEF + "A", // NGE_A + "G", // NGE_G + "P", // NGE_P + "A_GRP", // NGE_A_GRP + "X_CPY", // NGE_X_CPY + "G_VEC", // NGE_G_VEC + "G_PNT", // NGE_G_PNT + "G_FRM", // NGE_G_FRM + "C_LIN", // NGE_C_LIN + "C_ARC", // NGE_C_ARC + "C_BEZ", // NGE_C_BEZ + "C_CMP", // NGE_C_CMP + "S_TRM"} ; // NGE_S_TRM + +//---------------------------------------------------------------------------- +// KeyWord per file NGE BINARY +//---------------------------------------------------------------------------- +// basi per KeyWord binarie +const int NGEB_GEN_BASE = 0x0000 ; +const int NGEB_GDB_BASE = 0x1000 ; +const int NGEB_GEO_BASE = 0x2000 ; +// KeyWord binarie +const int NgeBinKeyW[] = { NGEB_GEN_BASE + 0x0F0F, // NGE_START + NGEB_GEN_BASE + 0x0FFF, // NGE_END + NGEB_GEN_BASE + 0x0100, // NGE_MAT_DEF + NGEB_GEN_BASE + 0x0200, // NGE_A + NGEB_GEN_BASE + 0x0201, // NGE_G + NGEB_GEN_BASE + 0x0202, // NGE_P + NGEB_GDB_BASE + 0x0000, // NGE_A_GRP + NGEB_GDB_BASE + 0x0001, // NGE_X_CPY + NGEB_GEO_BASE + GEO_VECT3D, // NGE_G_VEC + NGEB_GEO_BASE + GEO_PNT3D, // NGE_G_PNT + NGEB_GEO_BASE + GEO_FRAME3D, // NGE_G_FRM + NGEB_GEO_BASE + CRV_LINE, // NGE_C_LIN + NGEB_GEO_BASE + CRV_ARC, // NGE_C_ARC + NGEB_GEO_BASE + CRV_BEZ, // NGE_C_BEZ + NGEB_GEO_BASE + CRV_COMPO, // NGE_C_CMP + NGEB_GEO_BASE + SRF_TRIMESH} ; // NGE_S_TRM diff --git a/NgeWriter.cpp b/NgeWriter.cpp new file mode 100644 index 0000000..26ba0b5 --- /dev/null +++ b/NgeWriter.cpp @@ -0,0 +1,262 @@ +//---------------------------------------------------------------------------- +// EgalTech 2014-2014 +//---------------------------------------------------------------------------- +// File : NgeWriter.cpp Data : 13.04.14 Versione : 1.5d5 +// Contenuto : Implementazione della classe Writer. +// +// +// +// Modifiche : 13.04.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +//--------------------------- Include ---------------------------------------- +#include "stdafx.h" +#include "NgeWriter.h" +#include "NgeConst.h" +#include "NgeKeyW.h" +#include "/EgtDev/Include/EGkStringUtils3d.h" +#include "/EgtDev/Include/EgnStringConverter.h" + +using namespace std ; + +//---------------------------------------------------------------------------- +bool +NgeWriter::Init( const std::string& sFileOut, bool bBinary) +{ + // salvo tipo file + m_bBinary = bBinary ; + + // 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() ; +} + +//---------------------------------------------------------------------------- +bool +NgeWriter::Close( void) +{ + bool bOk = ( m_OutFile.good() && m_OutFile.is_open()) ; + + if ( m_OutFile.is_open()) + m_OutFile.close() ; + + return bOk ; +} + +//---------------------------------------------------------------------------- +void +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)) ; + else { + m_OutFile << ToString( ucVal) ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +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)) ; + else { + m_OutFile << ToString( bVal) ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +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)) ; + else { + m_OutFile << ToString( nVal) ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +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()) ; + } + else { + m_OutFile << sVal ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +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)) ; + else { + m_OutFile << ToString( vtV, nPrec) ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +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)) ; + else { + m_OutFile << ToString( ptP, nPrec) ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +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)) ; + } + else { + m_OutFile << ToString( ptP, dW, nPrecP, nPrecW) ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +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)) ; + } + else { + m_OutFile << ToString( frF, nPrecP, nPrecV) ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +NgeWriter::WriteKey( int nKey, bool bEndL) +{ + if ( ! m_OutFile.is_open()) + return ; + + if ( nKey < 0 || nKey > NGE_LAST_ID) + return ; + + if ( m_bBinary) + m_OutFile.write( (char*) &NgeBinKeyW[nKey], sizeof( int)) ; + else { + m_OutFile << NgeAscKeyW[nKey] ; + if ( bEndL) + m_OutFile << endl ; + } +} + +//---------------------------------------------------------------------------- +void +NgeWriter::WriteCol( const Color& cCol, const char* szSep, bool bEndL) +{ + if ( ! m_OutFile.is_open()) + return ; + + if ( m_bBinary) { + 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)) ; + } + else { + m_OutFile << ToString( cCol) ; + if ( szSep != nullptr) + m_OutFile << szSep ; + if ( bEndL) + m_OutFile << endl ; + } +} \ No newline at end of file diff --git a/NgeWriter.h b/NgeWriter.h new file mode 100644 index 0000000..fb2f12a --- /dev/null +++ b/NgeWriter.h @@ -0,0 +1,48 @@ +//---------------------------------------------------------------------------- +// EgalTech 2014-2014 +//---------------------------------------------------------------------------- +// File : NgeWriter.h Data : 12.04.14 Versione : 1.5d5 +// Contenuto : Dichiarazione della classe NgeWriter. +// +// +// +// Modifiche : 12.04.14 DS Creazione modulo. +// +// +//---------------------------------------------------------------------------- + +#pragma once + +#include "NgeConst.h" +#include "/EgtDev/Include/EGkPoint3d.h" +#include "/EgtDev/Include/EGkColor.h" +#include + +//---------------------------------------------------------------------------- +class NgeWriter +{ + public : + NgeWriter( void) : m_bBinary( false) {} + ~NgeWriter( void) + { Close() ; } + bool Init( const std::string& sFileOut, bool bBinary) ; + 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, + 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, bool bEndL) ; + void WriteCol( const Color& cCol, const char* szSep, bool bEndL = false) ; + + + private : + bool m_bBinary ; + std::ofstream m_OutFile ; + +} ; diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index e356b0b..cd24b42 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -15,6 +15,7 @@ #include "stdafx.h" #include "SurfTriMesh.h" #include "GeoObjFactory.h" +#include "NgeWriter.h" #include "Triangulate.h" #include "\EgtDev\Include\EGkStringUtils3d.h" #include "\EgtDev\Include\EGkPolyLine.h" @@ -23,7 +24,7 @@ using namespace std ; //---------------------------------------------------------------------------- -GEOOBJ_REGISTER( SRF_TRIMESH, "S_TRM", SurfTriMesh) ; +GEOOBJ_REGISTER( SRF_TRIMESH, NGE_S_TRM, SurfTriMesh) ; //---------------------------------------------------------------------------- SurfTriMesh::SurfTriMesh( void) @@ -297,6 +298,13 @@ SurfTriMesh::Copy( const SurfTriMesh& stmSrc) return true ; } +//---------------------------------------------------------------------------- +GeoObjType +SurfTriMesh::GetType( void) const +{ + return static_cast( GEOOBJ_GETTYPE( SurfTriMesh)) ; +} + //---------------------------------------------------------------------------- const string& SurfTriMesh::GetTitle( void) const @@ -320,41 +328,41 @@ SurfTriMesh::Dump( string& sOut, const char* szNewLine) const } //---------------------------------------------------------------------------- -const string& -SurfTriMesh::GetKey( void) const +int +SurfTriMesh::GetNgeId( void) const { - return GEOOBJ_GETKEY( SurfTriMesh) ; + return GEOOBJ_GETNGEID( SurfTriMesh) ; } //---------------------------------------------------------------------------- bool -SurfTriMesh::Save( ostream& osOut) const +SurfTriMesh::Save( NgeWriter& ngeOut) const { // flag aperta/chiusa - osOut << ToString( m_bClosed) << ";" ; + ngeOut.WriteBool( m_bClosed, ";") ; // numero di vertici - osOut << ToString( GetVertexNum()) << ";" ; + ngeOut.WriteInt( GetVertexNum(), ";") ; // numero di triangoli - osOut << ToString( GetTriangleNum()) << ";" << endl ; + ngeOut.WriteInt( GetTriangleNum(), ";", true) ; // ciclo sui vertici for ( int i = 0 ; i < int( m_vVert.size()) ; ++ i) { - osOut << ToString( i) << ";" ; - osOut << ToString( m_vVert[i].ptP) << ";" ; - osOut << ToString( m_vVert[i].nIdTria) << ";" ; - osOut << ToString( m_vVert[i].nFlag) << ";" << endl ; + ngeOut.WriteInt( i, ";") ; + ngeOut.WritePoint( m_vVert[i].ptP, ";") ; + ngeOut.WriteInt( m_vVert[i].nIdTria, ";") ; + ngeOut.WriteInt( m_vVert[i].nFlag, ";", true) ; } // ciclo sui triangoli for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) { - osOut << ToString( i) << ";" ; - osOut << ToString( m_vTria[i].nIdVert[0]) << "," ; - osOut << ToString( m_vTria[i].nIdVert[1]) << "," ; - osOut << ToString( m_vTria[i].nIdVert[2]) << ";" ; - osOut << ToString( m_vTria[i].nIdAdjac[0]) << "," ; - osOut << ToString( m_vTria[i].nIdAdjac[1]) << "," ; - osOut << ToString( m_vTria[i].nIdAdjac[2]) << ";" ; - osOut << ToString( m_vTria[i].vtN) << ";" ; - osOut << ToString( m_vTria[i].nTFlag) << ";" ; - osOut << ToString( m_vTria[i].nEFlag) << ";" << endl ; + 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 true ; diff --git a/SurfTriMesh.h b/SurfTriMesh.h index ff7947c..40cf488 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -15,6 +15,7 @@ #include "ObjGraphicsMgr.h" #include "DllMain.h" +#include "GeoObjRW.h" #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EgtNumCollection.h" @@ -58,19 +59,18 @@ class StmTria } ; //---------------------------------------------------------------------------- -class SurfTriMesh : public ISurfTriMesh +class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW { public : // IGeoObj virtual ~SurfTriMesh( void) ; virtual SurfTriMesh* Clone( void) const ; - virtual GeoObjType GetType( void) const - { return SRF_TRIMESH ; } + virtual GeoObjType GetType( void) const ; virtual bool IsValid( void) const { return ( m_nStatus == OK) ; } virtual const std::string& GetTitle( void) const ; virtual bool Dump( std::string& sOut, const char* szNewLine = "\n") const ; - virtual const std::string& GetKey( void) const ; - virtual bool Save( std::ostream& osOut) const ; + virtual int GetNgeId( void) const ; + virtual bool Save( NgeWriter& ngeOut) const ; virtual bool Load( Scanner& TheScanner) ; virtual bool GetLocalBBox( BBox3d& b3Loc) const ; virtual bool GetBBox( const Frame3d& frRef, BBox3d& b3Ref) const ;