EgtGeomKernel 1.5e6 :

- aggiunto PointGrid3d (griglia hash per ricerca spaziale veloce di punti)
- aggiunti Compacting e Sewing a SurfTriMesh
- razionalizzazioni a GdbExecutor.
This commit is contained in:
Dario Sassi
2014-05-18 09:28:31 +00:00
parent 7bcd0813f9
commit ea3099ae74
11 changed files with 731 additions and 234 deletions
+309 -166
View File
@@ -1165,18 +1165,15 @@ GdbExecutor::CurveCompoMake( const STRVECTOR& vsParams)
PtrOwner<ICurveComposite> pCrvCompo( CreateCurveComposite()) ;
if ( ! IsValid( pCrvCompo))
return false ;
// per eventuale cancellazione curve di origine
bool bErase ;
INTVECTOR vnNames ;
INTVECTOR::iterator Iter ;
// 3 o 4 parametri
bool bErase ;
switch ( vsParams.size()) {
case 3 : bErase = false ; break ;
case 4 : bErase = ( vsParams[3] != "0") ; break ;
default : return false ; break ;
}
// recupero lista nomi
INTVECTOR vnNames ;
if ( ! GetNamesParam( vsParams[2], vnNames))
return false ;
// recupero il riferimento del gruppo destinazione
@@ -1184,6 +1181,7 @@ GdbExecutor::CurveCompoMake( const STRVECTOR& vsParams)
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// esecuzione
INTVECTOR::iterator Iter ;
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero la curva
int nIdCrv = *Iter ;
@@ -1329,185 +1327,31 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
{
// se inizio creazione con componenti elementari
if ( sCmd2 == "BEGIN") {
// 4 parametri (2 opzionali) : Id, ParentId[, numero vertici e numero triangoli]
if ( vsParams.size() < 2)
return false ;
// recupero Id e ParentId
m_sId = vsParams[0] ;
m_sParentId = vsParams[1] ;
// recupero i parametri opzionali
int nNumVert = 3 ;
if ( vsParams.size() >= 3)
FromString( vsParams[2], nNumVert) ;
int nNumTria = 1 ;
if ( vsParams.size() >= 4)
FromString( vsParams[3], nNumTria) ;
// creo la superficie
ISurfTriMesh* pSTM = CreateSurfTriMesh() ;
if ( pSTM == nullptr)
return false ;
// la inizializzo
if ( ! pSTM->Init( nNumVert, nNumTria))
return false ;
// salvo il puntatore
if ( m_pGeoObj != nullptr)
delete m_pGeoObj ;
m_pGeoObj = pSTM ;
return true ;
return SurfTriMeshBegin( vsParams) ;
}
// se nuovo vertice
else if ( sCmd2 == "VERT" || sCmd2 == "ADDVERTEX") {
// 1 parametro : punto
if ( vsParams.size() != 1)
return false ;
// recupero il riferimento in cui va inserito
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( m_sParentId), frRef))
return false ;
// recupero il punto
Point3d ptP ;
if ( ! GetPointParam( vsParams[0], frRef, ptP))
return false ;
// recupero la superficie
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// aggiungo il vertice
return ( pSTM->AddVertex( ptP) != -1) ;
return SurfTriMeshAddVertex( vsParams) ;
}
// se nuovo triangolo
else if ( sCmd2 == "TRIA" || sCmd2 == "ADDTRIANGLE") {
// 3 parametri : IdV1, IdV2, IdV3
if ( vsParams.size() != 3)
return false ;
// recupero gli indici dei 3 vertici
int nIdVert[3] ;
if ( ! FromString( vsParams[0], nIdVert[0]) ||
! FromString( vsParams[1], nIdVert[1]) ||
! FromString( vsParams[2], nIdVert[2]))
return false ;
// recupero la superficie
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// aggiungo il triangolo definito con gli indici dei 3 vertici
return ( pSTM->AddTriangle( nIdVert) != -1) ;
return SurfTriMeshAddTriangle( vsParams) ;
}
// se fine creazione
else if ( sCmd2 == "END") {
// nessun parametro
if ( vsParams.size() != 0)
return false ;
// recupero la superficie
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// valido la superficie e calcolo le adiacenze
if ( ! pSTM->AdjustTopology())
return false ;
// inserisco la superficie trimesh nel DB
m_pGeoObj = nullptr ;
bool bOk = AddGeoObj( m_sId, m_sParentId, pSTM) ;
m_sId.clear() ;
m_sParentId.clear() ;
return bOk ;
return SurfTriMeshEnd( vsParams) ;
}
// se creazione per triangolazione di un contorno chiuso e piano
else if ( sCmd2 == "CONT" || sCmd2 == "BYCONTOUR") {
// 3 o 4 parametri : Id, ParentId, IdCurve[, dLinTol]
if ( vsParams.size() != 3 && vsParams.size() != 4)
return false ;
// recupero la tolleranza lineare
double dLinTol = LIN_TOL_STD ;
if ( vsParams.size() == 4)
FromString( vsParams[3], dLinTol) ;
// recupero l'identificativo della curva
int nIdCrv = GetIdParam( vsParams[2]) ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// calcolo la polilinea che approssima la curva
PolyLine PL ;
if ( ! GetPolylineFromCurve( nIdCrv, frDest, dLinTol, PL))
return false ;
// creo la superficie
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
if ( ! IsValid( pSTM))
return false ;
// costruisco la triangolazione
if ( ! pSTM->CreateByFlatContour( PL))
return false ;
// inserisco la superficie trimesh nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
return SurfTriMeshByContour( vsParams) ;
}
// se creazione per estrusione
else if ( sCmd2 == "EXTR" || sCmd2 == "BYEXTRUSION") {
// 4 o 5 parametri : Id, ParentId, IdCurve, vtExtr[, dLinTol]
if ( vsParams.size() != 4 && vsParams.size() != 5)
return false ;
// recupero la tolleranza lineare
double dLinTol = LIN_TOL_STD ;
if ( vsParams.size() == 5)
FromString( vsParams[4], dLinTol) ;
// recupero la curva
int nIdCrv = GetIdParam( vsParams[2]) ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// calcolo la polilinea che approssima la curva
PolyLine PL ;
if ( ! GetPolylineFromCurve( nIdCrv, frDest, dLinTol, PL))
return false ;
// recupero il vettore di estrusione
Vector3d vtExtr ;
if ( ! GetVectorParam( vsParams[3], frDest, vtExtr))
return false ;
// creo la superficie
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
if ( ! IsValid( pSTM))
return false ;
// costruisco l'estrusione
if ( ! pSTM->CreateByExtrusion( PL, vtExtr))
return false ;
// inserisco la superficie trimesh nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
return SurfTriMeshByExtrusion( vsParams) ;
}
// se creazione da 2 percorsi
else if ( sCmd2 == "2P" || sCmd2 == "BY2PATHS") {
// 4 o 5 parametri : Id, ParentId, IdCurve1, IdCurve2[, dLinTol]
if ( vsParams.size() != 4 && vsParams.size() != 5)
return false ;
// recupero la tolleranza lineare
double dLinTol = LIN_TOL_STD ;
if ( vsParams.size() == 5)
FromString( vsParams[4], dLinTol) ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// recupero l'identificativo della prima curva
int nIdCrv1 = GetIdParam( vsParams[2]) ;
// calcolo la polilinea che approssima la prima curva
PolyLine PL1 ;
if ( ! GetPolylineFromCurve( nIdCrv1, frDest, dLinTol, PL1))
return false ;
// recupero l'identificativo della seconda curva
int nIdCrv2 = GetIdParam( vsParams[3]) ;
// calcolo la polilinea che approssima la seconda curva
PolyLine PL2 ;
if ( ! GetPolylineFromCurve( nIdCrv2, frDest, dLinTol, PL2))
return false ;
// creo la superficie
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
if ( ! IsValid( pSTM))
return false ;
// costruisco la rigata tra le due curve
if ( ! pSTM->CreateByTwoCurves( PL1, PL2))
return false ;
// inserisco la superficie trimesh nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
return SurfTriMeshByTwoPaths( vsParams) ;
}
// se creazione per rivoluzione
else if ( sCmd2 == "REV" || sCmd2 == "BYREVOLUTION") {
@@ -1517,10 +1361,225 @@ GdbExecutor::ExecuteSurfTriMesh( const string& sCmd2, const STRVECTOR& vsParams)
else if ( sCmd2 == "SCR" || sCmd2 == "BYSCREWING") {
return SurfTriMeshByScrewing( true, vsParams) ;
}
// imposto angolo limite per mediare normali in un vertice
else if ( sCmd2 == "SMA" || sCmd2 == "SMOOTHANG") {
return SurfTriMeshChangeSmoothAng( vsParams) ;
}
// compattazione per unione di vertici con posizioni coincidenti
else if ( sCmd2 == "COMP" || sCmd2 == "DOCOMPACTING") {
return SurfTriMeshDoCompacting( vsParams) ;
}
// se unione di due o più superfici per cucitura
else if ( sCmd2 == "SEW" || sCmd2 == "DOSEWING") {
return SurfTriMeshDoSewing( vsParams) ;
}
else
return false ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshBegin( const STRVECTOR& vsParams)
{
// 4 parametri (2 opzionali) : Id, ParentId[, numero vertici e numero triangoli]
if ( vsParams.size() < 2)
return false ;
// recupero Id e ParentId
m_sId = vsParams[0] ;
m_sParentId = vsParams[1] ;
// recupero i parametri opzionali
int nNumVert = 3 ;
if ( vsParams.size() >= 3)
FromString( vsParams[2], nNumVert) ;
int nNumTria = 1 ;
if ( vsParams.size() >= 4)
FromString( vsParams[3], nNumTria) ;
// creo la superficie
ISurfTriMesh* pSTM = CreateSurfTriMesh() ;
if ( pSTM == nullptr)
return false ;
// la inizializzo
if ( ! pSTM->Init( nNumVert, nNumTria))
return false ;
// salvo il puntatore
if ( m_pGeoObj != nullptr)
delete m_pGeoObj ;
m_pGeoObj = pSTM ;
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshAddVertex( const STRVECTOR& vsParams)
{
// 1 parametro : punto
if ( vsParams.size() != 1)
return false ;
// recupero il riferimento in cui va inserito
Frame3d frRef ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( m_sParentId), frRef))
return false ;
// recupero il punto
Point3d ptP ;
if ( ! GetPointParam( vsParams[0], frRef, ptP))
return false ;
// recupero la superficie
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// aggiungo il vertice
return ( pSTM->AddVertex( ptP) != -1) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshAddTriangle( const STRVECTOR& vsParams)
{
// 3 parametri : IdV1, IdV2, IdV3
if ( vsParams.size() != 3)
return false ;
// recupero gli indici dei 3 vertici
int nIdVert[3] ;
if ( ! FromString( vsParams[0], nIdVert[0]) ||
! FromString( vsParams[1], nIdVert[1]) ||
! FromString( vsParams[2], nIdVert[2]))
return false ;
// recupero la superficie
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// aggiungo il triangolo definito con gli indici dei 3 vertici
return ( pSTM->AddTriangle( nIdVert) != -1) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshEnd( const STRVECTOR& vsParams)
{
// nessun parametro
if ( vsParams.size() != 0)
return false ;
// recupero la superficie
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
if ( pSTM == nullptr)
return false ;
// valido la superficie e calcolo le adiacenze
if ( ! pSTM->AdjustTopology())
return false ;
// inserisco la superficie trimesh nel DB
m_pGeoObj = nullptr ;
bool bOk = AddGeoObj( m_sId, m_sParentId, pSTM) ;
m_sId.clear() ;
m_sParentId.clear() ;
return bOk ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshByContour( const STRVECTOR& vsParams)
{
// 3 o 4 parametri : Id, ParentId, IdCurve[, dLinTol]
if ( vsParams.size() != 3 && vsParams.size() != 4)
return false ;
// recupero la tolleranza lineare
double dLinTol = LIN_TOL_STD ;
if ( vsParams.size() == 4)
FromString( vsParams[3], dLinTol) ;
// recupero l'identificativo della curva
int nIdCrv = GetIdParam( vsParams[2]) ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// calcolo la polilinea che approssima la curva
PolyLine PL ;
if ( ! GetPolylineFromCurve( nIdCrv, frDest, dLinTol, PL))
return false ;
// creo la superficie
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
if ( ! IsValid( pSTM))
return false ;
// costruisco la triangolazione
if ( ! pSTM->CreateByFlatContour( PL))
return false ;
// inserisco la superficie trimesh nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshByExtrusion( const STRVECTOR& vsParams)
{
// 4 o 5 parametri : Id, ParentId, IdCurve, vtExtr[, dLinTol]
if ( vsParams.size() != 4 && vsParams.size() != 5)
return false ;
// recupero la tolleranza lineare
double dLinTol = LIN_TOL_STD ;
if ( vsParams.size() == 5)
FromString( vsParams[4], dLinTol) ;
// recupero la curva
int nIdCrv = GetIdParam( vsParams[2]) ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// calcolo la polilinea che approssima la curva
PolyLine PL ;
if ( ! GetPolylineFromCurve( nIdCrv, frDest, dLinTol, PL))
return false ;
// recupero il vettore di estrusione
Vector3d vtExtr ;
if ( ! GetVectorParam( vsParams[3], frDest, vtExtr))
return false ;
// creo la superficie
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
if ( ! IsValid( pSTM))
return false ;
// costruisco l'estrusione
if ( ! pSTM->CreateByExtrusion( PL, vtExtr))
return false ;
// inserisco la superficie trimesh nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshByTwoPaths( const STRVECTOR& vsParams)
{
// 4 o 5 parametri : Id, ParentId, IdCurve1, IdCurve2[, dLinTol]
if ( vsParams.size() != 4 && vsParams.size() != 5)
return false ;
// recupero la tolleranza lineare
double dLinTol = LIN_TOL_STD ;
if ( vsParams.size() == 5)
FromString( vsParams[4], dLinTol) ;
// recupero il riferimento del gruppo destinazione
Frame3d frDest ;
if ( ! m_pGDB->GetGroupGlobFrame( GetIdParam( vsParams[1]), frDest))
return false ;
// recupero l'identificativo della prima curva
int nIdCrv1 = GetIdParam( vsParams[2]) ;
// calcolo la polilinea che approssima la prima curva
PolyLine PL1 ;
if ( ! GetPolylineFromCurve( nIdCrv1, frDest, dLinTol, PL1))
return false ;
// recupero l'identificativo della seconda curva
int nIdCrv2 = GetIdParam( vsParams[3]) ;
// calcolo la polilinea che approssima la seconda curva
PolyLine PL2 ;
if ( ! GetPolylineFromCurve( nIdCrv2, frDest, dLinTol, PL2))
return false ;
// creo la superficie
PtrOwner<ISurfTriMesh> pSTM( CreateSurfTriMesh()) ;
if ( ! IsValid( pSTM))
return false ;
// costruisco la rigata tra le due curve
if ( ! pSTM->CreateByTwoCurves( PL1, PL2))
return false ;
// inserisco la superficie trimesh nel DB
return AddGeoObj( vsParams[0], vsParams[1], Release( pSTM)) ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshByScrewing( bool bMove, const STRVECTOR& vsParams)
@@ -1624,6 +1683,90 @@ GdbExecutor::GetPolylineFromCurve( int nId, const Frame3d& frDest, double dLinTo
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshChangeSmoothAng( const STRVECTOR& vsParams)
{
// 2 parametri : Id, dSmoothAngDeg
if ( vsParams.size() != 2)
return false ;
// recupero la superficie
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( GetIdParam( vsParams[0]))) ;
if ( pStm == nullptr)
return false ;
// recupero il valore dell'angolo
double dSmoothAng ;
if ( ! FromString( vsParams[1], dSmoothAng))
return false ;
// imposto l'angolo
pStm->SetSmoothAngle( dSmoothAng) ;
return true ;
}
//----------------------------------------------------------------------------
bool
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)
return false ;
// eseguo la compattazione
return pStm->DoCompacting() ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::SurfTriMeshDoSewing( const STRVECTOR& vsParams)
{
// 2 o 3 parametri : Id, IdOther[, bErase]
if ( vsParams.size() != 2 && vsParams.size() != 3)
return false ;
// eventuale flag per cancellazione delle superfici cucite alla prima
bool bErase = false ;
if ( vsParams.size() >= 3 && vsParams[2] != "0")
bErase = true ;
// recupero la prima superficie
int nIdStm = GetIdParam( vsParams[0]) ;
ISurfTriMesh* pStm = GetSurfTriMesh( m_pGDB->GetGeoObj( nIdStm)) ;
if ( pStm == nullptr)
return false ;
// ne recupero il riferimento
Frame3d frStm ;
if ( ! m_pGDB->GetGlobFrame( nIdStm, frStm))
return false ;
// recupero lista nomi delle altre superfici
INTVECTOR vnNames ;
if ( ! GetNamesParam( vsParams[1], vnNames))
return false ;
// esecuzione
INTVECTOR::iterator Iter ;
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter) {
// recupero la superficie da cucire
const ISurfTriMesh* pStmS = GetSurfTriMesh( m_pGDB->GetGeoObj( *Iter)) ;
if ( pStmS == nullptr)
return false ;
// recupero il riferimento
Frame3d frStmS ;
if ( ! m_pGDB->GetGlobFrame( *Iter, frStmS))
return false ;
// lo esprimo rispetto a quello della prima superficie
frStmS.ToLoc( frStm) ;
// eseguo la cucitura
if ( ! pStm->DoSewing( *pStmS, frStm))
return false ;
}
// se richiesto, cancello le superfici cucite alla prima
if ( bErase) {
for ( Iter = vnNames.begin() ; Iter != vnNames.end() ; ++Iter)
m_pGDB->Erase( *Iter) ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
GdbExecutor::AddGeoObj( const string& sId, const string& sIdParent, IGeoObj* pGeoObj)