diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index f5287b3..32bbdca 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Machining.cpp b/Machining.cpp index 05cfb91..96f59cd 100644 --- a/Machining.cpp +++ b/Machining.cpp @@ -728,11 +728,15 @@ Machining::AdjustStartMovements(void) DBLVECTOR vAxIni ; if ( ! pPrevMch->GetFinalAxesValues( vAxVal) || ! GetInitialAxesValues( vAxIni)) return false ; - if ( vAxVal.size() >= 5 && vAxIni.size() >= 5 && - fabs( vAxVal[4] - vAxIni[4]) > 15) { - double dDelta = max( vAxVal[2], vAxIni[2]) - vAxVal[2] + 200 ; - if ( ! pPrevMch->AddRise( vAxVal, dDelta)) + // determino delta Z rispetto a posizione finale + if ( vAxVal.size() >= 4 && vAxIni.size() >= 4) { + double dDelta = 0 ; + if ( ! CalcDeltaZForHeadRotation( vAxVal, vAxIni, dDelta)) return false ; + if ( dDelta > EPS_SMALL) { + if ( ! pPrevMch->AddRise( vAxVal, dDelta)) + return false ; + } } } // altrimenti aggiungo uscita per cambio utensile alla lavorazione precedente e parto da questa @@ -866,7 +870,7 @@ Machining::AddRise( DBLVECTOR& vAxVal, double dDelta) vAxVal = pCam->GetAxisVal() ; // flag di movimento in rapido int nFlag = 0 ; - // se delta positivo lo uso come incremeto di Z + // se delta positivo lo uso come incremento di Z if ( dDelta > 0) { vAxVal[2] += dDelta ; nFlag = 0 ; // movimento standard @@ -878,13 +882,22 @@ Machining::AddRise( DBLVECTOR& vAxVal, double dDelta) vAxVal[2] = vAxHome[2] ; nFlag = 3 ; // movimento a Zmax } - pCam->SetAxes( CamData::AS_OK, vAxVal) ; + // verifico extra-corsa dell'asse Z + double dL1 = vAxVal[0] ; + double dL2 = vAxVal[1] ; + double dL3 = vAxVal[2] ; + double dR1 = ( vAxVal.size() >= 4 ? vAxVal[3] : 0) ; + double dR2 = ( vAxVal.size() >= 5 ? vAxVal[4] : 0) ; + int nStat ; + bool bOk = ( m_pMchMgr->VerifyOutstroke( dL1, dL2, dL3, dR1, dR2, nStat) && nStat == 0) ; + // assegno i dati + pCam->SetAxes( (bOk ? CamData::AS_OK : CamData::AS_OUTSTROKE), vAxVal) ; pCam->SetFeed( 0) ; pCam->SetFlag( nFlag) ; // associo questo oggetto a quello geometrico m_pGeomDB->SetUserObj( nId, Release( pCam)) ; - return true ; + return bOk ; } //---------------------------------------------------------------------------- @@ -908,3 +921,49 @@ Machining::RemoveRise( void) return true ; } + +//---------------------------------------------------------------------------- +bool +Machining::CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, double& dDeltaZ) +{ + // il numero di assi deve essere costante + if ( vAxStart.size() != vAxEnd.size()) + return false ; + // se ci sono solo assi lineari, non delta Z nullo + if ( vAxStart.size() <= 3) { + dDeltaZ = 0 ; + return true ; + } + // determino gli estremi del movimento rotatorio + double dR1Start = ( vAxStart.size() >= 4 ? vAxStart[3] : 0) ; + double dR2Start = ( vAxStart.size() >= 5 ? vAxStart[4] : 0) ; + double dR1End = ( vAxEnd.size() >= 4 ? vAxEnd[3] : 0) ; + double dR2End = ( vAxEnd.size() >= 5 ? vAxEnd[4] : 0) ; + // determino le variazioni di ciascun asse + double dR1Delta = dR1End - dR1Start ; + double dR2Delta = dR2End - dR2Start ; + // divido il movimento in step di massimo 15 gradi + int nStep = int( max( abs( dR1Delta), abs( dR2Delta)) / 15.0) + 1 ; + double dR1Step = dR1Delta / nStep ; + double dR2Step = dR2Delta / nStep ; + // calcolo + double dL1 = vAxStart[0] ; + double dL2 = vAxStart[1] ; + double dL3 = vAxStart[2] ; + double dZStart, dZmin ; + for ( int i = 0 ; i <= nStep ; ++ i) { + double dR1 = dR1Start + i * dR1Step ; + double dR2 = dR2Start + i * dR2Step ; + Point3d ptTip ; + if ( ! m_pMchMgr->GetCalcTipFromPositions( dL1, dL2, dL3, dR1, dR2, true, ptTip)) + return false ; + if ( i == 0) { + dZStart = ptTip.z ; + dZmin = dZStart ; + } + else if ( ptTip.z < dZmin) + dZmin = ptTip.z ; + } + dDeltaZ = dZStart - dZmin ; + return true ; +} \ No newline at end of file diff --git a/Machining.h b/Machining.h index 4bfd858..f1aecd4 100644 --- a/Machining.h +++ b/Machining.h @@ -70,6 +70,7 @@ class Machining : public IUserObj bool ToolChangeNeeded( const ToolData& T1, const ToolData& T2) ; bool AddRise( DBLVECTOR& vAxVal, double dDelta = - 1) ; bool RemoveRise( void) ; + bool CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, double& dDeltaZ) ; protected : bool SetPathId( int nPathId) ;