EgtMachKernel 1.6w4 :

- migliorie varie per gestire tre assi rotanti
- aggiunta a MachMgr funzione GetAxisToken.
This commit is contained in:
Dario Sassi
2016-11-16 18:47:13 +00:00
parent fbda2e5945
commit a369920354
7 changed files with 60 additions and 24 deletions
+19 -10
View File
@@ -828,7 +828,7 @@ Machine::GetPositions( const Point3d& ptP, double dAngA, double dAngB,
//----------------------------------------------------------------------------
bool
Machine::GetPositions( const Point3d& ptP, DBLVECTOR vAng,
Machine::GetPositions( const Point3d& ptP, const DBLVECTOR& vAng,
int& nStat, double& dX, double& dY, double& dZ) const
{
// la posizione deve essere espressa rispetto allo ZERO MACCHINA
@@ -881,7 +881,7 @@ Machine::GetPositions( const Point3d& ptP, DBLVECTOR vAng,
//----------------------------------------------------------------------------
bool
Machine::GetHeadOffsetDelta( DBLVECTOR vAng,
Machine::GetHeadOffsetDelta( const DBLVECTOR& vAng,
double& dRecX, double& dRecY, double& dRecZ) const
{
// ovviamente tutto è espresso nel riferimento ZERO MACCHINA
@@ -917,20 +917,29 @@ Machine::GetHeadOffsetDelta( DBLVECTOR vAng,
//----------------------------------------------------------------------------
bool
Machine::GetDirection( const Vector3d& vtDir, double dAngA, double dAngB, Vector3d& vtNew) const
Machine::GetDirection( const Vector3d& vtDir, const DBLVECTOR& vAng, Vector3d& vtNew) const
{
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa)
// direzione a riposo
vtNew = vtDir ;
// se c'è terzo asse rotante di testa
if ( m_vCalcRotAx.size() >= 3 && m_vCalcRotAx[2].bHead) {
// posizione e direzione secondo asse rotante
Point3d ptAx3 = m_vCalcRotAx[2].ptPos ;
Vector3d vtAx3 = m_vCalcRotAx[2].vtDir ;
// ruoto dati a riposo
vtNew.Rotate( vtAx3, vAng[2]) ;
}
// se c'è secondo asse rotante di testa
if ( m_vCalcRotAx.size() >= 2 && m_vCalcRotAx[1].bHead) {
// posizione e direzione primo asse rotante
// posizione e direzione secondo asse rotante
Point3d ptAx2 = m_vCalcRotAx[1].ptPos ;
Vector3d vtAx2 = m_vCalcRotAx[1].vtDir ;
// ruoto dati a riposo
vtNew.Rotate( vtAx2, dAngB) ;
vtNew.Rotate( vtAx2, vAng[1]) ;
}
// se c'è primo asse rotante di testa
@@ -939,14 +948,14 @@ Machine::GetDirection( const Vector3d& vtDir, double dAngA, double dAngB, Vector
Point3d ptAx1 = m_vCalcRotAx[0].ptPos ;
Vector3d vtAx1 = m_vCalcRotAx[0].vtDir ;
// ruoto dati a riposo
vtNew.Rotate( vtAx1, dAngA) ;
vtNew.Rotate( vtAx1, vAng[0]) ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
Machine::GetTipFromPositions( double dX, double dY, double dZ, double dAngA, double dAngB,
Machine::GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng,
bool bOverall, bool bBottom, Point3d& ptTip) const
{
// la posizione deve essere espressa rispetto allo ZERO MACCHINA
@@ -954,7 +963,6 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, double dAngA, dou
// Calcoli recuperi della testa e lunghezza utensile per orientamento
double dRecX, dRecY, dRecZ ;
DBLVECTOR vAng( 2) ; vAng[0] = dAngA ; vAng[1] = dAngB ;
if ( ! GetHeadOffsetDelta( vAng, dRecX, dRecY, dRecZ))
return false ;
ptTip.Set( dX - dRecX, dY - dRecY, dZ - dRecZ) ;
@@ -963,7 +971,7 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, double dAngA, dou
if ( bOverall || bBottom) {
// calcolo la direzione fresa
Vector3d vtDirT ;
if ( ! GetDirection( m_vtCalcDir, dAngA, dAngB, vtDirT))
if ( ! GetDirection( m_vtCalcDir, vAng, vtDirT))
return false ;
// se richiesto ingombro totale
if ( bOverall)
@@ -987,7 +995,8 @@ Machine::GetTipFromPositions( double dX, double dY, double dZ, double dAngA, dou
bool
Machine::GetToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const
{
return GetDirection( m_vtCalcDir, dAngA, dAngB, vtDir) ;
DBLVECTOR vAng( 2) ; vAng[0] = dAngA ; vAng[1] = dAngB ;
return GetDirection( m_vtCalcDir, vAng, vtDir) ;
}
//----------------------------------------------------------------------------