diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index a9594c9..0118598 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Operation.cpp b/Operation.cpp index a1f92df..9096b5a 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -3306,6 +3306,23 @@ Operation::GetZHomeDown( void) const return bZHomeDown ; } +//---------------------------------------------------------------------------- +static bool +ResetMachine( Machine* pMch) +{ + // macchina non definita + if ( pMch == nullptr) + return false ; + // Riporto la macchina in home + pMch->ResetAllAxesPos() ; + // Sgancio pezzi, grezzi e sottopezzi dalla tavola corrente + pMch->UnlinkAllPartsFromGroups() ; + pMch->UnlinkAllRawPartsFromGroups() ; + pMch->UnlinkAllFixturesFromGroups() ; + // tutto bene + return true ; +} + //---------------------------------------------------------------------------- bool Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const @@ -3349,6 +3366,14 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn // Parti di testa e collegati da considerare per la collisione INTVECTOR vCollId ; pMch->GetCurrHeadCollGroups( vCollId) ; + + // Lancio la verifica custom + int nRes = SpecialTestCollisionAvoid( vAxStart, vAxEnd) ; + if ( nRes != SCAV_TOTEST) { + ResetMachine( pMch) ; + return ( nRes == SCAV_AVOID) ; + } + // distanza di sicurezza const double TOL_SAFEDIST = 5.0 ; const double MIN_SAFEDIST = 5.0 ; @@ -3504,16 +3529,65 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn } } } - // Riporto la macchina in home - pMch->ResetAllAxesPos() ; - // Sgancio pezzi, grezzi e sottopezzi dalla tavola corrente - pMch->UnlinkAllPartsFromGroups() ; - pMch->UnlinkAllRawPartsFromGroups() ; - pMch->UnlinkAllFixturesFromGroups() ; + // Ripristino lo stato macchina + ResetMachine( pMch) ; return ( ! bCollide) ; } +//---------------------------------------------------------------------------- +int +Operation::SpecialTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const +{ + // recupero la macchina corrente + Machine* pMch = ( m_pMchMgr != nullptr ? m_pMchMgr->GetCurrMachine() : nullptr) ; + if ( pMch == nullptr) + return false ; + + // assi già verificati + + // 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_RES = ".RES" ; // OUT (int) risultato (0=collide, 1=evita, 2=fare test standard) + static const string ON_SPECIAL_TESTCOLLISIONAVOID = "OnSpecialTestCollisionAvoid" ; + + // verifico definizione funzione + if ( ! pMch->LuaExistsFunction( ON_SPECIAL_TESTCOLLISIONAVOID)) + return SCAV_TOTEST ; + + // avvio + 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()) ; + bOk = bOk && pMch->LuaSetGlobVar( EMC_VAR + GVAR_MCHID, GetOwner()) ; + // valori degli assi + for ( int i = 1 ; i <= int( vAxStart.size()) ; ++ i) + bOk = bOk && pMch->LuaSetGlobVar( GetGlobVarAxisPrev( i, EMC_VAR), vAxStart[i-1]) ; + for ( int i = 1 ; i <= int( vAxEnd.size()) ; ++ i) + bOk = bOk && pMch->LuaSetGlobVar( GetGlobVarAxisValue( i, EMC_VAR), vAxEnd[i-1]) ; + // eseguo + bOk = bOk && pMch->LuaCallFunction( ON_SPECIAL_TESTCOLLISIONAVOID, false) ; + // recupero valori parametri obbligatori + bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_ERROR, nErr) ; + int nRes = SCAV_TOTEST ; + bOk = bOk && pMch->LuaGetGlobVar( EMC_VAR + EVAR_RES, nRes) ; + // reset + bOk = bOk && pMch->LuaResetGlobVar( EMC_VAR) ; + // segnalo errori + if ( nErr != 0) { + bOk = false ; + string sOut = " Error in " + ON_SPECIAL_TESTCOLLISIONAVOID + " (" + ToString( nErr) + ")" ; + LOG_ERROR( GetEMkLogger(), sOut.c_str()) + } + return ( nErr != 0 ? SCAV_ERROR : nRes) ; +} + //---------------------------------------------------------------------------- bool Operation::SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) diff --git a/Operation.h b/Operation.h index 282f161..bb8dc25 100644 --- a/Operation.h +++ b/Operation.h @@ -153,7 +153,8 @@ class Operation : public IUserObj int GetUserNotesZmax( void) const ; bool GetZHomeDown( void) const ; bool TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd) const ; - bool SpecialMoveZup( DBLVECTOR& vAx, Vector3d& vtTool, int& nFlag, int& nFlag2, bool& bModif) ; + 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, DBLVECTOR& vAxNew, bool& bModif) ; bool GetAggrBottomData( const std::string& sHead, AggrBottom& agbData) const ; @@ -219,3 +220,5 @@ inline Operation* GetOperation( IUserObj* pUserObj) enum { TOOL_PARAL = 1, TOOL_ORTHO = 2, TOOL_ORTUP = 3, TOOL_PAR_SLANT= 4} ; // tipo di utilizzo contorno faccia enum { FACE_DOWN = 1, FACE_TOP = 2, FACE_FRONT = 3, FACE_BACK = 4, FACE_LEFT = 5, FACE_RIGHT = 6, FACE_CONT = 7} ; +// risultato di SpecialTestCollisionAvoid +enum { SCAV_ERROR = -1, SCAV_COLLIDE = 0, SCAV_AVOID = 1, SCAV_TOTEST = 2};