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:
Binary file not shown.
@@ -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
@@ -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
@@ -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
@@ -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 ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user