EgtMachKernel 1.6n8 :

- gestione tagli con lama esterno e interno archi per marmo.
This commit is contained in:
Dario Sassi
2016-02-28 18:44:06 +00:00
parent 50948663f7
commit c0de1755be
18 changed files with 1672 additions and 140 deletions
+29 -12
View File
@@ -1,13 +1,13 @@
//----------------------------------------------------------------------------
// EgalTech 2015-2015
// EgalTech 2015-2016
//----------------------------------------------------------------------------
// File : Simulator.cpp Data : 19.10.15 Versione : 1.6j2
// File : Simulator.cpp Data : 26.02.16 Versione : 1.6n8
// Contenuto : Implementazione della classe Simulator.
//
//
//
// Modifiche : 19.10.15 DS Creazione modulo.
//
// 26.02.16 DS Aggiunta gestione archi.
//
//----------------------------------------------------------------------------
@@ -173,7 +173,7 @@ Simulator::Move( int& nStatus)
case CamData::AS_OK :
break ;
case CamData::AS_OUTSTROKE : {
DBLVECTOR OutAxes = pCamData->GetAxisVal() ;
DBLVECTOR OutAxes = pCamData->GetAxesVal() ;
for ( size_t i = OutAxes.size() ; i < 5 ; ++ i)
OutAxes.emplace_back( 0) ;
int nStat ;
@@ -187,9 +187,9 @@ Simulator::Move( int& nStatus)
nStatus = MCH_SIM_ERR ;
return false ;
}
const DBLVECTOR& AxesEnd = pCamData->GetAxisVal() ;
// Verifico se movimento in rapido
bool bRapid = ( pCamData->GetFeed() < EPS_SMALL) ;
const DBLVECTOR& AxesEnd = pCamData->GetAxesVal() ;
// Tipo di movimento
int nMoveType = pCamData->GetMoveType() ;
// Calcolo distanza di movimento
double dSqDist = 0 ;
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
@@ -198,13 +198,30 @@ Simulator::Move( int& nStatus)
dSqDist += dSqCoeff * ( AxesEnd[i] - m_AxesVal[i]) * ( AxesEnd[i] - m_AxesVal[i]) ;
}
double dDist = sqrt( dSqDist) ;
m_dCoeff += ( bRapid ? 4 : 1) * m_dStep / dDist ;
m_dCoeff += ( nMoveType == 0 ? 4 : 1) * m_dStep / dDist ;
if ( m_dCoeff > 1)
m_dCoeff = 1 ;
// Eseguo movimento
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ;
m_pMchMgr->SetAxisPos( m_AxesName[i], dVal) ;
// Eseguo movimento rapido o lineare
if ( nMoveType != 2 && nMoveType != 3) {
for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) {
double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ;
m_pMchMgr->SetAxisPos( m_AxesName[i], dVal) ;
}
}
// Eseguo movimento su arco (per ora sempre nel piano XY)
else {
// primi due assi lineari
Point3d ptCen = pCamData->GetAxesCen() ;
double dAngCen = pCamData->GetAxesAngCen() ;
Vector3d vtCurr = Point3d( m_AxesVal[0], m_AxesVal[1], ptCen.z) - ptCen ;
vtCurr.Rotate( Z_AX, m_dCoeff * dAngCen) ;
m_pMchMgr->SetAxisPos( m_AxesName[0], ptCen.x + vtCurr.x) ;
m_pMchMgr->SetAxisPos( m_AxesName[1], ptCen.y + vtCurr.y) ;
// altri assi
for ( size_t i = 2 ; i < m_AxesName.size() ; ++ i) {
double dVal = m_AxesVal[i] * ( 1 - m_dCoeff) + AxesEnd[i] * m_dCoeff ;
m_pMchMgr->SetAxisPos( m_AxesName[i], dVal) ;
}
}
// Se arrivato a fine interpolazione movimento, salvo posizioni e segnalo