- ulteriore riduzione di copie di costruzione e copie di polyline in tree.
This commit is contained in:
+2
-32
@@ -1612,39 +1612,9 @@ bool
|
||||
SurfBezier::UpdateEdgesFromTree( Tree& tr) const
|
||||
{
|
||||
tr.GetEdges3D( m_mCCEdge) ;
|
||||
//for ( int i= 0 ; i < int( mPlEdges.size()); ++i) {
|
||||
// for ( int j = 0 ; j < int ( mPlEdges[i].size()) ; ++j) {
|
||||
// m_mCCEdge[i].emplace_back(CreateBasicCurveComposite()) ;
|
||||
// if ( ! m_mCCEdge[i].back()->FromPolyLine(mPlEdges[i][j]) ) {
|
||||
// Point3d ptStart ;
|
||||
// if ( ! mPlEdges[i][j].GetFirstPoint( ptStart))
|
||||
// continue ;
|
||||
// m_mCCEdge[i].back()->FromPoint( ptStart) ;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
if ( m_bTrimmed) {
|
||||
POLYLINEVECTOR vPl ;
|
||||
tr.GetSplitLoops( vPl) ;
|
||||
|
||||
// recupero i loop nel parametrico
|
||||
for( int i = 0 ; i < int( vPl.size()); ++i) {
|
||||
m_vCCLoop.emplace_back(CreateBasicCurveComposite()) ;
|
||||
m_vCCLoop.back()->FromPolyLine(vPl[i]) ;
|
||||
}
|
||||
}
|
||||
|
||||
// if ( m_bTrimmed) {
|
||||
// //POLYLINEVECTOR vPl ;
|
||||
// tr.GetSplitLoops( m_vCCLoop) ;
|
||||
|
||||
// //// recupero i loop nel parametrico
|
||||
// //for( int i = 0 ; i < int( vPl.size()); ++i) {
|
||||
// // m_vCCLoop.emplace_back(CreateBasicCurveComposite()) ;
|
||||
// // m_vCCLoop.back()->FromPolyLine(vPl[i]) ;
|
||||
// //}
|
||||
// }
|
||||
if ( m_bTrimmed)
|
||||
tr.GetSplitLoops( m_vCCLoop) ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
|
||||
@@ -223,7 +223,7 @@ Tree::SetSurf( const SurfBezier* pSrfBz, bool bSplitPatches, const Point3d& ptMi
|
||||
m_vPlApprox.clear() ;
|
||||
m_vPolygons.clear() ;
|
||||
m_vPolygonsCorr.clear() ;
|
||||
m_vPlLoop2D.clear() ;
|
||||
m_vCCLoop2D.clear() ;
|
||||
|
||||
m_pSrfBz = pSrfBz ;
|
||||
m_bSplitPatches = bSplitPatches ;
|
||||
@@ -2280,13 +2280,21 @@ Tree::FindCell( const Point3d& ptToAssign, const CurveLine& cl, INTVECTOR vCells
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
bool
|
||||
Tree::UpdateSplitLoop( PolyLine& pl, int& nCount, Point3d& pt)
|
||||
Tree::UpdateSplitLoop( ICurveComposite* pCC, Point3d& pt)
|
||||
{
|
||||
Point3d ptLast ;
|
||||
pl.GetLastPoint( ptLast) ;
|
||||
if ( pl.AddUPoint( nCount, pt))
|
||||
++ nCount ;
|
||||
if ( pl.GetPointNbr() != 1 ) {
|
||||
bool bAdded = false ;
|
||||
if ( ! pCC->GetEndPoint( ptLast)) {
|
||||
// potrei avere una compo vuota o con solo un punto
|
||||
// se non riesco ad aggiungere una linea allora era una compo vuota
|
||||
if ( ! pCC->AddLine( pt))
|
||||
pCC->AddPoint( pt) ;
|
||||
bAdded = true ;
|
||||
pCC->GetStartPoint( ptLast) ;
|
||||
}
|
||||
if( pCC->IsValid()) {
|
||||
if ( ! bAdded)
|
||||
pCC->AddLine( pt) ;
|
||||
Vector3d vtDir = pt - ptLast ;
|
||||
if ( ! vtDir.Normalize())
|
||||
return false ;
|
||||
@@ -2324,9 +2332,8 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons)
|
||||
// percorro i loop trovando le interezioni con le celle e riempiendo i vettori m_vInters delle varie celle
|
||||
for ( int i = 0 ; i < (int) m_vPlApprox.size() ; ++ i) {
|
||||
PolyLine plLoop = get<0>( m_vPlApprox[i]) ;
|
||||
// creo la polyline che aggiunge alla polyline originale degli split dove interseca le celle ( serve per ricostruire gli edge aperti della superficie)
|
||||
PolyLine plLoopSplit ;
|
||||
int nPtLoopSplit = 0 ;
|
||||
// creo la compo che aggiunge alla polyline originale degli split dove interseca le celle ( serve per ricostruire gli edge aperti della superficie)
|
||||
PtrOwner<ICurveComposite> pCCLoopSplit( CreateCurveComposite()) ;
|
||||
// controllo se il loop è CCW o CW
|
||||
bool bCCW = get<1>( m_vPlApprox[i]) ;
|
||||
// trovo in quale cella è il ptStart
|
||||
@@ -2338,8 +2345,8 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons)
|
||||
advance( ptSecond, 1) ;
|
||||
CurveLine clFirst ;
|
||||
clFirst.Set( ptFirst->first, ptSecond->first) ;
|
||||
// aggiorno la polyline splittata
|
||||
UpdateSplitLoop( plLoopSplit, nPtLoopSplit, ptFirst->first) ;
|
||||
// aggiorno la compo splittata
|
||||
UpdateSplitLoop( pCCLoopSplit, ptFirst->first) ;
|
||||
// individuo la cella da cui parte il loop
|
||||
INTVECTOR nCells = FindCell( ptStart, clFirst) ;
|
||||
int nId ;
|
||||
@@ -2408,15 +2415,15 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons)
|
||||
pCell->m_vInters.back().bCCW = bCCW ;
|
||||
// salvo il chunk del loop
|
||||
pCell->m_vInters.back().nChunk = m_mChunk[i] ;
|
||||
// aggiorno la polyline splittata
|
||||
UpdateSplitLoop( plLoopSplit, nPtLoopSplit, vptInters.back()) ;
|
||||
// aggiorno la compo splittata
|
||||
UpdateSplitLoop( pCCLoopSplit, vptInters.back()) ;
|
||||
}
|
||||
// controllo di aggiungere un punto abbastanza distante dal precedente
|
||||
if( ! AreSamePointXYEpsilon( vptInters.back(), ptCurr, 10 * EPS_SMALL)) {
|
||||
// aggiungo la fine del segmento nel vettore delle intersezioni
|
||||
vptInters.push_back( ptCurr) ;
|
||||
// aggiorno la polyline splittata
|
||||
UpdateSplitLoop( plLoopSplit, nPtLoopSplit, ptCurr) ;
|
||||
// aggiorno la compo splittata
|
||||
UpdateSplitLoop( pCCLoopSplit, ptCurr) ;
|
||||
}
|
||||
}
|
||||
if ( nId == nFirstCell)
|
||||
@@ -2466,8 +2473,8 @@ Tree::TraceLoopLabelCell( const POLYLINEVECTOR& vplPolygons)
|
||||
pCell->m_vInters[nPass].nOut = nOut ;
|
||||
}
|
||||
}
|
||||
// salvo la polyline splittata
|
||||
m_vPlLoop2D.emplace_back( plLoopSplit) ;
|
||||
// salvo la compo splittata
|
||||
m_vCCLoop2D.emplace_back( Release( pCCLoopSplit)) ;
|
||||
}
|
||||
|
||||
// riordino i vettori di intersezione per ogni cella e setto il flag RightEdgeIn
|
||||
|
||||
@@ -262,10 +262,8 @@ class Tree
|
||||
bool GetPolygonsBasic( POLYLINEVECTOR& vPolygons, INTVECTOR vCells = {}) ;
|
||||
bool GetLeaves ( std::vector<Cell>& vLeaves) const ; // restituisce gli indici delle foglie nell'albero
|
||||
bool GetEdges3D ( vector<ICRVCOMPOPOVECTOR>& mCCEdge) ; // restituisce gli edge 3D come polyline
|
||||
bool GetSplitLoops( POLYLINEVECTOR& vPl) const // funzione che restituisce i loop splitatti ai confini delle celle
|
||||
{ for ( int i = 0 ; i < int( m_vPlLoop2D.size()); ++i) vPl.emplace_back( m_vPlLoop2D[i]) ; return true ; };
|
||||
// bool GetSplitLoops( ICRVCOMPOPOVECTOR& vCCLoopSplit) const // funzione che restituisce i loop splitatti ai confini delle celle
|
||||
// { for ( int i = 0 ; i < int( m_vCCLoop2D.size()); ++i) vCCLoopSplit.emplace_back( m_vCCLoop2D[i]->Clone()) ; return true ; };
|
||||
bool GetSplitLoops( ICRVCOMPOPOVECTOR& vCCLoopSplit) const // funzione che restituisce i loop splitatti ai confini delle celle
|
||||
{ for ( int i = 0 ; i < int( m_vCCLoop2D.size()); ++i) vCCLoopSplit.emplace_back( m_vCCLoop2D[i]->Clone()) ; return true ; };
|
||||
void SetTestMode( void) { m_bTestMode = true ;} ; // attivando la test mode, per la costruzione dell'albero viene usata la funzione BuiltTree_test e viene corretta di conseguenza la FindCell
|
||||
// funzioni da usare per ricostruire tagli che vanno aggiunti allo spazio parametrico
|
||||
bool AddCutsToRoot( POLYLINEVECTOR& vCuts) ; // aggiunge i tagli al tree
|
||||
@@ -308,8 +306,7 @@ class Tree
|
||||
bool CheckIfBetween( const Inters& inA, const Inters& inB) const ; // / controllo se inB è compreso tra l'end e lo start di inA (in senso CCW)
|
||||
bool OnWhichEdge( int nId, const Point3d& ptToAssign, int& nEdge) const ; // indica a quale edge o vertice il punto è vicino entro EPS_SMALL
|
||||
bool AdjustCuts( void) ;
|
||||
bool UpdateSplitLoop( PolyLine& pl, int& nCount, Point3d& pt) ;
|
||||
//bool UpdateSplitLoop( ICurveComposite* pCC, Point3d& pt) ;
|
||||
bool UpdateSplitLoop( ICurveComposite* pCC, Point3d& pt) ;
|
||||
bool CloseOpenCuts( void) ;
|
||||
bool CloseOpenCuts( POLYLINEVECTOR& vPL, PolyLine& pl) const ;
|
||||
bool VerifyLoopOrientation( ICURVEPLIST& vpCrv, BOOLVECTOR& vbOrientation) const ; // verifico l'orientazione ( CCW o CW) delle polyline in base a come sono contenute le une nelle altre
|
||||
@@ -344,7 +341,6 @@ class Tree
|
||||
INTVECTOR m_vnLeaves ; // vettore delle foglie
|
||||
INTVECTOR m_vnParents ; // vettore delle celle ottenute dalla divisione preliminare in singole patch
|
||||
bool m_bTestMode ; // bool che indica se la test mode è attiva
|
||||
POLYLINEVECTOR m_vPlLoop2D ; // vettore che contiene le polyline che rappresentano i loop di trim tenendo conto della divisione in celle
|
||||
//ICRVCOMPOPOVECTOR m_vCCLoop2D ; // vettore che contiene le CurveCompo che rappresentano i loop di trim tenendo conto della divisione in celle
|
||||
ICRVCOMPOPOVECTOR m_vCCLoop2D ; // vettore che contiene le CurveCompo che rappresentano i loop di trim tenendo conto della divisione in celle
|
||||
vector<pair<BIPNTVECTOR, ChainCurves>> m_vCEdge2D ; // vettore che le chain che rappresentano ciò che resta degli edge originali, tenendo conto dei trim.
|
||||
} ;
|
||||
Reference in New Issue
Block a user