From ed1cd66164d72ee17503846b64db84e53fbba5a1 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Thu, 30 Apr 2026 14:36:03 +0200 Subject: [PATCH] EgtMachKernel 3.1d7 : - in NewLink in SpecialLink() aggiunto parametro OTHERLINKTYPE per gestione lavorazioni in doppio - Aggiunto controllo "Home" per Add/Remove Climb/Rise. --- EgtMachKernel.rc | Bin 11774 -> 11774 bytes MachConst.h | 11 +++++ MachineLuaCL.cpp | 12 ++++++ Operation.cpp | 108 +++++++++++++++++++++++++++-------------------- Operation.h | 11 ++--- 5 files changed, 91 insertions(+), 51 deletions(-) diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index dba24b9691490b0afb670521717e6a4042adae0c..39dadd4ac7fb824a6765f29404f06a8b04d2dc8f 100644 GIT binary patch delta 81 zcmewt{V#gMH#SD|&F|$dGEF|gnFC}RN|iEhUd8Rf3>J0-QHDw&Az`QxlFGd-$coN# F0{{g?9OwW5 delta 81 zcmewt{V#gMH#SDI&F|$dGEF|gnFC}RN|iEhUd8Rf3>J0-QHDw&Az`QxlFGd-$coN# F0{{dX9N+)| diff --git a/MachConst.h b/MachConst.h index fb160b4..354d163 100644 --- a/MachConst.h +++ b/MachConst.h @@ -142,9 +142,20 @@ const std::string MACHININGS_SEC = "Machinings" ; const std::string RAPIDONOUT_KEY = "RapidOnOut" ; // Chiave per Drilling in Doppio in Parallelo const std::string DRILLING_PARALLEL_KEY = "DrillingDoubleNT" ; +// Chiave per Pocketing in Doppio in Parallelo +const std::string POCKETING_PARALLEL_KEY = "PocketingDoubleNT" ; // Chiave per Ottimizzazione delle Feed in PocketingNT const std::string POCKETING_FEED_KEY = "PocketingAdjustFeedNT" ; +//---------------------------------------------------------------------------- +// Tipo di Collegamento tra le lavorazioni (LinkType) +enum LINKTYPE { + LINK_NULL = 0, + LINK_HOME_TO_MACH = 1, + LINK_MACH_TO_HOME = 2, + LINK_MACH_TO_MACH = 3 +} ; + //---------------------------------------------------------------------------- // Minimo spessore del grezzo const double RAW_MIN_H = 1 ; diff --git a/MachineLuaCL.cpp b/MachineLuaCL.cpp index 78c0fee..2605dd6 100644 --- a/MachineLuaCL.cpp +++ b/MachineLuaCL.cpp @@ -317,6 +317,9 @@ Machine::LuaEmtAddClimb( lua_State* L) if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; + // verifica "Main" e "Double" + if ( ! EqualNoCase( sMain, MCH_CL) && ! EqualNoCase( sMain, MCH_DBL)) + return luaL_error( L, ( " Error in EmtAddClimb : " + sMain).c_str()) ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // imposto la discesa (primo movimento del primo percorso della lavorazione) @@ -343,6 +346,9 @@ Machine::LuaEmtRemoveClimb( lua_State* L) if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; + // verifica "Main" e "Double" + if ( ! EqualNoCase( sMain, MCH_CL) && ! EqualNoCase( sMain, MCH_DBL)) + return luaL_error( L, ( " Error in EmtAddClimb : " + sMain).c_str()) ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // elimino le discese (primi movimenti "CLIMB" del primo percorso della lavorazione) @@ -377,6 +383,9 @@ Machine::LuaEmtAddRise( lua_State* L) if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; + // verifica "Main" e "Double" + if ( ! EqualNoCase( sMain, MCH_CL) && ! EqualNoCase( sMain, MCH_DBL)) + return luaL_error( L, ( " Error in EmtAddClimb : " + sMain).c_str()) ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // aggiungo la risalita (ultimo movimento dell'ultimo percorso della lavorazione) @@ -403,6 +412,9 @@ Machine::LuaEmtRemoveRise( lua_State* L) if ( m_pMchLua == nullptr || m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) return luaL_error( L, " Unknown Machine") ; + // verifica "Main" e "Double" + if ( ! EqualNoCase( sMain, MCH_CL) && ! EqualNoCase( sMain, MCH_DBL)) + return luaL_error( L, ( " Error in EmtAddClimb : " + sMain).c_str()) ; // recupero l'operazione Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; // elimino le risalite (ultimi movimenti "RISE" dell'ultimo percorso della lavorazione) diff --git a/Operation.cpp b/Operation.cpp index 5feeadf..225aea7 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -3418,7 +3418,8 @@ Operation::AdjustStartEndMovementsStd( bool bVerifyPreviousLink) //---------------------------------------------------------------------------- bool -Operation::MoveHeadFromHomeToMach( bool bCurrMain, const string& sToolName, const string& sHeadName, int nExitNbr, int nStartZMax) +Operation::MoveHeadFromHomeToMach( bool bCurrMain, const string& sToolName, const string& sHeadName, int nExitNbr, int nStartZMax, + int nOtherLinkType) { // verifico gestore delle lavorazioni e operazione if ( m_pMchMgr == nullptr) @@ -3433,7 +3434,7 @@ Operation::MoveHeadFromHomeToMach( bool bCurrMain, const string& sToolName, cons if ( ! AdjustOneStartEndMovement( GetFirstFullToolpath( bCurrMain), GDB_ID_NULL, nullptr, vAxVal, 0, true)) return false ; // eseguo collegamento speciale - if ( ! ManageSpecialLink( nullptr, GDB_ID_NULL, false, this, GDB_ID_NULL, bCurrMain, nStartZMax)) + if ( ! ManageSpecialLink( nullptr, GDB_ID_NULL, false, this, GDB_ID_NULL, bCurrMain, nStartZMax, nOtherLinkType)) return false ; // riporto l'utensile corrente come originale @@ -3448,7 +3449,7 @@ bool Operation::MoveHeadFromMachToMach( Operation* pPrevOpe, bool bPrevMain, const string& sPrevToolName, const string& sPrevHeadName, int nPrevExitNbr, bool bCurrMain, const string& sCurrToolName, const string& sCurrHeadName, int nCurrExitNbr, - bool bToolChangeNeeded, int nStartZMax) + bool bToolChangeNeeded, int nStartZMax, int nOtherLinkType, int nOtherLinkType1) { // verifico gestore delle lavorazioni e operazione precedente if ( m_pMchMgr == nullptr || pPrevOpe == nullptr) @@ -3474,7 +3475,7 @@ Operation::MoveHeadFromMachToMach( Operation* pPrevOpe, if ( ! AdjustOneStartEndMovement( GetFirstFullToolpath( bCurrMain), GDB_ID_NULL, pPrevOpe, vAxVal, dPrevOffsX, false)) return false ; // gestione collegamento speciale - if ( ! ManageSpecialLink( pPrevOpe, GDB_ID_NULL, bPrevMain, this, GDB_ID_NULL, bCurrMain, nStartZMax)) + if ( ! ManageSpecialLink( pPrevOpe, GDB_ID_NULL, bPrevMain, this, GDB_ID_NULL, bCurrMain, nStartZMax, nOtherLinkType)) return false ; } @@ -3482,12 +3483,12 @@ Operation::MoveHeadFromMachToMach( Operation* pPrevOpe, else { // imposto la lavorazione precedente come corrente ed effettuo collegamento m_pMchMgr->SetCurrMachining( pPrevOpe->GetOwner()) ; - if ( ! MoveHeadFromMachToHome( pPrevOpe, bPrevMain, sPrevToolName, sPrevHeadName, nPrevExitNbr, nStartZMax)) + if ( ! MoveHeadFromMachToHome( pPrevOpe, bPrevMain, sPrevToolName, sPrevHeadName, nPrevExitNbr, nStartZMax, nOtherLinkType)) return false ; // ripristino la lavorazione corrente ed effettuo collegamento m_pMchMgr->SetCurrMachining( GetOwner()) ; - if ( ! MoveHeadFromHomeToMach( bCurrMain, sCurrToolName, sCurrHeadName, nCurrExitNbr, nStartZMax)) + if ( ! MoveHeadFromHomeToMach( bCurrMain, sCurrToolName, sCurrHeadName, nCurrExitNbr, nStartZMax, nOtherLinkType1)) return false ; } @@ -3501,7 +3502,7 @@ Operation::MoveHeadFromMachToMach( Operation* pPrevOpe, //---------------------------------------------------------------------------- bool Operation::MoveHeadFromMachToHome( Operation* pPrevOpe, bool bPrevMain, const string& sPrevToolName, const string& sPrevHeadName, int nPrevExitNbr, - int nStartZMax) + int nStartZMax, int nOtherLinkType) { // verifico gestore delle lavorazioni e operazione precedente if ( m_pMchMgr == nullptr || pPrevOpe == nullptr) @@ -3517,7 +3518,7 @@ Operation::MoveHeadFromMachToHome( Operation* pPrevOpe, bool bPrevMain, const st return false ; } // eventuale rilascio utensile speciale di lavorazione precedente - if ( ! pPrevOpe->ManageSpecialLink( pPrevOpe, GDB_ID_NULL, bPrevMain, nullptr, GDB_ID_NULL, false, nStartZMax)) + if ( ! pPrevOpe->ManageSpecialLink( pPrevOpe, GDB_ID_NULL, bPrevMain, nullptr, GDB_ID_NULL, false, nStartZMax, nOtherLinkType)) return false ; // riporto l'utensile corrente come originale @@ -3565,10 +3566,10 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) if ( sPrevTool.empty() || NeedPrevHome()) { // -->! la lavorazione corrente è per forza in doppio !<-- // Dalla sua posizione di Home porto la Testa Main sul percorso Main corrente - if ( ! MoveHeadFromHomeToMach( true, GetToolName(), GetHeadName(), GetExitNbr(), nStartZMax)) + if ( ! MoveHeadFromHomeToMach( true, GetToolName(), GetHeadName(), GetExitNbr(), nStartZMax, LINK_HOME_TO_MACH)) return false ; // Dalla sua posizione di Home porto da Testa Double sul percorso Double corrente - if ( ! MoveHeadFromHomeToMach( false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, nStartZMax)) + if ( ! MoveHeadFromHomeToMach( false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, nStartZMax, LINK_HOME_TO_MACH)) return false ; } else { @@ -3579,10 +3580,11 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) if ( ! ToolChangeNeeded( *pPrevOpe, true, *this, true) && nStartZMax == 0) { // Come prima cosa sposto la testa Main della prima lavorazione sul percorso Main della lavorazione corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, - true, GetToolName(), GetHeadName(), GetExitNbr(), false, nStartZMax)) + true, GetToolName(), GetHeadName(), GetExitNbr(), false, nStartZMax, + LINK_HOME_TO_MACH, LINK_NULL)) return false ; // Successivamente porto la testa Double dalla sua Home alla lavorazione corrente ( in doppio) sul percorso - if ( ! MoveHeadFromHomeToMach( false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, nStartZMax)) + if ( ! MoveHeadFromHomeToMach( false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, nStartZMax, LINK_MACH_TO_MACH)) return false ; } // -->! 2) Verifico se l'unico utensile della lavorazione precedente ( in quanto singola) è compatibile @@ -3590,10 +3592,11 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) else if ( ! ToolChangeNeeded( *pPrevOpe, true, *this, false) && nStartZMax == 0) { // Come prima cosa sposto la testa Main della lavorazione precedente sul percorso Double della lavorazione corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, - false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, false, nStartZMax)) + false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, false, nStartZMax, + LINK_HOME_TO_MACH, LINK_NULL)) return false ; // Successivamente porto la testa Main dalla sua Home alla lavorazione corrente ( in doppio) sul percorso - if ( ! MoveHeadFromHomeToMach( true, GetToolName(), GetHeadName(), GetExitNbr(), nStartZMax)) + if ( ! MoveHeadFromHomeToMach( true, GetToolName(), GetHeadName(), GetExitNbr(), nStartZMax, LINK_MACH_TO_MACH)) return false ; } // -->! 3) In questo caso l'unico utensile della lavorazione precedente ( in quanto singola) non è compatibile @@ -3601,10 +3604,11 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) else { // Porto la Testa Main sul percorso Main corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, - true, GetToolName(), GetHeadName(), GetExitNbr(), true, nStartZMax)) + true, GetToolName(), GetHeadName(), GetExitNbr(), true, nStartZMax, + LINK_NULL, LINK_HOME_TO_MACH)) return false ; // Dalla sua posizione di Home porto da Testa Double sul percorso Double corrente - if ( ! MoveHeadFromHomeToMach( false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, nStartZMax)) + if ( ! MoveHeadFromHomeToMach( false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, nStartZMax, LINK_HOME_TO_MACH)) return false ; } } @@ -3614,33 +3618,36 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) // con l'Utensile presente sul percorso Main della lavorazione corrente ( in quanto singola) !<-- if ( ! ToolChangeNeeded( *pPrevOpe, true, *this, true) && nStartZMax == 0) { // Come prima cosa sposto la testa Double della lavorazione precedente ( in doppio) in Home - if ( ! MoveHeadFromMachToHome( pPrevOpe, false, sPrevDblTool, sPrevDblHead, nPrevDblExitNbr, nStartZMax)) + if ( ! MoveHeadFromMachToHome( pPrevOpe, false, sPrevDblTool, sPrevDblHead, nPrevDblExitNbr, nStartZMax, LINK_MACH_TO_MACH)) return false ; // Sposto al testa Main della lavorazione precedente sul percorso Main corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, - true, GetToolName(), GetHeadName(), GetExitNbr(), false, nStartZMax)) + true, GetToolName(), GetHeadName(), GetExitNbr(), false, nStartZMax, + LINK_MACH_TO_HOME, LINK_NULL)) return false ; } // -->! 2) Verifico se l'utensile secondario della lavorazione precedente ( in doppio) è compatibile // con l'Utensile presente sul percorso Double della lavorazione corrente ( in quanto singola) !<-- else if ( ! ToolChangeNeeded( *pPrevOpe, false, *this, true) && nStartZMax == 0) { // Come prima cosa sposto la testa Main della lavorazione precedente ( in doppio) in Home - if ( ! MoveHeadFromMachToHome( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, nStartZMax)) + if ( ! MoveHeadFromMachToHome( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, nStartZMax, LINK_MACH_TO_MACH)) return false ; // Sposto al testa Double della lavorazione precedente sul percorso corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, false, sPrevDblTool, sPrevDblHead, nPrevDblExitNbr, - true, GetToolName(), GetHeadName(), GetExitNbr(), false, nStartZMax)) + true, GetToolName(), GetHeadName(), GetExitNbr(), false, nStartZMax, + LINK_MACH_TO_HOME, LINK_NULL)) return false ; } // -->! 3) In questo caso l'unico utensile della lavorazione corrente ( in quanto singola) non è compatibile // con nessun utensile della lavorazione precedente ( in doppio) !<-- else { // Come prima cosa sposto la testa Double della lavorazione precedente ( in doppio) in Home - if ( ! MoveHeadFromMachToHome( pPrevOpe, false, sPrevDblTool, sPrevDblHead, nPrevDblExitNbr, nStartZMax)) + if ( ! MoveHeadFromMachToHome( pPrevOpe, false, sPrevDblTool, sPrevDblHead, nPrevDblExitNbr, nStartZMax, LINK_MACH_TO_HOME)) return false ; // Sposto la testa Main della lavorazione precedente sul percorso corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, - true, GetToolName(), GetHeadName(), GetExitNbr(), true, nStartZMax)) + true, GetToolName(), GetHeadName(), GetExitNbr(), true, nStartZMax, + LINK_MACH_TO_HOME, LINK_NULL)) return false ; } } @@ -3650,22 +3657,26 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) if ( ! ToolChangeNeeded( *pPrevOpe, true, *this, true) && ! ToolChangeNeeded( *pPrevOpe, false, *this, false) && nStartZMax == 0) { // Porto la testa Main dalla lavorazione precedente alla lavorazione corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, - true, GetToolName(), GetHeadName(), GetExitNbr(), false, nStartZMax)) + true, GetToolName(), GetHeadName(), GetExitNbr(), false, nStartZMax, + LINK_MACH_TO_MACH, LINK_NULL)) return false ; // Porto la testa double delle lavorazione precedente alla lavorazine corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, false, sPrevDblTool, sPrevDblHead, nPrevDblExitNbr, - false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, false, nStartZMax)) + false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, false, nStartZMax, + LINK_MACH_TO_MACH, LINK_NULL)) return false ; } // -->! 2) Per tutto il resto porto sempre in Home per sicurezza passando da una lavorazione all'altra !<-- else { // Porto la testa Main dalla lavorazione precedente alla lavorazione corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, true, sPrevTool, sPrevHead, nPrevExitNbr, - true, GetToolName(), GetHeadName(), GetExitNbr(), true, nStartZMax)) + true, GetToolName(), GetHeadName(), GetExitNbr(), true, nStartZMax, + LINK_MACH_TO_HOME, LINK_HOME_TO_MACH)) return false ; // Porto la testa Double delle lavorazione precedente alla lavorazine corrente if ( ! MoveHeadFromMachToMach( pPrevOpe, false, sPrevDblTool, sPrevDblHead, nPrevDblExitNbr, - false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, true, nStartZMax)) + false, sCurrDblTool, sCurrDblHead, nCurrDblExitNbr, true, nStartZMax, + LINK_MACH_TO_HOME, LINK_HOME_TO_MACH)) return false ; } } @@ -3684,7 +3695,7 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) DBLVECTOR vAxVal ; bOk = bOk && GetClPathFinalAxesValues( nPrevCLPathId, false, vAxVal) ; bOk = bOk && AdjustOneStartEndMovement( nCLPathId, nPrevCLPathId, nullptr, vAxVal, 0, false) ; - bOk = bOk && ManageSpecialLink( this, nPrevCLPathId, true, this, nCLPathId, true, nStartZMax) ; + bOk = bOk && ManageSpecialLink( this, nPrevCLPathId, true, this, nCLPathId, true, nStartZMax, LINK_NULL) ; // passo al successivo nPrevCLPathId = nCLPathId ; nCLPathId = GetNextFullToolpath( nCLPathId) ; @@ -3716,13 +3727,13 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) // Utensile Main bOk = bOk && GetClPathFinalAxesValues( nPrevCLPathId, false, vAxVal) ; bOk = bOk && AdjustOneStartEndMovement( nCLPathId, nPrevCLPathId, nullptr, vAxVal, 0, false) ; - bOk = bOk && ManageSpecialLink( this, nPrevCLPathId, true, this, nCLPathId, true, nStartZMax) ; + bOk = bOk && ManageSpecialLink( this, nPrevCLPathId, true, this, nCLPathId, true, nStartZMax, LINK_MACH_TO_HOME) ; // Utensile Double DBLVECTOR vAxDblVal ; bOk = bOk && m_pMchMgr->SetCalcTool( sCurrDblTool, sCurrDblHead, nCurrDblExitNbr) ; bOk = bOk && GetClPathFinalAxesValues( nPrevDBLPathId, false, vAxDblVal) ; bOk = bOk && AdjustOneStartEndMovement( nDBLPathId, nPrevDBLPathId, nullptr, vAxDblVal, 0, false) ; - bOk = bOk && ManageSpecialLink( this, nPrevDBLPathId, false, this, nDBLPathId, false, nStartZMax) ; + bOk = bOk && ManageSpecialLink( this, nPrevDBLPathId, false, this, nDBLPathId, false, nStartZMax, LINK_MACH_TO_HOME) ; bOk = bOk && m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()) ; // passo al successivo nPrevCLPathId = nCLPathId ; @@ -3735,12 +3746,12 @@ Operation::ManageDoubleOperNew( Operation* pPrevOpe) // per utensile Main DBLVECTOR vAxVal ; bOk = bOk && AddRise( vAxVal) ; - bOk = bOk && ManageSpecialLink( this, GDB_ID_NULL, true, nullptr, GDB_ID_NULL, true, 0) ; + bOk = bOk && ManageSpecialLink( this, GDB_ID_NULL, true, nullptr, GDB_ID_NULL, true, 0, LINK_NULL) ; // per utensile Double DBLVECTOR vAxDblVal ; bOk = bOk && m_pMchMgr->SetCalcTool( sCurrDblTool, sCurrDblHead, nCurrDblExitNbr) ; bOk = bOk && AddRise( vAxDblVal, NAN, GDB_ID_NULL, false) ; - bOk = bOk && ManageSpecialLink( this, GDB_ID_NULL, false, nullptr, GDB_ID_NULL, false, 0) ; + bOk = bOk && ManageSpecialLink( this, GDB_ID_NULL, false, nullptr, GDB_ID_NULL, false, 0, LINK_NULL) ; bOk = bOk && m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr()) ; // -->! se ultima operazione o la successiva lo richiede, vado in Home !<-- int nNextOpId = m_pMchMgr->GetNextActiveOperation( m_nOwnerId) ; @@ -3907,7 +3918,7 @@ Operation::AdjustStartEndMovementsNew( void) //---------------------------------------------------------------------------- bool Operation::ManageSpecialLink( Operation* pPrevOpe, int nPrevClPathId, bool bPrevMain, Operation* pNextOpe, int nNextClPathId, bool bNextMain, - int nStartZmax) + int nStartZmax, int nOtherLinkType) { // controlli if ( pPrevOpe == nullptr && pNextOpe == nullptr) @@ -3950,7 +3961,7 @@ Operation::ManageSpecialLink( Operation* pPrevOpe, int nPrevClPathId, bool bPrev return false ; // chiamo funzione script OnSpecialRapidMove per avere posizioni di movimento - bool bOk = SpecialLink( vNeatAxSta, vNeatAxEnd, nLinkType, pPrevOpe, bPrevMain, pNextOpe, bNextMain, nStartZmax) ; + bool bOk = SpecialLink( vNeatAxSta, vNeatAxEnd, nLinkType, pPrevOpe, bPrevMain, pNextOpe, bNextMain, nStartZmax, nOtherLinkType) ; // in caso di errore eseguo inserimento con segnalazione di errore if ( ! bOk) { @@ -5941,23 +5952,24 @@ Operation::SpecialMoveRapid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, bool Operation::SpecialLink( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nLinkType, const Operation* pPrevOpe, bool bPrevMain, const Operation* pNextOpe, bool bNextMain, - int nStartZMax) + int nStartZMax, int nOtherLinkType) { // 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_PREVMCHID = ".PREVMCHID" ; // IN (int) identificativo lavorazione precedente - static const string EVAR_PREVPHASE = ".PREVPHASE" ; // IN (int) indice fase della lavorazione precedente - static const string EVAR_PREVMAIN = ".PREVMAIN" ; // IN (bool) flag lavorazione principale o double 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_NEXTMAIN = ".NEXTMAIN" ; // IN (bool) flag lavorazione principale o double successiva - static const string EVAR_STARTZMAX = ".STARTZMAX" ; // IN (int) identificativo StartZMax - 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 EMC_VAR = "EMC" ; // tabella variabili locali per calcolo + 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_PREVMAIN = ".PREVMAIN" ; // IN (bool) flag lavorazione principale o double 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_NEXTMAIN = ".NEXTMAIN" ; // IN (bool) flag lavorazione principale o double successiva + static const string EVAR_STARTZMAX = ".STARTZMAX" ; // IN (int) identificativo StartZMax + static const string EVAR_LINKTYPE = ".LINKTYPE" ; // IN (int) codice tipo collegamento (1=Inizio, 2=Fine, 3=FinePrec+InizioSucc) + static const string EVAR_OTHERLINKTYPE = ".OTHERLINKTYPE" ; // IN (int) codice tipo collegamento per altra lavorazione (0=Non Presente, 1=Inizio, 2=Fine, 3=FinePrec+InizioSucc) + static const string EVAR_ERROR = ".ERR" ; // OUT (int) codice di errore ( 0 = ok) static const string ON_SPECIAL_LINK = "OnSpecialLink" ; // se la funzione non è definita, esco @@ -5982,14 +5994,18 @@ Operation::SpecialLink( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_EXIT, nExitNbr) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_TCPOS, sTcPos) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PREVMCHID, ( pPrevOpe != nullptr ? pPrevOpe->GetOwner() : GDB_ID_NULL)) ; - bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PREVMAIN, ( bPrevMain ? MCH_CL : MCH_DBL)) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_PREVMAIN, ( pPrevOpe != nullptr ? ( bPrevMain ? MCH_CL : MCH_DBL) : MCH_HOME)) ; 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 + EVAR_NEXTMAIN, ( bNextMain ? MCH_CL : MCH_DBL)) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_NEXTMAIN, ( pNextOpe != nullptr ? ( bNextMain ? MCH_CL : MCH_DBL) : MCH_HOME)) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_STARTZMAX, nStartZMax) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_PHASE, m_nPhase) ; bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_LINKTYPE, nLinkType) ; + if ( nOtherLinkType == LINK_NULL) + bOk = bOk && pMch->LuaResetGlobVar( EMC_VAR + EVAR_OTHERLINKTYPE) ; + else + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + EVAR_OTHERLINKTYPE, nOtherLinkType) ; // valore degli assi bool bIsRobot = m_pMchMgr->GetCurrIsRobot() ; int nNumAxes = ssize( vAxStart) ; diff --git a/Operation.h b/Operation.h index 0197aa1..eb3aa8d 100644 --- a/Operation.h +++ b/Operation.h @@ -240,16 +240,17 @@ class Operation : public IUserObj bool AdjustStartEndMovementsStd( bool bVerifyPreviousLink) ; bool AdjustOneStartEndMovement( int nClPathId, int nPrevClPathId, Operation* pPrevOpe, const DBLVECTOR& vAxPrev, double dPrevOffsX, bool bMaxZ) ; bool AdjustStartEndMovementsNew( void) ; - bool MoveHeadFromHomeToMach( bool bMain, const std::string& sToolName, const std::string& sHeadName, int nExitNbr, int nStartZMax) ; + bool MoveHeadFromHomeToMach( bool bMain, const std::string& sToolName, const std::string& sHeadName, int nExitNbr, int nStartZMax, + int nOtherLinkType) ; bool MoveHeadFromMachToMach( Operation* pPrevOpe, bool bPrevMain, const std::string& sPrevToolName, const std::string& sPrevHeadName, int nPrevExitNbr, bool bCurrMain, const std::string& sCurrToolName, const std::string& sCurrHeadName, int nCurrExitNbr, - bool bToolChange, int nStartZMax) ; + bool bToolChange, int nStartZMax, int nOtherLinkType, int nOtherLinkType1) ; bool MoveHeadFromMachToHome( Operation* pPrevOpe, bool bCurrMain, const std::string& sCurrToolName, const std::string& sCurrHeadName, int nCurrExitNbr, - int nStartZMax) ; + int nStartZMax, int nOtherLinkType) ; bool ManageDoubleOperNew( Operation* pPrevOpe) ; bool ManageSpecialLink( Operation* pPrevOpe, int nPrevClPathId, bool bPrevMain, Operation* pNextOpe, int nNextClPathId, bool bNextMain, - int nStartZMax) ; + int nStartZMax, int nOtherLinkType = LINK_NULL) ; bool ToolChangeNeeded( const Operation& Ope1, bool bMain1, const Operation& Ope2, bool bMain2) const ; bool AddSpecialClimb( const DBLVECTOR& vAxVal, bool bOk = true, int nClPathId = GDB_ID_NULL, bool bMain = true, int nFlag = 0, int nFlag2 = 0, int nMask = -1, const std::string& sInfo = "", bool bFirst = true) ; @@ -278,7 +279,7 @@ class Operation : public IUserObj 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, bool bPrevMain, const Operation* pNextOpe, bool bNextMain, - int nStartZMax) ; + int nStartZMax, int nOtherLinkType = LINK_NULL) ; bool SpecialPrevMachiningOffset( const Operation* pPrevOpe, double& dOffsetX) ; protected :