EgtMachKernel 3.1c7 :

- esportata VerifyOutstroke con angoli da vettore di double
- resa più robusta GetCalcAngles che restituisce due soli assi rotanti (ora i primi due)
- nelle GetCalcAngles ora si applicano gli assi bloccati impostati tramite SetBlockedRotAxis
- consentiti fino a 4 assi rotanti nelle catene cinematiche dei centri di lavoro.
This commit is contained in:
Dario Sassi
2026-03-25 16:42:53 +01:00
parent 8fed51ca79
commit b6ef052c50
5 changed files with 75 additions and 23 deletions
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -378,6 +378,7 @@ class MachMgr : public IMachMgr
bool GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const override ;
bool LimitAngleToStroke( int nInd, double& dAng) const override ;
bool VerifyOutstroke( double dX, double dY, double dZ, double dAngA, double dAngB, int& nStat) const override ;
bool VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool bClear, int& nStat) const override ;
std::string GetOutstrokeInfo( bool bMM = true) const override ;
// Machine
int GetBaseId( const std::string& sBase) const override ;
@@ -486,7 +487,6 @@ class MachMgr : public IMachMgr
bool GetCalcMaxDeltaR2OnFirst( void) const ;
bool GetCalcPartDirFromAngles( const Vector3d& vtPart, const DBLVECTOR& vAng, Vector3d& vtDir) const ;
bool VerifyAngleOutstroke( int nInd, double dAng) const ;
bool VerifyOutstroke( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool bClear, int& nStat) const ;
bool ExistProtectedAreas( void) const ;
// Operations
bool GetOperationNewName( std::string& sName) const ;
+14 -2
View File
@@ -775,8 +775,19 @@ bool
MachMgr::GetCalcAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
int& nStat, double& dAngA1, double& dAngB1, double& dAngA2, double& dAngB2) const
{
Machine* pMch = GetCurrMachine() ;
return ( ( pMch != nullptr) ? pMch->GetAngles( vtDirT, vtDirA, nStat, dAngA1, dAngB1, dAngA2, dAngB2) : false) ;
nStat = 0 ; dAngA1 = 0 ; dAngB1 = 0 ; dAngA2 = 0 ; dAngB2 = 0 ;
DBLVECTOR vAng1, vAng2 ;
if ( ! GetCalcAngles( vtDirT, vtDirA, nStat, vAng1, vAng2))
return false ;
if ( vAng1.size() >= 1) {
dAngA1 = vAng1[0] ;
dAngA2 = vAng2[0] ;
if ( vAng1.size() >= 2) {
dAngB1 = vAng1[1] ;
dAngB2 = vAng2[1] ;
}
}
return true ;
}
//----------------------------------------------------------------------------
@@ -784,6 +795,7 @@ bool
MachMgr::GetCalcAngles( const Vector3d& vtDirT, const Vector3d& vtDirA,
int& nStat, DBLVECTOR& vAng1, DBLVECTOR& vAng2) const
{
const_cast<MachMgr*>(this)->ApplyRotAxisBlock() ;
Machine* pMch = GetCurrMachine() ;
return ( ( pMch != nullptr) ? pMch->GetAngles( vtDirT, vtDirA, nStat, vAng1, vAng2) : false) ;
}
+29 -2
View File
@@ -742,9 +742,36 @@ Machine::CalculateKinematicChain( void)
}
}
}
// se più di 3
// se 4 va bene ( due dovranno poi avere valore assegnato)
else if ( m_vCalcRotAx.size() == 4) {
int n2ndHeadRotAx = - 1 ;
// se tutti e quattro di testa, devo invertire il primo con il quarto e il secondo con il terzo
if ( m_vCalcRotAx[0].bHead && m_vCalcRotAx[1].bHead && m_vCalcRotAx[2].bHead && m_vCalcRotAx[3].bHead) {
swap( m_vCalcRotAx[0], m_vCalcRotAx[3]) ;
swap( m_vCalcRotAx[1], m_vCalcRotAx[2]) ;
n2ndHeadRotAx = 1 ;
}
// se altrimenti ultimi tre di testa, devo invertire il secondo con il quarto
else if ( m_vCalcRotAx[1].bHead && m_vCalcRotAx[2].bHead && m_vCalcRotAx[3].bHead) {
swap( m_vCalcRotAx[1], m_vCalcRotAx[3]) ;
n2ndHeadRotAx = 2 ;
}
// se altrimenti ultimi due di testa, devo invertirne l'ordine
else if ( m_vCalcRotAx[2].bHead && m_vCalcRotAx[3].bHead) {
swap( m_vCalcRotAx[2], m_vCalcRotAx[3]) ;
n2ndHeadRotAx = 3 ;
}
// impongo limiti di corsa sul secondo asse rotante di testa
if ( n2ndHeadRotAx > 0) {
Head* pHead = GetHead( m_nCalcHeadId) ;
if ( pHead != nullptr) {
m_vCalcRotAx[n2ndHeadRotAx].stroke.Min = max( m_vCalcRotAx[n2ndHeadRotAx].stroke.Min, pHead->GetRot2Stroke().Min) ;
m_vCalcRotAx[n2ndHeadRotAx].stroke.Max = min( m_vCalcRotAx[n2ndHeadRotAx].stroke.Max, pHead->GetRot2Stroke().Max) ;
}
}
}
// altrimenti più di 4 non ancora gestito, quindi errore
else {
// altrimenti non ancora gestito, quindi errore
LOG_ERROR( GetEMkLogger(), "Rotary Axes not manageable")
return false ;
}
+31 -18
View File
@@ -1737,29 +1737,42 @@ Operation::SetBlockedRotAxis( const string& sBlockedAxis, bool bToolSetOk) const
// se non ci sono bloccaggi, esco
if ( sBlockedAxis.empty())
return true ;
// recupero token/nome asse e valore
string sKey, sVal ;
Split( sBlockedAxis, "=", true, sKey, sVal) ;
if ( sKey.empty() || sVal.empty())
return true ;
double dVal = 0 ;
if ( ! FromString( sVal, dVal))
return true ;
// recupero numero assi lineari e rotanti correnti
int nLinAxes = m_pMchMgr->GetCurrLinAxes() ;
int nRotAxes = m_pMchMgr->GetCurrRotAxes() ;
// lo cerco tra i token degli assi rotanti correnti
for ( int i = 0 ; i < nRotAxes ; ++ i) {
string sAxToken ;
if ( m_pMchMgr->GetCurrMachine()->GetCurrAxisToken( i + nLinAxes, sAxToken) &&
sKey == Trim( sAxToken, " \t\r\n=")) {
string sAxis ;
m_pMchMgr->GetCurrMachine()->GetCurrAxisName( i + nLinAxes, sAxis) ;
return m_pMchMgr->SetRotAxisBlock( sAxis, dVal) ;
// possono essere bloccati più assi, divido la stringa sui ";"
STRVECTOR vsAxBlock ;
Tokenize( sBlockedAxis, ";", vsAxBlock) ;
// ciclo sui diversi bloccaggi
bool bOk = true ;
for ( const string& sAxBlock : vsAxBlock) {
// recupero token/nome asse e valore
string sKey, sVal ;
Split( sAxBlock, "=", true, sKey, sVal) ;
if ( sKey.empty() || sVal.empty())
continue ;
double dVal = 0 ;
if ( ! FromString( sVal, dVal))
continue ;
// lo cerco tra i token degli assi rotanti correnti
bool bFound = false ;
for ( int i = 0 ; i < nRotAxes ; ++ i) {
string sAxToken ;
if ( m_pMchMgr->GetCurrMachine()->GetCurrAxisToken( i + nLinAxes, sAxToken) &&
sKey == Trim( sAxToken, " \t\r\n=")) {
string sAxis ;
m_pMchMgr->GetCurrMachine()->GetCurrAxisName( i + nLinAxes, sAxis) ;
if ( ! m_pMchMgr->SetRotAxisBlock( sAxis, dVal))
bOk = false ;
bFound = true ;
break ;
}
}
// lo cerco tra gli assi rotanti della macchina
if ( ! bFound && ! m_pMchMgr->SetRotAxisBlock( sKey, dVal))
bOk = false ;
}
// lo cerco tra gli assi rotanti della macchina
return m_pMchMgr->SetRotAxisBlock( sKey, dVal) ;
return bOk ;
}
//----------------------------------------------------------------------------