EgtMachKernel :

- ulteriori correzioni a Simulatore MP.
This commit is contained in:
Dario Sassi
2024-11-16 13:05:37 +01:00
parent 3aab2b94fc
commit 3c241080d0
2 changed files with 91 additions and 70 deletions
+90 -70
View File
@@ -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 ;