EgtMachKernel 1.6l11 :
- migliorie alla risalita in Z tra una lavorazione e l'altra.
This commit is contained in:
+66
-7
@@ -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 ;
|
||||
}
|
||||
Reference in New Issue
Block a user