EgtGeomKernel 2.1.10.1 :

- nuova versione delle operazioni booleane sulle superfici trimesh.
This commit is contained in:
Dario Sassi
2019-10-02 06:27:18 +00:00
parent 8f5ce2ac09
commit a4609dfa0f
8 changed files with 1751 additions and 498 deletions
+138 -77
View File
@@ -1,7 +1,7 @@
//----------------------------------------------------------------------------
// EgalTech 2013-2014
// EgalTech 2013-2019
//----------------------------------------------------------------------------
// File : GdbExecutor.cpp Data : 24.04.14 Versione : 1.5a6
// File : GdbExecutor.cpp Data : 01.10.19 Versione : 2.1i3
// Contenuto : Implementazione della classe GdbExecutor.
//
//
@@ -2177,6 +2177,15 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
else if ( sCmd2 == "GENCUT") {
return SurfTrimeshGenCut( vsParams) ;
}
else if ( sCmd2 == "ADD") {
return SurfTrimeshAdd( vsParams) ;
}
else if ( sCmd2 == "INTERS") {
return SurfTrimeshInters( vsParams) ;
}
else if ( sCmd2 == "SUBTRACT") {
return SurfTrimeshSubtract( vsParams) ;
}
else
return false ;
}
@@ -2669,6 +2678,58 @@ GdbExecutor::SurfTrimeshGenCut( const STRVECTOR& vsParams)
return pStmF->GeneralizedCut( *pCurve, true) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTrimeshAdd( const STRVECTOR& vsParams)
{
// Parametri: nSurfId, nOtherSurfId
if ( vsParams.size() != 2)
return false ;
// Recupero Id superficie
int nIdSurf = GetIdParam( vsParams[0]) ;
ISurfTriMesh* pStmM = GetSurfTriMesh( m_pGDB->GetGeoObj( nIdSurf)) ;
SurfTriMesh* pStmF = static_cast <SurfTriMesh*> ( pStmM) ;
int nIdOtherSurf = GetIdParam( vsParams[1]) ;
ISurfTriMesh* pStmOtherM = GetSurfTriMesh( m_pGDB->GetGeoObj( nIdOtherSurf)) ;
SurfTriMesh* pStmOtherF = static_cast <SurfTriMesh*> ( pStmOtherM) ;
return pStmF->Add( *pStmOtherF) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTrimeshInters( const STRVECTOR& vsParams)
{
// Parametri: nSurfId, nOtherSurfId
if ( vsParams.size() != 2)
return false ;
// Recupero Id superficie
int nIdSurf = GetIdParam( vsParams[0]) ;
ISurfTriMesh* pStmM = GetSurfTriMesh( m_pGDB->GetGeoObj( nIdSurf)) ;
SurfTriMesh* pStmF = static_cast <SurfTriMesh*> ( pStmM) ;
int nIdOtherSurf = GetIdParam( vsParams[1]) ;
ISurfTriMesh* pStmOtherM = GetSurfTriMesh( m_pGDB->GetGeoObj( nIdOtherSurf)) ;
SurfTriMesh* pStmOtherF = static_cast <SurfTriMesh*> ( pStmOtherM) ;
return pStmF->Intersect( *pStmOtherF) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTrimeshSubtract( const STRVECTOR& vsParams)
{
// Parametri: nSurfId, nOtherSurfId
if ( vsParams.size() != 2)
return false ;
// Recupero Id superficie
int nIdSurf = GetIdParam( vsParams[0]) ;
ISurfTriMesh* pStmM = GetSurfTriMesh( m_pGDB->GetGeoObj( nIdSurf)) ;
SurfTriMesh* pStmF = static_cast <SurfTriMesh*> ( pStmM) ;
int nIdOtherSurf = GetIdParam( vsParams[1]) ;
SurfTriMesh* pStmOther = GetBasicSurfTriMesh( m_pGDB->GetGeoObj( nIdOtherSurf)) ;
if ( pStmOther == nullptr)
return false ;
return pStmF->Subtract( *pStmOther) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteVolZmap( const string& sCmd2, const STRVECTOR& vsParams)
@@ -2705,15 +2766,15 @@ GdbExecutor::ExecuteVolZmap( const string& sCmd2, const STRVECTOR& vsParams)
//else if ( sCmd2 == "TRIMESHZMAP") {
// return VolZmapCreateFromTriMesh( vsParams) ;
//}
if ( sCmd2 == "CUT") {
return ExecuteVolZmapCut( vsParams) ;
}
else if ( sCmd2 == "COMP") {
return ExecuteVolZmapCompact( vsParams) ;
}
else if ( sCmd2 == "EDGES") {
return ExecuteVolZmapEdges( vsParams) ;
}
//if ( sCmd2 == "CUT") {
// return ExecuteVolZmapCut( vsParams) ;
//}
//else if ( sCmd2 == "COMP") {
// return ExecuteVolZmapCompact( vsParams) ;
//}
//else if ( sCmd2 == "EDGES") {
// return ExecuteVolZmapEdges( vsParams) ;
//}
return false ;
}
/*
@@ -3024,76 +3085,76 @@ GdbExecutor::VolZmapBBoxZmapIntersection( const STRVECTOR& vsParams)
}*/
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteVolZmapCut( const STRVECTOR& vsParams)
{
// Parametri : ZmapId, ParentId, ptP, vtN
if ( vsParams.size() != 4)
return false ;
// Recupero Zmap
int nZmapId = GetIdParam( vsParams[0]) ;
VolZmap* pZmap = GetBasicVolZmap( m_pGDB->GetGeoObj( nZmapId)) ;
if ( pZmap == nullptr)
return false ;
// recupero il riferimento in cui è immerso lo Zmap
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
// Recupero punto piano
Point3d ptP ;
if ( ! GetPointParam( vsParams[2], frRef, ptP))
return false ;
// primo vettore frBBoxFrame
Vector3d vtN ;
if ( ! GetVectorParam( vsParams[3], frRef, vtN))
return false ;
vtN.Normalize() ;
Plane3d plPlane ;
plPlane.Set( ptP, vtN) ;
pZmap->Cut( plPlane) ;
return true ;
}
//bool
//GdbExecutor::ExecuteVolZmapCut( const STRVECTOR& vsParams)
//{
// // Parametri : ZmapId, ParentId, ptP, vtN
// if ( vsParams.size() != 4)
// return false ;
// // Recupero Zmap
// int nZmapId = GetIdParam( vsParams[0]) ;
// VolZmap* pZmap = GetBasicVolZmap( m_pGDB->GetGeoObj( nZmapId)) ;
// if ( pZmap == nullptr)
// return false ;
// // recupero il riferimento in cui è immerso lo Zmap
// Frame3d frRef ;
// if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
// return false ;
// // Recupero punto piano
// Point3d ptP ;
// if ( ! GetPointParam( vsParams[2], frRef, ptP))
// return false ;
// // primo vettore frBBoxFrame
// Vector3d vtN ;
// if ( ! GetVectorParam( vsParams[3], frRef, vtN))
// return false ;
// vtN.Normalize() ;
// Plane3d plPlane ;
// plPlane.Set( ptP, vtN) ;
// pZmap->Cut( plPlane) ;
// return true ;
//}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteVolZmapCompact( const STRVECTOR& vsParams)
{
// Parametri : ZmapId
if ( vsParams.size() != 1)
return false ;
// Recupero Zmap
int nZmapId = GetIdParam( vsParams[0]) ;
VolZmap* pZmap = GetBasicVolZmap( m_pGDB->GetGeoObj( nZmapId)) ;
if ( pZmap == nullptr)
return false ;
pZmap->Compact() ;
return true ;
}
//bool
//GdbExecutor::ExecuteVolZmapCompact( const STRVECTOR& vsParams)
//{
// // Parametri : ZmapId
// if ( vsParams.size() != 1)
// return false ;
// // Recupero Zmap
// int nZmapId = GetIdParam( vsParams[0]) ;
// VolZmap* pZmap = GetBasicVolZmap( m_pGDB->GetGeoObj( nZmapId)) ;
// if ( pZmap == nullptr)
// return false ;
// pZmap->Compact() ;
// return true ;
//}
//----------------------------------------------------------------------------
bool
GdbExecutor::ExecuteVolZmapEdges(const STRVECTOR& vsParams)
{
// Parametri : ZmapId, ParentId
if ( vsParams.size() != 2)
return false ;
// Recupero Zmap
int nZmapId = GetIdParam( vsParams[0]) ;
VolZmap* pZmap = GetBasicVolZmap( m_pGDB->GetGeoObj( nZmapId)) ;
if ( pZmap == nullptr)
return false;
// recupero il riferimento in cui è immerso lo Zmap
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
return false ;
ICURVEPOVECTOR vpLoop ;
pZmap->GetEdges( vpLoop) ;
bool bOk = true ;
for ( int n = 0 ; n < int( vpLoop.size()) && bOk ; ++ n) {
bOk = bOk && AddGeoObj( "$NN", vsParams[1], Release( vpLoop[n])) ;
}
return bOk ;
}
//bool
//GdbExecutor::ExecuteVolZmapEdges(const STRVECTOR& vsParams)
//{
// // Parametri : ZmapId, ParentId
// if ( vsParams.size() != 2)
// return false ;
// // Recupero Zmap
// int nZmapId = GetIdParam( vsParams[0]) ;
// VolZmap* pZmap = GetBasicVolZmap( m_pGDB->GetGeoObj( nZmapId)) ;
// if ( pZmap == nullptr)
// return false;
// // recupero il riferimento in cui è immerso lo Zmap
// Frame3d frRef ;
// if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frRef))
// return false ;
// ICURVEPOVECTOR vpLoop ;
// pZmap->GetEdges( vpLoop) ;
// bool bOk = true ;
// for ( int n = 0 ; n < int( vpLoop.size()) && bOk ; ++ n) {
// bOk = bOk && AddGeoObj( "$NN", vsParams[1], Release( vpLoop[n])) ;
// }
// return bOk ;
//}
//----------------------------------------------------------------------------
bool