diff --git a/SimulatorMP.cpp b/SimulatorMP.cpp index 9e7d595..854bf7c 100644 --- a/SimulatorMP.cpp +++ b/SimulatorMP.cpp @@ -358,7 +358,7 @@ SimulatorMP::Move( int& nStatus) // Se arrivato alla fine dell'interpolazione if ( m_dCoeff > COEFF_LIM) { - // recupero una nuova entità + // recupero una nuova entità m_nEntId = m_pGeomDB->GetNext( m_nEntId) ; m_dCoeff = 0 ; } @@ -546,7 +546,7 @@ SimulatorMP::SetUiStatus( int nUiStatus) bool SimulatorMP::GoHome( void) { - // controllo validità stato + // controllo validità stato if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr || m_pMachine == nullptr) return false ; // reset visualizzazione collisioni @@ -586,9 +586,9 @@ SimulatorMP::UpdateMachiningTool( bool bFirst, int& nChangeTool, int& nErr) // ripristino l'utensile corrente m_pMchMgr->TdbSetCurrTool( m_sTool) ; } - // verifico se cambierà + // verifico se cambierà bool bDiffTool = ( sTool != m_sTool) ; - // se cambierà ed esiste il corrente, lo scarico + // se cambierà ed esiste il corrente, lo scarico if ( bDiffTool && ! m_sTool.empty() && nChangeTool == 0) { // eventuale lancio script per scarico utensile int nCurrErr ; @@ -652,7 +652,7 @@ SimulatorMP::UpdateDispositionTool( bool bFirst, int& nErr) // Recupero i dati string sTool ; string sHead ; int nExit ; string sTcPos ; pDisp->GetToolData( sTool, sHead, nExit, sTcPos) ; - // se esiste utensile corrente e cambierà, lo scarico + // se esiste utensile corrente e cambierà, lo scarico if ( ! m_sTool.empty() && sTool != m_sTool) { // eventuale lancio script per scarico utensile int nCurrErr ; @@ -822,7 +822,7 @@ SimulatorMP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nChange // se disposizione con cambio di fase Disposition* pDisp = GetDisposition( m_pGeomDB->GetUserObj( m_nOpId)) ; if ( pDisp != nullptr) { - // in alcuni casi la disposizione non è inizializzata + // in alcuni casi la disposizione non è inizializzata pDisp->Init( m_pMchMgr) ; // recupero dati tavola string sTable ; @@ -877,7 +877,7 @@ SimulatorMP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nChange nStatus = CalcStatusOnError( ERR_NONE) ; return false ; } - // se non è inizio, aggiorno visualizzazione e breve pausa (200 ms) + // se non è inizio, aggiorno visualizzazione e breve pausa (200 ms) if ( nPhase != 1) { ExeDraw() ; Sleep( 200) ; @@ -897,15 +897,15 @@ bool SimulatorMP::ManageOperationEnd( int& nStatus) { bool bOk = false ; - // non c'è operazione in corso (solo prima disposizione senza lavorazioni) + // non c'è operazione in corso (solo prima disposizione senza lavorazioni) if ( m_nOpId == GDB_ID_NULL) bOk = true ; - // se altrimenti è una lavorazione + // se altrimenti è una lavorazione else if ( GetMachining( m_pGeomDB->GetUserObj( m_nOpId)) != nullptr) { // richiamo gestione evento fine lavorazione bOk = OnMachiningEnd() ; } - // se altrimenti è una disposizione + // se altrimenti è una disposizione else if ( GetDisposition( m_pGeomDB->GetUserObj( m_nOpId)) != nullptr) { // richiamo gestione evento fine disposizione bOk = OnDispositionEnd() ; @@ -943,7 +943,7 @@ SimulatorMP::FindAndManagePathStart( int& nStatus) m_dCoeff = 0 ; } } - // se trovato nuovo CLpath con entità, gestisco inizio percorso di lavoro + // se trovato nuovo CLpath con entità, gestisco inizio percorso di lavoro if ( m_nEntId != GDB_ID_NULL) { ++ m_nCLPathInd ; // recupero punti di inizio e fine percorso @@ -1065,9 +1065,9 @@ SimulatorMP::ManageMove( int& nStatus) if ( ! ManageSingleMove( nStatus, dMove)) return false ; dCurrMove += dMove ; - // se modalità play e fine entità e non raggiunta la lunghezza di movimento voluto + // se modalità play e fine entità e non raggiunta la lunghezza di movimento voluto if ( m_nUiStatus == MCH_UISIM_PLAY && nStatus == MCH_SIM_END_STEP && dCurrMove < 0.75 * m_dStep) { - // recupero una nuova entità + // recupero una nuova entità m_nEntId = m_pGeomDB->GetNext( m_nEntId) ; m_dCoeff = 0 ; } @@ -1111,7 +1111,7 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) DBLVECTOR AxesEnd = pCamData->GetAxesVal() ; // Tipo di movimento int nMoveType = pCamData->GetMoveType() ; - // Se inizio di nuova entità, mascheratura movimento + // Se inizio di nuova entità, mascheratura movimento if ( m_nEntId != GDB_ID_NULL && m_dCoeff < EPS_ZERO) m_nAxesMask = pCamData->GetAxesMask() ; // Se movimento in rapido muovo solo gli assi abilitati dal mask @@ -1122,7 +1122,7 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) } } - // Se inizio di nuova entità + // Se inizio di nuova entità if ( m_nEntId != GDB_ID_NULL && m_dCoeff < EPS_ZERO) { ++ m_nEntInd ; const CamData* pNextCamData = GetCamData( m_pGeomDB->GetUserObj( m_pGeomDB->GetNext( m_nEntId))) ; @@ -1200,7 +1200,7 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) // Eseguo movimento rapido o lineare (non arco) if ( nMoveType != 2 && nMoveType != 3) { - // se attivo CollisionCheck approssimo movimento con più step + // se attivo CollisionCheck approssimo movimento con più step int nStep = 1 ; if ( NeedCollisionCheck()) nStep = max( int( dMove / COLL_STEP), 1) ; @@ -1230,7 +1230,7 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) } m_pMachine->SetAxisPos( m_AuxAxesName[j], dVal) ; } - // se abilitato e non è rapido o non c'è verifica collisioni, eseguo eventuale Vmill + // se abilitato e non è rapido o non c'è verifica collisioni, eseguo eventuale Vmill if ( m_bEnableVm && ( nMoveType != 0 || ! NeedCollisionCheck())) { for ( int j = 0 ; j < int( m_VmTool.size()) ; ++ j) { Point3d ptNoseF ; Vector3d vtDirF ; Vector3d vtAuxF ; @@ -1265,7 +1265,7 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) double dDiffAng = ( m_dCoeff - dPrevCoeff) * dAngCen ; Vector3d vtRot = Point3d( m_AxesVal[0], m_AxesVal[1], m_AxesVal[2]) - ptCen ; vtRot.Rotate( vtN, dPrevCoeff * dAngCen) ; - // se attivi Vmill o CollisionCheck approssimo movimento con più step + // se attivi Vmill o CollisionCheck approssimo movimento con più step int nStep = 1 ; if ( ! m_VmId.empty() || NeedCollisionCheck()) { const double MIN_LEN_STEP = 2. ; @@ -1362,7 +1362,7 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) else m_dCoeff = 1 ; dMove = ( m_dCoeff - dPrevCoeff) * dDist ; - // se attivo CollisionCheck approssimo movimento con più step + // se attivo CollisionCheck approssimo movimento con più step int nStep = 1 ; if ( NeedCollisionCheck()) nStep = max( int( dMove / COLL_STEP), 1) ; @@ -1375,7 +1375,7 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) m_pMachine->SetAxisPos( m_AuxAxesName[j], dVal) ; } } - // se abilitato e non è rapido o non c'è verifica collisioni, eseguo eventuale Vmill + // se abilitato e non è rapido o non c'è verifica collisioni, eseguo eventuale Vmill if ( m_bEnableVm && ( nMoveType != 0 || ! NeedCollisionCheck())) { for ( int j = 0 ; j < int( m_VmTool.size()) ; ++ j) { Point3d ptNoseF ; Vector3d vtDirF ; Vector3d vtAuxF ; @@ -1412,7 +1412,7 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) for ( size_t i = 0 ; i < m_AxesName.size() ; ++ i) m_AxesVal[i] = AxesEnd[i] ; } - // richiamo gestione evento fine entità, senza gestirne eventuali errori + // richiamo gestione evento fine entità, senza gestirne eventuali errori int nErr ; OnMoveEnd( nErr) ; } @@ -1427,14 +1427,14 @@ SimulatorMP::ManageSingleMove( int& nStatus, double& dMove) m_AxesVal[i] = AxesEnd[i] ; } nStatus = MCH_SIM_END_STEP ; - // richiamo gestione evento fine entità + // richiamo gestione evento fine entità int nErr ; if ( ! OnMoveEnd( nErr)) { nStatus = CalcStatusOnError( nErr) ; return false ; } } - // Altrimenti sto muovendomi all'interno dell'entità + // Altrimenti sto muovendomi all'interno dell'entità else nStatus = MCH_SIM_OK ; @@ -1544,11 +1544,11 @@ SimulatorMP::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType) return true ; // ciclo sui grezzi o equivalenti for ( int i = 0 ; i < int( m_CdId.size()) ; ++ i) { - // se modo hidden è da saltare + // se modo hidden è da saltare int nMode ; if ( m_pGeomDB->GetCalcMode( m_CdId[i], nMode) && nMode == GDB_MD_HIDDEN) continue ; - // verifico se è il grezzo in lavorazione + // verifico se è il grezzo in lavorazione bool bIsRaw = ( find( m_VmId.begin(), m_VmId.end(), m_CdId[i]) != m_VmId.end()) ; // recupero solido o trimesh, se altro lo salto const IVolZmap* pVZM = GetVolZmap( m_pGeomDB->GetGeoObj( m_CdId[i])) ; @@ -1559,16 +1559,16 @@ SimulatorMP::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType) Frame3d frCd ; m_pGeomDB->GetGlobFrame( m_CdId[i], frCd) ; // ciclo sugli oggetti con cui verificare for ( int j = 0 ; j < int( m_CollObj.size()) ; ++ j) { - // se modo hidden è da saltare + // se modo hidden è da saltare int nMode ; if ( m_pGeomDB->GetCalcMode( m_CollObj[j].nFrameId, nMode) && nMode == GDB_MD_HIDDEN) continue ; - // verifico se è l'utensile attivo + // verifico se è l'utensile attivo string sHead ; m_pGeomDB->GetName( m_pGeomDB->GetParentId( m_CollObj[j].nFrameId), sHead) ; string sExit ; m_pGeomDB->GetName( m_CollObj[j].nFrameId, sExit) ; bool bIsTool = m_CollObj[j].bToolOn || ( sHead == m_sHead && ( sExit == "_T" + ToString( m_nExit) || sExit == "_TT" + ToString( m_nExit))) ; - // se utensile attivo su grezzo in lavoro e non è rapido, salto + // se utensile attivo su grezzo in lavoro e non è rapido, salto if ( bIsTool && bIsRaw && nMoveType != 0) continue ; // esecuzione controlli di collisione @@ -1692,7 +1692,7 @@ SimulatorMP::CallFunction( const string& sFun, bool bSetRecord, bool bSetModifie // verifico esistenza funzione if ( ! m_pMachine->LuaExistsFunction( sFun)) return true ; - // se richiesto, imposto modalità registrazione + // se richiesto, imposto modalità registrazione if ( bSetRecord && ! m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_RECORD, true)) return false ; // eventuale log di inizio esecuzione @@ -1700,7 +1700,7 @@ SimulatorMP::CallFunction( const string& sFun, bool bSetRecord, bool bSetModifie string sOut = "** " + sFun ; LOG_INFO( GetEMkLogger(), sOut.c_str()) } - // chiamo la funzione di inizio disposizione + // chiamo la funzione bool bOk = m_pMachine->LuaCallFunction( sFun, bSetModifiedOff) ; // se necessario, annullo stato registrazione if ( bSetRecord && ! m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_RECORD, false)) @@ -1856,44 +1856,8 @@ SimulatorMP::OnToolSelect( const string& sTool, const string& sHead, int nExit, m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_CODET, m_CdId) ; // verifico codice di errore bOk = bOk && m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_ERR, nErr) ; - // recupero i dati di ritorno per assi ausiliari - ResetAuxAxes() ; - int nNumAuxAxes = 0 ; - if ( ! m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_AUXAXES, nNumAuxAxes) || nNumAuxAxes == 0) - return ( bOk && nErr == ERR_NONE) ; - m_AuxAxesName.reserve( nNumAuxAxes) ; - m_AuxAxesToken.reserve( nNumAuxAxes) ; - m_AuxAxesInvert.reserve( nNumAuxAxes) ; - m_AuxAxesOffset.reserve( nNumAuxAxes) ; - m_AuxAxesLinear.reserve( nNumAuxAxes) ; - m_AuxAxesVal.reserve( nNumAuxAxes) ; - m_AuxAxesEnd.reserve( nNumAuxAxes) ; - for ( int i = 1 ; i <= nNumAuxAxes && bOk ; ++ i) { - string sName ; string sToken ; bool bInvert ; double dOffset ; bool bLinear ; double dVal ; - string sAuxAxName = GLOB_VAR + GVAR_ANN ; ReplaceString( sAuxAxName, "N", ToString( i)) ; - if ( m_pMachine->LuaGetGlobVar( sAuxAxName, sName) && - m_pMachine->GetAxisToken( sName, sToken) && - m_pMachine->GetAxisInvert( sName, bInvert) && - m_pMachine->GetAxisOffset( sName, dOffset) && - m_pMachine->GetAxisType( sName, bLinear) && - m_pMachine->GetAxisPos( sName, dVal)) { - // se non è già negli assi principali, lo aggiungo - if ( find( m_AxesName.begin(), m_AxesName.end(), sName) == m_AxesName.end()) { - m_AuxAxesName.emplace_back( sName) ; - m_AuxAxesToken.emplace_back( sToken) ; - m_AuxAxesInvert.push_back( bInvert) ; - m_AuxAxesOffset.push_back( dOffset) ; - m_AuxAxesLinear.push_back( bLinear) ; - m_AuxAxesVal.emplace_back( dVal) ; - m_AuxAxesEnd.emplace_back( dVal) ; - m_AuxAxesLink.emplace_back( 0) ; - } - } - else { - bOk = false ; - nErr = ERR_TOOL_SEL ; - } - } + // recupero eventuali dati di ritorno per assi ausiliari + bOk = ReadAuxAxesData( nErr) && bOk ; return ( bOk && nErr == ERR_NONE) ; } @@ -2161,7 +2125,7 @@ SimulatorMP::OnMoveStart( const CamData* pCamData, const CamData* pNextCamData, } // se altrimenti specificato valore finale del movimento else if ( m_pMachine->LuaGetGlobVar( sAuxAxVal, dEnd)) { - // se assi principali disabilitati o non è tra questi, lo aggiungo + // se assi principali disabilitati o non è tra questi, lo aggiungo if ( ! m_bEnabAxes || find( m_AxesName.begin(), m_AxesName.end(), sName) == m_AxesName.end()) { m_AuxAxesName.emplace_back( sName) ; m_AuxAxesToken.emplace_back( sToken) ; @@ -2225,7 +2189,7 @@ SimulatorMP::OnCollision( int nCdInd, int nObjInd, int& nErr) return false ; // verifico codice di errore m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_ERR, nErr) ; - // l'errore standard di collisione è stato portato da 1 a 11 per non collidere con altri tipi di errori + // l'errore standard di collisione è stato portato da 1 a 11 per non collidere con altri tipi di errori if ( nErr == 1) { nErr = ERR_COLLISION ; m_pMachine->LuaSetGlobVar( GLOB_VAR + GVAR_ERR, nErr) ; @@ -2247,6 +2211,53 @@ SimulatorMP::OnResetMachine( void) return CallFunction( ON_RESET_MACHINE) ; } +//---------------------------------------------------------------------------- +bool +SimulatorMP::ReadAuxAxesData( int& nErr) +{ + bool bOk = true ; + // recupero i dati di ritorno per assi ausiliari + ResetAuxAxes() ; + int nNumAuxAxes = 0 ; + if ( ! m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_AUXAXES, nNumAuxAxes) || nNumAuxAxes == 0) + return ( bOk && nErr == ERR_NONE) ; + m_AuxAxesName.reserve( nNumAuxAxes) ; + m_AuxAxesToken.reserve( nNumAuxAxes) ; + m_AuxAxesInvert.reserve( nNumAuxAxes) ; + m_AuxAxesOffset.reserve( nNumAuxAxes) ; + m_AuxAxesLinear.reserve( nNumAuxAxes) ; + m_AuxAxesVal.reserve( nNumAuxAxes) ; + m_AuxAxesEnd.reserve( nNumAuxAxes) ; + for ( int i = 1 ; i <= nNumAuxAxes && bOk ; ++ i) { + string sName ; string sToken ; bool bInvert ; double dOffset ; bool bLinear ; double dVal ; + string sAuxAxName = GLOB_VAR + GVAR_ANN ; ReplaceString( sAuxAxName, "N", ToString( i)) ; + if ( m_pMachine->LuaGetGlobVar( sAuxAxName, sName) && + m_pMachine->GetAxisToken( sName, sToken) && + m_pMachine->GetAxisInvert( sName, bInvert) && + m_pMachine->GetAxisOffset( sName, dOffset) && + m_pMachine->GetAxisType( sName, bLinear) && + m_pMachine->GetAxisPos( sName, dVal)) { + // se non è già negli assi principali, lo aggiungo + if ( find( m_AxesName.begin(), m_AxesName.end(), sName) == m_AxesName.end()) { + m_AuxAxesName.emplace_back( sName) ; + m_AuxAxesToken.emplace_back( sToken) ; + m_AuxAxesInvert.push_back( bInvert) ; + m_AuxAxesOffset.push_back( dOffset) ; + m_AuxAxesLinear.push_back( bLinear) ; + m_AuxAxesVal.emplace_back( dVal) ; + m_AuxAxesEnd.emplace_back( dVal) ; + m_AuxAxesLink.emplace_back( 0) ; + } + } + else { + bOk = false ; + nErr = ERR_TOOL_SEL ; + } + } + + return ( bOk && nErr == ERR_NONE) ; +} + //---------------------------------------------------------------------------- bool SimulatorMP::AddCollisionObj( int nInd, bool bToolOn, int nFrameId, int nType, const Vector3d& vtMove, double dPar1, double dPar2, double dPar3) @@ -2620,6 +2631,15 @@ SimulatorMP::ExecCmdData( int& nStatus) nStatus = MCH_SIM_ERR ; return false ; } + // recupero dati per verifica collisione + m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_SAFEDIST, m_dSafeDist) ; + m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_CODET, m_CdId) ; + // recupero eventuali dati di ritorno per assi ausiliari + int nErr = ERR_NONE ; + if ( ! ReadAuxAxesData( nErr)) { + nStatus = MCH_SIM_ERR ; + return false ; + } // Aggiorno indice comandi eseguiti m_nCmdInd += 1 ; m_dCmdCoeff = 0 ; diff --git a/SimulatorMP.h b/SimulatorMP.h index e2ac0ac..22aa3ab 100644 --- a/SimulatorMP.h +++ b/SimulatorMP.h @@ -105,6 +105,7 @@ class SimulatorMP : public ISimulator bool OnMoveStart( const CamData* pCamData, const CamData* pNextCamData, int& nErr) ; bool OnMoveEnd( int& nErr) ; bool OnResetMachine( void) ; + bool ReadAuxAxesData( int& nErr) ; bool ExecCmdData( int& nStatus) ; bool ExecAllCmdData( int& nStatus) ;