From 92a8cdad99a4f2b40539fd76950f9d992c622b1f Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Wed, 10 Jul 2024 10:24:23 +0200 Subject: [PATCH 1/4] EgtGeomKernel : - in CalcPocketing aggiunto calcolo della Feed per percorsi a curva singola. --- CalcPocketing.cpp | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index fa68929..a4a0255 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -125,7 +125,24 @@ AssignMinFeed( ICurveComposite* pCrv, const PocketParams& PockParams) //--------------------------------------------------------------------------- static bool -GetFeedForParam( double& dPar, const PocketParams& PockParams, double& dFeed) +AssignCustomFeed( ICurveComposite* pCrv, const PocketParams& PockParams, double dFeed) +{ + // controllo dei parametri + if ( pCrv == nullptr || ! pCrv->IsValid() || pCrv->GetCurveCount() == 0) + return false ; + // La Feed deve essere compresa tra la minima e la massima + dFeed = Clamp( dFeed, GetMinFeed( PockParams), GetMaxFeed( PockParams)) ; + + // assegno la Feed ad ogni sottocurva di pCrv + for ( int u = 0 ; u < pCrv->GetCurveCount() ; ++ u) + pCrv->SetCurveTempParam( u, dFeed, 0) ; + + return true ; +} + +//--------------------------------------------------------------------------- +static bool +GetFeedForParam( double dPar, const PocketParams& PockParams, double& dFeed) { /* Feed @@ -1692,12 +1709,11 @@ GetPocketCurvesByCloseEdges( const ISurfFlatRegion* pSfrChunk, const PocketParam bAllRemoved = false ; // controllo se la superficie si annulla con un controOffset del raggio utensile - PtrOwner pSfrCheck( CloneSurfFlatRegion( pSfrChunk)) ; - if ( IsNull( pSfrCheck) || ! pSfrCheck->IsValid()) - return false ; - pSfrCheck->Offset( - PockParams.dRad + 200 * EPS_SMALL, ICurve::OFF_FILLET) ; - if ( pSfrCheck->IsValid() && pSfrCheck->GetChunkCount() > 0) - return true ; // se la superficie non si annulla, allora non ricavo nessuna curva + double dMaxOffs ; + pSfrChunk->GetMaxOffset( dMaxOffs) ; + if ( dMaxOffs > PockParams.dRad + 200 * EPS_SMALL) + return true ; + /* NB. Si poteva calcolare la Fat curve del raggio utensile dell'Offset di tutti i chiusi e vedere se l'unione di queste regioni copriva interamente il Chunk attuale... così facendo rischio di @@ -1909,17 +1925,18 @@ GetPocketCurvesByCloseEdges( const ISurfFlatRegion* pSfrChunk, const PocketParam // imposto le Feed per tali curve e aggiungo eventuale entrata da fuori for ( int i = 0 ; i < int( vCrvCompoRes_tmp.size()) ; ++ i) { - // per ora è default ( sono passate singole)... /* Idea : Feed proporzionale al minimo Offset per annullare la regione ? - -> Massimo parametro sui bisettori di VORONOI (?) + -> Massimo parametro sui bisettori di VORONOI */ - AssignMinFeed( vCrvCompoRes_tmp[i], PockParams) ; + double dFeed ; + GetFeedForParam( 2 * dMaxOffs, PockParams, dFeed) ; + AssignCustomFeed( vCrvCompoRes_tmp[i], PockParams, dFeed) ; // ricavo punto di inizio e vettore tangente Point3d ptStart ; vCrvCompoRes_tmp[i]->GetStartPoint( ptStart) ; Vector3d vtStart ; vCrvCompoRes_tmp[i]->GetStartDir( vtStart) ; // recupero il punto di caduta dell'utensile - Point3d ptFall = ptStart - vtStart * ( PockParams.dRad + PockParams.dOpenMinSafe) ; + Point3d ptFall = ptStart - vtStart * ( 2 * PockParams.dRad + PockParams.dOpenMinSafe) ; // controllo che il tool non sia interno alla regione limite if ( pSfrLimit->IsValid()) { PtrOwner pCrvToolShape( CreateCurveArc()) ; @@ -1934,7 +1951,7 @@ GetPocketCurvesByCloseEdges( const ISurfFlatRegion* pSfrChunk, const PocketParam } else { // se trovo intersezione, provo a ruotare di 90° vtStart.Rotate( Z_AX, ANG_RIGHT) ; // verso sinistra - ptFall = ptStart + vtStart * ( PockParams.dRad + PockParams.dOpenMinSafe) ; + ptFall = ptStart + vtStart * ( 2 * PockParams.dRad + PockParams.dOpenMinSafe) ; if ( ! pCrvToolShape->Set( ptFall, Z_AX, PockParams.dRad - 100 * EPS_SMALL)) return false ; ccClass.clear() ; From f6d3873ecbe92fa5f7eee29c7b5b15e123c95156 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Wed, 10 Jul 2024 12:35:20 +0200 Subject: [PATCH 2/4] EgtGeomKernel : - In CalcPocketing, aggiunta inversione dei percorsi. --- CalcPocketing.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index a4a0255..97de885 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -1950,7 +1950,7 @@ GetPocketCurvesByCloseEdges( const ISurfFlatRegion* pSfrChunk, const PocketParam vCrvCompoRes_tmp[i]->SetCurveTempParam( 0, GetMinFeed( PockParams) , 0) ; // Feed minima } else { // se trovo intersezione, provo a ruotare di 90° - vtStart.Rotate( Z_AX, ANG_RIGHT) ; // verso sinistra + vtStart.Rotate( Z_AX, PockParams.bInvert ? - ANG_RIGHT : ANG_RIGHT) ; ptFall = ptStart + vtStart * ( 2 * PockParams.dRad + PockParams.dOpenMinSafe) ; if ( ! pCrvToolShape->Set( ptFall, Z_AX, PockParams.dRad - 100 * EPS_SMALL)) return false ; @@ -4379,7 +4379,7 @@ CalcBoundedSmoothedLink( const Point3d& ptStart, const Vector3d& vtStart, const PtrOwner pCrvCir( CreateBasicCurveArc()) ; if ( IsNull( pCrvCir)) return false ; - pCrvCir->SetCPAN( Media( ptStart, ptEnd), ptStart, - 360, 0, Z_AX) ; + pCrvCir->SetCPAN( Media( ptStart, ptEnd), ptStart, PockParams.bInvert ? 360 : - 360, 0, Z_AX) ; pBiArcLink.Set( pCrvCir->Clone()) ; pCrvLink->AddCurve( pBiArcLink->Clone()) ; return true ; @@ -6451,7 +6451,7 @@ CalcZigZag( const ISurfFlatRegion* pSrfZigZag, const PocketParams& PockParams, I dYStep = PockParams.dSideStep ; } - int nRef = (( nYStep + ( 1)) % 2) ; + int nRef = (( nYStep + ( PockParams.bInvert ? 0 : 1)) % 2) ; // tratto valido struct Section { @@ -7093,6 +7093,10 @@ AddOneWay( const ISurfFlatRegion* pSrfPock, const ISurfFlatRegion* pSfrOrig, con if ( IsNull( pLine) || ! pLine->SetPVL( ptStart, X_AX, dDimX + 2 * EXP_LEN)) return false ; + // se richiesta inversione + if ( PockParams.bInvert) + pLine->Invert() ; + // linea come composita per Feed ( la dovrò spezzare) PtrOwner pCrvCompo( CreateCurveComposite()) ; if ( IsNull( pCrvCompo)) @@ -7144,7 +7148,7 @@ AddOneWay( const ISurfFlatRegion* pSrfPock, const ISurfFlatRegion* pSfrOrig, con //---------------------------------------------------------------------------- bool CalcPocketing( const ISurfFlatRegion* pSfr, double dRad, double dRadOffs, double dStep, double dAngle, - int nType, bool bSmooth, ISurfFlatRegion* pSfrLimit, ICRVCOMPOPOVECTOR& vCrvCompoRes) + int nType, bool bSmooth, bool bInvert, ISurfFlatRegion* pSfrLimit, ICRVCOMPOPOVECTOR& vCrvCompoRes) { // controllo dei parametri if ( pSfr == nullptr || ! pSfr->IsValid() || @@ -7163,6 +7167,7 @@ CalcPocketing( const ISurfFlatRegion* pSfr, double dRad, double dRadOffs, double myParams.bSmooth = bSmooth ; myParams.dAngle = dAngle ; myParams.dSideStep = dStep ; + myParams.bInvert = bInvert ; if ( pSfrLimit != nullptr && pSfrLimit->IsValid()) myParams.SfrLimit.CopyFrom( pSfrLimit) ; From fd4677d099f062310e7c6a16127fbb877d16169b Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 11 Jul 2024 09:00:21 +0200 Subject: [PATCH 3/4] EgtGeomKernel : - piccola modifica in svuotature (tolto controllo di offset negativo). --- CalcPocketing.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index 97de885..dbd0dea 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -5918,7 +5918,7 @@ CheckIfOffsetIsNecessary( const ICurveComposite* pCrvOffs, const double dOffs, c { // controllo dei parametri - if ( pCrvOffs == nullptr || ! pCrvOffs->IsValid() || pCrvOffs->GetCurveCount() == 0 || dOffs < EPS_SMALL) + if ( pCrvOffs == nullptr || ! pCrvOffs->IsValid() || pCrvOffs->GetCurveCount() == 0) return false ; bInsert = true ; // di base inserisco From aade1d19f155f47c952d139650035674ba13b3ab Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 12 Jul 2024 08:46:00 +0200 Subject: [PATCH 4/4] EgtGeomKernel : - correzioni alle HashGrids per evitare problemi con memoria - ottimizzazione calcolo CollisionAvoid con TestSeries e TestPath fatti di seguito - piccole milgiorie a Pocketing. --- CAvToolSurfTm.cpp | 36 ++++++++++++++++++++++++------------ CalcPocketing.cpp | 34 +++++++++++----------------------- HashGrids1d.cpp | 22 +++++++++++----------- HashGrids2d.cpp | 22 +++++++++++----------- HashGrids3d.cpp | 22 +++++++++++----------- 5 files changed, 68 insertions(+), 68 deletions(-) diff --git a/CAvToolSurfTm.cpp b/CAvToolSurfTm.cpp index acb6f3d..f911a90 100644 --- a/CAvToolSurfTm.cpp +++ b/CAvToolSurfTm.cpp @@ -171,14 +171,20 @@ CAvToolSurfTm::TestSeries( PNTUVECTOR& vPntM, const Vector3d& vtDir, const Vecto // Se vettore vuoto, non devo fare alcunché if ( vPntM.empty()) return true ; - // Imposto il riferimento di movimento + // Calcolo nuovo riferimento di movimento + Frame3d frMove ; if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove)) - m_frMove.Set( ORIG, vtMove, vtDir) ; + frMove.Set( ORIG, vtMove, vtDir) ; else - m_frMove.Set( ORIG, vtMove) ; - // Predispongo Hash Grid - if ( ! PrepareHashGrid()) - return false ; + frMove.Set( ORIG, vtMove) ; + // Se riferimento di movimento non presente o diverso dal calcolato + if ( ! m_frMove.IsValid() || ! AreSameFrame( frMove, m_frMove)) { + // Ricalcolo HashGrid + if ( ! PrepareHashGrid()) + return false ; + // Salvo nuovo riferimento + m_frMove = frMove ; + } // Determino il numero di punti dell'insieme m_nTotPnt = int( vPntM.size()) ; // Recupero il numero massimo di thread concorrenti @@ -281,14 +287,20 @@ CAvToolSurfTm::TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d& dLinTol = max( dLinTol, EPS_SMALL) ; else dLinTol = -1 ; - // Imposto il riferimento di movimento + // Calcolo nuovo riferimento di movimento + Frame3d frMove ; if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove)) - m_frMove.Set( ORIG, vtMove, vtDir) ; + frMove.Set( ORIG, vtMove, vtDir) ; else - m_frMove.Set( ORIG, vtMove) ; - // Predispongo Hash Grid - if ( ! PrepareHashGrid()) - return false ; + frMove.Set( ORIG, vtMove) ; + // Se riferimento di movimento non presente o diverso dal calcolato + if ( ! m_frMove.IsValid() || ! AreSameFrame( frMove, m_frMove)) { + // Ricalcolo HashGrid + if ( ! PrepareHashGrid()) + return false ; + // Salvo nuovo riferimento + m_frMove = frMove ; + } // Determino il numero di punti del path m_nTotPnt = int( lPntM.size()) ; // Recupero il numero massimo di thread concorrenti diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index dbd0dea..75fcebb 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -6877,7 +6877,6 @@ AddSpiralOut( const ISurfFlatRegion* pSrfPock, const ISurfFlatRegion* pSfrOrig, static bool AddZigZag( const ISurfFlatRegion* pSrfPock, const ISurfFlatRegion* pSfrOrig, const PocketParams& PockParams, ICRVCOMPOPOVECTOR& vCrvCompoRes) { - // Offset della regione per curva ZigZag double dOffs = PockParams.dRad + PockParams.dRadialOffset ; @@ -7020,13 +7019,11 @@ OptimizeChunkOneWay( ISurfFlatRegion* pSrfOrig, ISURFFRPOVECTOR& vSrfIdeal) return ( int( vSrfIdeal.size() != 0)) ; } - //---------------------------------------------------------------------------- static bool AddOneWay( const ISurfFlatRegion* pSrfPock, const ISurfFlatRegion* pSfrOrig, const PocketParams& PockParams, ICRVCOMPOPOVECTOR& vCrvCompoRes) { - - double dOffs = PockParams.dRad ; + double dOffs = PockParams.dRad + PockParams.dRadialOffset ; double dExtra = 0. ; // copio la regione da svuotare @@ -7152,7 +7149,7 @@ CalcPocketing( const ISurfFlatRegion* pSfr, double dRad, double dRadOffs, double { // controllo dei parametri if ( pSfr == nullptr || ! pSfr->IsValid() || - dStep < EPS_SMALL || + dStep < 10 * EPS_SMALL || ( nType != POCKET_ZIGZAG && nType != POCKET_ONEWAY && nType != POCKET_SPIRALIN && nType != POCKET_SPIRALOUT)) return false ; @@ -7201,25 +7198,16 @@ CalcPocketing( const ISurfFlatRegion* pSfr, double dRad, double dRadOffs, double // ------------ calcolo delle curve elementari della superficie ------------------- switch ( nType) { - case POCKET_ZIGZAG : - if ( ! AddZigZag( pSfrAdj, pSfr, myParams, vCrvCompoRes)) - return false ; - break ; - case POCKET_ONEWAY : - if ( ! AddOneWay( pSfrAdj, pSfr, myParams, vCrvCompoRes)) - return false ; - break ; - case POCKET_SPIRALIN : - if ( ! AddSpiralIn( pSfrAdj, pSfr, myParams, vCrvCompoRes)) - return false ; - break ; - case POCKET_SPIRALOUT : - if ( ! AddSpiralOut( pSfrAdj, pSfr, myParams, vCrvCompoRes)) - return true ; - break ; + case POCKET_ZIGZAG : + return AddZigZag( pSfrAdj, pSfr, myParams, vCrvCompoRes) ; + case POCKET_ONEWAY : + return AddOneWay( pSfrAdj, pSfr, myParams, vCrvCompoRes) ; + case POCKET_SPIRALIN : + return AddSpiralIn( pSfrAdj, pSfr, myParams, vCrvCompoRes) ; + case POCKET_SPIRALOUT : + return AddSpiralOut( pSfrAdj, pSfr, myParams, vCrvCompoRes) ; } - - return true ; + return false ; } //---------------------------------------------------------------------------- diff --git a/HashGrids1d.cpp b/HashGrids1d.cpp index 9c20278..3831d6d 100644 --- a/HashGrids1d.cpp +++ b/HashGrids1d.cpp @@ -116,7 +116,7 @@ HashGrid1d::~HashGrid1d( void) { Clear() ; - for ( Cell* pCell = m_cell ; pCell < m_cell + m_CellCount ; ++ pCell) { + for ( Cell* pCell = m_cell ; pCell != nullptr && pCell < m_cell + m_CellCount ; ++ pCell) { if ( pCell->m_neighborOffset != m_stdNeighborOffset) delete[] pCell->m_neighborOffset ; } @@ -396,8 +396,10 @@ HashGrid1d::Enlarge( void) for ( auto pCell = m_cell ; pCell < m_cell + m_CellCount ; ++ pCell) { if ( pCell->m_neighborOffset != m_stdNeighborOffset) delete[] pCell->m_neighborOffset ; + pCell->m_neighborOffset = nullptr ; } delete[] m_cell ; + m_cell = nullptr ; // ... the number of cells is doubled in each coordinate direction, ... m_CellCount *= 2 ; @@ -641,17 +643,15 @@ HashGrids1d::Find( const BBox3d& b3Test, INTVECTOR& vnIds) const void HashGrids1d::Clear( void) { - for ( auto pGrid : m_GridList) { - delete pGrid ; - } - m_GridList.clear() ; - - m_bGridActive = false ; - - m_nonGridObjs.clear() ; - + m_ObjsList.clear() ; + m_ObjsMap.clear() ; m_objsToAdd.clear() ; - + m_nonGridObjs.clear() ; + for ( auto pGrid : m_GridList) + delete pGrid ; + m_GridList.clear() ; + m_bActivate = true ; + m_bGridActive = false ; m_b3Objs.Reset() ; } diff --git a/HashGrids2d.cpp b/HashGrids2d.cpp index 9dddd9d..9aa6985 100644 --- a/HashGrids2d.cpp +++ b/HashGrids2d.cpp @@ -125,7 +125,7 @@ HashGrid2d::~HashGrid2d( void) { Clear() ; - for ( Cell* pCell = m_cell ; pCell < m_cell + m_xyCellCount ; ++ pCell) { + for ( Cell* pCell = m_cell ; pCell != nullptr && pCell < m_cell + m_xyCellCount ; ++ pCell) { if ( pCell->m_neighborOffset != m_stdNeighborOffset) delete[] pCell->m_neighborOffset ; } @@ -445,8 +445,10 @@ HashGrid2d::Enlarge( void) for ( auto pCell = m_cell ; pCell < m_cell + m_xyCellCount ; ++ pCell) { if ( pCell->m_neighborOffset != m_stdNeighborOffset) delete[] pCell->m_neighborOffset ; + pCell->m_neighborOffset = nullptr ; } delete[] m_cell ; + m_cell = nullptr ; // ... the number of cells is doubled in each coordinate direction, ... m_xCellCount *= 2 ; @@ -695,17 +697,15 @@ HashGrids2d::Find( const BBox3d& b3Test, INTVECTOR& vnIds) const void HashGrids2d::Clear( void) { - for ( auto pGrid : m_GridList) { - delete pGrid ; - } - m_GridList.clear() ; - - m_bGridActive = false ; - - m_nonGridObjs.clear() ; - + m_ObjsList.clear() ; + m_ObjsMap.clear() ; m_objsToAdd.clear() ; - + m_nonGridObjs.clear() ; + for ( auto pGrid : m_GridList) + delete pGrid ; + m_GridList.clear() ; + m_bActivate = true ; + m_bGridActive = false ; m_b3Objs.Reset() ; } diff --git a/HashGrids3d.cpp b/HashGrids3d.cpp index f1a839d..199da94 100644 --- a/HashGrids3d.cpp +++ b/HashGrids3d.cpp @@ -132,7 +132,7 @@ HashGrid3d::~HashGrid3d( void) { Clear() ; - for ( Cell* pCell = m_cell ; pCell < m_cell + m_xyzCellCount ; ++ pCell) { + for ( Cell* pCell = m_cell ; pCell != nullptr && pCell < m_cell + m_xyzCellCount ; ++ pCell) { if ( pCell->m_neighborOffset != m_stdNeighborOffset) delete[] pCell->m_neighborOffset ; } @@ -486,8 +486,10 @@ HashGrid3d::Enlarge( void) for ( auto pCell = m_cell ; pCell < m_cell + m_xyzCellCount ; ++ pCell) { if ( pCell->m_neighborOffset != m_stdNeighborOffset) delete[] pCell->m_neighborOffset ; + pCell->m_neighborOffset = nullptr ; } delete[] m_cell ; + m_cell = nullptr ; // ... the number of cells is doubled in each coordinate direction, ... m_xCellCount *= 2 ; @@ -739,17 +741,15 @@ HashGrids3d::Find( const BBox3d& b3Test, INTVECTOR& vnIds) const void HashGrids3d::Clear( void) { - for ( auto pGrid : m_GridList) { - delete pGrid ; - } - m_GridList.clear() ; - - m_bGridActive = false ; - - m_nonGridObjs.clear() ; - + m_ObjsList.clear() ; + m_ObjsMap.clear() ; m_objsToAdd.clear() ; - + m_nonGridObjs.clear() ; + for ( auto pGrid : m_GridList) + delete pGrid ; + m_GridList.clear() ; + m_bActivate = true ; + m_bGridActive = false ; m_b3Objs.Reset() ; }