EgtMachKernel 1.9a2 :

- migliorie a simulazione per Vmill con pezzi che si muovono.
This commit is contained in:
Dario Sassi
2018-01-19 08:32:30 +00:00
parent 61431b34d8
commit 2e170521c0
4 changed files with 39 additions and 27 deletions
BIN
View File
Binary file not shown.
+11 -8
View File
@@ -1061,18 +1061,21 @@ Machine::GetNoseFromPositions( double dX, double dY, double dZ, const DBLVECTOR&
Point3d& ptNose) const
{
// la posizione deve essere espressa rispetto allo ZERO MACCHINA
// è espressa nel riferimento di macchina (tiene conto delle sole rotazioni di testa)
// è espressa nel riferimento di macchina (tiene conto delle sole traslazioni e rotazioni di testa)
// aggiorno posizione testa a riposo mediante ciclo inverso sugli assi di testa
Point3d ptPosH = m_ptCalcPos ;
// aggiorno posizione testa a riposo mediante ciclo inverso sugli assi rotanti di testa
ptNose = m_ptCalcPos ;
for ( size_t i = m_vCalcRotAx.size() ; i >= 1 ; -- i) {
// se asse di testa
if ( m_vCalcRotAx[i-1].bHead) {
ptPosH.Rotate( m_vCalcRotAx[i-1].ptPos, m_vCalcRotAx[i-1].vtDir, vAng[i-1]) ;
}
if ( m_vCalcRotAx[i-1].bHead)
ptNose.Rotate( m_vCalcRotAx[i-1].ptPos, m_vCalcRotAx[i-1].vtDir, vAng[i-1]) ;
}
// aggiorno posizione testa con assi lineari di testa
DBLVECTOR vMov( {dX, dY, dZ}) ;
for ( size_t i = 1 ; i <= m_vCalcLinAx.size() ; ++ i) {
if ( m_vCalcLinAx[i-1].bHead)
ptNose += m_vCalcLinAx[i-1].vtDir * vMov[i-1] ;
}
ptNose.Set( dX + ptPosH.x, dY + ptPosH.y, dZ + ptPosH.z) ;
return true ;
}
+26 -18
View File
@@ -829,9 +829,9 @@ Simulator::ManageMove( int& nStatus)
else
m_dCoeff = 1 ;
// Posizione e direzione attuali dell'utensile (per Vmill)
Point3d ptNoseI ; Vector3d vtDirI ;
bool bOkI = GetHeadCurrPosDir( ptNoseI, vtDirI) ;
// Posizione e direzione attuali dell'utensile e riferimento attuale del pezzo (per Vmill)
Point3d ptNoseI ; Vector3d vtDirI ; Frame3d frVzmI ;
bool bOkI = GetHeadCurrPosDir( ptNoseI, vtDirI) && m_pGeomDB->GetGlobFrame( m_nVmId, frVzmI) ;
// Eseguo movimento rapido o lineare
if ( nMoveType != 2 && nMoveType != 3) {
@@ -842,9 +842,9 @@ Simulator::ManageMove( int& nStatus)
}
// eseguo eventuale Vmill
if ( m_nVmId != GDB_ID_NULL) {
Point3d ptNoseF ; Vector3d vtDirF ;
bool bOkF = GetHeadCurrPosDir( ptNoseF, vtDirF) ;
ExecVmillOnLine( ptNoseI, vtDirI, ptNoseF, vtDirF) ;
Point3d ptNoseF ; Vector3d vtDirF ; Frame3d frVzmF ;
bool bOkF = GetHeadCurrPosDir( ptNoseF, vtDirF) && m_pGeomDB->GetGlobFrame( m_nVmId, frVzmF) ; ;
ExecVmillOnLine( ptNoseI, vtDirI, frVzmI, ptNoseF, vtDirF, frVzmF) ;
}
}
// Eseguo movimento su arco
@@ -859,25 +859,30 @@ Simulator::ManageMove( int& nStatus)
vtRot.Rotate( vtN, dPrevCoeff * dAngCen) ;
// approssimo movimento con 1 o più step a seconda ci sia Vmill
int nStep = 1 ;
const double ANG_STEP = 5.0 ;
if ( m_nVmId != GDB_ID_NULL)
nStep = int( max( abs( dDiffAng) / 15.0, 1.)) ;
nStep = int( max( abs( dDiffAng) / ANG_STEP, 1.)) ;
for ( int i = 1 ; i <= nStep ; ++ i) {
double dCurrCoeff = dPrevCoeff + ( m_dCoeff - dPrevCoeff) / nStep * i ;
// assi lineari
vtRot.Rotate( vtN, dDiffAng / nStep) ;
m_pMachine->SetAxisPos( m_AxesName[0], ptCen.x + vtRot.x + dCurrCoeff * dDeltaN * vtN.x) ;
m_pMachine->SetAxisPos( m_AxesName[1], ptCen.y + vtRot.y + dCurrCoeff * dDeltaN * vtN.y) ;
m_pMachine->SetAxisPos( m_AxesName[2], ptCen.z + vtRot.z + dCurrCoeff * dDeltaN * vtN.z) ;
// assi rotanti
for ( size_t j = 3 ; j < m_AxesName.size() ; ++ j) {
double dVal = m_AxesVal[j] * ( 1 - dCurrCoeff) + AxesEnd[j] * dCurrCoeff ;
m_pMachine->SetAxisPos( m_AxesName[j], dVal) ;
}
// eseguo eventuale Vmill
if ( m_nVmId != GDB_ID_NULL) {
Point3d ptNoseF ; Vector3d vtDirF ;
bool bOkF = GetHeadCurrPosDir( ptNoseF, vtDirF) ;
ExecVmillOnLine( ptNoseI, vtDirI, ptNoseF, vtDirF) ;
Point3d ptNoseF ; Vector3d vtDirF ; Frame3d frVzmF ;
bool bOkF = GetHeadCurrPosDir( ptNoseF, vtDirF) && m_pGeomDB->GetGlobFrame( m_nVmId, frVzmF) ;
ExecVmillOnLine( ptNoseI, vtDirI, frVzmI, ptNoseF, vtDirF, frVzmF) ;
// aggiorno prossimo inizio
ptNoseI = ptNoseF ;
vtDirI = vtDirF ;
frVzmI = frVzmF ;
}
}
}
@@ -950,19 +955,18 @@ Simulator::GetHeadCurrPosDir( Point3d& ptH, Vector3d& vtH)
//----------------------------------------------------------------------------
bool
Simulator::ExecVmillOnLine( const Point3d& ptHi, const Vector3d& vtHi, const Point3d& ptHf, const Vector3d& vtHf)
Simulator::ExecVmillOnLine( const Point3d& ptHi, const Vector3d& vtHi, const Frame3d& frVzmI,
const Point3d& ptHf, const Vector3d& vtHf, const Frame3d& frVzmF)
{
// Recupero Zmap
IVolZmap* pVZM = GetVolZmap( m_pGeomDB->GetGeoObj( m_nVmId)) ;
if ( pVZM == nullptr)
return false ;
// Porto gli estremi nel riferimento dello Zmap
Frame3d frVZM ;
m_pGeomDB->GetGlobFrame( m_nVmId, frVZM) ;
Point3d ptHiL = ptHi ; ptHiL.ToLoc( frVZM) ;
Vector3d vtHiL = vtHi ; vtHiL.ToLoc( frVZM) ;
Point3d ptHfL = ptHf ; ptHfL.ToLoc( frVZM) ;
Vector3d vtHfL = vtHf ; vtHfL.ToLoc( frVZM) ;
// Porto gli estremi nel riferimento opportuno dello Zmap
Point3d ptHiL = ptHi ; ptHiL.ToLoc( frVzmI) ;
Vector3d vtHiL = vtHi ; vtHiL.ToLoc( frVzmI) ;
Point3d ptHfL = ptHf ; ptHfL.ToLoc( frVzmF) ;
Vector3d vtHfL = vtHf ; vtHfL.ToLoc( frVzmF) ;
// Eseguo
return pVZM->MillingStep( ptHiL, vtHiL, ptHfL, vtHfL) ;
}
@@ -1016,6 +1020,10 @@ Simulator::OnDispositionStart( int nOpId, int nOpInd, int nPhase,
return true ;
// chiamo la funzione di inizio disposizione
bOk = bOk && m_pMachine->LuaCallFunction( ON_SIMUL_DISPOSITION_START) ;
// recupero i dati di ritorno
int nVmId = GDB_ID_NULL ;
m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_VMILL, nVmId) ;
m_nVmId = nVmId ;
// forzo aggiornamento posizione assi (possono essere stati mossi nello script)
UpdateAxesPos() ;
return bOk ;
+2 -1
View File
@@ -54,7 +54,8 @@ class Simulator
bool ManagePathEndAux( int& nStatus) ;
bool ManageMove( int& nStatus) ;
bool GetHeadCurrPosDir( Point3d& ptH, Vector3d& vtH) ;
bool ExecVmillOnLine( const Point3d& ptHi, const Vector3d& vtHi, const Point3d& ptHf, const Vector3d& vtHf) ;
bool ExecVmillOnLine( const Point3d& ptHi, const Vector3d& vtHi, const Frame3d& frVzmI,
const Point3d& ptHf, const Vector3d& vtHf, const Frame3d& frVzmF) ;
bool OnDispositionStarting( int nOpId, int nOpInd, int nPhase,
const std::string& sTable, const Point3d& ptOri1, bool bEmpty, bool bSomeByHand) ;
bool OnDispositionStart( int nOpId, int nOpInd, int nPhase,