diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 3314137..9284f86 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/GenMachining.cpp b/GenMachining.cpp index cf9bde9..eb6d0a9 100644 --- a/GenMachining.cpp +++ b/GenMachining.cpp @@ -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 ; } diff --git a/Operation.cpp b/Operation.cpp index fee9b8c..96781a4 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -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 diff --git a/Operation.h b/Operation.h index 467c98f..493496f 100644 --- a/Operation.h +++ b/Operation.h @@ -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) ;