EgtGeomKernel :
- implementato il trim dello spazio parametrico. Da aggiungere : - gestione delle celle non intersecate, interne ai loop Problematiche : - gestione di aree di trim nested in una cella
This commit is contained in:
+46
-20
@@ -149,10 +149,12 @@ SurfBezier::SetTrimRegion( const ISurfFlatRegion& sfrTrimReg)
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
SurfBezier::GetTrimRegion( ISurfFlatRegion& sfrTrimReg)
|
||||
SurfFlatRegion*
|
||||
SurfBezier::GetTrimRegion( void) const
|
||||
{
|
||||
return true ;
|
||||
if ( ! m_bTrimmed || m_pTrimReg == nullptr )
|
||||
return nullptr ;
|
||||
return m_pTrimReg ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -1228,39 +1230,62 @@ SurfBezier::GetCurveOnV( double dU) const
|
||||
CurveComposite*
|
||||
SurfBezier::GetLoop( int nLoop) const
|
||||
{
|
||||
// Se superficie completa, basta concatenare le 4 isoparametriche di bordo
|
||||
if ( ! m_bTrimmed) {
|
||||
// Esiste solo il loop esterno
|
||||
if ( nLoop != 0)
|
||||
// Il primo loop sono le 4 isoparametriche di bordo concatenate
|
||||
if ( ! m_bTrimmed ) {
|
||||
if ( nLoop != 0 )
|
||||
return nullptr ;
|
||||
// Loop
|
||||
// Loop
|
||||
PtrOwner<CurveComposite> pLoop( CreateBasicCurveComposite()) ;
|
||||
// prima curva isoparametrica in U con V=0
|
||||
// prima curva isoparametrica in U con V=0
|
||||
PtrOwner<CurveComposite> pCrvCoU0( GetCurveOnU( 0)) ;
|
||||
if ( ! IsNull( pCrvCoU0) && ! pCrvCoU0->IsAPoint())
|
||||
pLoop->AddCurve( Release( pCrvCoU0)) ;
|
||||
// seconda curva isoparametrica in V con U=m_nSpanU
|
||||
// seconda curva isoparametrica in V con U=m_nSpanU
|
||||
PtrOwner<CurveComposite> pCrvCoV1( GetCurveOnV( m_nSpanU)) ;
|
||||
if ( ! IsNull( pCrvCoV1) && ! pCrvCoV1->IsAPoint())
|
||||
pLoop->AddCurve( Release( pCrvCoV1)) ;
|
||||
// terza curva isoparametrica in U con V=m_nSpanV invertita
|
||||
// terza curva isoparametrica in U con V=m_nSpanV invertita
|
||||
PtrOwner<CurveComposite> pCrvCoU1( GetCurveOnU( m_nSpanV)) ;
|
||||
if ( ! IsNull( pCrvCoU1) && ! pCrvCoU1->IsAPoint()) {
|
||||
pCrvCoU1->Invert() ;
|
||||
pLoop->AddCurve( Release( pCrvCoU1)) ;
|
||||
}
|
||||
// quarta curva isoparametrica in V con U=0 invertita
|
||||
// quarta curva isoparametrica in V con U=0 invertita
|
||||
PtrOwner<CurveComposite> pCrvCoV0( GetCurveOnV( 0)) ;
|
||||
if ( ! IsNull( pCrvCoV0) && ! pCrvCoV0->IsAPoint()) {
|
||||
pCrvCoV0->Invert() ;
|
||||
pLoop->AddCurve( Release( pCrvCoV0)) ;
|
||||
}
|
||||
// se loop chiuso lo restituisco, altrimenti errore
|
||||
// se loop chiuso lo restituisco, altrimenti errore
|
||||
return ( pLoop->IsClosed() ? Release( pLoop) : nullptr) ;
|
||||
}
|
||||
// altrimenti trimmata, per ora non gestita
|
||||
else
|
||||
return nullptr ;
|
||||
// la superficie è trimmata, quindi devo cercare nei vari chunck il loop corrispondente
|
||||
else {
|
||||
if ( nLoop > m_pTrimReg->GetChunkCount())
|
||||
return nullptr ;
|
||||
else {
|
||||
int nLoopCount = 0 ;
|
||||
int nChunck = 0, nLoopLoc = 0;
|
||||
INTVECTOR nLoopCountPerChunck ;
|
||||
for ( int i = 0 ; i < m_pTrimReg->GetChunkCount() && nLoopCount != nLoop ; ++ i) {
|
||||
int nLoopCountLoc = 0 ;
|
||||
for ( int j = 0 ; j < m_pTrimReg->GetLoopCount( i) ; ++ j) {
|
||||
++ nLoopCountLoc ;
|
||||
++ nLoopCount ;
|
||||
if ( nLoopCount != nLoop ) {
|
||||
nChunck = i ;
|
||||
nLoopLoc = j ;
|
||||
break ;
|
||||
}
|
||||
}
|
||||
nLoopCountPerChunck.push_back( nLoopCountLoc) ;
|
||||
}
|
||||
if ( nLoopCount < nLoop )
|
||||
return nullptr ;
|
||||
PtrOwner<CurveComposite> pLoop( GetBasicCurveComposite( m_pTrimReg->GetLoop( nChunck, nLoopLoc))) ;
|
||||
return Release( pLoop) ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -1473,21 +1498,22 @@ SurfBezier::GetAuxSurf( void) const
|
||||
return m_pSTM ;
|
||||
|
||||
// costruttore della superficie
|
||||
|
||||
Tree Tree( this, true) ;
|
||||
Tree.BuildTree() ;
|
||||
POLYLINEVECTOR vPL ;
|
||||
Tree.GetPolygons( vPL) ;
|
||||
vector<POLYLINEVECTOR> vvPL ;
|
||||
Tree.GetPolygons( vvPL) ;
|
||||
PtrOwner<SurfTriMesh> pSrfTm( CreateBasicSurfTriMesh()) ;
|
||||
StmFromTriangleSoup stmSoup ;
|
||||
if ( ! stmSoup.Start())
|
||||
return nullptr ;
|
||||
|
||||
// prendo i punti di ogni polyline dell'albero, li triangolo e li porto in 3d
|
||||
for ( PolyLine i : vPL) {
|
||||
for ( POLYLINEVECTOR vPL : vvPL) {
|
||||
PNTVECTOR vPnt ;
|
||||
INTVECTOR vTria ;
|
||||
Triangulate Tri ;
|
||||
if ( ! Tri.Make( i, vPnt, vTria))
|
||||
if ( ! Tri.Make( vPL, vPnt, vTria))
|
||||
return nullptr ;
|
||||
|
||||
// porto i punti in 3d
|
||||
|
||||
Reference in New Issue
Block a user