EgtMachKernel 1.8g3 :
- in lavorazione generica si può disabilitare controllo su collegamento con precedente (Vpl:0 in Notes).
This commit is contained in:
Binary file not shown.
+3
-1
@@ -574,7 +574,9 @@ GenMachining::Update( void)
|
||||
}
|
||||
|
||||
// gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione
|
||||
if ( ! AdjustStartEndMovements()) {
|
||||
bool bVpl = true ;
|
||||
FromString( ExtractInfo( m_Params.m_sUserNotes, "Vpl:"), bVpl) ;
|
||||
if ( ! AdjustStartEndMovements( bVpl)) {
|
||||
m_pMchMgr->SetLastError( 2805, "Error in GenMachining : link movements not calculable") ;
|
||||
return false ;
|
||||
}
|
||||
|
||||
+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
|
||||
|
||||
+2
-1
@@ -80,11 +80,12 @@ class Operation : public IUserObj
|
||||
bool GetClPathInitialAxesValues( int nClPathId, DBLVECTOR& vAxVal) ;
|
||||
bool GetFinalAxesValues( DBLVECTOR& vAxVal) ;
|
||||
bool GetClPathFinalAxesValues( int nClPathId, DBLVECTOR& vAxVal) ;
|
||||
std::string Operation::ExtractInfo( const std::string& sNotes, const std::string& sKey) ;
|
||||
std::string ExtractHint( const std::string& sNotes) ;
|
||||
bool CalculateAxesValues( const std::string& sHint) ;
|
||||
bool CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W,
|
||||
DBLVECTOR& vAxRotPrec, int& nOutStrC) ;
|
||||
bool AdjustStartEndMovements( void) ;
|
||||
bool AdjustStartEndMovements( bool bVerifyPreviousLink = true) ;
|
||||
bool AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bMaxZ) ;
|
||||
bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) ;
|
||||
bool RemoveClimb( int nClPathId) ;
|
||||
|
||||
Reference in New Issue
Block a user