EgtGeomKernel 1.5e7 :

- velocizzata selezione con migliaia di entità
- aggiunta creazione superfici trimesh da zuppa di triangoli.
This commit is contained in:
Dario Sassi
2014-05-19 20:03:58 +00:00
parent ea3099ae74
commit 0239607929
10 changed files with 223 additions and 31 deletions
+85 -6
View File
@@ -32,6 +32,7 @@
#include "/EgtDev/Include/EgkDistPointCurve.h"
#include "/EgtDev/Include/EgkSurfTriMesh.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
#include "/EgtDev/Include/EGkStmFromTriangleSoup.h"
using namespace std ;
@@ -1341,8 +1342,12 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
else if ( sCmd2 == "END") {
return SurfTriMeshEnd( vsParams) ;
}
// se creazione da zuppa di triangoli
else if ( sCmd2 == "TRIAS" || sCmd2 == "BYTRIANGLESOUP") {
return SurfTriMeshByTriangleSoup( vsParams) ;
}
// se creazione per triangolazione di un contorno chiuso e piano
else if ( sCmd2 == "CONT" || sCmd2 == "BYCONTOUR") {
else if ( sCmd2 == "CONT" || sCmd2 == "BYCONTOUR") {
return SurfTriMeshByContour( vsParams) ;
}
// se creazione per estrusione
@@ -1474,6 +1479,70 @@ GdbExecutor::SurfTriMeshEnd( const STRVECTOR& vsParams)
return bOk ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshByTriangleSoup( const STRVECTOR& vsParams)
{
// 3 o 4 parametri : Id, ParentId, IdStm/s[, bErase]
if ( vsParams.size() != 3 && vsParams.size() != 4)
return false ;
// flag per cancellazione superfici originali
bool bErase = ( vsParams.size() >= 4 && vsParams[3] == "1") ;
// recupero lista nomi
INTVECTOR vnNames ;
if ( ! GetNamesParam( vsParams[2], vnNames))
return false ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// Costruttore di trimesh da insieme disordinato di triangoli
StmFromTriangleSoup StmFts ;
if ( ! StmFts.Start())
return false ;
// Recupero tutti i triangoli delle superfici sorgenti e li inserisco nella nuova
INTVECTOR::iterator Iter ;
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero la superficie sorgente
const ISurfTriMesh* pStmS = GetSurfTriMesh( m_pGDB->GetGeoObj( *Iter)) ;
if ( pStmS == nullptr)
return false ;
// recupero il riferimento della superficie sorgente
Frame3d frSou ;
if ( ! m_pGDB->GetGlobFrame( *Iter, frSou))
return false ;
// recupero tutti i triangoli
Triangle3d Tria ;
int nId = pStmS->GetFirstTriangle( Tria) ;
while ( nId != SVT_NULL) {
// aggiusto per i sistemi di riferimento
Tria.LocToLoc( frSou, frDest) ;
// inserisco il triangolo nella nuova superficie
if ( ! StmFts.AddTriangle( Tria))
return false ;
// passo al triangolo successivo
nId = pStmS->GetNextTriangle( nId, Tria) ;
}
}
// valido la superficie e calcolo le adiacenze
if ( ! StmFts.End())
return false ;
// inserisco la superficie trimesh nel DB
ISurfTriMesh* pSTM = StmFts.GetSurf() ;
if ( AddGeoObj( vsParams[0], vsParams[1], pSTM)) {
// se richiesto, cancello le curve originali
if ( bErase) {
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
if ( ! m_pGDB->Erase( *Iter))
return false ;
}
}
return true ;
}
else
return false ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshByContour( const STRVECTOR& vsParams)
@@ -1710,12 +1779,22 @@ GdbExecutor::SurfTriMeshDoCompacting( const STRVECTOR& vsParams)
// 1 parametro : Id
if ( vsParams.size() != 1)
return false ;
// recupero la superficie
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
if ( pStm == nullptr)
// recupero lista nomi superfici
INTVECTOR vnNames ;
if ( ! GetNamesParam( vsParams[0], vnNames))
return false ;
// eseguo la compattazione
return pStm->DoCompacting() ;
// opero sui diversi oggetti
INTVECTOR::iterator Iter ;
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero la superficie
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( *Iter)) ;
if ( pStm == nullptr)
return false ;
// eseguo la compattazione
if ( ! pStm->DoCompacting())
return false ;
}
return true ;
}
//----------------------------------------------------------------------------