diff --git a/CurveArc.h b/CurveArc.h index 3879e20..e8ea208 100644 --- a/CurveArc.h +++ b/CurveArc.h @@ -186,7 +186,10 @@ class CurveArc : public ICurveArc, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : CurveArc( void) ; diff --git a/CurveBezier.h b/CurveBezier.h index f87d649..d50106c 100644 --- a/CurveBezier.h +++ b/CurveBezier.h @@ -151,7 +151,10 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : CurveBezier( void) ; diff --git a/CurveComposite.h b/CurveComposite.h index ee458fc..d682158 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -181,7 +181,10 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : CurveComposite( void) ; diff --git a/CurveLine.h b/CurveLine.h index e7d5de0..b337501 100644 --- a/CurveLine.h +++ b/CurveLine.h @@ -146,7 +146,10 @@ class CurveLine : public ICurveLine, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : CurveLine( void) ; diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index e7c1fc4..1aba0ff 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/ExtDimension.h b/ExtDimension.h index 4e6e043..b7f6681 100644 --- a/ExtDimension.h +++ b/ExtDimension.h @@ -110,7 +110,10 @@ class ExtDimension : public IExtDimension, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : ExtDimension( void) ; diff --git a/ExtText.h b/ExtText.h index df50ff3..4fe91f0 100644 --- a/ExtText.h +++ b/ExtText.h @@ -113,7 +113,10 @@ class ExtText : public IExtText, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : ExtText( void) ; diff --git a/GdbGeo.cpp b/GdbGeo.cpp index 31ea3a7..6a45c37 100644 --- a/GdbGeo.cpp +++ b/GdbGeo.cpp @@ -101,6 +101,10 @@ GdbGeo::Save( int nBaseId, NgeWriter& ngeOut, INTUNORDSET* pSavedIds) const if ( pGObjRW == nullptr) return false ; + // eventuali modifiche prima del salvataggio + if ( ! pGObjRW->PreSave( * const_cast( this))) + return false ; + // tipo entità e identificativi if ( ! ngeOut.WriteKey( pGObjRW->GetNgeId())) return false ; @@ -124,7 +128,11 @@ GdbGeo::Save( int nBaseId, NgeWriter& ngeOut, INTUNORDSET* pSavedIds) const // parametri geometrici if ( ! ngeOut.WriteKey( NGE_G)) return false ; - return pGObjRW->Save( ngeOut) ; + if ( ! pGObjRW->Save( ngeOut)) + return false ; + + // eventuali ripristini dopo il salvataggio + return pGObjRW->PostSave( * const_cast( this)) ; } //---------------------------------------------------------------------------- @@ -181,7 +189,7 @@ GdbGeo::Load( int nNgeId, NgeReader& ngeIn, int nBaseGdbId, int& nParentId) // parametri geometrici IGeoObjRW* pGObjRW = dynamic_cast( m_pGeoObj) ; - return ( pGObjRW != nullptr && pGObjRW->Load( ngeIn)) ; + return ( pGObjRW != nullptr && pGObjRW->Load( ngeIn) && pGObjRW->PostLoad( *this)) ; } //---------------------------------------------------------------------------- diff --git a/GeoFrame3d.h b/GeoFrame3d.h index f4333a4..3181419 100644 --- a/GeoFrame3d.h +++ b/GeoFrame3d.h @@ -83,7 +83,10 @@ class GeoFrame3d : public IGeoFrame3d, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : GeoFrame3d( void) ; diff --git a/GeoObjRW.h b/GeoObjRW.h index f9e1f3f..c474885 100644 --- a/GeoObjRW.h +++ b/GeoObjRW.h @@ -1,13 +1,13 @@ //---------------------------------------------------------------------------- -// EgalTech 2014-2014 +// EgalTech 2014-2024 //---------------------------------------------------------------------------- -// File : GeoObjRW.h Data : 14.03.14 Versione : 1.5d5 +// File : GeoObjRW.h Data : 08.03.24 Versione : 2.6c2 // Contenuto : Dichiarazione della interfaccia IGeoObjRW. // // // // Modifiche : 20.11.13 DS Creazione modulo. -// +// 08.03.24 DS Aggiunte PreSave, PostSave, PreLoad e PostLoad. // //---------------------------------------------------------------------------- @@ -15,6 +15,7 @@ class NgeWriter ; class NgeReader ; +class GdbGeo ; //----------------------------------------------------------------------------- class __declspec( novtable) IGeoObjRW @@ -22,5 +23,8 @@ class __declspec( novtable) IGeoObjRW public : virtual int GetNgeId( void) const = 0 ; virtual bool Save( NgeWriter& ngeOut) const = 0 ; + virtual bool PreSave( GdbGeo& Wrapper) const = 0 ; + virtual bool PostSave( GdbGeo& Wrapper) const = 0 ; virtual bool Load( NgeReader& ngeIn) = 0 ; + virtual bool PostLoad( GdbGeo& Wrapper) = 0 ; } ; diff --git a/GeoPoint3d.h b/GeoPoint3d.h index 7b52970..29214a7 100644 --- a/GeoPoint3d.h +++ b/GeoPoint3d.h @@ -77,7 +77,10 @@ class GeoPoint3d : public IGeoPoint3d, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : GeoPoint3d( void) ; diff --git a/GeoVector3d.h b/GeoVector3d.h index 34e8106..9bfab31 100644 --- a/GeoVector3d.h +++ b/GeoVector3d.h @@ -91,7 +91,10 @@ class GeoVector3d : public IGeoVector3d, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : GeoVector3d( void) ; diff --git a/SurfBezier.h b/SurfBezier.h index 9f357d1..34b1e7f 100644 --- a/SurfBezier.h +++ b/SurfBezier.h @@ -116,7 +116,10 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : SurfBezier( void) ; diff --git a/SurfFlatRegion.h b/SurfFlatRegion.h index dcfb642..f41bc41 100644 --- a/SurfFlatRegion.h +++ b/SurfFlatRegion.h @@ -109,7 +109,10 @@ class SurfFlatRegion : public ISurfFlatRegion, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override { return true ; } + bool PostSave( GdbGeo& Wrapper) const override { return true ; } bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override { return true ; } public : SurfFlatRegion( void) ; diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index 2d9903d..c2d741c 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -16,6 +16,7 @@ #include "stdafx.h" #include "SurfTriMesh.h" #include "GeoObjFactory.h" +#include "GdbGeo.h" #include "NgeWriter.h" #include "NgeReader.h" #include "SurfFlatRegion.h" @@ -41,8 +42,9 @@ GEOOBJ_REGISTER( SRF_TRIMESH, NGE_S_TRM, SurfTriMesh) ; //---------------------------------------------------------------------------- SurfTriMesh::SurfTriMesh( void) : m_nStatus( TO_VERIFY), m_dLinTol( STM_STD_LIN_TOL), m_dBoundaryAng( STM_STD_BOUNDARY_ANG), - m_dSmoothAng( STM_STD_SMOOTH_ANG), m_bOriented( false), m_bClosed( false), m_bFaceted( false), m_bFacEdged( false), - m_nTimeStamp( 0), m_nTempProp{0,0}, m_dTempParam{0.0,0.0}, m_nMaxTFlag( 0), m_nParts( -1), m_pHGrd3d( nullptr) + m_dSmoothAng( STM_STD_SMOOTH_ANG), m_bShowEdges( false), m_bOriented( false), m_bClosed( false), + m_bFaceted( false), m_bFacEdged( false), m_nTimeStamp( 0), m_nTempProp{0,0}, m_dTempParam{0,0}, + m_nMaxTFlag( 0), m_nParts( -1), m_pHGrd3d( nullptr) { m_dCosBndAng = cos( m_dBoundaryAng * DEGTORAD) ; m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ; @@ -59,7 +61,7 @@ bool SurfTriMesh::Init( int nNumVert, int nNumTria, int nNumFacet) { // imposto ricalcolo della grafica e di hashgrids3d - m_OGrMgr.Reset() ; + m_OGrMgr.Clear() ; ResetHashGrids3d() ; // se superficie vuota if ( nNumVert == 0 && nNumTria == 0 && nNumFacet == 0) @@ -91,6 +93,12 @@ bool SurfTriMesh::Clear( void) { m_nStatus = OK ; + m_dLinTol = STM_STD_LIN_TOL ; + m_dBoundaryAng = STM_STD_BOUNDARY_ANG ; + m_dCosBndAng = cos( m_dBoundaryAng * DEGTORAD) ; + m_dSmoothAng = STM_STD_SMOOTH_ANG ; + m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ; + m_bShowEdges = false ; m_bOriented = false ; m_bClosed = false ; m_bFaceted = false ; @@ -98,7 +106,13 @@ SurfTriMesh::Clear( void) m_vVert.clear() ; m_vTria.clear() ; m_vFacet.clear() ; + m_OGrMgr.Clear() ; ResetHashGrids3d() ; + m_nTimeStamp = 0 ; + m_nTempProp[0] = 0 ; + m_nTempProp[1] = 0 ; + m_dTempParam[0] = 0 ; + m_dTempParam[1] = 0 ; m_nMaxTFlag = 0 ; m_nParts = -1 ; return true ; @@ -875,7 +889,7 @@ SurfTriMesh::GetTriangleSmoothNormal( int nT, int nV, Vector3d& vtN) const SurfTriMesh* SurfTriMesh::CloneTriangle( int nT) const { - // verifico validit� superficie ed esistenza del triangolo + // verifico validità superficie ed esistenza del triangolo if ( ! IsValid() || nT < 0 || nT >= GetTriangleSize() || m_vTria[nT].nIdVert[0] == SVT_DEL) return nullptr ; @@ -982,7 +996,7 @@ SurfTriMesh::GetLoops( POLYLINEVECTOR& vPL) const if ( ! MarchAlongLoop( nT, 1, m_nTimeStamp, vPL.back())) return false ; } - // se il lato 0 � di contorno + // se il lato 0 è di contorno else if ( nAdjT[0] == SVT_NULL) { // ho trovato l'inizio di un loop vPL.emplace_back() ; @@ -994,7 +1008,7 @@ SurfTriMesh::GetLoops( POLYLINEVECTOR& vPL) const if ( ! MarchAlongLoop( nT, 1, m_nTimeStamp, vPL.back())) return false ; } - // se il lato 1 � di contorno + // se il lato 1 è di contorno else if ( nAdjT[1] == SVT_NULL) { // ho trovato l'inizio di un loop vPL.emplace_back() ; @@ -1006,7 +1020,7 @@ SurfTriMesh::GetLoops( POLYLINEVECTOR& vPL) const if ( ! MarchAlongLoop( nT, 2, m_nTimeStamp, vPL.back())) return false ; } - // se il lato 2 � di contorno + // se il lato 2 è di contorno else if ( nAdjT[2] == SVT_NULL) { // ho trovato l'inizio di un loop vPL.emplace_back() ; @@ -1018,7 +1032,7 @@ SurfTriMesh::GetLoops( POLYLINEVECTOR& vPL) const if ( ! MarchAlongLoop( nT, 0, m_nTimeStamp, vPL.back())) return false ; } - // altrimenti non c'� contorno + // altrimenti non c'è contorno else { // marco il triangolo come verificato m_vTria[nT].nTemp = m_nTimeStamp ; @@ -1063,10 +1077,10 @@ SurfTriMesh::MarchOneTria( int& nT, int& nV, int nTimeStamp, return false ; // vertice di fine adiacenza e indice del successivo lato int nAdjV = Next( nAdjS) ; - // verifico se il lato successivo � un bordo + // verifico se il lato successivo è un bordo int nNextT = m_vTria[nAdjT].nIdAdjac[nAdjV] ; if ( nNextT == SVT_NULL) { - // se gi� recuperato + // se già recuperato if ( m_vTria[nAdjT].nTemp == nTimeStamp) { bEnd = true ; return true ; @@ -1197,6 +1211,7 @@ SurfTriMesh::CopyFrom( const SurfTriMesh& stmSrc) m_dCosBndAng = stmSrc.m_dCosBndAng ; m_dSmoothAng = stmSrc.m_dSmoothAng ; m_dCosSmAng = stmSrc.m_dCosSmAng ; + m_bShowEdges = stmSrc.m_bShowEdges ; m_bOriented = stmSrc.m_bOriented ; m_bClosed = stmSrc.m_bClosed ; m_bFaceted = stmSrc.m_bFaceted ; @@ -1332,12 +1347,33 @@ SurfTriMesh::Save( NgeWriter& ngeOut) const return true ; } +//---------------------------------------------------------------------------- +bool +SurfTriMesh::PreSave( GdbGeo& Wrapper) const +{ + // salvo il flag di visualizzazione spigoli vivi anche in shading (default false) + if ( m_bShowEdges) + Wrapper.SetInfo( GDB_SI_SHOWEDGES, true) ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +SurfTriMesh::PostSave( GdbGeo& Wrapper) const +{ + // elimino eventuali info aggiunte nella PreSave + Wrapper.RemoveInfo( GDB_SI_SHOWEDGES) ; + + return true ; +} + //---------------------------------------------------------------------------- bool SurfTriMesh::Load( NgeReader& ngeIn) { // imposto ricalcolo della grafica, della connessione e di hashgrids3d - m_OGrMgr.Reset() ; + m_OGrMgr.Clear() ; m_nMaxTFlag = 0 ; m_nParts = -1 ; ResetHashGrids3d() ; @@ -1434,6 +1470,20 @@ SurfTriMesh::Load( NgeReader& ngeIn) return Validate() ; } +//---------------------------------------------------------------------------- +bool +SurfTriMesh::PostLoad( GdbGeo& Wrapper) +{ + // recupero eventuale flag di visualizzazione spigoli vivi anche in shading + bool bVal ; + if ( Wrapper.GetInfo( GDB_SI_SHOWEDGES, bVal)) { + m_bShowEdges = bVal ; + Wrapper.RemoveInfo( GDB_SI_SHOWEDGES) ; + } + + return true ; +} + //---------------------------------------------------------------------------- bool SurfTriMesh::Validate( bool bCorrect) @@ -3643,6 +3693,7 @@ SurfTriMesh::ResetTFlags( void) for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) m_vTria[i].nTFlag = 0 ; m_nMaxTFlag = 0 ; + m_OGrMgr.Clear() ; return true ; } diff --git a/SurfTriMesh.h b/SurfTriMesh.h index e78f3f5..c6c732b 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -226,6 +226,9 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW { m_dSmoothAng = std::max( dSmoothAngDeg, EPS_ANG_SMALL) ; m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ; m_OGrMgr.Reset() ; } + void SetShowEdges( bool bShow) override + { m_bShowEdges = bShow ; // qui è necessario far ricreare la grafica + m_OGrMgr.Clear() ; } int AddVertex( const Point3d& ptVert, double dU = -1, double dV = -1) override ; bool MoveVertex( int nInd, const Point3d& ptNewVert) override ; int AddTriangle( const int nIdVert[3], int nTFlag = 0) override ; @@ -254,6 +257,8 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW { return m_dLinTol ; } double GetSmoothAngle( void) const override { return m_dSmoothAng ; } + bool GetShowEdges( void) const override + { return m_bShowEdges ; } bool GetVertex( int nId, Point3d& ptP) const override ; bool GetVertexParam( int nId, double& dU, double& dV) const override ; int GetFirstVertex( Point3d& ptP) const override ; @@ -320,7 +325,10 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override ; + bool PostSave( GdbGeo& Wrapper) const override ; bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override ; public : SurfTriMesh( void) ; @@ -413,6 +421,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW double m_dCosBndAng ; // coseno dell'angolo limite per considerare un lato un contorno double m_dSmoothAng ; // angolo limite per mediare le normali (in gradi) double m_dCosSmAng ; // coseno dell'angolo limite per mediare le normali + bool m_bShowEdges ; // flag di visualizzazione spigoli vivi bool m_bOriented ; // la superficie è orientata consistentemente in tutte le sue parti bool m_bClosed ; // la superficie racchiude un volume bool m_bFaceted ; // flag di validità della sfaccettatura diff --git a/SurfTriMeshFaceting.cpp b/SurfTriMeshFaceting.cpp index 2b9df41..2f99525 100644 --- a/SurfTriMeshFaceting.cpp +++ b/SurfTriMeshFaceting.cpp @@ -901,7 +901,7 @@ SurfTriMesh::UpdateFacetEdging( void) int nTAdj = Tria.nIdAdjac[nE] ; if ( Tria.nETempFlag[nE] == 0) { if ( nTAdj == SVT_NULL) { - m_vFacEdge.emplace_back( Tria.nIdVert[nE], Tria.nIdVert[nE2], Tria.nIdFacet, SVT_NULL, 0.) ; + m_vFacEdge.emplace_back( Tria.nIdVert[nE], Tria.nIdVert[nE2], Tria.nIdFacet, SVT_NULL, 180.) ; } else if ( Tria.nIdFacet != m_vTria[nTAdj].nIdFacet) { // calcolo l'angolo tra le facce ( 0 = allineate, > 0 convesse, < 0 concave) diff --git a/VolZmap.cpp b/VolZmap.cpp index eb6e225..7142e7e 100644 --- a/VolZmap.cpp +++ b/VolZmap.cpp @@ -14,10 +14,11 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "VolZmap.h" -#include "DistPointLine.h" #include "GeoObjFactory.h" +#include "GdbGeo.h" #include "NgeWriter.h" #include "NgeReader.h" +#include "DistPointLine.h" #include "GeoConst.h" #include "/EgtDev/Include/EGkIntersLinePlane.h" #include "/EgtDev/Include/EGkUiUnits.h" @@ -34,7 +35,8 @@ GEOOBJ_REGISTER( VOL_ZMAP, NGE_V_ZMP, VolZmap) ; //---------------------------------------------------------------------------- VolZmap::VolZmap(void) - : m_nStatus( TO_VERIFY), m_nTempProp{0,0}, m_dTempParam{0.0,0.0}, m_dStep( 10.0), m_nMapNum( 0), m_nShape( GENERIC), m_nVoxNumPerBlock( N_VOXBLOCK), + : m_nStatus( TO_VERIFY), m_nTempProp{0,0}, m_dTempParam{0.0,0.0}, m_bShowEdges( false), + m_dStep( 10.0), m_nMapNum( 0), m_nShape( GENERIC), m_nVoxNumPerBlock( N_VOXBLOCK), m_nDexVoxRatio( 1), m_nNumBlock( 0), m_nConnectedCompoCount( 0), m_nCurrTool( -1), m_dToolLinTol( LIN_TOL_STD), m_dToolAngTolDeg( ANG_TOL_APPROX_DEG) { @@ -60,8 +62,16 @@ bool VolZmap::Clear( void) { m_nStatus = TO_VERIFY ; + m_nTempProp[0] = 0 ; + m_nTempProp[1] = 0 ; + m_dTempParam[0] = 0.0 ; + m_dTempParam[1] = 0.0 ; + m_bShowEdges = false ; + m_dStep = 10.0 ; m_nMapNum = 0 ; m_nShape = GENERIC ; + m_nVoxNumPerBlock = N_VOXBLOCK ; + m_nDexVoxRatio = 1 ; m_nNumBlock = 0 ; m_nConnectedCompoCount = 0 ; m_MapFrame.Reset() ; @@ -73,17 +83,12 @@ VolZmap::Clear( void) m_dMaxZ[i] = 0 ; m_Values[i].clear() ; } - m_dStep = EPS_SMALL ; - m_nTempProp[0] = 0 ; - m_nTempProp[1] = 0 ; - m_dTempParam[0] = 0.0 ; - m_dTempParam[1] = 0.0 ; m_vTool.resize( 1) ; m_nCurrTool = 0 ; m_dToolLinTol = LIN_TOL_STD ; m_dToolAngTolDeg = ANG_TOL_APPROX_DEG ; - // imposto ricalcolo della grafica - m_OGrMgr.Reset() ; + // imposto ri-creazione della grafica + m_OGrMgr.Clear() ; return true ; } @@ -150,6 +155,7 @@ VolZmap::CopyFrom( const VolZmap& vzmSrc) m_nTempProp[1] = vzmSrc.m_nTempProp[1] ; m_dTempParam[0] = vzmSrc.m_dTempParam[0] ; m_dTempParam[1] = vzmSrc.m_dTempParam[1] ; + m_bShowEdges = vzmSrc.m_bShowEdges ; // dimensiono membri legati ai blocchi m_BlockToUpdate = vzmSrc.m_BlockToUpdate ; @@ -175,7 +181,7 @@ VolZmap::CopyFrom( const VolZmap& vzmSrc) bool VolZmap::ResetGraphics( void) { - m_OGrMgr.Reset() ; + m_OGrMgr.Clear() ; for ( int nCount = 0 ; nCount < m_nNumBlock ; ++ nCount) m_BlockToUpdate[nCount] = true ; return true ; @@ -318,6 +324,27 @@ VolZmap::Save( NgeWriter& ngeOut) const return true ; } +//---------------------------------------------------------------------------- +bool +VolZmap::PreSave( GdbGeo& Wrapper) const +{ + // salvo il flag di visualizzazione spigoli vivi anche in shading (default false) + if ( m_bShowEdges) + Wrapper.SetInfo( GDB_SI_SHOWEDGES, true) ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +VolZmap::PostSave( GdbGeo& Wrapper) const +{ + // elimino eventuali info aggiunte nella PreSave + Wrapper.RemoveInfo( GDB_SI_SHOWEDGES) ; + + return true ; +} + //---------------------------------------------------------------------------- bool VolZmap::Load( NgeReader& ngeIn) @@ -430,6 +457,20 @@ VolZmap::Load( NgeReader& ngeIn) return true ; } +//---------------------------------------------------------------------------- +bool +VolZmap::PostLoad( GdbGeo& Wrapper) +{ + // recupero eventuale flag di visualizzazione spigoli vivi anche in shading + bool bVal ; + if ( Wrapper.GetInfo( GDB_SI_SHOWEDGES, bVal)) { + m_bShowEdges = bVal ; + Wrapper.RemoveInfo( GDB_SI_SHOWEDGES) ; + } + + return true ; +} + //---------------------------------------------------------------------------- bool VolZmap::GetLocalBBox( BBox3d& b3Loc, int nFlag) const @@ -1620,12 +1661,12 @@ VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt) bool VolZmap::IsMapPartABox( int nMap, int nInfI, int nSupI, int nInfJ, int nSupJ, double& dMinZ, double& dMaxZ) { + if ( ! m_bIsBox) + return true ; dMinZ = m_dMaxZ[nMap] ; dMaxZ = m_dMinZ[nMap] ; for ( int i = nInfI ; i < nSupI ; ++ i) { for ( int j = nInfJ ; j < nSupJ ; ++ j) { - if ( ! m_bIsBox) - return true ; int n = j * m_nNx[nMap] + i ; int nSize = int( m_Values[nMap][n].size()) ; if ( nSize > 1) diff --git a/VolZmap.h b/VolZmap.h index 40cfeb9..17e8656 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -91,6 +91,11 @@ class VolZmap : public IVolZmap, public IGeoObjRW int GetResolution( void) const override { return m_nDexVoxRatio ; } bool ChangeResolution( int nDexVoxRatio) override ; + void SetShowEdges( bool bShow) override + { m_bShowEdges = bShow ; // qui è necessario far ricreare la grafica + m_OGrMgr.Clear() ; } + bool GetShowEdges( void) const override + { return m_bShowEdges ; } bool SetToolTolerances( double dLinTol, double dAngTolDeg = 90) override ; bool SetStdTool( const std::string& sToolName, double dH, double dR, double dCornR, double dCutterH, int nFlag, bool bFirst) override ; @@ -139,7 +144,10 @@ class VolZmap : public IVolZmap, public IGeoObjRW public : // IGeoObjRW int GetNgeId( void) const override ; bool Save( NgeWriter& ngeOut) const override ; + bool PreSave( GdbGeo& Wrapper) const override ; + bool PostSave( GdbGeo& Wrapper) const override ; bool Load( NgeReader& ngeIn) override ; + bool PostLoad( GdbGeo& Wrapper) override ; public : VolZmap( void) ; @@ -192,22 +200,18 @@ class VolZmap : public IVolZmap, public IGeoObjRW std::vector vbFlipped ; } ; // Triangoli smooth - struct SmoothTriaStruct { + struct SmoothTriaStruct { int i, j, k ; TRIA3DEXVECTOR vTria ; - }; - // Vettore di SharpTriaStruct con sharp feature - typedef std::vector SharpTriHolder ; - // Vettore di SmoothTriaStruct con triangoli smooth - typedef std::vector SmoothTriHolder ; - // Vettore di SharpTriHolder con sharp feature: il primo indice individua il blocco, il secondo il voxel - typedef std::vector SharpTriaMatrix ; - // Vettore di SmoothTriHolder smooth: il primo indice individua il blocco, il secondo il voxel - typedef std::vector SmoothTriaMatrix ; + } ; + // Matrice di SharpTriaStruct con sharp feature: il primo indice individua il blocco, il secondo il voxel + typedef std::vector> SharpTriaMatrix ; + // Matrice di SmoothTriaStruct con triangoli smooth: il primo indice individua il blocco, il secondo il voxel + typedef std::vector> SmoothTriaMatrix ; // Tavola hash di Voxel - typedef std::unordered_map VoxelContainer ; + typedef std::unordered_map VoxelContainer ; // Unordered map per la coerenza topologica - typedef std::unordered_map InterVoxMatter ; + typedef std::unordered_map InterVoxMatter ; private : bool CopyFrom( const VolZmap& clSrc) ; @@ -419,9 +423,10 @@ class VolZmap : public IVolZmap, public IGeoObjRW Status m_nStatus ; // stato int m_nTempProp[2] ; // vettore proprietà temporanee double m_dTempParam[2] ; // vettore parametri temporanei + bool m_bShowEdges ; // flag di visualizzazione spigoli vivi + Frame3d m_MapFrame ; // riferimento intrinseco dello Zmap double m_dStep ; // passo delle griglie int m_nMapNum ; // numero di griglie ( 1 o 3) - Frame3d m_MapFrame ; // riferimento intrinseco dello Zmap int m_nNx[N_MAPS] ; // dimensione di ciascuna griglia in X int m_nNy[N_MAPS] ; // dimensione di ciascuna griglia in Y int m_nDim[N_MAPS] ; // dimensione di ciascuna griglia ( X * Y) @@ -439,7 +444,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW } ; std::vector> m_Values[N_MAPS] ; // dexel delle 3 griglie - int m_nShape ; // Forma : 0 generica, 1 box, 2 estrusione + int m_nShape ; // Forma : 0 generica, 1 box, 2 estrusione int m_nVoxNumPerBlock ; // Numero di voxel per blocco int m_nDexVoxRatio ; // Rapporto dexel voxel @@ -465,7 +470,6 @@ class VolZmap : public IVolZmap, public IGeoObjRW mutable std::vector m_SliceYZ ; mutable std::mutex m_SliceMutex ; - mutable std::atomic m_bBreak ; std::atomic m_bIsBox ; int m_nCurrTool ; diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index 938d4ae..d79817f 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -4673,23 +4673,19 @@ VolZmap::GetEdges( ICURVEPOVECTOR& vpCurve) const PtrOwner pCrvCompo( CreateBasicCurveComposite()) ; if ( IsNull( pCrvCompo)) return false ; - // recupero gli estremi dei segmenti, creo le linee e le inserisco nella composita + // recupero gli estremi dei segmenti e li inserisco nella composita for ( int i = 0 ; i < int( vId.size()) ; ++ i) { - // creo un segmento di retta + // recupero indice e flag di inversione int nInd = abs( vId[i]) - 1 ; bool bInvert = ( vId[i] < 0) ; - PtrOwner pLine( CreateBasicCurveLine()) ; - if ( IsNull( pLine) || ! pLine->Set( vBpt[nInd].first, vBpt[nInd].second)) - continue ; - if ( bInvert) - pLine->Invert() ; - // lo accodo alla composita - if ( ! pCrvCompo->AddCurve( Release( pLine), true, 1.1 * dToler) && - ! AreSamePointApprox( ptNear, ( bInvert ? vBpt[nInd].first : vBpt[nInd].second))) - return false ; - // aggiorno il prossimo near - ptNear = ( bInvert ? vBpt[nInd].first : vBpt[nInd].second) ; + // se primo segmento, inserisco il punto iniziale + if ( i == 0) + pCrvCompo->AddPoint( ! bInvert ? vBpt[nInd].first : vBpt[nInd].second) ; + // aggiungo il punto finale + pCrvCompo->AddLine( ! bInvert ? vBpt[nInd].second : vBpt[nInd].first) ; } + // aggiorno il prossimo near + pCrvCompo->GetEndPoint( ptNear) ; // se lunghezza curva inferiore a 5 volte la tolleranza, la salto double dCrvLen ; if ( ! pCrvCompo->GetLength( dCrvLen) || dCrvLen < 5 * dToler)