diff --git a/SurfTriMesh.h b/SurfTriMesh.h index ccff9df..48797d3 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -221,6 +221,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW bool GetFacetNormal( int nF, Vector3d& vtN) const override ; bool GetFacetArea( int nF, double& dArea) const override ; bool GetFacetsContact( int nF1, int nF2, bool& bAdjac, Point3d& ptP1, Point3d& ptP2, double& dAng) const override ; + bool RemoveFacet( int nF) override ; SurfTriMesh* CloneFacet( int nF) const override ; bool SwapFacets( int nF1, int nF2) override ; bool GetFacetLocalBBox( int nF, BBox3d& b3Loc, int nFlag = BBF_STANDARD) const override ; diff --git a/SurfTriMeshFaceting.cpp b/SurfTriMeshFaceting.cpp index 772efcc..139d50b 100644 --- a/SurfTriMeshFaceting.cpp +++ b/SurfTriMeshFaceting.cpp @@ -645,6 +645,8 @@ SurfTriMesh::GetFacetArea( int nF, double& dArea) const SurfTriMesh* SurfTriMesh::CloneFacet( int nF) const { + if ( ! IsValid()) + return nullptr ; // alloco la nuova superficie PtrOwner pSTM( CreateBasicSurfTriMesh()) ; if ( IsNull( pSTM)) @@ -689,12 +691,40 @@ SurfTriMesh::CloneFacet( int nF) const return Release( pSTM) ; } +//---------------------------------------------------------------------------- +bool +SurfTriMesh::RemoveFacet( int nF) +{ + // verifico esistenza delle due facce + if ( ! IsValid() || nF < 0 || nF >= GetFacetCount()) + return false ; + + // recupero l'elenco dei triangoli della faccia + INTVECTOR vTria ; + if ( ! GetAllTriaInFacet( nF, vTria)) + return false ; + + // Rimuovo i triangoli della faccia + for ( int i : vTria) + RemoveTriangle( i) ; + + // aggiorno le strutture di base dell'oggetto + if ( ! DoCompacting()) + return false ; + + // dichiaro necessità ricalcolo della grafica e di hashgrids3d + m_OGrMgr.Reset() ; + ResetHashGrids3d() ; + + return true ; +} + //---------------------------------------------------------------------------- bool SurfTriMesh::SwapFacets( int nF1, int nF2) { // verifico esistenza delle due facce - if ( nF1 < 0 || nF1 >= GetFacetCount() || nF2 < 0 || nF2 >= GetFacetCount()) + if ( ! IsValid() || nF1 < 0 || nF1 >= GetFacetCount() || nF2 < 0 || nF2 >= GetFacetCount()) return false ; // recupero gli indici dei triangoli della prima e seconda faccia