diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 4a54f39..d706f06 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/SurfTriMeshBooleans.cpp b/SurfTriMeshBooleans.cpp index 4ed9b8a..f91c87f 100644 --- a/SurfTriMeshBooleans.cpp +++ b/SurfTriMeshBooleans.cpp @@ -1807,7 +1807,7 @@ SurfTriMesh::IntersectTriMeshTriangle( SurfTriMesh& Other) // Se i triangoli delle superfici non si intersecano, una delle due è totalmente interna o esterna all'altra. bool bRetriangulated = true ; - if ( ! bModif) { + if ( ! bModif && ( int( AmbiguosA.size()) == 0 || int( AmbiguosB.size()) == 0)) { bRetriangulated = false ; int nVertNum = 0 ; Point3d ptFirstV ; diff --git a/VolZmap.cpp b/VolZmap.cpp index 896d90d..408a90e 100644 --- a/VolZmap.cpp +++ b/VolZmap.cpp @@ -14,6 +14,7 @@ //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "VolZmap.h" +#include "DistPointLine.h" #include "GeoObjFactory.h" #include "NgeWriter.h" #include "NgeReader.h" @@ -1359,6 +1360,60 @@ VolZmap::RemovePart( int nPart) return true ; } +//---------------------------------------------------------------------------- +int +VolZmap::GetPartMinDistFromPoint( const Point3d& ptP) const +{ + // Verifico lo stato e che siano definibili le componenti connesse + if ( m_nStatus != OK || m_nMapNum == 1) + return - 1 ; + // Se il numero di componenti è indefinito, lo ricalcolo + if ( m_nConnectedCompoCount == -1) + const_cast( this)->CheckMapConnection() ; + // Se non vi sono componenti, abbiamo finito + if ( m_nConnectedCompoCount == 0) + return - 1 ; + // Porto il punto nel riferimento intrinseco + Point3d ptPL = ptP ; + ptPL.ToLoc( m_MapFrame) ; + // Trovo la componente connessa di minima distanza dal punto + double dMinDist = DBL_MAX ; + int nMinDistPart = - 1 ; + for ( int nMap = 0 ; nMap < m_nMapNum ; ++ nMap) { + for ( int nDex = 0 ; nDex < m_nDim[nMap] ; ++ nDex) { + double dX = ( ( nDex % m_nNx[nMap]) + 0.5) * m_dStep ; + double dY = ( ( nDex / m_nNx[nMap]) + 0.5) * m_dStep ; + int nIntervalNum = int( m_Values[nMap][nDex].size()) ; + for ( int nInt = 0 ; nInt < nIntervalNum ; ++ nInt) { + Point3d ptSt( dX, dY, m_Values[nMap][nDex][nInt].dMin) ; + Point3d ptEn( dX, dY, m_Values[nMap][nDex][nInt].dMax) ; + // Riporto le coordinate cicliche delle normali nell'ordine di partenza (da griglia a sistema intrinseco) + if ( nMap == 1) { + swap( ptSt.x, ptSt.z) ; + swap( ptSt.y, ptSt.z) ; + swap( ptEn.x, ptEn.z) ; + swap( ptEn.y, ptEn.z) ; + } + else if ( nMap == 2) { + swap( ptSt.y, ptSt.z) ; + swap( ptSt.x, ptSt.z) ; + swap( ptEn.y, ptEn.z) ; + swap( ptEn.x, ptEn.z) ; + } + // Calcolo la distanza del punto dal segmento corrente. Se è minore della minima distanza aggiorno quest'ultima + // e la corrispondente componente connessa di minima distanza con la distanza e la componente connessa correnti. + double dDist ; + DistPointLine DistCalc( ptPL, ptSt, ptEn) ; + if ( DistCalc.GetDist( dDist) && dDist < dMinDist) { + dMinDist = dDist ; + nMinDistPart = m_Values[nMap][nDex][nInt].nCompo ; + } + } + } + } + return nMinDistPart ; +} + //---------------------------------------------------------------------------- bool VolZmap::SetToModifyDexelBlocks( int nGrid, int nDex, int nInt) diff --git a/VolZmap.h b/VolZmap.h index 850dcab..8472de1 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -104,6 +104,7 @@ class VolZmap : public IVolZmap, public IGeoObjRW bool GetPartBBox( int nPart, const Frame3d& frRef, BBox3d& b3Ref, int nFlag = BBF_STANDARD) const override ; VolZmap* ClonePart( int nPart) const override ; bool RemovePart( int nPart) override ; + int GetPartMinDistFromPoint( const Point3d& ptP) const override ; public : // IGeoObjRW int GetNgeId( void) const override ;