- ulteriore riduzione di copie di costruzione e copie di polyline in tree.

This commit is contained in:
Daniele Bariletti
2025-03-24 12:42:56 +01:00
parent eb9aaef53a
commit b2e799e1d6
3 changed files with 30 additions and 57 deletions
+2 -32
View File
@@ -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 ;
}
+24 -17
View File
@@ -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
+4 -8
View File
@@ -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.
} ;