diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 1445527..5782751 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/SurfTriMesh.h b/SurfTriMesh.h index 416aea8..45a426c 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -237,6 +237,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW bool Subtract( const ISurfTriMesh& Other) override ; bool GetSurfClassification( const ISurfTriMesh& ClassifierSurf, INTVECTOR& vTriaIn, INTVECTOR& vTriaOut, INTVECTOR& vTriaOnP, INTVECTOR& vTriaOnM, INTVECTOR& vTriaIndef) override ; + bool CutWithOtherSurf( const ISurfTriMesh& CutterSurf, bool bInVsOut, bool bSaveOnEq) override ; bool GetAllTriaOverlapBox( const BBox3d& b3Box, INTVECTOR& vT) const override ; const BBox3d& GetAllTriaBox( void) const override ; int GetPartCount( void) const override ; diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index 9a56004..fa8698a 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -2408,15 +2408,13 @@ SurfTriMesh::Add( const ISurfTriMesh& Other) AddTriangle( nNewVert, m_nMaxTFlag) ; } } - if ( ! AdjustVertices() || ! DoCompacting()) - return false ; - RemoveTripleTriangles() ; - if ( ! AdjustVertices() || ! DoCompacting()) - return false ; - RemoveTJunctions() ; - bool bResult = ( AdjustVertices() && DoCompacting()) ; + bool bOk = ( AdjustVertices() && DoCompacting()) ; + bOk && RemoveTripleTriangles() ; + bOk = bOk && ( AdjustVertices() && DoCompacting()) ; + bOk && RemoveTJunctions() ; + bOk = bOk && ( AdjustVertices() && DoCompacting()) ; Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ; - return bResult ; + return bOk ; } //---------------------------------------------------------------------------- @@ -2451,15 +2449,13 @@ SurfTriMesh::Intersect( const ISurfTriMesh& Other) AddTriangle( nNewVert, m_nMaxTFlag) ; } } - if ( ! AdjustVertices() || ! DoCompacting()) - return false ; - RemoveTripleTriangles() ; - if ( ! AdjustVertices() || ! DoCompacting()) - return false ; - RemoveTJunctions() ; - bool bResult = ( AdjustVertices() && DoCompacting()) ; + bool bOk = ( AdjustVertices() && DoCompacting()) ; + bOk && RemoveTripleTriangles() ; + bOk = bOk && ( AdjustVertices() && DoCompacting()) ; + bOk && RemoveTJunctions() ; + bOk = bOk && ( AdjustVertices() && DoCompacting()) ; Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ; - return bResult ; + return bOk ; } //---------------------------------------------------------------------------- @@ -2495,15 +2491,13 @@ SurfTriMesh::Subtract( const ISurfTriMesh& Other) AddTriangle( nNewVert, m_nMaxTFlag) ; } } - if ( ! AdjustVertices() || ! DoCompacting()) - return false ; - RemoveTripleTriangles() ; - if ( ! AdjustVertices() || ! DoCompacting()) - return false ; - RemoveTJunctions() ; - bool bResult = ( AdjustVertices() && DoCompacting()) ; + bool bOk = ( AdjustVertices() && DoCompacting()) ; + bOk && RemoveTripleTriangles() ; + bOk = bOk && ( AdjustVertices() && DoCompacting()) ; + bOk && RemoveTJunctions() ; + bOk = bOk && ( AdjustVertices() && DoCompacting()) ; Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ; - return bResult ; + return bOk ; } //---------------------------------------------------------------------------- @@ -2548,3 +2542,31 @@ SurfTriMesh::GetSurfClassification( const ISurfTriMesh& ClassifierSurf, } return true ; } + +//---------------------------------------------------------------------------- +bool +SurfTriMesh::CutWithOtherSurf( const ISurfTriMesh& CutterSurf, bool bInVsOut, bool bSaveOnEq) +{ + // Le superfici devono essere valide + if ( ! IsValid() || ! CutterSurf.IsValid()) + return false ; + m_OGrMgr.Clear() ; + SurfTriMesh SurfC ; + SurfC.CopyFrom( &CutterSurf) ; + Frame3d frScalingRef ; + frScalingRef.Set( m_vVert[0].ptP, X_AX, Y_AX, Z_AX) ; + Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ; + SurfC.Scale( frScalingRef, BOOLEAN_SCALE, BOOLEAN_SCALE, BOOLEAN_SCALE) ; + IntersectTriMeshTriangle( SurfC) ; + IdentifyParts() ; + int nPartToRemove = ( bInVsOut ? -1 : 1) ; + int nCoplanarPartToRemove = ( bSaveOnEq ? ( nPartToRemove ? -2 : 2) : 5) ; + int nTriaNum = GetTriangleSize() ; + for ( int nT = 0 ; nT < nTriaNum ; ++ nT) { + if ( m_vTria[nT].nTempPart == nPartToRemove || m_vTria[nT].nTempPart == nCoplanarPartToRemove) + RemoveTriangle( nT) ; + } + bool bOk = ( AdjustVertices() && DoCompacting()) ; + Scale( frScalingRef, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE, 1. / BOOLEAN_SCALE) ; + return bOk ; +}