diff --git a/Chiseling.cpp b/Chiseling.cpp index d7913c8..c77b061 100644 --- a/Chiseling.cpp +++ b/Chiseling.cpp @@ -626,12 +626,18 @@ Chiseling::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2910, "Error in Chiseling : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2911, "Error in Chiseling : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2912, sErr) ; else @@ -639,15 +645,6 @@ Chiseling::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2910, "Error in Chiseling : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2911, "Error in Chiseling : link outstroke ") ; - return false ; - } - return true ; } diff --git a/Drilling.cpp b/Drilling.cpp index bc779e5..9946e70 100644 --- a/Drilling.cpp +++ b/Drilling.cpp @@ -748,12 +748,18 @@ Drilling::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2111, "Error in Drilling : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2112, "Error in Drilling : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2113, sErr) ; else @@ -761,15 +767,6 @@ Drilling::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2111, "Error in Drilling : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2112, "Error in Drilling : link outstroke ") ; - return false ; - } - return true ; } diff --git a/FiveAxisMilling.cpp b/FiveAxisMilling.cpp index 124d395..f714f56 100644 --- a/FiveAxisMilling.cpp +++ b/FiveAxisMilling.cpp @@ -743,12 +743,18 @@ FiveAxisMilling::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 3306, "Error in FiveAxisMilling : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 3307, "Error in FiveAxisMilling : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 3308, sErr) ; else @@ -756,15 +762,6 @@ FiveAxisMilling::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 3306, "Error in FiveAxisMilling : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 3307, "Error in FiveAxisMilling : link outstroke ") ; - return false ; - } - return true ; } diff --git a/GenMachining.cpp b/GenMachining.cpp index 2100c46..9a11624 100644 --- a/GenMachining.cpp +++ b/GenMachining.cpp @@ -719,12 +719,18 @@ GenMachining::Update( bool bPostApply) bool bVpl ; if ( ! FromString( ExtractInfo( m_Params.m_sUserNotes, "Vpl:"), bVpl)) bVpl = true ; - bool bLinkOk = AdjustStartEndMovements( bVpl) ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements( bVpl)) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2806, "Error in GenMachining : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2807, "Error in GenMachining : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2808, sErr) ; else @@ -732,15 +738,6 @@ GenMachining::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2806, "Error in GenMachining : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2807, "Error in GenMachining : link outstroke ") ; - return false ; - } - return true ; } diff --git a/Machine.h b/Machine.h index 6b2686d..8d1c4b1 100644 --- a/Machine.h +++ b/Machine.h @@ -184,7 +184,7 @@ class Machine bool VerifyAngleOutstroke( int nInd, double dAng) const ; bool VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool bClear, int& nStat) const ; bool ExistProtectedAreas( void) const ; - bool VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& vAng, int nLinkType, int& nStat) ; + bool VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& vAng, int& nStat) ; bool VerifyOutstroke( const std::string& sAxName, double dVal) const ; std::string GetOutstrokeInfo( bool bMM = true) const ; void ResetOutstrokeInfo( void) const diff --git a/MachineCalc.cpp b/MachineCalc.cpp index d0e70ea..990152b 100644 --- a/MachineCalc.cpp +++ b/MachineCalc.cpp @@ -48,7 +48,6 @@ static const string EVAR_R1 = ".R1" ; // (num) valore del pri static const string EVAR_R2 = ".R2" ; // (num) valore del secondo asse rotante static const string EVAR_R3 = ".R3" ; // (num) valore del terzo asse rotante static const string EVAR_R4 = ".R4" ; // (num) valore del quarto asse rotante -static const string EVAR_LINKTYPE = ".LINKTYPE" ; // (int) tipo collegamento (0=No, 1=Inizio, 2=Fine, 3=Link)) static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok) static const string EVAR_STAT = ".STAT" ; // OUT (int) codice di stato ( 0 = ok) static const string EVAR_AUXINFO = ".AUXINFO" ; // OUT (string) stringa con info ausiliarie @@ -76,7 +75,7 @@ Machine::SetCurrTable( const string& sTable) m_pGeomDB->SetStatus( m_nCalcTabId, GDB_ST_ON) ; // lancio eventuale funzione lua di personalizzazione if ( LuaExistsFunction( ON_SET_TABLE)) { - // salvo eventuale variabile EMC_VAR già presente + // salvo eventuale variabile EMC_VAR già presente bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ; // definisco variabili bool bOk = LuaCreateGlobTable( EMC_VAR) ; @@ -86,7 +85,7 @@ Machine::SetCurrTable( const string& sTable) bOk = bOk && LuaCallFunction( ON_SET_TABLE) ; // reset variabili bOk = bOk && LuaResetGlobVar( EMC_VAR) ; - // ripristino eventuale variabile EMC_VAR già presente + // ripristino eventuale variabile EMC_VAR già presente if ( bOldEMC) LuaChangeNameGlobVar( EMC_VAR_BACKUP, EMC_VAR) ; // restituisco risultato @@ -283,7 +282,7 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit) if ( ! sTool.empty()) { // carico anche gli utensili su eventuali altre uscite della testa LoadTools( sHead, nExit) ; - // carico l'utensile (si sostituisce ad altro già presente sulla stessa uscita) + // carico l'utensile (si sostituisce ad altro già presente sulla stessa uscita) if ( ! LoadTool( sHead, nExit, sTool)) { string sOut = "Missing tool " + sTool ; LOG_ERROR( GetEMkLogger(), sOut.c_str()) @@ -333,7 +332,7 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit) m_dCalcTOvRad = dTOvDiam / 2 ; // lancio eventuale funzione lua di personalizzazione if ( LuaExistsFunction( ON_SET_HEAD)) { - // salvo eventuale variabile EMC_VAR già presente + // salvo eventuale variabile EMC_VAR già presente bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ; // definisco variabili bool bOk = LuaCreateGlobTable( EMC_VAR) ; @@ -351,7 +350,7 @@ Machine::SetCurrTool( const string& sTool, const string& sHead, int nExit) bOk = bOk && LuaCallFunction( ON_SET_HEAD) ; // reset variabili bOk = bOk && LuaResetGlobVar( EMC_VAR) ; - // ripristino eventuale variabile EMC_VAR già presente + // ripristino eventuale variabile EMC_VAR già presente if ( bOldEMC) LuaChangeNameGlobVar( EMC_VAR_BACKUP, EMC_VAR) ; // in caso di errore esco @@ -541,7 +540,7 @@ Machine::CalculateKinematicChain( void) nHParId = m_pGeomDB->GetParentId( nHParId) ; } - // se non ci sono assi, né lineari né rotanti, sicuramente errore + // se non ci sono assi, né lineari né rotanti, sicuramente errore if ( m_nTabLinAxes == 0 && m_nHeadLinAxes == 0 && m_nTabRotAxes == 0 && m_nHeadRotAxes == 0) { LOG_ERROR( GetEMkLogger(), "Errors in Axes : none have been found") @@ -666,7 +665,7 @@ Machine::CalculateKinematicChain( void) } } } - // se 3 va bene ( uno dovrà poi avere valore assegnato) + // se 3 va bene ( uno dovrà poi avere valore assegnato) else if ( m_vCalcRotAx.size() == 3) { int n2ndHeadRotAx = - 1 ; // se tutti e tre di testa, devo invertire il primo con il terzo @@ -688,7 +687,7 @@ Machine::CalculateKinematicChain( void) } } } - // se più di 3 + // se più di 3 else { // altrimenti non ancora gestito, quindi errore LOG_ERROR( GetEMkLogger(), "Rotary Axes not manageable") @@ -705,7 +704,7 @@ Machine::CalculateKinematicChain( void) // non sono ammessi due assi di questo tipo if ( m_nHeadSpecRotAxis != -1) return false ; - // la tavola non deve avere più di un asse lineare + // la tavola non deve avere più di un asse lineare if ( m_nTabLinAxes > 1) return false ; // se ha un asse lineare deve essere allineato con il rotante speciale @@ -754,7 +753,7 @@ Machine::AddKinematicAxis( bool bOnHead, int nId) kAx.vtDir = pAx->GetDir() ; kAx.stroke = pAx->GetStroke() ; kAx.dHomeVal = pAx->GetHomeVal() ; - // ne determino l'indice di posizione nella sua catena cinematica (assegno valore negato perchè provvisorio) + // ne determino l'indice di posizione nella sua catena cinematica (assegno valore negato perchè provvisorio) if ( kAx.bHead) { ( kAx.bLinear ? ++ m_nHeadLinAxes : ++ m_nHeadRotAxes) ; kAx.nInd = - ( m_nHeadLinAxes + m_nHeadRotAxes) ; @@ -977,7 +976,7 @@ Machine::GetAngles( const Vector3d& vtDirT, const Vector3d& vtDirA, // aggiorno direzioni utensile e ausiliaria richieste vtDirTm.Rotate( m_vCalcRotAx[i].vtDir, m_vCalcRotAx[i].dFixVal) ; vtDirAm.Rotate( m_vCalcRotAx[i].vtDir, m_vCalcRotAx[i].dFixVal) ; - // aggiorno eventuali assi già inseriti (sicuramente di tavola) + // aggiorno eventuali assi già inseriti (sicuramente di tavola) for ( size_t j = 0 ; int( j) < nNumRotAx ; ++ j) { RotAx[j].ptPos.Rotate( m_vCalcRotAx[i].ptPos, m_vCalcRotAx[i].vtDir, m_vCalcRotAx[i].dFixVal) ; RotAx[j].vtDir.Rotate( m_vCalcRotAx[i].vtDir, m_vCalcRotAx[i].dFixVal) ; @@ -1066,7 +1065,7 @@ Machine::GetMyAngles( const Vector3d& vtDirT, const Vector3d& vtDirA, // componente versore fresa desiderato su direzione primo asse rotante double dCompTSuAxR1 = vtDirTn * vtAx1 ; - // se c'è secondo asse rotante, si calcola angolo per avere il componente appena calcolato + // se c'è secondo asse rotante, si calcola angolo per avere il componente appena calcolato bool bDet = true ; Vector3d vtDirH1, vtDirH2 ; Vector3d vtDirI1, vtDirI2 ; @@ -1221,7 +1220,7 @@ Machine::GetPositions( const Point3d& ptP, const DBLVECTOR& vAng, int& nStat, double& dX, double& dY, double& dZ) const { // la posizione deve essere espressa rispetto allo ZERO MACCHINA - // il punto è dato rispetto alla posizione home della tavola + // il punto è dato rispetto alla posizione home della tavola // verifico che siano stati assegnati gli angoli necessari, altrimenti errore if ( vAng.size() < m_vCalcRotAx.size()) @@ -1263,7 +1262,7 @@ Machine::GetPositions( const Point3d& ptP, const DBLVECTOR& vAng, // assegno l'offset testa Vector3d vtDtHe = ORIG - m_ptCalcPos ; - // calcolo il recupero degli assi : è l'opposto dello spostamento della posizione + // calcolo il recupero degli assi : è l'opposto dello spostamento della posizione Vector3d vtDtAx = m_ptCalcPos - ptPosH ; // calcolo il recupero di lunghezza utensile @@ -1287,7 +1286,7 @@ Machine::GetPositions( const Point3d& ptP, const DBLVECTOR& vAng, bool Machine::GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& vtNew) const { - // è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa) + // è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa) // verifico dimensione vettore angoli rispetto al numero di assi rotanti if ( vAng.size() < m_vCalcRotAx.size()) @@ -1314,7 +1313,7 @@ Machine::GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& v bool Machine::GetBackDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& vtNew) const { - // è espressa nel riferimento del pezzo (tiene conto delle rotazioni di testa e al contrario di quelle di tavola) + // è espressa nel riferimento del pezzo (tiene conto delle rotazioni di testa e al contrario di quelle di tavola) // verifico dimensione vettore angoli rispetto al numero di assi rotanti if ( vAng.size() < m_vCalcRotAx.size()) @@ -1342,7 +1341,7 @@ Machine::GetNoseFromPositions( double dX, double dY, double dZ, const DBLVECTOR& Point3d& ptNose) const { // la posizione deve essere espressa rispetto allo ZERO MACCHINA - // è espressa nel riferimento di macchina (tiene conto delle sole traslazioni e rotazioni di testa) + // è espressa nel riferimento di macchina (tiene conto delle sole traslazioni e rotazioni di testa) // verifico dimensione vettore angoli rispetto al numero di assi rotanti if ( vAng.size() < m_vCalcRotAx.size()) @@ -1394,8 +1393,8 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& bool bOverall, bool bBottom, bool bBack, Point3d& ptTip) const { // la posizione deve essere espressa rispetto allo ZERO MACCHINA - // è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa) - // se bBack vero, allora è nel riferimento pezzo + // è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa) + // se bBack vero, allora è nel riferimento pezzo // verifico dimensione vettore angoli rispetto al numero di assi rotanti if ( vAng.size() < m_vCalcRotAx.size()) @@ -1472,9 +1471,9 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& // se richiesto ingombro totale if ( bOverall) ptTip -= vtDirT * max( m_dCalcTOvLen - m_dCalcTLen, 0.) ; - // se richiesto punto più basso e direzione fresa non esattamente verticale + // se richiesto punto più basso e direzione fresa non esattamente verticale if ( bBottom && ! vtDirT.IsZplus() && ! vtDirT.IsZminus()) { - // calcolo la direzione perpendicolare più verticale possibile + // calcolo la direzione perpendicolare più verticale possibile Vector3d vtCorr = FromUprightOrtho( vtDirT) ; // correggo il tip if ( bOverall) @@ -1505,7 +1504,7 @@ Machine::GetAuxDirFromAngles( const DBLVECTOR& vAng, Vector3d& vtDir) const bool Machine::GetPartDirFromAngles( const Vector3d& vtPart, const DBLVECTOR& vAng, Vector3d& vtDir) const { - // è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di tavola e asse rotante speciale di testa) + // è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di tavola e asse rotante speciale di testa) // verifico dimensione vettore angoli rispetto al numero di assi rotanti if ( vAng.size() < m_vCalcRotAx.size()) @@ -1651,10 +1650,10 @@ Machine::AdjustAngleInStroke( const STROKE& Stroke, double& dAng) const bool Machine::GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const { - // se angolo fittizio (non esiste l'asse rotante corrispondente), non c'è alcunchè da fare + // se angolo fittizio (non esiste l'asse rotante corrispondente), non c'è alcunchè da fare if ( nInd < 0 || nInd >= int( m_vCalcRotAx.size())) return true ; - // cerco l'angolo più vicino stando nella corsa + // cerco l'angolo più vicino stando nella corsa while ( dAng - dAngRef > ANG_STRAIGHT + EPS_ANG_ZERO && dAng - ANG_FULL >= m_vCalcRotAx[nInd].stroke.Min) dAng -= ANG_FULL ; while ( dAng - dAngRef < -ANG_STRAIGHT + EPS_ANG_ZERO && dAng + ANG_FULL <= m_vCalcRotAx[nInd].stroke.Max) @@ -1667,10 +1666,10 @@ Machine::GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const bool Machine::LimitAngleToStroke( int nInd, double& dAng) const { - // se angolo fittizio (non esiste l'asse rotante corrispondente), non c'è alcunchè da fare + // se angolo fittizio (non esiste l'asse rotante corrispondente), non c'è alcunchè da fare if ( nInd < 0 || nInd >= int( m_vCalcRotAx.size())) return true ; - // se angolo fuori corsa, lo porto all'estremo più vicino + // se angolo fuori corsa, lo porto all'estremo più vicino dAng = Clamp( dAng, m_vCalcRotAx[nInd].stroke.Min, m_vCalcRotAx[nInd].stroke.Max) ; return true ; } @@ -1740,7 +1739,7 @@ Machine::VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng } // verifica delle aree protette if ( nStat == 0) - return const_cast( this)->VerifyProtectedAreas( dX, dY, dZ, vAng, 0, nStat) ; + return const_cast( this)->VerifyProtectedAreas( dX, dY, dZ, vAng, nStat) ; return true ; } @@ -1754,20 +1753,17 @@ Machine::VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng //---------------------------------------------------------------------------- bool -Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& vAng, int nLinkType, int& nStat) +Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& vAng, int& nStat) { - // se non esiste funzione gestione aree protette, non devo fare alcunchè + // se non esiste funzione gestione aree protette, non devo fare alcunchè if ( ! LuaExistsFunction( ON_VERIFY_PROTECTEDAREAS)) return true ; - // se non è collegamento e aree protette solo per questi, non devo fare alcunchè - if ( nLinkType == 0 && m_nNewLinkMgr == 1) - return true ; // default bool bOk = true ; int nErr = 99 ; - // salvo eventuale variabile EMC_VAR già presente + // salvo eventuale variabile EMC_VAR già presente bool bOldEMC = LuaChangeNameGlobVar( EMC_VAR, EMC_VAR_BACKUP) ; - // definisco variabili (nelle disposizioni l'utensile non è definito e non ha nome) + // definisco variabili (nelle disposizioni l'utensile non è definito e non ha nome) string sTool, sHead ; int nExit ; bOk = bOk && LuaCreateGlobTable( EMC_VAR) ; bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_VER, GetEMkVer()) ; @@ -1785,7 +1781,6 @@ Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_R3, vAng[2]) ; if ( vAng.size() >= 4) bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_R4, vAng[3]) ; - bOk = bOk && LuaSetGlobVar( EMC_VAR + EVAR_LINKTYPE, nLinkType) ; // chiamo funzione bOk = bOk && LuaCallFunction( ON_VERIFY_PROTECTEDAREAS) ; // recupero il risultato @@ -1807,7 +1802,7 @@ Machine::VerifyProtectedAreas( double dX, double dY, double dZ, const DBLVECTOR& } // reset variabili bOk = LuaResetGlobVar( EMC_VAR) && bOk ; - // ripristino eventuale variabile EMC_VAR già presente + // ripristino eventuale variabile EMC_VAR già presente if ( bOldEMC) LuaChangeNameGlobVar( EMC_VAR_BACKUP, EMC_VAR) ; // esco @@ -1854,7 +1849,7 @@ Machine::VerifyOutstroke( const string& sAxName, double dVal) const string Machine::GetOutstrokeInfo( bool bMM) const { - // se non c'è extracorsa, ritorno stringa vuota + // se non c'è extracorsa, ritorno stringa vuota if ( m_OutstrokeInfo.sAxName.empty()) return "" ; // creo stringa con info opportune diff --git a/Machining.cpp b/Machining.cpp index cb07441..fbb99a2 100644 --- a/Machining.cpp +++ b/Machining.cpp @@ -431,7 +431,7 @@ Machining::ActivateDrillingUnit( int nHeadId, const INTVECTOR& vActExit) const //---------------------------------------------------------------------------- bool -Machining::PostApply( bool& bLinkOk, string& sErr) +Machining::PostApply( string& sErr) { // recupero la macchina corrente Machine* pMch = m_pMchMgr->GetCurrMachine() ; @@ -441,7 +441,6 @@ Machining::PostApply( bool& bLinkOk, string& sErr) static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo static const string EVAR_PHASE = ".PHASE" ; // IN (int) indice fase static const string EVAR_MCHID = ".MCHID" ; // IN (int) identificativo della lavorazione - static const string EVAR_LINKOK = ".LINKOK" ; // IN/OUT (bool) flag di validità collegamento con lavorazione precedente static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok, > 0 errore, < 0 warning) static const string EVAR_MSG = ".MSG" ; // OUT (string) stringa di errore ( opzionale) static const string ON_POST_APPLY = "OnPostApplyMachining" ; @@ -457,12 +456,10 @@ Machining::PostApply( bool& bLinkOk, string& sErr) bOk = bOk && pMch->LuaCreateGlobTable( EMC_VAR) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PHASE, m_nPhase) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_MCHID, m_nOwnerId) ; - bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_LINKOK, bLinkOk) ; // eseguo bOk = bOk && pMch->LuaCallFunction( ON_POST_APPLY, false) ; // recupero valori parametri obbligatori bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_ERROR, nErr) ; - bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_LINKOK, bLinkOk) ; // recupero valori parametri opzionali string sMsg ; bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_MSG, sMsg) ; diff --git a/Machining.h b/Machining.h index 5fc2672..d00259c 100644 --- a/Machining.h +++ b/Machining.h @@ -57,7 +57,7 @@ class Machining : public Operation protected : Machining( void) ; - bool PostApply( bool& bLinkOk, std::string& sErr) ; + bool PostApply( std::string& sErr) ; private : int GetToolPreviewNext( int nEntId, int nParentId, int nStId) const ; diff --git a/Milling.cpp b/Milling.cpp index c3a7bd5..484d8ef 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -912,13 +912,19 @@ Milling::Update( bool bPostApply) // assegno estremi degli assi dei vari percorsi di lavorazione e della lavorazione nel suo complesso CalcAndSetAxesBBox() ; - // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + // gestione movimenti all'inizio e fine di ogni singolo percorso di lavorazione + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2319, "Error in Milling : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2320, "Error in Milling : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2321, sErr) ; else @@ -926,15 +932,6 @@ Milling::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2319, "Error in Milling : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2320, "Error in Milling : link outstroke ") ; - return false ; - } - return true ; } diff --git a/Mortising.cpp b/Mortising.cpp index 7587d20..61512dd 100644 --- a/Mortising.cpp +++ b/Mortising.cpp @@ -665,12 +665,18 @@ Mortising::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2509, "Error in Mortising : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2510, "Error in Mortising : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2511, sErr) ; else @@ -678,15 +684,6 @@ Mortising::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2509, "Error in Mortising : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2510, "Error in Mortising : link outstroke ") ; - return false ; - } - return true ; } diff --git a/Operation.cpp b/Operation.cpp index edb1007..b2dcda9 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -2724,6 +2724,18 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) if ( IsEmpty( NEED_ONE_TP_OK)) return true ; + // se nuova gestione collegamenti tra lavorazioni oppure robot + if ( m_pMchMgr->GetCurrMachine()->GetNewLinkMgr() || m_pMchMgr->GetCurrIsRobot()) + return AdjustStartEndMovementsNew( bVerifyPreviousLink) ; + // altrimenti modalità standard + else + return AdjustStartEndMovementsStd( bVerifyPreviousLink) ; +} + +//---------------------------------------------------------------------------- +bool +Operation::AdjustStartEndMovementsStd( bool bVerifyPreviousLink) +{ // recupero ultima operazione precedente non vuota o che richiede home precedente // (disposizione qui considerata non vuota anche se nella path contiene solo comandi ausiliari) int nPrevOpId = m_pMchMgr->GetPrevActiveOperation( m_nOwnerId) ; @@ -2741,12 +2753,6 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) if ( pPrevOp != nullptr && ! pPrevOp->IsEmpty( NEED_ONE_TP_OK)) sPrevTool = pPrevOp->GetToolName() ; - // flag nuova gestione collegamenti tra lavorazioni - bool bNewLink = m_pMchMgr->GetCurrMachine()->GetNewLinkMgr() ; - - // flag per CLIMB a inizio percorso già gestito - bool bClimbDone = false ; - // determino posizione precedente assi DBLVECTOR vAxVal ; bool bMaxZ = false ; @@ -2761,16 +2767,6 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) return false ; // si parte da Z massima bMaxZ = true ; - // per nuova gestione collegamenti, verifica aree protette - if ( bVerifyPreviousLink && bNewLink && m_pMchMgr->GetCurrIsCenter()) { - // recupero posizione iniziale lavorazione - DBLVECTOR vAxIni ; - if ( ! GetInitialAxesValues( false, vAxIni)) - return false ; - // eseguo verifica - if ( ! ManageProtectedAreas( vAxVal, vAxIni, nullptr, this, bClimbDone)) - return false ; - } } // *** Se utensile non cambiato o su diversa uscita della stessa testa, uso posizione finale della lavorazione precedente @@ -2791,194 +2787,177 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) DBLVECTOR vAxIni ; if ( ! GetInitialAxesValues( false, vAxIni)) return false ; - // se centro di lavoro - if ( m_pMchMgr->GetCurrIsCenter()) { - // recupero se ZHome è in basso - bool bZHomeDown = GetZHomeDown() ; - // recupero quote home e max di Z - double dHomeZ ; - if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ)) + // recupero se ZHome è in basso + bool bZHomeDown = GetZHomeDown() ; + // recupero quote home e max di Z + double dHomeZ ; + if ( ! m_pMchMgr->GetCurrAxisHomePos( 2, dHomeZ)) + return false ; + // se necessaria, aggiungo risalita parziale + double dDeltaZ = ( vAxIni[2] - vAxVal[2]) ; + if ( ( ! bZHomeDown && dDeltaZ > 100 * EPS_SMALL && vAxIni[2] <= dHomeZ) || + ( bZHomeDown && dDeltaZ < -100 * EPS_SMALL && vAxIni[2] >= dHomeZ)) { + if ( ! pPrevOp->AddRise( vAxVal, dDeltaZ)) return false ; - // se necessaria, aggiungo risalita parziale - double dDeltaZ = ( vAxIni[2] - vAxVal[2]) ; - if ( ( ! bZHomeDown && dDeltaZ > 100 * EPS_SMALL && vAxIni[2] <= dHomeZ) || - ( bZHomeDown && dDeltaZ < -100 * EPS_SMALL && vAxIni[2] >= dHomeZ)) { - 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 non ci sia collisione a HomeZ - bool bToMaxZ = false ; - bool bToMyHomeZ = false ; - DBLVECTOR vAxVal2 = vAxVal ; vAxVal2[2] = dHomeZ ; - DBLVECTOR vAxIni2 = vAxIni ; vAxIni2[2] = dHomeZ ; - if ( ! TestCollisionAvoid( vAxVal2, vAxIni2)) { - // se ammessa risalita aggiuntiva - Vector3d vtTprev ; pPrevOp->GetFinalToolDir( false, vtTprev) ; - Vector3d vtTcurr ; GetInitialToolDir( false, vtTcurr) ; - double dExtraZ ; - if ( GetExtraZ( vAxVal2, vtTprev, vAxIni2, vtTcurr, dHomeZ, dExtraZ)) { - if ( abs( dExtraZ) > EPS_SMALL) { - double dMyHomeZ = dHomeZ + dExtraZ ; - vAxVal2[2] = dMyHomeZ ; - vAxIni2[2] = dMyHomeZ ; - if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { - dHomeZ = dMyHomeZ ; - bToMyHomeZ = true ; - } - else - bToMaxZ = true ; + // aggiorno quota in Z della posizione iniziale ( anche se verrà aggiornata solo in seguito) + vAxIni[2] = vAxVal[2] ; + } + // Verifico non ci sia collisione a HomeZ + bool bToMaxZ = false ; + bool bToMyHomeZ = false ; + DBLVECTOR vAxVal2 = vAxVal ; vAxVal2[2] = dHomeZ ; + DBLVECTOR vAxIni2 = vAxIni ; vAxIni2[2] = dHomeZ ; + if ( ! TestCollisionAvoid( vAxVal2, vAxIni2)) { + // se ammessa risalita aggiuntiva + Vector3d vtTprev ; pPrevOp->GetFinalToolDir( false, vtTprev) ; + Vector3d vtTcurr ; GetInitialToolDir( false, vtTcurr) ; + double dExtraZ ; + if ( GetExtraZ( vAxVal2, vtTprev, vAxIni2, vtTcurr, dHomeZ, dExtraZ)) { + if ( abs( dExtraZ) > EPS_SMALL) { + double dMyHomeZ = dHomeZ + dExtraZ ; + vAxVal2[2] = dMyHomeZ ; + vAxIni2[2] = dMyHomeZ ; + if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { + dHomeZ = dMyHomeZ ; + bToMyHomeZ = true ; } else bToMaxZ = true ; } - // se altrimenti ammessa rotazione a Zmax e richiesta rotazione - else if ( GetRotationAtZmax() && - (( vAxVal2.size() >= 4 && abs( vAxVal2[3] - vAxIni2[3]) > 5) || - ( vAxVal2.size() >= 5 && abs( vAxVal2[4] - vAxIni2[4]) > 5))) { - // verifico se va bene rotazione assi iniziale e poi movimento - DBLVECTOR vAxMid2 = vAxVal2 ; - vAxMid2[3] = vAxIni2[3] ; - if ( vAxVal2.size() >= 5) - vAxMid2[4] = vAxIni2[4] ; - if ( TestCollisionAvoid( vAxVal2, vAxMid2) && - TestCollisionAvoid( vAxMid2, vAxIni2) && - pPrevOp->AddRise( vAxVal2) && - pPrevOp->AddSpecialRise( vAxMid2, true, GDB_ID_NULL, 5)) { - vAxVal = vAxMid2 ; - bMaxZ = true ; - } - else - return false ; + else + bToMaxZ = true ; + } + // se altrimenti ammessa rotazione a Zmax e richiesta rotazione + else if ( GetRotationAtZmax() && + (( vAxVal2.size() >= 4 && abs( vAxVal2[3] - vAxIni2[3]) > 5) || + ( vAxVal2.size() >= 5 && abs( vAxVal2[4] - vAxIni2[4]) > 5))) { + // verifico se va bene rotazione assi iniziale e poi movimento + DBLVECTOR vAxMid2 = vAxVal2 ; + vAxMid2[3] = vAxIni2[3] ; + if ( vAxVal2.size() >= 5) + vAxMid2[4] = vAxIni2[4] ; + if ( TestCollisionAvoid( vAxVal2, vAxMid2) && + TestCollisionAvoid( vAxMid2, vAxIni2) && + pPrevOp->AddRise( vAxVal2) && + pPrevOp->AddSpecialRise( vAxMid2, true, GDB_ID_NULL, 5)) { + vAxVal = vAxMid2 ; + bMaxZ = true ; } - // altrimenti impossibile else return false ; } - // Recupero box complessivo dei grezzi attivi - BBox3d b3Raws ; - GetCurrRawsGlobBox( b3Raws) ; - // Se già a Zmax - if ( bMaxZ) { - // non devo fare alcunché - } - // se altrimenti richiesta risalita a Zmax - else if ( bToMaxZ || ForcedZmax( vAxVal, vAxIni, b3Raws)) { - // cancello eventuale risalita parziale della lavorazione precedente - pPrevOp->RemoveRise() ; - // aggiungo risalita a HomeZ/MaxZ - if ( ! pPrevOp->AddRise( vAxVal, NAN, GDB_ID_NULL, ( bNewLink ? ( bZHomeDown ? -1 : +1) : 0))) - 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 ( bToMyHomeZ || ! TestCollisionAvoid( vAxVal, vAxIni)) { - // riprovo con risalita parziale - bool bPartRise = false ; - double dSafeZ = dHomeZ ; - double dUnsafeZ = ( bZHomeDown ? min( vAxVal[2], vAxIni[2]) : max( vAxVal[2], vAxIni[2])) ; - if ( ( ! bZHomeDown && dUnsafeZ < dSafeZ) || ( bZHomeDown && dUnsafeZ > dSafeZ)) { - DBLVECTOR vAxVal2 = vAxVal ; - DBLVECTOR vAxIni2 = vAxIni ; - vAxVal2[2] = dUnsafeZ ; - vAxIni2[2] = dUnsafeZ ; - if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { - bPartRise = true ; - dSafeZ = dUnsafeZ ; - } - else { - for ( int i = 1 ; i <= 3 ; ++ i) { - double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ; - vAxVal2[2] = dTestSafeZ ; - vAxIni2[2] = dTestSafeZ ; - if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { - bPartRise = true ; - dSafeZ = dTestSafeZ ; - } - else { - dUnsafeZ = dTestSafeZ ; - } - } - } - // se necessario, riprovo appena prima di Zmax - if ( ! bPartRise) { - double dOffsZ = 1 * ( bZHomeDown ? 1 : -1) ; - vAxVal2[2] = dHomeZ + dOffsZ ; - vAxIni2[2] = dHomeZ + dOffsZ ; - if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { - bPartRise = true ; - dSafeZ = dHomeZ + dOffsZ ; - } - } - } - 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( false, vAxVal) ; - // aggiungo risalita a Zsafe - double dDelta = ( ! bZHomeDown ? max( dSafeZ - vAxVal[2], 0.) : min( dSafeZ - vAxVal[2], 0.)) ; - if ( ! pPrevOp->AddRise( vAxVal, dDelta)) - return false ; - // aggiorno quota iniziale in Z - vAxIni[2] = dSafeZ ; - } - } - // gestione eventuali aree protette - if ( ! ManageProtectedAreas( vAxVal, vAxIni, pPrevOp, this, bClimbDone)) + // altrimenti impossibile + else return false ; } - // se robot - else if ( m_pMchMgr->GetCurrIsRobot()) { - // recupero dati posizione finale lavorazione precedente - const CamData* pCdEnd = pPrevOp->GetFinalCamData( false) ; - const Point3d& ptPEnd = pCdEnd->GetEndPoint() ; - const Vector3d& vtDirEnd = pCdEnd->GetToolDir() ; - const Vector3d& vtAuxEnd = pCdEnd->GetAuxDir() ; - // recupero dati posizione iniziale lavorazione corrente - const CamData* pCdStart = GetInitialCamData( false) ; - const Point3d& ptPStart = pCdStart->GetEndPoint() ; - const Vector3d& vtDirStart = pCdStart->GetToolDir() ; - const Vector3d& vtAuxStart = pCdStart->GetAuxDir() ; - // verifico se collegamento diretto tra le due posizioni (muovendosi alla Z maggiore) è possibile senza collisioni - int nLowerPos = 0 ; - DBLVECTOR vAxEnd = vAxVal ; - DBLVECTOR vAxStart = vAxIni ; - if ( ptPEnd.z < ptPStart.z - 100 * EPS_SMALL) { - nLowerPos = - 1 ; - if ( ! CalcRobotAxesAbovePos( ptPEnd, vtDirEnd, vtAuxEnd, ptPStart.z - ptPEnd.z, vAxEnd)) - return false ; - } - else if ( ptPEnd.z > ptPStart.z + 100 * EPS_SMALL) { - nLowerPos = 1 ; - if ( ! CalcRobotAxesAbovePos( ptPStart, vtDirStart, vtAuxStart, ptPEnd.z - ptPStart.z, vAxStart)) - return false ; - } - if ( TestCollisionAvoid( vAxEnd, vAxStart)) { - if ( nLowerPos == -1) { - // aggiungo risalita a Z opportuna - if ( ! pPrevOp->AddRise( vAxVal, ptPStart.z - ptPEnd.z)) - return false ; + // Recupero box complessivo dei grezzi attivi + BBox3d b3Raws ; + GetCurrRawsGlobBox( b3Raws) ; + // Se già a Zmax + if ( bMaxZ) { + // non devo fare alcunché + } + // se altrimenti richiesta risalita a Zmax + else if ( bToMaxZ || ForcedZmax( vAxVal, vAxIni, b3Raws)) { + // cancello eventuale risalita parziale della lavorazione precedente + pPrevOp->RemoveRise() ; + // aggiungo risalita a HomeZ/MaxZ + if ( ! pPrevOp->AddRise( vAxVal, NAN, GDB_ID_NULL, 0)) + 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 ( bToMyHomeZ || ! TestCollisionAvoid( vAxVal, vAxIni)) { + // riprovo con risalita parziale + bool bPartRise = false ; + double dSafeZ = dHomeZ ; + double dUnsafeZ = ( bZHomeDown ? min( vAxVal[2], vAxIni[2]) : max( vAxVal[2], vAxIni[2])) ; + if ( ( ! bZHomeDown && dUnsafeZ < dSafeZ) || ( bZHomeDown && dUnsafeZ > dSafeZ)) { + DBLVECTOR vAxVal2 = vAxVal ; + DBLVECTOR vAxIni2 = vAxIni ; + vAxVal2[2] = dUnsafeZ ; + vAxIni2[2] = dUnsafeZ ; + if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { + bPartRise = true ; + dSafeZ = dUnsafeZ ; + } + else { + for ( int i = 1 ; i <= 3 ; ++ i) { + double dTestSafeZ = ( dUnsafeZ + dSafeZ) / 2 ; + vAxVal2[2] = dTestSafeZ ; + vAxIni2[2] = dTestSafeZ ; + if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { + bPartRise = true ; + dSafeZ = dTestSafeZ ; + } + else { + dUnsafeZ = dTestSafeZ ; + } + } + } + // se necessario, riprovo appena prima di Zmax + if ( ! bPartRise) { + double dOffsZ = 1 * ( bZHomeDown ? 1 : -1) ; + vAxVal2[2] = dHomeZ + dOffsZ ; + vAxIni2[2] = dHomeZ + dOffsZ ; + if ( TestCollisionAvoid( vAxVal2, vAxIni2)) { + bPartRise = true ; + dSafeZ = dHomeZ + dOffsZ ; + } } } - // altrimenti aggiungo risalita a Zmax - else { + 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( false, vAxVal) ; + // aggiungo risalita a Zsafe + double dDelta = ( ! bZHomeDown ? max( dSafeZ - vAxVal[2], 0.) : min( dSafeZ - vAxVal[2], 0.)) ; + if ( ! pPrevOp->AddRise( vAxVal, dDelta)) + return false ; + // aggiorno quota iniziale in Z + vAxIni[2] = dSafeZ ; + } + } + // se ci sono aree protette... + if ( m_pMchMgr->GetCurrMachine()->ExistProtectedAreas()) { + // verifico se il collegamento le attraversa + const double PA_VERIF_LEN = 10 ; + Point3d ptStart( vAxVal[0], vAxVal[1], vAxVal[2]) ; + Point3d ptEnd( vAxIni[0], vAxIni[1], vAxIni[2]) ; + double dLen = DistXY( ptStart, ptEnd) ; + int nStep = int( dLen / PA_VERIF_LEN + 1) ; + bool bOutstroke = false ; + for ( int i = 1 ; i < nStep ; ++ i) { + Point3d ptCurr = Media( ptStart, ptEnd, double( i) / nStep) ; + int nStat = 0 ; + if ( ! m_pMchMgr->GetCurrMachine()->VerifyProtectedAreas( ptCurr.x, ptCurr.y, ptCurr.z, {}, nStat) || nStat != 0) { + bOutstroke = true ; + break ; + } + } + // in caso di attraversamento dell'area proibita + if ( bOutstroke) { + // chiamo funzione script OnSpecialRapidMove per avere nuovo punto intermedio + DBLVECTOR vAxNew ; + bool bModif = false ; + bool bOk = ( SpecialMoveRapid( vAxVal, vAxIni, vAxNew, bModif) && bModif) ; + // inserisco il nuovo punto alla fine della lavorazione precedente + if ( bOk) + vAxVal = vAxNew ; + if ( ! pPrevOp->AddSpecialRise( vAxVal, bOk)) + return false ; + } } } // altrimenti non richiesta verifica collegamento con lavorazione precedente @@ -3001,18 +2980,6 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) if ( ! pPrevOp->AddRise( vAxVal)) return false ; } - // per nuova gestione collegamenti, verifica aree protette - if ( bVerifyPreviousLink && bNewLink && m_pMchMgr->GetCurrIsCenter()) { - // recupero posizione finale lavorazione - if ( ! pPrevOp->GetFinalAxesValues( false, vAxVal)) - return false ; - // recupero posizione home - DBLVECTOR vAxIni ; - if ( ! m_pMchMgr->GetAllCurrAxesHomePos( vAxIni)) - return false ; - if ( ! pPrevOp->ManageProtectedAreas( vAxVal, vAxIni, pPrevOp, nullptr, bClimbDone)) - return false ; - } // ripristino la lavorazione corrente m_pMchMgr->SetCurrMachining( GetOwner()) ; @@ -3024,16 +2991,6 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) return false ; // si parte da Z massima bMaxZ = true ; - // per nuova gestione collegamenti, verifica aree protette - if ( bVerifyPreviousLink && bNewLink && m_pMchMgr->GetCurrIsCenter()) { - // recupero posizione iniziale lavorazione - DBLVECTOR vAxIni ; - if ( ! GetInitialAxesValues( false, vAxIni)) - return false ; - // eseguo verifica - if ( ! ManageProtectedAreas( vAxVal, vAxIni, nullptr, this, bClimbDone)) - return false ; - } } // aggiusto l'inizio di ogni percorso di lavoro @@ -3042,7 +2999,7 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) int nClPathId = GetFirstFullToolpath() ; while ( bOk && nClPathId != GDB_ID_NULL) { // se richiesta verifica collegamento con lavorazione precedente, sistemo inizio - if ( bVerifyPreviousLink && ( ! bClimbDone || nPrevClPathId != GDB_ID_NULL)) { + if ( bVerifyPreviousLink) { if ( ! AdjustOneStartEndMovement( nClPathId, nPrevClPathId, pPrevOp, vAxVal, bMaxZ)) bOk = false ; } @@ -3059,16 +3016,145 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) // Aggiungo risalita finale bOk = bOk && AddRise( vAxVal) ; - // per nuova gestione collegamenti, verifica aree protette - if ( bVerifyPreviousLink && bNewLink && m_pMchMgr->GetCurrIsCenter()) { - // recupero posizione finale lavorazione - if ( ! GetFinalAxesValues( false, vAxVal)) + + // se ultima operazione o la successiva lo richiede, vado in home + int nNextOpId = m_pMchMgr->GetNextActiveOperation( m_nOwnerId) ; + Operation* pNextOp = GetOperation( m_pGeomDB->GetUserObj( nNextOpId)) ; + if ( pNextOp == nullptr || pNextOp->NeedPrevHome() || + ( IsValidMachiningType( pNextOp->GetType()) && ! pNextOp->IsAtLeastOnePathOk())) + bOk = bOk && AddHome() ; + + return bOk ; +} + +//---------------------------------------------------------------------------- +bool +Operation::AdjustStartEndMovementsNew( bool bVerifyPreviousLink) +{ + // recupero ultima operazione precedente non vuota o che richiede home precedente + // (disposizione qui considerata non vuota anche se nella path contiene solo comandi ausiliari) + int nPrevOpId = m_pMchMgr->GetPrevActiveOperation( m_nOwnerId) ; + Operation* pPrevOp = GetOperation( m_pGeomDB->GetUserObj( nPrevOpId)) ; + while ( pPrevOp != nullptr) { + if ( ! pPrevOp->IsEmpty( NEED_ONE_TP_OK) || pPrevOp->NeedPrevHome()) + break ; + else { + nPrevOpId = m_pMchMgr->GetPrevActiveOperation( nPrevOpId) ; + pPrevOp = GetOperation( m_pGeomDB->GetUserObj( nPrevOpId)) ; + } + } + // recupero l'utensile precedente + string sPrevTool ; + if ( pPrevOp != nullptr && ! pPrevOp->IsEmpty( NEED_ONE_TP_OK)) + sPrevTool = pPrevOp->GetToolName() ; + + // determino posizione precedente assi + bool bMaxZ = false ; + + // *** Se primo utensile o richiesto, uso la posizione home + if ( sPrevTool.empty() || NeedPrevHome()) { + // imposto l'utensile per i calcoli macchina + if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr())) return false ; - // recupero posizione home - DBLVECTOR vAxIni ; - if ( ! m_pMchMgr->GetAllCurrAxesHomePos( vAxIni)) + // si parte da Z massima + bMaxZ = true ; + // eventuale collegamento speciale + if ( bVerifyPreviousLink) { + // eseguo collegamento speciale + if ( ! ManageSpecialLink( nullptr, GDB_ID_NULL, this, GDB_ID_NULL)) + return false ; + } + } + + // *** Se utensile non cambiato o su diversa uscita della stessa testa, uso posizione finale della lavorazione precedente + else if ( ! ToolChangeNeeded( *pPrevOp, *this)) { + // imposto l'utensile per i calcoli macchina + if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr())) return false ; - if ( ! ManageProtectedAreas( vAxVal, vAxIni, this, nullptr, bClimbDone)) + // se richiesta verifica collegamento con lavorazione precedente + if ( bVerifyPreviousLink) { + // cancello eventuale risalita finale lavorazione precedente + pPrevOp->RemoveRise() ; + // recupero posizione finale lavorazione precedente + DBLVECTOR vAxVal ; + if ( ! pPrevOp->GetFinalAxesValues( false, vAxVal)) + return false ; + // sistemo collegamento con lavorazione precedente + if ( ! AdjustOneStartEndMovement( GetFirstFullToolpath(), GDB_ID_NULL, pPrevOp, vAxVal, bMaxZ)) + return false ; + // gestione collegamento speciale + if ( ! ManageSpecialLink( pPrevOp, GDB_ID_NULL, this, GDB_ID_NULL)) + return false ; + } + } + + // *** Altrimenti aggiungo uscita per cambio utensile alla lavorazione precedente e parto da questa + else { + // imposto la lavorazione precedente come corrente + m_pMchMgr->SetCurrMachining( pPrevOp->GetOwner()) ; + // imposto l'utensile precedente per i calcoli macchina + if ( ! m_pMchMgr->SetCalcTool( pPrevOp->GetToolName(), pPrevOp->GetHeadName(), pPrevOp->GetExitNbr())) + return false ; + // ricalcolo risalita di lavorazione precedente (se già calcolata) + if ( pPrevOp->RemoveRise()) { + DBLVECTOR vAxVal ; + if ( ! pPrevOp->AddRise( vAxVal)) + return false ; + } + // se richiesta verifica collegamento con lavorazione precedente + if ( bVerifyPreviousLink) { + // eventuale rilascio utensile speciale di lavorazione precedente + if ( ! pPrevOp->ManageSpecialLink( pPrevOp, GDB_ID_NULL, nullptr, GDB_ID_NULL)) + return false ; + } + + // ripristino la lavorazione corrente + m_pMchMgr->SetCurrMachining( GetOwner()) ; + // imposto l'utensile per i calcoli macchina + if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr())) + return false ; + // si parte da Z massima + bMaxZ = true ; + // eventuale presa utensile speciale di lavorazione corrente + if ( bVerifyPreviousLink) { + // eseguo verifica + if ( ! ManageSpecialLink( nullptr, GDB_ID_NULL, this, GDB_ID_NULL)) + return false ; + } + } + + // aggiusto il collegamento iniziale di ogni percorso di lavoro successivo al primo + bool bOk = true ; + int nPrevClPathId = GetFirstFullToolpath() ; + int nClPathId = GetNextFullToolpath( nPrevClPathId) ; + while ( bOk && nClPathId != GDB_ID_NULL) { + // se richiesta verifica collegamento con lavorazione precedente + if ( bVerifyPreviousLink) { + // recupero nuovi finali senza risalite + RemoveRise( nPrevClPathId) ; + DBLVECTOR vAxVal ; + if ( ! GetClPathFinalAxesValues( nPrevClPathId, false, vAxVal)) + bOk = false ; + // sistemo collegamento con precedente + if ( ! AdjustOneStartEndMovement( nClPathId, nPrevClPathId, nullptr, vAxVal, bMaxZ)) + bOk = false ; + // gestione collegamento speciale ( tra due percorsi della stessa lavorazione) + if ( ! ManageSpecialLink( this, nPrevClPathId, this, nClPathId)) + return false ; + } + bMaxZ = false ; + // passo al successivo + nPrevClPathId = nClPathId ; + nClPathId = GetNextFullToolpath( nClPathId) ; + pPrevOp = nullptr ; + } + + // Aggiungo risalita finale + DBLVECTOR vAxVal ; + bOk = bOk && AddRise( vAxVal) ; + // nuova verifica aree protette alla fine + if ( bVerifyPreviousLink) { + if ( ! ManageSpecialLink( this, GDB_ID_NULL, nullptr, GDB_ID_NULL)) return false ; } @@ -3084,116 +3170,58 @@ Operation::AdjustStartEndMovements( bool bVerifyPreviousLink) //---------------------------------------------------------------------------- bool -Operation::ManageProtectedAreas( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, Operation* pPrevOp, Operation* pNextOp, - bool& bClimbDone) +Operation::ManageSpecialLink( Operation* pPrevOpe, int nPrevClPathId, Operation* pNextOpe, int nNextClPathId) { - // se non ci sono aree protette, esco subito. - if ( ! m_pMchMgr->GetCurrMachine()->ExistProtectedAreas()) - return true ; - - // il numero di assi non deve cambiare - if ( vAxStart.size() != vAxEnd.size()) + // controlli + if ( pPrevOpe == nullptr && pNextOpe == nullptr) return false ; - int nAxisTot = int( vAxStart.size()) ; - - // recupero flag nuova gestione collegamenti tra lavorazioni - bool bNewLink = m_pMchMgr->GetCurrMachine()->GetNewLinkMgr() ; // codifica tipo di collegamento - int nLinkType = ( pPrevOp == nullptr ? 0 : 2) + ( pNextOp == nullptr ? 0 : 1) ; - - // Verifico se il collegamento le attraversa - Point3d ptSta( vAxStart[0], vAxStart[1], vAxStart[2]) ; - Point3d ptEnd( vAxEnd[0], vAxEnd[1], vAxEnd[2]) ; - DBLVECTOR vAngSta ; - for ( int i = 3 ; i < int( vAxStart.size()) && bNewLink ; ++ i) - vAngSta.emplace_back( vAxStart[i]) ; - DBLVECTOR vAngEnd ; - for ( int i = 3 ; i < int( vAxEnd.size()) && bNewLink ; ++ i) - vAngEnd.emplace_back( vAxEnd[i]) ; - // verifico inizio e fine - int nOutstroke = 0 ; - int nStSta = 0 ; - if ( ! m_pMchMgr->GetCurrMachine()->VerifyProtectedAreas( ptSta.x, ptSta.y, ptSta.z, vAngSta, nLinkType, nStSta) || nStSta != 0) - nOutstroke |= 2 ; - int nStEnd = 0 ; - if ( ! m_pMchMgr->GetCurrMachine()->VerifyProtectedAreas( ptEnd.x, ptEnd.y, ptEnd.z, vAngEnd, nLinkType, nStEnd) || nStEnd != 0) - nOutstroke |= 1 ; - // verifico i punti intermedi - const double PA_VERIF_LEN = 10 ; - double dLen = DistXY( ptSta, ptEnd) ; - int nStep = int( dLen / PA_VERIF_LEN) + 1 ; - for ( int i = 1 ; i < nStep && nOutstroke == 0 ; ++ i) { - double dCoeff = double( i) / nStep ; - Point3d ptCurr = Media( ptSta, ptEnd, dCoeff) ; - DBLVECTOR vAng ; - for ( int j = 0 ; j < int( vAngSta.size()) ; ++ j) - vAng.emplace_back( ( 1 - dCoeff) * vAngSta[j] + dCoeff * vAngEnd[j]) ; - int nStat = 0 ; - if ( ! m_pMchMgr->GetCurrMachine()->VerifyProtectedAreas( ptCurr.x, ptCurr.y, ptCurr.z, vAng, nLinkType, nStat) || nStat != 0) - nOutstroke |= 4 ; - } - if ( nOutstroke == 0) - return true ; + int nLinkType = ( pPrevOpe != nullptr ? 2 : 0) + ( pNextOpe != nullptr ? 1 : 0) ; // assegno valori assi iniziali e finali, depurati di approcci/retrazioni aggiuntive (CLIMB e RISE) in area protetta - DBLVECTOR vNeatAxSta ; - if ( bNewLink && pPrevOp && ( nOutstroke & 2) != 0) - pPrevOp->GetFinalAxesValues( true, vNeatAxSta) ; + DBLVECTOR vAxSta, vNeatAxSta ; + if ( pPrevOpe != nullptr) { + if ( nPrevClPathId == GDB_ID_NULL) { + pPrevOpe->GetFinalAxesValues( false, vAxSta) ; + pPrevOpe->GetFinalAxesValues( true, vNeatAxSta) ; + } + else { + pPrevOpe->GetClPathFinalAxesValues( nPrevClPathId, false, vAxSta) ; + pPrevOpe->GetClPathFinalAxesValues( nPrevClPathId, true, vNeatAxSta) ; + } + } else - vNeatAxSta = vAxStart ; - DBLVECTOR vNeatAxEnd ; - if ( bNewLink && pNextOp && ( nOutstroke & 1) != 0) - pNextOp->GetInitialAxesValues( true, vNeatAxEnd) ; + m_pMchMgr->GetAllCurrAxesHomePos( vNeatAxSta) ; + DBLVECTOR vAxEnd, vNeatAxEnd ; + if ( pNextOpe != nullptr) { + if ( nNextClPathId == GDB_ID_NULL) { + pNextOpe->GetInitialAxesValues( false, vAxEnd) ; + pNextOpe->GetInitialAxesValues( true, vNeatAxEnd) ; + } + else { + pNextOpe->GetClPathInitialAxesValues( nNextClPathId, false, vAxEnd) ; + pNextOpe->GetClPathInitialAxesValues( nNextClPathId, true, vNeatAxEnd) ; + } + } else - vNeatAxEnd = vAxEnd ; - if ( int( vNeatAxSta.size()) != nAxisTot || int( vNeatAxEnd.size()) != nAxisTot) + m_pMchMgr->GetAllCurrAxesHomePos( vNeatAxEnd) ; + if ( vNeatAxSta.size() != vNeatAxEnd.size()) return false ; // chiamo funzione script OnSpecialRapidMove per avere posizioni di movimento - POSVECTOR vPosNew ; - bool bOk = SpecialMoveRapid( vNeatAxSta, vNeatAxEnd, nOutstroke, nLinkType, vPosNew) ; - // se tutto bene, eseguo cancellazioni e inserimenti come richiesto - if ( bOk) { - bClimbDone = bNewLink ; - // eventuali cancellazioni - if ( bNewLink && ( nOutstroke & 2) != 0 && pPrevOp != nullptr) - pPrevOp->RemoveRise() ; - if ( bNewLink && ( nOutstroke & 1) != 0 && pNextOp != nullptr) - pNextOp->RemoveClimb() ; - // eventuali inserimenti - for ( const auto& PosNew : vPosNew) { - if ( PosNew.nSide == 2) { - if ( pPrevOp == nullptr || - ! pPrevOp->AddSpecialRise( PosNew.vAxis, true, GDB_ID_NULL, - PosNew.nFlag, PosNew.nFlag2, PosNew.nMask, PosNew.sInfo)) - return false ; - } - else if ( PosNew.nSide != 1) + bool bOk = SpecialLink( vNeatAxSta, vNeatAxEnd, nLinkType, pPrevOpe, pNextOpe) ; + + // in caso di errore eseguo inserimento con segnalazione di errore + if ( ! bOk) { + if ( pPrevOpe != nullptr) { + if ( ! pPrevOpe->AddSpecialRise( vAxSta, false)) return false ; } - for ( int i = int( vPosNew.size()) - 1 ; i >= 0 ; --i) { - const auto& PosNew = vPosNew[i] ; - if ( PosNew.nSide == 1) { - if ( pNextOp == nullptr || - ! pNextOp->AddSpecialClimb( PosNew.vAxis, true, GDB_ID_NULL, - PosNew.nFlag, PosNew.nFlag2, PosNew.nMask, PosNew.sInfo)) - return false ; - } - } - } - // altrimenti eseguo inserimento con segnalazione di errore - else { - if ( pPrevOp != nullptr) { - if ( ! pPrevOp->AddSpecialRise( vAxStart, false)) + if ( pNextOpe != nullptr) { + if ( ! pNextOpe->AddSpecialClimb( vAxEnd, false)) return false ; } - if ( pNextOp != nullptr) { - if ( ! pNextOp->AddSpecialClimb( vAxEnd, false)) - return false ; - } - if ( pPrevOp == nullptr && pNextOp == nullptr) - return false ; } return true ; @@ -3554,18 +3582,18 @@ Operation::AdjustOneStartEndMovement( int nClPathId, int nPrevClPathId, Operatio //---------------------------------------------------------------------------- bool -Operation::ToolChangeNeeded( const Operation& Op1, const Operation& Op2) const +Operation::ToolChangeNeeded( const Operation& Ope1, const Operation& Ope2) const { // se non cambia l'utensile, non cambia la testa fisica - if ( EqualNoCase( Op1.GetToolName(), Op2.GetToolName())) + if ( EqualNoCase( Ope1.GetToolName(), Ope2.GetToolName())) return false ; // se non hanno TcPos e stanno sulla stessa testa con uscita diversa, non cambia la testa fisica - if ( Op1.GetToolTcPos().empty() && Op2.GetToolTcPos().empty() && - EqualNoCase( Op1.GetHeadName(), Op2.GetHeadName()) && Op1.GetExitNbr() != Op2.GetExitNbr()) + if ( Ope1.GetToolTcPos().empty() && Ope2.GetToolTcPos().empty() && + EqualNoCase( Ope1.GetHeadName(), Ope2.GetHeadName()) && Ope1.GetExitNbr() != Ope2.GetExitNbr()) return false ; // se hanno lo stesso TcPos e stanno sulla stessa testa con uscita diversa, non cambia la testa fisica - if ( EqualNoCase( Op1.GetToolTcPos(), Op2.GetToolTcPos()) && - EqualNoCase( Op1.GetHeadName(), Op2.GetHeadName()) && Op1.GetExitNbr() != Op2.GetExitNbr()) + if ( EqualNoCase( Ope1.GetToolTcPos(), Ope2.GetToolTcPos()) && + EqualNoCase( Ope1.GetHeadName(), Ope2.GetHeadName()) && Ope1.GetExitNbr() != Ope2.GetExitNbr()) return false ; // altrimenti necessario un cambio return true ; @@ -4969,8 +4997,63 @@ Operation::SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nF //---------------------------------------------------------------------------- bool -Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nOutstroke, int nLinkType, - POSVECTOR& vNewPos) +Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, DBLVECTOR& vAxNew, bool& bModif) +{ + // recupero la macchina corrente + Machine* pMch = ( m_pMchMgr != nullptr ? m_pMchMgr->GetCurrMachine() : nullptr) ; + if ( pMch == nullptr) + return false ; + // costanti + static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo + static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok) + static const string EVAR_MODIF = ".MODIF" ; // OUT (bool) flag di modifica effettuata + static const string ON_SPECIAL_MOVERAPID = "OnSpecialMoveRapid" ; + + // se funzione non implementata + if ( ! pMch->LuaExistsFunction( ON_SPECIAL_MOVERAPID)) { + bModif = false ; + return true ; + } + + // eseguo l'azione + bool bOk = true ; + int nErr = 99 ; + // imposto valori parametri + bOk = bOk && pMch->LuaCreateGlobTable( EMC_VAR) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_TOOL, GetToolName()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_HEAD, GetHeadName()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_EXIT, GetExitNbr()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_TCPOS, GetToolTcPos()) ; + // valore degli assi + bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ; + int nNumAxes = int( vAxStart.size()) ; + for ( int i = 1 ; i <= nNumAxes ; ++ i) + bOk = bOk && pMch->LuaSetGlobVar( GetGlobVarAxisPrev( i, EMC_VAR, bIsRobot), vAxStart[i-1]) ; + for ( int i = 1 ; i <= nNumAxes ; ++ i) + bOk = bOk && pMch->LuaSetGlobVar( GetGlobVarAxisValue( i, EMC_VAR, bIsRobot), vAxEnd[i-1]) ; + // eseguo + bOk = bOk && pMch->LuaCallFunction( ON_SPECIAL_MOVERAPID, false) ; + // recupero valori parametri obbligatori + bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_ERROR, nErr) ; + bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_MODIF, bModif) ; + vAxNew.resize( nNumAxes) ; + for ( int i = 1 ; i <= nNumAxes ; ++ i) + bOk = bOk && pMch->LuaGetGlobVar( GetGlobVarAxisValue( i, EMC_VAR, bIsRobot), vAxNew[i-1]) ; + // reset + bOk = bOk && pMch->LuaResetGlobVar( EMC_VAR) ; + // segnalo errori + if ( nErr != 0) { + bOk = false ; + string sOut = " Error in " + ON_SPECIAL_MOVERAPID + " (" + ToString( nErr) + ")" ; + LOG_ERROR( GetEMkLogger(), sOut.c_str()) + } + return bOk ; +} + +//---------------------------------------------------------------------------- +bool +Operation::SpecialLink( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nLinkType, + const Operation* pPrevOpe, const Operation* pNextOpe) { // recupero la macchina corrente Machine* pMch = ( m_pMchMgr != nullptr ? m_pMchMgr->GetCurrMachine() : nullptr) ; @@ -4978,16 +5061,16 @@ Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, return false ; // costanti static const string EMC_VAR = "EMC" ; // tabella variabili locali per calcolo - static const string EVAR_OUTSTROKE = ".OUTSTROKE" ; // IN (int) codice extracorsa posizioni (1=Inizio, 2=Fine, 3=FinePrec+InizioSucc)) - static const string EVAR_LINKTYPE = ".LINKTYPE" ; // IN (int) codice tipo collegamento (1=Inizio, 2=Fine, 3=FinePrec+InizioSucc)) + static const string EVAR_PREVMCHID = ".PREVMCHID" ; // IN (int) identificativo lavorazione precedente + static const string EVAR_PREVPHASE = ".PREVPHASE" ; // IN (int) indice fase della lavorazione precedente + static const string EVAR_NEXTMCHID = ".NEXTMCHID" ; // IN (int) identificativo lavorazione successiva + static const string EVAR_NEXTPHASE = ".NEXTPHASE" ; // IN (int) indice fase della lavorazione successiva + static const string EVAR_LINKTYPE = ".LINKTYPE" ; // IN (int) codice tipo collegamento (1=Inizio, 2=Fine, 3=FinePrec+InizioSucc) static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok) - static const string EVAR_POSTOT = ".POSTOT" ; // OUT (int) numero di nuove posizioni - static const string EVAR_POS = ".POS" ; // OUT (table) vettore di posizioni - static const string EVAR_SIDE = ".SIDE" ; // OUT (int) codice inserimento movimento (1=Inizio, 2=Fine) - static const string ON_SPECIAL_MOVERAPID = "OnSpecialMoveRapid" ; + static const string ON_SPECIAL_LINK = "OnSpecialLink" ; // se la funzione non è definita, esco - if ( ! pMch->LuaExistsFunction( ON_SPECIAL_MOVERAPID)) + if ( ! pMch->LuaExistsFunction( ON_SPECIAL_LINK)) return false ; // eseguo @@ -4999,9 +5082,11 @@ Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_HEAD, GetHeadName()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_EXIT, GetExitNbr()) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_TCPOS, GetToolTcPos()) ; - bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_MCHID, GetOwner()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PREVMCHID, ( pPrevOpe != nullptr ? pPrevOpe->GetOwner() : GDB_ID_NULL)) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PREVPHASE, ( pPrevOpe != nullptr ? pPrevOpe->m_nPhase : 0)) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_NEXTMCHID, ( pNextOpe != nullptr ? pNextOpe->GetOwner() : GDB_ID_NULL)) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_NEXTPHASE, ( pNextOpe != nullptr ? pNextOpe->m_nPhase : 0)) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_PHASE, m_nPhase) ; - bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OUTSTROKE, ( nOutstroke % 4)) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_LINKTYPE, nLinkType) ; // valore degli assi bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ; @@ -5011,59 +5096,14 @@ Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, for ( int i = 1 ; i <= nNumAxes ; ++ i) bOk = bOk && pMch->LuaSetGlobVar( GetGlobVarAxisValue( i, EMC_VAR, bIsRobot), vAxEnd[i-1]) ; // eseguo - bOk = bOk && pMch->LuaCallFunction( ON_SPECIAL_MOVERAPID) ; + bOk = bOk && pMch->LuaCallFunction( ON_SPECIAL_LINK) ; // recupero valori parametri obbligatori bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_ERROR, nErr) && nErr == 0 ; - // recupero i parametri facoltativi - int nPosTot ; - if ( ! pMch->LuaGetGlobVar( EMC_VAR + EVAR_POSTOT, nPosTot)) - nPosTot = -1 ; - // recupero gli assi - vNewPos.clear() ; - if ( nPosTot == -1) { - vNewPos.resize( 1) ; - vNewPos[0].vAxis.resize( nNumAxes) ; - for ( int i = 1 ; i <= nNumAxes && bOk ; ++ i) { - if ( ! pMch->LuaGetGlobVar( GetGlobVarAxisValue( i, EMC_VAR, bIsRobot), vNewPos[0].vAxis[i-1])) { - bOk = false ; - nErr = 91 ; - break ; - } - } - } - else { - for ( int j = 1 ; j <= nPosTot && bOk ; ++ j) { - string sRec = EMC_VAR + EVAR_POS + "." + ToString( j) ; - Position CurrPos ; - if ( ! pMch->LuaGetGlobVar( sRec + EVAR_SIDE, CurrPos.nSide)) { - bOk = false ; - nErr = 92 ; - break ; - } - CurrPos.vAxis.resize( nNumAxes) ; - for ( int i = 1 ; i <= nNumAxes ; ++ i) { - if ( ! pMch->LuaGetGlobVar( GetGlobVarAxisValue( i, sRec, bIsRobot), CurrPos.vAxis[i-1])) { - bOk = false ; - nErr = 93 ; - break ; - } - } - if ( ! pMch->LuaGetGlobVar( sRec + GVAR_MASK, CurrPos.nMask)) - CurrPos.nMask = -1 ; - if ( ! pMch->LuaGetGlobVar( sRec + GVAR_FLAG, CurrPos.nFlag)) - CurrPos.nFlag = 0 ; - if ( ! pMch->LuaGetGlobVar( sRec + GVAR_FLAG2, CurrPos.nFlag2)) - CurrPos.nFlag2 = 0 ; - if ( ! pMch->LuaGetGlobVar( sRec + GVAR_INFO, CurrPos.sInfo)) - CurrPos.sInfo = "" ; - vNewPos.emplace_back( CurrPos) ; - } - } // reset bOk = pMch->LuaResetGlobVar( EMC_VAR) && bOk ; // segnalo errori if ( ! bOk) { - string sOut = " Error in " + ON_SPECIAL_MOVERAPID + " (" + ToString( nErr) + ")" ; + string sOut = " Error in " + EVAR_LINKTYPE + " (" + ToString( nErr) + ")" ; LOG_ERROR( GetEMkLogger(), sOut.c_str()) } return bOk ; diff --git a/Operation.h b/Operation.h index 68f74ba..9aa21ed 100644 --- a/Operation.h +++ b/Operation.h @@ -231,9 +231,11 @@ class Operation : public IUserObj DBLVECTOR& vAxMid) const ; bool OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, Machine* pMch, const INTVECTOR& vRawId, const INTVECTOR& vFxtId) const ; - bool ManageProtectedAreas( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, Operation* pPrevOp, Operation* pNextOp, bool& bClimbDone) ; - bool AdjustOneStartEndMovement( int nClPathId, int nPrevClPathId, Operation* pPrevOp, const DBLVECTOR& vAxPrev, bool bMaxZ) ; - bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) const ; + bool AdjustStartEndMovementsStd( bool bVerifyPreviousLink) ; + bool AdjustOneStartEndMovement( int nClPathId, int nPrevClPathId, Operation* pPrevOpe, const DBLVECTOR& vAxPrev, bool bMaxZ) ; + bool AdjustStartEndMovementsNew( bool bVerifyPreviousLink) ; + bool ManageSpecialLink( Operation* pPrevOpe, int nPrevClPathId, Operation* pNextOpe, int nNextClPathId) ; + bool ToolChangeNeeded( const Operation& Ope1, const Operation& Ope2) const ; bool AddSpecialClimb( const DBLVECTOR& vAxVal, bool bOk = true, int nClPathId = GDB_ID_NULL, int nFlag = 0, int nFlag2 = 0, int nMask = -1, const std::string& sInfo = "", bool bFirst = true) ; bool RemoveClimb( int nClPathId = GDB_ID_NULL) ; @@ -258,8 +260,9 @@ class Operation : public IUserObj bool GetZHomeDown( void) const ; int SpecialTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ; bool SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) ; - bool SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nOutstroke, int nLinkType, - POSVECTOR& vNewPos) ; + bool SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, DBLVECTOR& vAxNew, bool& bModif) ; + bool SpecialLink( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nLinkType, + const Operation* pPrevOpe, const Operation* pNextOpe) ; protected : int m_nOwnerId ; // identificativo dell'oggetto geometrico possessore diff --git a/Pocketing.cpp b/Pocketing.cpp index 5f13e8e..eabff28 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -783,12 +783,18 @@ Pocketing::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2425, "Error in Pocketing : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2426, "Error in Pocketing : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2427, sErr) ; else @@ -796,15 +802,6 @@ Pocketing::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2425, "Error in Pocketing : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2426, "Error in Pocketing : link outstroke ") ; - return false ; - } - return true ; } diff --git a/PocketingNT.cpp b/PocketingNT.cpp index 3d1c5f8..d22b0d0 100644 --- a/PocketingNT.cpp +++ b/PocketingNT.cpp @@ -853,12 +853,18 @@ PocketingNT::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2425, "Error in PocketingNT : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2426, "Error in PocketingNT : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2427, sErr) ; else @@ -866,15 +872,6 @@ PocketingNT::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2425, "Error in PocketingNT : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2426, "Error in PocketingNT : link outstroke ") ; - return false ; - } - return true ; } diff --git a/Probing.cpp b/Probing.cpp index 2186fd6..55527b2 100644 --- a/Probing.cpp +++ b/Probing.cpp @@ -681,12 +681,18 @@ Probing::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 3406, "Error in Probing : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 3407, "Error in Probing : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 3408, sErr) ; else @@ -694,15 +700,6 @@ Probing::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 3406, "Error in Probing : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 3407, "Error in Probing : link outstroke ") ; - return false ; - } - return true ; } diff --git a/SawFinishing.cpp b/SawFinishing.cpp index 1ae4c7e..b65ca38 100644 --- a/SawFinishing.cpp +++ b/SawFinishing.cpp @@ -638,12 +638,18 @@ SawFinishing::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2713, "Error in SawFinishing : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2714, "Error in SawFinishing : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2715, sErr) ; else @@ -651,15 +657,6 @@ SawFinishing::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2713, "Error in SawFinishing : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2714, "Error in SawFinishing : link outstroke ") ; - return false ; - } - return true ; } diff --git a/SawRoughing.cpp b/SawRoughing.cpp index fc94f0e..fb3241c 100644 --- a/SawRoughing.cpp +++ b/SawRoughing.cpp @@ -602,12 +602,18 @@ SawRoughing::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2613, "Error in SawRoughing : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2614, "Error in SawRoughing : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2615, sErr) ; else @@ -615,15 +621,6 @@ SawRoughing::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2613, "Error in SawRoughing : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2614, "Error in SawRoughing : link outstroke ") ; - return false ; - } - return true ; } diff --git a/Sawing.cpp b/Sawing.cpp index b33062c..98e5a30 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -784,12 +784,18 @@ Sawing::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 2217, "Error in Sawing : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 2218, "Error in Sawing : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2219, sErr) ; else @@ -797,15 +803,6 @@ Sawing::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 2217, "Error in Sawing : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 2218, "Error in Sawing : link outstroke ") ; - return false ; - } - return true ; } diff --git a/SurfFinishing.cpp b/SurfFinishing.cpp index 489be00..4c15ab6 100644 --- a/SurfFinishing.cpp +++ b/SurfFinishing.cpp @@ -18,8 +18,6 @@ #include "SurfFinishing.h" #include "OperationConst.h" #include "GeoConst.h" -#include "/EgtDev/Include/EXeCmdLogOff.h" -#include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EGkCurveLine.h" #include "/EgtDev/Include/EGkCurveArc.h" #include "/EgtDev/Include/EGkCurveComposite.h" @@ -27,21 +25,24 @@ #include "/EgtDev/Include/EGkChainCurves.h" #include "/EgtDev/Include/EGkOffsetCurve.h" #include "/EgtDev/Include/EGkIntersCurves.h" +#include "/EgtDev/Include/EGkCurveAux.h" #include "/EgtDev/Include/EGkSfrCreate.h" #include "/EgtDev/Include/EGkSurfLocal.h" +#include "/EgtDev/Include/EGkStmFromTriangleSoup.h" +#include "/EgtDev/Include/EGkStmFromCurves.h" +#include "/EgtDev/Include/EGkSurfTriMeshAux.h" +#include "/EgtDev/Include/EGkDistPointCurve.h" +#include "/EgtDev/Include/EGkDistPointSurfFr.h" #include "/EgtDev/Include/EGkCAvToolSurfTm.h" #include "/EgtDev/Include/EGkCAvSilhouetteSurfTm.h" #include "/EgtDev/Include/EGkCalcPocketing.h" #include "/EgtDev/Include/EGkIntervals.h" #include "/EgtDev/Include/EGkStringUtils3d.h" #include "/EgtDev/Include/EGkUserObjFactory.h" +#include "/EgtDev/Include/EXeCmdLogOff.h" +#include "/EgtDev/Include/EXeConst.h" #include "/EgtDev/Include/EGnStringKeyVal.h" #include "/EgtDev/Include/EgtPointerOwner.h" -#include "/EgtDev/Include/EGkCurveAux.h" -#include "/EgtDev/Include/EGkDistPointCurve.h" -#include "/EgtDev/Include/EGkDistPointSurfFr.h" -#include "/EgtDev/Include/EGkStmFromTriangleSoup.h" -#include "/EgtDev/Include/EGkStmFromCurves.h" #include #include // per far dimenticare macro di WinUser.h @@ -739,12 +740,18 @@ SurfFinishing::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 3118, "Error in SurfFinishing : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 3119, "Error in SurfFinishing : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 3120, sErr) ; else @@ -752,15 +759,6 @@ SurfFinishing::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 3118, "Error in SurfFinishing : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 3119, "Error in SurfFinishing : link outstroke ") ; - return false ; - } - return true ; } diff --git a/SurfRoughing.cpp b/SurfRoughing.cpp index 167a226..0d925de 100644 --- a/SurfRoughing.cpp +++ b/SurfRoughing.cpp @@ -718,12 +718,18 @@ SurfRoughing::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 3018, "Error in SurfRoughing : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 3019, "Error in SurfRoughing : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 3020, sErr) ; else @@ -731,15 +737,6 @@ SurfRoughing::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 3018, "Error in SurfRoughing : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 3019, "Error in SurfRoughing : link outstroke ") ; - return false ; - } - return true ; } diff --git a/WaterJetting.cpp b/WaterJetting.cpp index e7783e9..62bc205 100644 --- a/WaterJetting.cpp +++ b/WaterJetting.cpp @@ -771,12 +771,18 @@ WaterJetting::Update( bool bPostApply) CalcAndSetAxesBBox() ; // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della lavorazione - bool bLinkOk = AdjustStartEndMovements() ; - string sLinkInfo = ( bLinkOk ? "" : m_pMchMgr->GetOutstrokeInfo()) ; + if ( ! AdjustStartEndMovements()) { + string sInfo = m_pMchMgr->GetOutstrokeInfo() ; + if ( sInfo.empty()) + m_pMchMgr->SetLastError( 3216, "Error in WaterJetting : link movements not calculable") ; + else + m_pMchMgr->SetLastError( 3217, "Error in WaterJetting : link outstroke ") ; + return false ; + } // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { + if ( bPostApply && ! PostApply( sErr)) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 3218, sErr) ; else @@ -784,15 +790,6 @@ WaterJetting::Update( bool bPostApply) return false ; } - // se non riuscito collegamento con lavorazione precedente - if ( ! bLinkOk) { - if ( sLinkInfo.empty()) - m_pMchMgr->SetLastError( 3216, "Error in WaterJetting : link movements not calculable") ; - else - m_pMchMgr->SetLastError( 3217, "Error in WaterJetting : link outstroke ") ; - return false ; - } - return true ; }