diff --git a/Machine.h b/Machine.h index 378942f..999195e 100644 --- a/Machine.h +++ b/Machine.h @@ -368,9 +368,15 @@ class Machine static int LuaEmtAddRapidMove( lua_State* L) ; static int LuaEmtAddLinearMove( lua_State* L) ; static int LuaEmtAddArcMove( lua_State* L) ; + static int LuaEmtAddClimb( lua_State* L) ; + static int LuaEmtRemoveClimb( lua_State* L) ; + static int LuaEmtAddRise( lua_State* L) ; + static int LuaEmtRemoveRise( lua_State* L) ; static int LuaEmtGetMoveType( lua_State* L) ; static int LuaEmtGetAxesPos( lua_State* L) ; static int LuaEmtGetBackAuxDir( lua_State* L) ; + static int LuaEmtGetInitialAxesPos( lua_State* L) ; + static int LuaEmtGetFinalAxesPos( lua_State* L) ; static int LuaEmtLinkRawPartToGroup( lua_State* L) ; static int LuaEmtGetAllLinkedRawParts( lua_State* L) ; static int LuaEmtUnlinkRawPartFromGroup( lua_State* L) ; diff --git a/MachineLua.cpp b/MachineLua.cpp index ce09098..80f4fc9 100644 --- a/MachineLua.cpp +++ b/MachineLua.cpp @@ -121,6 +121,12 @@ Machine::LuaInit( const string& sMachineName) m_LuaMgr.RegisterFunction( "EmtAddRapidMove", Machine::LuaEmtAddRapidMove) ; m_LuaMgr.RegisterFunction( "EmtAddLinearMove", Machine::LuaEmtAddLinearMove) ; m_LuaMgr.RegisterFunction( "EmtAddArcMove", Machine::LuaEmtAddArcMove) ; + m_LuaMgr.RegisterFunction( "EmtAddClimb", Machine::LuaEmtAddClimb) ; + m_LuaMgr.RegisterFunction( "EmtRemoveClimb", Machine::LuaEmtRemoveClimb) ; + m_LuaMgr.RegisterFunction( "EmtAddRise", Machine::LuaEmtAddRise) ; + m_LuaMgr.RegisterFunction( "EmtRemoveRise", Machine::LuaEmtRemoveRise) ; + m_LuaMgr.RegisterFunction( "EmtGetInitialAxesPos", Machine::LuaEmtGetInitialAxesPos) ; + m_LuaMgr.RegisterFunction( "EmtGetFinalAxesPos", Machine::LuaEmtGetFinalAxesPos) ; // registro le funzioni di lettura entità CL per lua m_LuaMgr.RegisterFunction( "EmtGetMoveType", Machine::LuaEmtGetMoveType) ; m_LuaMgr.RegisterFunction( "EmtGetAxesPos", Machine::LuaEmtGetAxesPos) ; diff --git a/MachineLuaCL.cpp b/MachineLuaCL.cpp index fca5e18..5e7c61e 100644 --- a/MachineLuaCL.cpp +++ b/MachineLuaCL.cpp @@ -16,6 +16,7 @@ #include "MachMgr.h" #include "DllMain.h" #include "CamData.h" +#include "Operation.h" #include "/EgtDev/Include/EXeExecutor.h" #include "/EgtDev/Include/EGkGeoPoint3d.h" #include "/EgtDev/Include/EGkCurveLine.h" @@ -276,6 +277,164 @@ Machine::LuaEmtAddArcMove( lua_State* L) return 1 ; } +//---------------------------------------------------------------------------- +int +Machine::LuaEmtAddClimb( lua_State* L) +{ + // 5 o 6 parametri : nMachId, vAxVal, nMask, nFlag, nFlag2 [, sInfo] + int nMachId ; + LuaCheckParam( L, 1, nMachId) + DBLVECTOR vAxVal ; + LuaCheckParam( L, 2, vAxVal) + int nMask ; + LuaCheckParam( L, 3, nMask) + int nFlag ; + LuaCheckParam( L, 4, nFlag) + int nFlag2 ; + LuaCheckParam( L, 5, nFlag2) + string sInfo = "" ; + LuaGetParam( L, 6, sInfo) ; + LuaClearStack( L) ; + // verifico ci sia una macchina attiva valida + if ( m_pMchLua == nullptr || + m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) + return luaL_error( L, " Unknown Machine") ; + // recupero l'operazione + Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; + // imposto la discesa (primo movimento del primo percorso della lavorazione) + bool bOk = ( pOper != nullptr && pOper->AddSpecialClimb( vAxVal, ( nMask >= 0), GDB_ID_NULL, nFlag, nFlag2, nMask, sInfo)) ; + LuaSetParam( L, bOk) ; + + return 1 ; +} + +//---------------------------------------------------------------------------- +int +Machine::LuaEmtRemoveClimb( lua_State* L) +{ + // 1 parametro : nMachId + int nMachId ; + LuaCheckParam( L, 1, nMachId) + LuaClearStack( L) ; + // verifico ci sia una macchina attiva valida + if ( m_pMchLua == nullptr || + m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) + return luaL_error( L, " Unknown Machine") ; + // recupero l'operazione + Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; + // elimino le discese (primi movimenti "CLIMB" del primo percorso della lavorazione) + bool bOk = ( pOper != nullptr && pOper->RemoveClimb()) ; + LuaSetParam( L, bOk) ; + + return 1 ; +} + +//---------------------------------------------------------------------------- +int +Machine::LuaEmtAddRise( lua_State* L) +{ + // 5 o 6 parametri : nMachId, vAxVal, nMask, nFlag, nFlag2 [, sInfo] + int nMachId ; + LuaCheckParam( L, 1, nMachId) + DBLVECTOR vAxVal ; + LuaCheckParam( L, 2, vAxVal) + int nMask ; + LuaCheckParam( L, 3, nMask) + int nFlag ; + LuaCheckParam( L, 4, nFlag) + int nFlag2 ; + LuaCheckParam( L, 5, nFlag2) + string sInfo = "" ; + LuaGetParam( L, 6, sInfo) ; + LuaClearStack( L) ; + // verifico ci sia una macchina attiva valida + if ( m_pMchLua == nullptr || + m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) + return luaL_error( L, " Unknown Machine") ; + // recupero l'operazione + Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; + // aggiungo la risalita (ultimo movimento dell'ultimo percorso della lavorazione) + bool bOk = ( pOper != nullptr && pOper->AddSpecialRise( vAxVal, ( nMask >= 0), GDB_ID_NULL, nFlag, nFlag2, nMask, sInfo)) ; + LuaSetParam( L, bOk) ; + + return 1 ; +} + +//---------------------------------------------------------------------------- +int +Machine::LuaEmtRemoveRise( lua_State* L) +{ + // 1 parametro : nMachId + int nMachId ; + LuaCheckParam( L, 1, nMachId) + LuaClearStack( L) ; + // verifico ci sia una macchina attiva valida + if ( m_pMchLua == nullptr || + m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) + return luaL_error( L, " Unknown Machine") ; + // recupero l'operazione + Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; + // elimino le risalite (ultimi movimenti "RISE" dell'ultimo percorso della lavorazione) + bool bOk = ( pOper != nullptr && pOper->RemoveRise()) ; + LuaSetParam( L, bOk) ; + + return 1 ; +} + +//---------------------------------------------------------------------------- +int +Machine::LuaEmtGetInitialAxesPos( lua_State* L) +{ + // 1 o 2 parametri : nMachId [, bSkipClimb] + int nMachId ; + LuaCheckParam( L, 1, nMachId) + bool bSkipClimb = true ; + LuaGetParam( L, 2, bSkipClimb) ; + LuaClearStack( L) ; + // verifico ci sia una macchina attiva valida + if ( m_pMchLua == nullptr || + m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) + return luaL_error( L, " Unknown Machine") ; + // recupero l'operazione + Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; + // acquisico il valore iniziale degli assi macchina + DBLVECTOR vAxesVal ; + bool bOk = ( pOper != nullptr && pOper->GetInitialAxesValues( bSkipClimb, vAxesVal)) ; + if ( bOk) + LuaSetParam( L, vAxesVal) ; + else + LuaSetParam( L) ; + + return 1 ; +} + +//---------------------------------------------------------------------------- +int +Machine::LuaEmtGetFinalAxesPos( lua_State* L) +{ + // 1 o 2 parametri : nMachId [, bSkipRise] + int nMachId ; + LuaCheckParam( L, 1, nMachId) + bool bSkipRise = true ; + LuaGetParam( L, 2, bSkipRise) ; + LuaClearStack( L) ; + // verifico ci sia una macchina attiva valida + if ( m_pMchLua == nullptr || + m_pMchLua->m_pMchMgr == nullptr || m_pMchLua->m_pGeomDB == nullptr) + return luaL_error( L, " Unknown Machine") ; + // recupero l'operazione + Operation* pOper = GetOperation( m_pMchLua->m_pGeomDB->GetUserObj( nMachId)) ; + // acquisico il valore finale degli assi macchina + DBLVECTOR vAxesVal ; + bool bOk = ( pOper != nullptr && pOper->GetFinalAxesValues( bSkipRise, vAxesVal)) ; + if ( bOk) + LuaSetParam( L, vAxesVal) ; + else + LuaSetParam( L) ; + + return 1 ; +} + //---------------------------------------------------------------------------- int Machine::LuaEmtGetMoveType( lua_State* L) diff --git a/Machining.cpp b/Machining.cpp index dca2462..cb07441 100644 --- a/Machining.cpp +++ b/Machining.cpp @@ -431,7 +431,7 @@ Machining::ActivateDrillingUnit( int nHeadId, const INTVECTOR& vActExit) const //---------------------------------------------------------------------------- bool -Machining::PostApply( string& sErr) +Machining::PostApply( bool& bLinkOk, string& sErr) { // recupero la macchina corrente Machine* pMch = m_pMchMgr->GetCurrMachine() ; @@ -439,10 +439,11 @@ Machining::PostApply( string& sErr) return false ; // costanti 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_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 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" ; // se non esiste la funzione, esco @@ -456,10 +457,12 @@ Machining::PostApply( 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 d00259c..01f8b88 100644 --- a/Machining.h +++ b/Machining.h @@ -57,7 +57,9 @@ class Machining : public Operation protected : Machining( void) ; - bool PostApply( std::string& sErr) ; + bool PostApply( std::string& sErr) + { bool bLinkOk = true ; return PostApply( bLinkOk, sErr) ; } + bool PostApply( bool& bLinkOk, std::string& sErr) ; private : int GetToolPreviewNext( int nEntId, int nParentId, int nStId) const ; diff --git a/Milling.cpp b/Milling.cpp index f75fb58..c3a7bd5 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -909,22 +909,16 @@ Milling::Update( bool bPostApply) return false ; } - // gestione movimenti all'inizio di ogni singolo percorso di lavorazione e alla fine della 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 ; - } - // 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()) ; + // esecuzione eventuali personalizzazioni string sErr ; - if ( bPostApply && ! PostApply( sErr)) { + if ( bPostApply && ! PostApply( bLinkOk, sErr) && bLinkOk) { if ( ! IsEmptyOrSpaces( sErr)) m_pMchMgr->SetLastError( 2321, sErr) ; else @@ -932,6 +926,15 @@ 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/Operation.cpp b/Operation.cpp index f5b30c3..6f667b4 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -3622,6 +3622,16 @@ Operation::AddSpecialClimb( const DBLVECTOR& vAxVal, bool bOk, int nClPathId, pCam->SetFeed( 0) ; pCam->SetFlag( nFlag) ; pCam->SetFlag2( nFlag2) ; + // calcolo e assegno dati derivati + DBLVECTOR vAng( next( vAxVal.begin(), 3), vAxVal.end()) ; + Vector3d vtTool ; + m_pMchMgr->GetCalcToolDirFromAngles( vAng, vtTool) ; + pCam->SetToolDir( vtTool) ; + if ( ! pCam->GetAuxDir().IsSmall()) { + Vector3d vtAux ; + m_pMchMgr->GetCalcAuxDirFromAngles( vAng, vtAux) ; + pCam->SetAuxDir( vtAux) ; + } // associo questo oggetto a quello geometrico m_pGeomDB->SetUserObj( nId, Release( pCam)) ; // inserzione eventuali info @@ -3880,6 +3890,16 @@ Operation::AddSpecialRise( const DBLVECTOR& vAxVal, bool bOk, int nClPathId, pCam->SetFeed( 0) ; pCam->SetFlag( nFlag) ; pCam->SetFlag2( nFlag2) ; + // calcolo e assegno dati derivati + DBLVECTOR vAng( next( vAxVal.begin(), 3), vAxVal.end()) ; + Vector3d vtTool ; + m_pMchMgr->GetCalcToolDirFromAngles( vAng, vtTool) ; + pCam->SetToolDir( vtTool) ; + if ( ! pCam->GetAuxDir().IsSmall()) { + Vector3d vtAux ; + m_pMchMgr->GetCalcAuxDirFromAngles( vAng, vtAux) ; + pCam->SetAuxDir( vtAux) ; + } // associo questo oggetto a quello geometrico m_pGeomDB->SetUserObj( nId, Release( pCam)) ; // inserzione eventuali info diff --git a/Operation.h b/Operation.h index 82d7092..4b73b15 100644 --- a/Operation.h +++ b/Operation.h @@ -30,6 +30,8 @@ class ICurveComposite ; //---------------------------------------------------------------------------- class Operation : public IUserObj { + friend class Machine ; + public : // IUserObj bool SetOwner( int nId, IGeomDB* pGDB) override ; int GetOwner( void) const override ;