EgtMachKernel :

- inserite diverse modalità di movimento assi nei link tra lavorazioni, per ora impostato sempre tutti interpolati tra loro.
This commit is contained in:
Dario Sassi
2024-08-07 14:28:14 +02:00
parent 114c13d781
commit b1d0f10b55
2 changed files with 56 additions and 17 deletions
+48 -15
View File
@@ -4042,24 +4042,32 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
// Verifica standard
bool bCollAvoid ;
int nHeadOrder = 0 ;
if ( nHeadOrder == 0) {
bCollAvoid = OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxEnd, pMch, vRawId, vFxtId) ;
}
else {
DBLVECTOR vAxMid( int( vAxName.size())) ;
// ciclo sugli assi correnti, assegno opportunamente valori a seconda del tipo (testa o tavola)
for ( int i = 0 ; i < int( vAxName.size()) ; ++ i) {
bool bLinear, bHead ; pMch->GetCurrAxisType( i, bLinear, bHead) ;
if ( nHeadOrder == -1)
vAxMid[i] = ( bHead ? vAxEnd[i] : vAxStart[i]) ;
else if ( nHeadOrder == +1) {
vAxMid[i] = ( bHead ? vAxStart[i] : vAxEnd[i]) ;
}
}
int nLinkAxisOrder = LKAO_INTERP ;
// se ordine stabilito tra gli assi di tavola e testa (LKAO_HEAD_BEFORE(-1)=prima testa, LKAO_HEAD_AFTER(+1)=dopo testa)
if ( nLinkAxisOrder == LKAO_HEAD_BEFORE || nLinkAxisOrder == LKAO_HEAD_AFTER) {
// assegno il valore degli assi nella posizione intermedia opportuna
DBLVECTOR vAxMid ;
GetAxisMidForTestCollisionAvoid( vAxStart, vAxEnd, nLinkAxisOrder, pMch, vAxMid) ;
// eseguo i test
bCollAvoid = OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxMid, pMch, vRawId, vFxtId) &&
OneMoveTestCollisionAvoid( vAxName, vAxMid, vAxEnd, pMch, vRawId, vFxtId) ;
}
// se verifico entrambi gli ordini degli assi di tavola e testa LKAO_HEAD_BOTH(11)
else if ( nLinkAxisOrder == LKAO_HEAD_BOTH) {
// assegno il valore degli assi nelle posizioni intermedie
DBLVECTOR vAxMidB, vAxMidA ;
GetAxisMidForTestCollisionAvoid( vAxStart, vAxEnd, LKAO_HEAD_BEFORE, pMch, vAxMidB) ;
GetAxisMidForTestCollisionAvoid( vAxStart, vAxEnd, LKAO_HEAD_AFTER, pMch, vAxMidA) ;
// eseguo i test
bCollAvoid = OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxMidB, pMch, vRawId, vFxtId) &&
OneMoveTestCollisionAvoid( vAxName, vAxMidB, vAxEnd, pMch, vRawId, vFxtId) &&
OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxMidA, pMch, vRawId, vFxtId) &&
OneMoveTestCollisionAvoid( vAxName, vAxMidA, vAxEnd, pMch, vRawId, vFxtId) ;
}
// altrimenti interpolo tutti gli assi tra loro LKAO_INTERP(0)
else {
bCollAvoid = OneMoveTestCollisionAvoid( vAxName, vAxStart, vAxEnd, pMch, vRawId, vFxtId) ;
}
// Ripristino lo stato macchina
ResetMachine( pMch) ;
@@ -4067,6 +4075,31 @@ Operation::TestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEn
return bCollAvoid ;
}
//----------------------------------------------------------------------------
bool
Operation::GetAxisMidForTestCollisionAvoid( const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd, int nAxisOrder, Machine* pMch,
DBLVECTOR& vAxMid) const
{
// reset del risultato
vAxMid.clear() ;
// verifico che i vettori degli assi abbiano la stessa dimensione e che la macchina sia definita
if ( vAxStart.size() != vAxEnd.size() || pMch == nullptr)
return false ;
// assegno dimensione al risultato
vAxMid.resize( vAxStart.size()) ;
// ciclo sugli assi correnti, assegno opportunamente valori a seconda del tipo (testa o tavola)
for ( int i = 0 ; i < int( vAxStart.size()) ; ++ i) {
bool bLinear, bHead ; pMch->GetCurrAxisType( i, bLinear, bHead) ;
if ( nAxisOrder == -1)
vAxMid[i] = ( bHead ? vAxEnd[i] : vAxStart[i]) ;
else if ( nAxisOrder == +1) {
vAxMid[i] = ( bHead ? vAxStart[i] : vAxEnd[i]) ;
}
}
// tutto bene
return true ;
}
//----------------------------------------------------------------------------
bool
Operation::OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR& vAxStart, const DBLVECTOR& vAxEnd,