EgtGeomKernel 2.1k5 :

- correzioni alle booleane di superfici per facce risultanti con buchi
- aggiunte a VolZmap funzioni GetPartLocalBBox e GetPartBBox.
This commit is contained in:
Dario Sassi
2019-11-21 11:41:49 +00:00
parent a5c39111fb
commit 729f405ec7
4 changed files with 125 additions and 8 deletions
+110
View File
@@ -491,6 +491,116 @@ VolZmap::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
return true ;
}
//----------------------------------------------------------------------------
bool
VolZmap::GetPartLocalBBox( int nPart, BBox3d& b3Loc, int nFlag) const
{
// Verifico lo stato.
if ( m_nStatus != OK)
return false ;
// Se una sola mappa o il numero di componenti è indefinito, vi è un errore.
if ( m_nMapNum == 1 || m_nConnectedCompoCount == - 1)
return false ;
// Se la componente richiesta non esiste, vi è un errore.
if ( nPart < 0 || nPart > m_nConnectedCompoCount - 1)
return false ;
// Calcolo Bounding-box
for ( int nMap = 0 ; nMap < 3 ; ++ nMap) {
for ( int nDex = 0 ; nDex < m_nDim[nMap] ; ++ nDex) {
for ( int nInt = 0 ; nInt < int( m_Values[nMap][nDex].size()) ; ++ nInt) {
if ( m_Values[nMap][nDex][nInt].nCompo == nPart) {
// Indici del dexel
int nI = nDex % m_nNx[nMap] ;
int nJ = nDex / m_nNx[nMap] ;
// Posizione del dexel
double dX = ( nI + 0.5) * m_dStep ;
double dY = ( nJ + 0.5) * m_dStep ;
// Definisco i punti nel sistema locale
Point3d ptP, ptPSt, ptPEn ;
if ( nMap == 0) {
ptP = m_MapFrame.Orig() + dX * m_MapFrame.VersX() + dY * m_MapFrame.VersY() ;
ptPSt = ptP + m_Values[nMap][nDex][nInt].dMin * m_MapFrame.VersZ() ;
ptPEn = ptP + m_Values[nMap][nDex][nInt].dMax * m_MapFrame.VersZ() ;
}
else if ( nMap == 1) {
ptP = m_MapFrame.Orig() + dX * m_MapFrame.VersY() + dY * m_MapFrame.VersZ() ;
ptPSt = ptP + m_Values[nMap][nDex][nInt].dMin * m_MapFrame.VersX() ;
ptPEn = ptP + m_Values[nMap][nDex][nInt].dMax * m_MapFrame.VersX() ;
}
else {
ptP = m_MapFrame.Orig() + dX * m_MapFrame.VersZ() + dY * m_MapFrame.VersX() ;
ptPSt = ptP + m_Values[nMap][nDex][nInt].dMin * m_MapFrame.VersY() ;
ptPEn = ptP + m_Values[nMap][nDex][nInt].dMax * m_MapFrame.VersY() ;
}
// Aggiungo i punti al bounding-box
b3Loc.Add( ptPSt) ;
b3Loc.Add( ptPEn) ;
}
}
}
}
return true ;
}
//----------------------------------------------------------------------------
bool
VolZmap::GetPartBBox( int nPart, const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
{
// Verifico lo stato.
if ( m_nStatus != OK)
return false ;
// Se una sola mappa o il numero di componenti è indefinito, vi è un errore.
if ( m_nMapNum == 1 || m_nConnectedCompoCount == - 1)
return false ;
// Se la componente richiesta non esiste, vi è un errore.
if ( nPart < 0 || nPart > m_nConnectedCompoCount - 1)
return false ;
// Calcolo Bounding-box
Point3d ptMapFrameOrig = m_MapFrame.Orig() ;
Vector3d vtMapFrameVersX = m_MapFrame.VersX() ;
Vector3d vtMapFrameVersY = m_MapFrame.VersY() ;
Vector3d vtMapFrameVersZ = m_MapFrame.VersZ() ;
ptMapFrameOrig.ToGlob( frRef) ;
vtMapFrameVersX.ToGlob( frRef) ;
vtMapFrameVersY.ToGlob( frRef) ;
vtMapFrameVersZ.ToGlob( frRef) ;
for ( int nMap = 0 ; nMap < 3 ; ++ nMap) {
for ( int nDex = 0 ; nDex < m_nDim[nMap] ; ++ nDex) {
for ( int nInt = 0 ; nInt < int( m_Values[nMap][nDex].size()) ; ++ nInt) {
if ( m_Values[nMap][nDex][nInt].nCompo == nPart) {
// Indici del dexel
int nI = nDex % m_nNx[nMap] ;
int nJ = nDex / m_nNx[nMap] ;
// Posizione del dexel
double dX = ( nI + 0.5) * m_dStep ;
double dY = ( nJ + 0.5) * m_dStep ;
// Definisco i punti nel sistema locale
Point3d ptP, ptPSt, ptPEn ;
if ( nMap == 0) {
ptP = ptMapFrameOrig + dX * vtMapFrameVersX + dY * vtMapFrameVersY ;
ptPSt = ptP + m_Values[nMap][nDex][nInt].dMin * vtMapFrameVersZ ;
ptPEn = ptP + m_Values[nMap][nDex][nInt].dMax * vtMapFrameVersZ ;
}
else if ( nMap == 1) {
ptP = ptMapFrameOrig + dX * vtMapFrameVersY + dY * vtMapFrameVersZ ;
ptPSt = ptP + m_Values[nMap][nDex][nInt].dMin * vtMapFrameVersX ;
ptPEn = ptP + m_Values[nMap][nDex][nInt].dMax * vtMapFrameVersX ;
}
else {
ptP = ptMapFrameOrig + dX * vtMapFrameVersZ + dY * vtMapFrameVersX ;
ptPSt = ptP + m_Values[nMap][nDex][nInt].dMin * vtMapFrameVersY ;
ptPEn = ptP + m_Values[nMap][nDex][nInt].dMax * vtMapFrameVersY ;
}
// Aggiungo i punti al bounding-box
b3Ref.Add( ptPSt) ;
b3Ref.Add( ptPEn) ;
}
}
}
}
return true ;
}
//----------------------------------------------------------------------------
bool
VolZmap::Translate( const Vector3d& vtMove)