EgtMachKernel 2.1c1 :

- corretta risalita in Z tra lavorazioni (senza più CalcDeltaZForHeadRotation)
- corretta svuotatura per reset flag lato aperto prima di analisi
- modificata simulazione per gestire più grezzi simultaneamente.
This commit is contained in:
Dario Sassi
2019-03-04 08:04:32 +00:00
parent 2f1b3ba378
commit c0906ef63c
8 changed files with 121 additions and 69 deletions
+57 -34
View File
@@ -1394,31 +1394,38 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
DBLVECTOR vAxIni ;
if ( ! GetInitialAxesValues( vAxIni))
return false ;
// aggiungo eventuale delta Z
double dDeltaZ = 0 ;
// determino delta Z rispetto a posizione finale
if ( vAxVal.size() >= 4 && vAxIni.size() >= 4) {
// verifico se movimento assi rotanti richiede una risalita parziale
if ( ! CalcDeltaZForHeadRotation( vAxVal, vAxIni, dDeltaZ))
return false ;
}
// confronto con eventuale risalita di inizio lavorazione
dDeltaZ = max( dDeltaZ, ( vAxIni[2] - vAxVal[2])) ;
// se necessaria, aggiungo risalita parziale
double dDeltaZ = ( vAxIni[2] - vAxVal[2]) ;
if ( dDeltaZ > 100 * EPS_SMALL) {
if ( ! pPrevOp->AddRise( vAxVal, dDeltaZ))
return false ;
// aggiorno quota in Z della posizione iniziale ( anche se verrà aggiornata solo in seguito)
vAxIni[2] = vAxVal[2] ;
}
// verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola
if ( ! TestCollisionAvoid( vAxVal, vAxIni)) {
// riprovo con risalita parziale
double dHomeZ ;
if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ))
// Verifico non ci sia collisione a Zmax
double dSafeZ ;
if ( m_pMchMgr->GetCurrAxisHomePos( 2, dSafeZ)) {
DBLVECTOR vAxVal2 = vAxVal ; vAxVal2[2] = dSafeZ ;
DBLVECTOR vAxIni2 = vAxIni ; vAxIni2[2] = dSafeZ ;
if ( ! TestCollisionAvoid( vAxVal2, vAxIni2))
return false ;
}
else
return false ;
// Se richiesta risalita a Zmax
if ( ForcedZmax( vAxVal, vAxIni)) {
// cancello eventuale risalita parziale della lavorazione precedente
pPrevOp->RemoveRise() ;
// aggiungo risalita a Zmax
if ( ! pPrevOp->AddRise( vAxVal))
return false ;
// si parte da Z massima
bMaxZ = true ;
}
// altrimenti, verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola
else if ( ! TestCollisionAvoid( vAxVal, vAxIni)) {
// riprovo con risalita parziale
bool bPartRise = false ;
double dSafeZ = dHomeZ ;
double dUnsafeZ = max( vAxVal[2], vAxIni[2]) ;
DBLVECTOR vAxVal2 = vAxVal ;
DBLVECTOR vAxIni2 = vAxIni ;
@@ -1558,8 +1565,10 @@ Operation::AdjustOneStartMovement( int nClPathId, int nPrevClPathId, const DBLVE
// per il test uso posizioni temporanee con questa Z
DBLVECTOR vAxPrevTmp = vAxPrev ; vAxPrevTmp[2] = dTopZ ;
DBLVECTOR vAxCurrTmp = vAxCurr ; vAxCurrTmp[2] = dTopZ ;
// verifico se forzata risalita a Zmax
bool bForcedZMax = ForcedZmax( vAxPrevTmp, vAxCurrTmp) ;
// se interferisce
if ( ! TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp)) {
if ( bForcedZMax || ! TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp)) {
// recupero HomeZ
double dHomeZ ;
if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ))
@@ -1571,7 +1580,7 @@ Operation::AdjustOneStartMovement( int nClPathId, int nPrevClPathId, const DBLVE
double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ;
vAxPrevTmp[2] = dTestSafeZ ;
vAxCurrTmp[2] = dTestSafeZ ;
if ( TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp))
if ( ! bForcedZMax && TestCollisionAvoid( vAxPrevTmp, vAxCurrTmp))
dSafeZ = dTestSafeZ ;
else
dUnsafeZ = dTestSafeZ ;
@@ -1939,6 +1948,35 @@ Operation::CalcDeltaZForHeadRotation( const DBLVECTOR& vAxStart, const DBLVECTOR
return true ;
}
//----------------------------------------------------------------------------
bool
Operation::ForcedZmax( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd)
{
// Recupero macchina corrente
Machine* pMch = ( m_pMchMgr != nullptr ? m_pMchMgr->GetCurrMachine() : nullptr) ;
if ( pMch == nullptr)
return true ;
// Recupero numero assi e ne verifico la costanza
int nLinAxes = m_pMchMgr->GetCurrLinAxes() ;
int nRotAxes = m_pMchMgr->GetCurrRotAxes() ;
if ( nLinAxes + nRotAxes != vAxStart.size() || nLinAxes + nRotAxes != vAxEnd.size())
return true ;
// Se testa con Info ZMAXONROT != 0 e movimento assi rotanti -> risalita a Zmax
int nHeadId = pMch->GetCurrHead() ;
DBLVECTOR vdVal ;
if ( m_pGeomDB->GetInfo( nHeadId, MCH_ZMAXONROT, vdVal) && vdVal.size() >= 1 && lround(vdVal[0]) > 0) {
double dAngTol = 100 * EPS_ANG_SMALL ;
if ( vdVal.size() >= 2)
dAngTol = max( vdVal[1], dAngTol) ;
for ( int i = nLinAxes ; i < nLinAxes + nRotAxes ; ++ i) {
if ( abs( vAxEnd[i] - vAxStart[i]) > dAngTol)
return true ;
}
}
// Non forzata risalita a Zmax
return false ;
}
//----------------------------------------------------------------------------
bool
Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd)
@@ -1951,26 +1989,11 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
string sTable ;
if ( ! pMch->GetCurrTable( sTable))
return false ;
// Recupero assi correnti
// Recupero assi correnti e ne verifico la costanza
STRVECTOR vAxName ;
pMch->GetAllCurrAxesName( vAxName) ;
// il numero di assi deve essere costante
if ( vAxName.size() != vAxStart.size() || vAxName.size() != vAxEnd.size())
return false ;
// Se testa con Info ZMAXONROT != 0 e movimento assi rotanti -> collisione
int nHeadId = pMch->GetCurrHead() ;
DBLVECTOR vdVal ;
if ( m_pGeomDB->GetInfo( nHeadId, MCH_ZMAXONROT, vdVal) && vdVal.size() >= 1 && lround(vdVal[0]) > 0) {
double dAngTol = 100 * EPS_ANG_SMALL ;
if ( vdVal.size() >= 2)
dAngTol = max( vdVal[1], dAngTol) ;
int nLinAxes = m_pMchMgr->GetCurrLinAxes() ;
int nRotAxes = m_pMchMgr->GetCurrRotAxes() ;
for ( int i = nLinAxes ; i < nLinAxes + nRotAxes ; ++ i) {
if ( int( vAxName.size()) > i && abs( vAxEnd[i] - vAxStart[i]) > dAngTol)
return false ;
}
}
// Porto la macchina in home
pMch->ResetAllAxesPos() ;
// Elenco grezzi attivi