EgtMachKernel 2.3a4 :
- corrette GetAxisMin e GetAxisMax di MachMgr perchè restituivano la posizione di Home - corrette CalcSurfAuxView di Milling e di Mortising perchè potevano andare in loop infinito - cambiato funzionamento di risalite tra una lavorazione e l'altra quando si imposta ExtraZ (ora valido solo se utensile entro un angolo da Z) e se non ammissibile si va a Zmax.
This commit is contained in:
+46
-18
@@ -1729,18 +1729,25 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
vAxIni[2] = vAxVal[2] ;
|
||||
}
|
||||
// Verifico non ci sia collisione a HomeZ
|
||||
bool bToZmax = false ;
|
||||
double dHomeZ ;
|
||||
if ( m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ)) {
|
||||
DBLVECTOR vAxVal2 = vAxVal ; vAxVal2[2] = dHomeZ ;
|
||||
DBLVECTOR vAxIni2 = vAxIni ; vAxIni2[2] = dHomeZ ;
|
||||
if ( ! TestCollisionAvoid( vAxVal2, vAxIni2)) {
|
||||
double dExtraZ = GetExtraZ( dHomeZ) ;
|
||||
if ( dExtraZ > EPS_SMALL) {
|
||||
dHomeZ += dExtraZ ;
|
||||
vAxVal2[2] = dHomeZ ;
|
||||
vAxIni2[2] = dHomeZ ;
|
||||
if ( ! TestCollisionAvoid( vAxVal2, vAxIni2))
|
||||
return false ;
|
||||
double dExtraZ, dMaxAngV ;
|
||||
if ( GetExtraZ( dHomeZ, dExtraZ, dMaxAngV)) {
|
||||
if ( vAxVal2.size() < 5 || ( abs( vAxVal2[4]) < dMaxAngV && abs( vAxIni2[4]) < dMaxAngV)) {
|
||||
double dMyHomeZ = dHomeZ + dExtraZ ;
|
||||
vAxVal2[2] = dMyHomeZ ;
|
||||
vAxIni2[2] = dMyHomeZ ;
|
||||
if ( TestCollisionAvoid( vAxVal2, vAxIni2))
|
||||
dHomeZ = dMyHomeZ ;
|
||||
else
|
||||
bToZmax = true ;
|
||||
}
|
||||
else
|
||||
bToZmax = true ;
|
||||
}
|
||||
else
|
||||
return false ;
|
||||
@@ -1749,11 +1756,11 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
|
||||
else
|
||||
return false ;
|
||||
// Se richiesta risalita a Zmax
|
||||
if ( ForcedZmax( vAxVal, vAxIni)) {
|
||||
if ( bToZmax || ForcedZmax( vAxVal, vAxIni)) {
|
||||
// cancello eventuale risalita parziale della lavorazione precedente
|
||||
pPrevOp->RemoveRise() ;
|
||||
// aggiungo risalita a Zmax
|
||||
if ( ! pPrevOp->AddRise( vAxVal))
|
||||
if ( ! pPrevOp->AddRise( vAxVal, ( bToZmax && false ? -10000 : -1)))
|
||||
return false ;
|
||||
// si parte da Z massima
|
||||
bMaxZ = true ;
|
||||
@@ -2146,6 +2153,9 @@ Operation::AddRise( DBLVECTOR& vAxVal, double dDelta, int nClPathId, bool bZHome
|
||||
m_pMchMgr->GetAllCurrAxesHomePos( vAxHome) ;
|
||||
vAxVal[2] = vAxHome[2] ;
|
||||
nFlag = 3 ; // movimento a Zmax
|
||||
// !!! PROVA !!!
|
||||
if ( dDelta < -9999)
|
||||
nFlag = 5 ;
|
||||
}
|
||||
// eventuale aggiustamenti speciali dipendenti dalla macchina
|
||||
Vector3d vtTool = pCam->GetToolDir() ;
|
||||
@@ -2397,23 +2407,41 @@ Operation::CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
double
|
||||
Operation::GetExtraZ( double dSafeZ) const
|
||||
bool
|
||||
Operation::GetExtraZ( double dSafeZ, double& dExtraZ, double& dMaxAngV) const
|
||||
{
|
||||
double dExtraZ = 0 ;
|
||||
// Recupero macchina corrente
|
||||
Machine* pMch = ( m_pMchMgr != nullptr ? m_pMchMgr->GetCurrMachine() : nullptr) ;
|
||||
if ( pMch == nullptr)
|
||||
return 0 ;
|
||||
// Se testa con Info ZEXTRA la recupero e la limito alla corsa dell'asse
|
||||
int nHeadId = pMch->GetCurrHead() ;
|
||||
double dVal ;
|
||||
if ( m_pGeomDB->GetInfo( nHeadId, MCH_ZEXTRA, dVal) && dVal > EPS_SMALL) {
|
||||
double dZmax ;
|
||||
pMch->GetCurrAxisMax( 2, dZmax) ;
|
||||
dExtraZ = min( dVal, dZmax - dSafeZ) ;
|
||||
DBLVECTOR vdVal ;
|
||||
if ( m_pGeomDB->GetInfo( nHeadId, MCH_ZEXTRA, vdVal) && vdVal.size() >= 1 && vdVal[0] > EPS_SMALL) {
|
||||
// angolo limite per applicare questo allontanamento extra
|
||||
dMaxAngV = 30 ;
|
||||
if ( vdVal.size() >= 2)
|
||||
dMaxAngV = vdVal[1] ;
|
||||
// flag per posizione sicura in alto o in basso
|
||||
bool bZHomeDown ;
|
||||
if ( ! m_pGeomDB->GetInfo( nHeadId, MCH_ZHOMEDOWN, bZHomeDown))
|
||||
bZHomeDown = false ;
|
||||
// se caso standard
|
||||
if ( ! bZHomeDown) {
|
||||
double dZmax ;
|
||||
pMch->GetCurrAxisMax( 2, dZmax) ;
|
||||
dExtraZ = min( vdVal[0], dZmax - dSafeZ) ;
|
||||
return ( dExtraZ > EPS_SMALL) ;
|
||||
}
|
||||
// altrimenti caso con posizione sicura in basso (teste da sotto)
|
||||
else {
|
||||
double dZmin ;
|
||||
pMch->GetCurrAxisMin( 2, dZmin) ;
|
||||
dExtraZ = max( vdVal[0], dZmin - dSafeZ) ;
|
||||
return ( dExtraZ < EPS_SMALL) ;
|
||||
}
|
||||
}
|
||||
return dExtraZ ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user