diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 0a241a2..07bfb1b 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/MachineCalc.cpp b/MachineCalc.cpp index cdd0043..0476073 100644 --- a/MachineCalc.cpp +++ b/MachineCalc.cpp @@ -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 ; } diff --git a/Simulator.cpp b/Simulator.cpp index 6aa539a..c76235c 100644 --- a/Simulator.cpp +++ b/Simulator.cpp @@ -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 ; diff --git a/Simulator.h b/Simulator.h index ecdc4a6..5b3f2c7 100644 --- a/Simulator.h +++ b/Simulator.h @@ -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,