EgtGeomKernel 1.5e7 :
- velocizzata selezione con migliaia di entità - aggiunta creazione superfici trimesh da zuppa di triangoli.
This commit is contained in:
+85
-6
@@ -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 ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user