EgtMachKernel :

- in Pocketing::CalcSpiral correzione calcolo offset nel caso di materiale residuo negli angoli
- in Pocketing::CalcSpiral modifica calcolo di pNextOffs.
This commit is contained in:
SaraP
2021-05-13 17:24:33 +02:00
parent ded589ac0d
commit 28e31097a9
+16 -10
View File
@@ -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<ICurveComposite> 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<ICurve> 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