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:
+57
-34
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user