EgtMachKernel 2.5l6 :

- aggiunta gestione script opzionale OnSpecialTestCollisionAvoid per avere un test custom di verifica collisione nei movimenti link tra le lavorazioni.
This commit is contained in:
Dario Sassi
2024-01-15 15:06:50 +01:00
parent 73ba4eb93a
commit bd448babd9
3 changed files with 84 additions and 7 deletions
BIN
View File
Binary file not shown.
+80 -6
View File
@@ -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)
+4 -1
View File
@@ -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};