diff --git a/Color.cpp b/Color.cpp index be8d844..e175891 100644 --- a/Color.cpp +++ b/Color.cpp @@ -117,7 +117,7 @@ GetHSVFromColor( const Color& cCol) double dDelta = dMax - dMin ; if ( dDelta < EPS_ZERO) - return HSV( dMax, 0, 0) ; + return HSV( 0, 0, dMax) ; if ( dMax < EPS_ZERO) return HSV( 0, 0, 0) ; diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 8df6dd1..df507ee 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/ObjGraphicsMgr.h b/ObjGraphicsMgr.h index 02db255..7a55aa8 100644 --- a/ObjGraphicsMgr.h +++ b/ObjGraphicsMgr.h @@ -22,6 +22,8 @@ class ObjGraphicsMgr public : ObjGraphicsMgr( void) : m_pOGr( nullptr) {} ~ObjGraphicsMgr( void) + { Clear() ; } + void Clear( void) { if ( m_pOGr != nullptr) delete m_pOGr ; m_pOGr = nullptr ; } diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index 897df53..c1e9dde 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -38,7 +38,7 @@ 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_nTimeStamp( 0), m_nTempProp( 0), m_pHGrd3d( nullptr), m_nParts( -1) + m_nTimeStamp( 0), m_nTempProp( 0), m_nMaxTFlag( 0), m_nParts( -1), m_pHGrd3d( nullptr) { m_dCosBndAng = cos( m_dBoundaryAng * DEGTORAD) ; m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ; @@ -76,6 +76,8 @@ SurfTriMesh::Init( int nNumVert, int nNumTria, int nNumFacet) // completo inizializzazione m_nStatus = OK ; m_bClosed = false ; + m_nMaxTFlag = 0 ; + m_nParts = -1 ; return true ; } @@ -127,7 +129,7 @@ SurfTriMesh::SetVertex( int nInd, const StmVert& vV) //---------------------------------------------------------------------------- int -SurfTriMesh::AddTriangle( const int nIdVert[3]) +SurfTriMesh::AddTriangle( const int nIdVert[3], int nTFlag) { // verifico che i tre indici siano diversi if ( nIdVert[0] == nIdVert[1] || @@ -160,8 +162,10 @@ SurfTriMesh::AddTriangle( const int nIdVert[3]) m_OGrMgr.Reset() ; ResetHashGrids3d() ; // inserisco il triangolo - try { m_vTria.emplace_back( nIdVert) ;} + try { m_vTria.emplace_back( nIdVert, nTFlag) ;} catch(...) { return SVT_NULL ;} + // aggiorno massimo TFlag + m_nMaxTFlag = max( m_nMaxTFlag, nTFlag) ; // ne determino l'indice return int( m_vTria.size() - 1) ; } @@ -193,6 +197,8 @@ SurfTriMesh::SetTriangle( int nInd, const StmTria& tT) } // inserisco il triangolo m_vTria[nInd] = tT ; + // aggiorno massimo TFlag + m_nMaxTFlag = max( m_nMaxTFlag, tT.nTFlag) ; return true ; } @@ -368,14 +374,28 @@ SurfTriMesh::GetVertexCount( void) const int SurfTriMesh::GetTriangleCount( void) const { - // calcolo il numero dei triangoli cancellati - int nErased = 0 ; + // calcolo il numero dei triangoli validi + int nCount = 0 ; for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) { - if ( m_vTria[nId].nIdVert[0] == SVT_DEL) - ++ nErased ; + if ( m_vTria[nId].nIdVert[0] != SVT_DEL) + ++ nCount ; } - return ( GetTriangleSize() - nErased) ; + return nCount ; +} + +//---------------------------------------------------------------------------- +int +SurfTriMesh::GetTriangleCount( int nTFlag) const +{ + // calcolo il numero dei triangoli con flag indicato e non cancellati + int nCount = 0 ; + for ( int nId = 0 ; nId < GetTriangleSize() ; ++ nId) { + if ( m_vTria[nId].nIdVert[0] != SVT_DEL && m_vTria[nId].nTFlag == nTFlag) + ++ nCount ; + } + + return nCount ; } //---------------------------------------------------------------------------- @@ -466,6 +486,7 @@ SurfTriMesh::GetTriangle( int nId, Triangle3d& Tria) const m_vVert[m_vTria[nId].nIdVert[1]].ptP, m_vVert[m_vTria[nId].nIdVert[2]].ptP, m_vTria[nId].vtN) ; + Tria.SetGrade( m_vTria[nId].nTFlag) ; return true ; } @@ -492,6 +513,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3d& Tria) const m_vVert[m_vTria[nId].nIdVert[1]].ptP, m_vVert[m_vTria[nId].nIdVert[2]].ptP, m_vTria[nId].vtN) ; + Tria.SetGrade( m_vTria[nId].nTFlag) ; // ritorno indice triangolo corrente return nId ; } @@ -508,6 +530,7 @@ SurfTriMesh::GetTriangle( int nId, Triangle3dEx& Tria) const m_vVert[m_vTria[nId].nIdVert[1]].ptP, m_vVert[m_vTria[nId].nIdVert[2]].ptP, m_vTria[nId].vtN) ; + Tria.SetGrade( m_vTria[nId].nTFlag) ; GetTriangleBoundaryEdges( nId, const_cast( Tria.GetTriFlags())) ; GetTriangleSmoothNormals( nId, const_cast( Tria.GetTriNormals())) ; return true ; @@ -536,6 +559,7 @@ SurfTriMesh::GetNextTriangle( int nId, Triangle3dEx& Tria) const m_vVert[m_vTria[nId].nIdVert[1]].ptP, m_vVert[m_vTria[nId].nIdVert[2]].ptP, m_vTria[nId].vtN) ; + Tria.SetGrade( m_vTria[nId].nTFlag) ; GetTriangleBoundaryEdges( nId, const_cast( Tria.GetTriFlags())) ; GetTriangleSmoothNormals( nId, const_cast( Tria.GetTriNormals())) ; // ritorno indice triangolo corrente @@ -987,6 +1011,7 @@ SurfTriMesh::CopyFrom( const SurfTriMesh& stmSrc) m_vFacet = stmSrc.m_vFacet ; m_nTimeStamp = stmSrc.m_nTimeStamp ; m_nTempProp = stmSrc.m_nTempProp ; + m_nMaxTFlag = stmSrc.m_nMaxTFlag ; m_nParts = stmSrc.m_nParts ; return true ; } @@ -1114,6 +1139,7 @@ SurfTriMesh::Load( NgeReader& ngeIn) { // imposto ricalcolo della grafica, della connessione e di hashgrids3d m_OGrMgr.Reset() ; + m_nMaxTFlag = 0 ; m_nParts = -1 ; ResetHashGrids3d() ; // leggo la prossima linea ( 2 parametri : dLinTol e dSmoothAng) @@ -3601,7 +3627,7 @@ SurfTriMesh::ClonePart( int nPart) const int nNewInd[3] = { pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[0]].ptP), pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[1]].ptP), pSurfTM->AddVertex( m_vVert[m_vTria[i].nIdVert[2]].ptP)} ; - if ( pSurfTM->AddTriangle( nNewInd) == SVT_NULL) + if ( pSurfTM->AddTriangle( nNewInd, m_vTria[i].nTFlag) == SVT_NULL) return nullptr ; } } @@ -3612,3 +3638,13 @@ SurfTriMesh::ClonePart( int nPart) const // Restituisco la nuova superficie return Release( pSurfTM) ; } + +//---------------------------------------------------------------------------- +bool +SurfTriMesh::ResetTFlags( void) +{ + for ( int i = 0 ; i < int( m_vTria.size()) ; ++ i) + m_vTria[i].nTFlag = 0 ; + m_nMaxTFlag = 0 ; + return true ; +} diff --git a/SurfTriMesh.h b/SurfTriMesh.h index 48797d3..416aea8 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -47,6 +47,9 @@ class StmTria StmTria( const int nIdV[3]) : vtN(), nIdFacet( SVT_NULL), nTFlag( 0), nEFlag( 0), nPart( SVT_NULL), nTemp( 0) { nIdVert[0] = nIdV[0] ; nIdVert[1] = nIdV[1] ; nIdVert[2] = nIdV[2] ; nIdAdjac[0] = SVT_NULL ; nIdAdjac[1] = SVT_NULL ; nIdAdjac[2] = SVT_NULL ; } + StmTria( const int nIdV[3], int nTF) : vtN(), nIdFacet( SVT_NULL), nTFlag( nTF), nEFlag( 0), nPart( SVT_NULL), nTemp( 0) + { nIdVert[0] = nIdV[0] ; nIdVert[1] = nIdV[1] ; nIdVert[2] = nIdV[2] ; + nIdAdjac[0] = SVT_NULL ; nIdAdjac[1] = SVT_NULL ; nIdAdjac[2] = SVT_NULL ; } StmTria( const int nIdV[3], const int nIdA[3], const Vector3d& vtV, int nTF, int nEF) : vtN( vtV), nIdFacet( SVT_NULL), nTFlag( nTF), nEFlag( nEF), nPart( SVT_NULL), nTemp( 0) { nIdVert[0] = nIdV[0] ; nIdVert[1] = nIdV[1] ; nIdVert[2] = nIdV[2] ; @@ -166,7 +169,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW m_dCosSmAng = cos( m_dSmoothAng * DEGTORAD) ; m_OGrMgr.Reset() ; } int AddVertex( const Point3d& ptVert) override ; - int AddTriangle( const int nIdVert[3]) override ; + int AddTriangle( const int nIdVert[3], int nTFlag = 0) override ; bool RemoveTriangle( int nId) override ; bool AdjustTopology( void) override ; bool CreateByFlatContour( const PolyLine& PL) override ; @@ -182,13 +185,14 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW bool DoSewing( const ISurfTriMesh& stmOther, const Frame3d& frOther = GLOB_FRM) override ; int GetVertexCount( void) const override ; int GetTriangleCount( void) const override ; + int GetTriangleCount( int nTFlag) const override ; int GetVertexSize( void) const override { return int( m_vVert.size()) ; } int GetTriangleSize( void) const override { return int( m_vTria.size()) ; } - double GetLinearTolerance( void) override + double GetLinearTolerance( void) const override { return m_dLinTol ; } - double GetSmoothAngle( void) override + double GetSmoothAngle( void) const override { return m_dSmoothAng ; } bool GetVertex( int nId, Point3d& ptP) const override ; int GetFirstVertex( Point3d& ptP) const override ; @@ -238,6 +242,9 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW int GetPartCount( void) const override ; bool RemovePart( int nPart) override ; SurfTriMesh* ClonePart( int nPart) const override ; + int GetMaxTFlag( void) const override + { return m_nMaxTFlag ; } + bool ResetTFlags( void) override ; public : // IGeoObjRW int GetNgeId( void) const override ; @@ -326,6 +333,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW INTVECTOR m_vFacet ; // vettore delle sfaccettature mutable int m_nTimeStamp ; // orologio locale int m_nTempProp ; // proprietà temporanea + int m_nMaxTFlag ; // massimo valore dei TFlag dei triangoli mutable int m_nParts ; // numero di parti connesse (-1 se da calcolare) mutable HashGrids3d* m_pHGrd3d ; // Hash Grid 3d nel suo riferimento mutable BBox3d m_b3HGrd3d ; // Box3d collegato a Hash Grid 3d diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index 6135bde..2c5b4eb 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -2040,15 +2040,16 @@ SurfTriMesh::RemoveTJunctions(void) PNTVECTOR vPt ; INTVECTOR vTr ; if ( Triangulate().Make( Polygon, vPt, vTr)) { - // Rimuovo il triangolo originale + // Rimuovo il triangolo originale e salvo il suo flag + int nTFlag = m_vTria[nT].nTFlag ; RemoveTriangle( nT) ; - // Inserisco i nuovi triangoli che lo sostituiscono + // Inserisco i nuovi triangoli che lo sostituiscono e asegno loro lo stesso flag for ( int n = 0 ; n < int( vTr.size()) - 2 ; n += 3) { int nNewTriaVertId[3] = { vTr[n], vTr[n + 1], vTr[n + 2]} ; int nNewId[3] = { AddVertex( vPt[nNewTriaVertId[0]]), AddVertex( vPt[nNewTriaVertId[1]]), AddVertex( vPt[nNewTriaVertId[2]])} ; - AddTriangle( nNewId) ; + AddTriangle( nNewId, nTFlag) ; } } } @@ -2171,13 +2172,22 @@ SurfTriMesh::ScanForTripleTriangles( bool& bModified) nAdjTriaContactEdge[(nAdjTria - 1) / 2] = nAdjEdge ; } } - // Elimino i triangoli + // Elimino i triangoli e salvo i loro Flag + int vnTFlag[3] ; for ( int nTria = 0 ; nTria < 3 ; ++ nTria) { + vnTFlag[nTria] = m_vTria[vTriaIndex[nTria]].nTFlag ; RemoveTriangle( vTriaIndex[nTria]) ; } - // Aggiungo il novo triangolo + // Aggiungo il nuovo triangolo con il flag + int nNewTFlag ; + if ( vnTFlag[0] == vnTFlag[1]) + nNewTFlag = vnTFlag[1] ; + else if ( vnTFlag[0] == vnTFlag[2] || vnTFlag[1] == vnTFlag[2]) + nNewTFlag = vnTFlag[2] ; + else + nNewTFlag = 0 ; int nNewVert[3] = { vVertAndAdjTria[0], vVertAndAdjTria[2], vVertAndAdjTria[4] } ; - int nNewTriaId = AddTriangle( nNewVert) ; + int nNewTriaId = AddTriangle( nNewVert, nNewTFlag) ; if ( nNewTriaId != SVT_NULL) { // Sistemo le adiacenze m_vTria[nNewTriaId].nIdAdjac[0] = vVertAndAdjTria[1] ; @@ -2256,6 +2266,7 @@ SurfTriMesh::FlipTriangles( int nTA, int nTB) bool SurfTriMesh::Add( const ISurfTriMesh& Other) { + m_OGrMgr.Clear() ; SurfTriMesh SurfB ; SurfB.CopyFrom( &Other) ; IntersectTriMeshTriangle( SurfB) ; @@ -2266,6 +2277,7 @@ SurfTriMesh::Add( const ISurfTriMesh& Other) if ( m_vTria[nTA].nTempPart == 1 || m_vTria[nTA].nTempPart == - 2) RemoveTriangle( nTA) ; } + int nPrevMaxTFlag = m_nMaxTFlag ; int nTriaNumB = SurfB.GetTriangleSize() ; for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) { if ( SurfB.m_vTria[nTB].nTempPart == - 1) { @@ -2273,7 +2285,9 @@ SurfTriMesh::Add( const ISurfTriMesh& Other) for ( int nV = 0 ; nV < 3 ; ++ nV) { nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ; } - AddTriangle( nNewVert) ; + if ( nPrevMaxTFlag == m_nMaxTFlag) + ++ m_nMaxTFlag ; + AddTriangle( nNewVert, m_nMaxTFlag) ; } } if ( ! AdjustVertices() || ! DoCompacting()) @@ -2289,6 +2303,7 @@ SurfTriMesh::Add( const ISurfTriMesh& Other) bool SurfTriMesh::Intersect( const ISurfTriMesh& Other) { + m_OGrMgr.Clear() ; SurfTriMesh SurfB ; SurfB.CopyFrom( &Other) ; IntersectTriMeshTriangle( SurfB) ; @@ -2299,6 +2314,7 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other) if ( m_vTria[nTA].nTempPart == - 1 || m_vTria[nTA].nTempPart == - 2) RemoveTriangle( nTA) ; } + int nPrevMaxTFlag = m_nMaxTFlag ; int nTriaNumB = SurfB.GetTriangleSize() ; for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) { if ( SurfB.m_vTria[nTB].nTempPart == 1) { @@ -2306,7 +2322,9 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other) for ( int nV = 0 ; nV < 3 ; ++ nV) { nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ; } - AddTriangle( nNewVert) ; + if ( nPrevMaxTFlag == m_nMaxTFlag) + ++ m_nMaxTFlag ; + AddTriangle( nNewVert, m_nMaxTFlag) ; } } if ( ! AdjustVertices() || ! DoCompacting()) @@ -2322,6 +2340,7 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other) bool SurfTriMesh::Subtract( const ISurfTriMesh& Other) { + m_OGrMgr.Clear() ; SurfTriMesh SurfB ; SurfB.CopyFrom( &Other) ; IntersectTriMeshTriangle( SurfB) ; @@ -2332,6 +2351,7 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other) if ( m_vTria[nTA].nTempPart == 1 || m_vTria[nTA].nTempPart == 2) RemoveTriangle( nTA) ; } + int nPrevMaxTFlag = m_nMaxTFlag ; int nTriaNumB = SurfB.GetTriangleSize() ; for ( int nTB = 0 ; nTB < nTriaNumB ; ++ nTB) { if ( SurfB.m_vTria[nTB].nTempPart == 1) { @@ -2340,7 +2360,9 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other) nNewVert[nV] = AddVertex( SurfB.m_vVert[SurfB.m_vTria[nTB].nIdVert[nV]].ptP) ; } swap( nNewVert[1], nNewVert[2]) ; - AddTriangle( nNewVert) ; + if ( nPrevMaxTFlag == m_nMaxTFlag) + ++ m_nMaxTFlag ; + AddTriangle( nNewVert, m_nMaxTFlag) ; } } if ( ! AdjustVertices() || ! DoCompacting())