EgtMachKernel 1.8g3 :
- in lavorazione generica si può disabilitare controllo su collegamento con precedente (Vpl:0 in Notes).
This commit is contained in:
+78
-66
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user