diff --git a/Pocketing.cpp b/Pocketing.cpp index e602769..0a58f6a 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -3145,10 +3145,11 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs, int nIter = 0 ; ICURVEPOVECTOR vOffs ; ICURVEPOVECTOR vCrvStack ; + DBLVECTOR vOffsValStack ; // valori dell'offset con cui sono state calcolate le cruve in vCrvStack DBLVECTOR vRadStack ; PtrOwner pOffs ; + double dOffsVal ; // valore dell'offset con cui è stato calcolato pOffs double dCurrRad = GetCurveRadius( pCompo) ; - double dOffsOld = 0.0 ; while ( nIter < MAX_ITER) { // calcolo @@ -3162,11 +3163,13 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs, if ( nIter == 0 && nReg >= OffsCrv.GetCurveCount()) return true ; // recupero le curve di offset e le metto sullo stack (se primo offset solo quella voluta) - int nCount = 0 ; + int nCount = 0 ; ICurve* pCrv = OffsCrv.GetLongerCurve() ; + bool bOffsOk = ( pCrv != nullptr) ; // indica se ho ottenuto un offset valido while ( pCrv != nullptr) { if ( nIter != 0 || nReg == nCount) { vCrvStack.emplace_back( pCrv) ; + vOffsValStack.emplace_back( dOffs) ; vRadStack.emplace_back( dCurrRad) ; if ( nIter == 0) break ; @@ -3176,11 +3179,14 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs, pCrv = OffsCrv.GetCurve() ; ++ nCount ; } - // recupero la prossima curva di offset + // recupero la prossima curva di offset se ho ottenuto un offset valido oppure ho fallito ma non è ulteriormente riducibile PtrOwner pNextOffs ; - if ( ! vCrvStack.empty()) { + double dNextOffsVal ; + if ( ! vCrvStack.empty() && ( bOffsOk || dOffs < dTRad + EPS_ZERO)) { pNextOffs.Set( Release( vCrvStack.back())) ; + dNextOffsVal = vOffsValStack.back() ; vCrvStack.pop_back() ; + vOffsValStack.pop_back() ; dCurrRad = vRadStack.back() ; vRadStack.pop_back() ; } @@ -3191,10 +3197,10 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs, pNewOffs.Set( CreateCurveComposite()) ; else if ( ! IsNull( pOffs)) pNewOffs.Set( pOffs->Clone()) ; - + if ( ! IsNull( pOffs) && nIter > 1) { - double dOverlap = 1 - dOffsOld / m_TParams.m_dDiam ; + double dOverlap = 1 - dOffsVal / m_TParams.m_dDiam ; double dSharpSin = 1 - 2 * dOverlap ; // valore critico const ICurve * pCrv = pOffs->GetFirstCurve() ; @@ -3249,7 +3255,7 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs, pCrv = pOffs->GetNextCurve() ; } } - + double dRad = GetCurveRadius( pNextOffs) ; bool bNextOk = ( dRad > EPS_ZERO && dRad < dCurrRad) ; bool bSmallRad = ( nIter == 0 ? dOffs < dTRad + GetOffsR() + EPS_ZERO : dOffs < dTRad + EPS_ZERO) ; @@ -3258,13 +3264,13 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs, // inserisco l'offset nel vettore vOffs.emplace_back( Release( pNewOffs)) ; } - // aggiorno valore di dOffs - dOffsOld = dOffs ; + // se offset va bene if ( bNextOk) { // sistemo per prossimo step dCurrRad = dRad ; pOffs.Set( GetCurveComposite( Release( pNextOffs))) ; + dOffsVal = dNextOffsVal ; // nuovo valore pari allo step dOffs = GetSideStep() ; } @@ -3327,7 +3333,7 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, int nReg, bool bSplitArcs, for ( int i = 0 ; i < int( vOffs.size()) ; ++ i) { // se collegamento da aggiungere if ( ! IsNull( vLinks[i])) { - // accodo nel percorso di lavorazione + // accodo nel percorso di lavorazione pMCrv->AddCurve( Release( vLinks[i])) ; } // se richiesta percorrenza invertita