EgtMachKernel 1.8g3 :

- in lavorazione generica si può disabilitare controllo su collegamento con precedente (Vpl:0 in Notes).
This commit is contained in:
Dario Sassi
2017-07-13 14:45:54 +00:00
parent b0ade6d112
commit e4082f83af
4 changed files with 83 additions and 68 deletions
+78 -66
View File
@@ -610,21 +610,27 @@ Operation::GetClPathFinalAxesValues( int nClPathId, DBLVECTOR& vAxVal)
//----------------------------------------------------------------------------
string
Operation::ExtractHint( const std::string& sNotes)
Operation::ExtractInfo( const string& sNotes, const string& sKey)
{
const string KEY_HINT = "Hint:" ;
string sHint ;
string sInfo ;
STRVECTOR vsCmd ;
Tokenize( sNotes, ";", vsCmd) ;
for each (const auto& sCmd in vsCmd) {
// se per assi rotanti
if ( sCmd.find( KEY_HINT) != string::npos) {
sHint = sCmd ;
ReplaceString( sHint, KEY_HINT, "") ;
if ( sCmd.find( sKey) != string::npos) {
sInfo = sCmd ;
ReplaceString( sInfo, sKey, "") ;
break ;
}
}
return sHint ;
return sInfo ;
}
//----------------------------------------------------------------------------
string
Operation::ExtractHint( const string& sNotes)
{
return ExtractInfo( sNotes, "Hint:") ;
}
//----------------------------------------------------------------------------
@@ -1047,7 +1053,7 @@ Operation::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes,
//----------------------------------------------------------------------------
bool
Operation::AdjustStartEndMovements( void)
Operation::AdjustStartEndMovements( bool bVerifyPreviousLink)
{
if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr)
return false ;
@@ -1093,70 +1099,76 @@ Operation::AdjustStartEndMovements( void)
return false ;
// cancello risalita lavorazione precedente
pPrevOp->RemoveRise() ;
// recupero posizioni
DBLVECTOR vAxIni ;
if ( ! pPrevOp->GetFinalAxesValues( vAxVal) || ! GetInitialAxesValues( vAxIni))
// recupero posizione finale lavorazione precedente
if ( ! pPrevOp->GetFinalAxesValues( vAxVal))
return false ;
// aggiungo eventuale delta Z
double dDelta = 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, dDelta))
// se richiesta verifica collegamento con lavorazione precedente
if ( bVerifyPreviousLink) {
// recupero posizione iniziale lavorazione
DBLVECTOR vAxIni ;
if ( ! GetInitialAxesValues( vAxIni))
return false ;
}
// confronto con eventuale risalita di inizio lavorazione
dDelta = max( dDelta, ( vAxIni[2] - vAxVal[2])) ;
// se necessaria, aggiungo risalita parziale
if ( dDelta > 100 * EPS_SMALL) {
if ( ! pPrevOp->AddRise( vAxVal, dDelta))
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))
return false ;
bool bPartRise = false ;
double dSafeZ = dHomeZ ;
double dUnsafeZ = max( vAxVal[2], vAxIni[2]) ;
DBLVECTOR vAxVal2 = vAxVal ;
DBLVECTOR vAxIni2 = vAxIni ;
for ( int i = 1 ; i <= 4 ; ++ i) {
double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ;
vAxVal2[2] = dTestSafeZ ;
vAxIni2[2] = dTestSafeZ ;
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
bPartRise = true ;
dSafeZ = dTestSafeZ ;
// aggiungo eventuale delta Z
double dDelta = 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, dDelta))
return false ;
}
// confronto con eventuale risalita di inizio lavorazione
dDelta = max( dDelta, ( vAxIni[2] - vAxVal[2])) ;
// se necessaria, aggiungo risalita parziale
if ( dDelta > 100 * EPS_SMALL) {
if ( ! pPrevOp->AddRise( vAxVal, dDelta))
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))
return false ;
bool bPartRise = false ;
double dSafeZ = dHomeZ ;
double dUnsafeZ = max( vAxVal[2], vAxIni[2]) ;
DBLVECTOR vAxVal2 = vAxVal ;
DBLVECTOR vAxIni2 = vAxIni ;
for ( int i = 1 ; i <= 4 ; ++ i) {
double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ;
vAxVal2[2] = dTestSafeZ ;
vAxIni2[2] = dTestSafeZ ;
if ( TestCollisionAvoid( vAxVal2, vAxIni2)) {
bPartRise = true ;
dSafeZ = dTestSafeZ ;
}
else {
dUnsafeZ = dTestSafeZ ;
}
}
if ( ! bPartRise) {
// 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 ;
}
else {
dUnsafeZ = dTestSafeZ ;
// cancello eventuale risalita parziale della lavorazione precedente
pPrevOp->RemoveRise() ;
// recupero le nuove quote finali (per calcolare il corretto delta)
pPrevOp->GetFinalAxesValues( vAxVal) ;
// aggiungo risalita a Zsafe
if ( ! pPrevOp->AddRise( vAxVal, dSafeZ - vAxVal[2]))
return false ;
// aggiorno quota iniziale in Z
vAxIni[2] = dSafeZ ;
}
}
if ( ! bPartRise) {
// 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 ;
}
else {
// cancello eventuale risalita parziale della lavorazione precedente
pPrevOp->RemoveRise() ;
// recupero le nuove quote finali (per calcolare il corretto delta)
pPrevOp->GetFinalAxesValues( vAxVal) ;
// aggiungo risalita a Zsafe
if ( ! pPrevOp->AddRise( vAxVal, dSafeZ - vAxVal[2]))
return false ;
// aggiorno quota iniziale in Z
vAxIni[2] = dSafeZ ;
}
}
}
// altrimenti aggiungo uscita per cambio utensile alla lavorazione precedente e parto da questa