From 3b18f414385ab68db54ad65d264be111f82bf68c Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Tue, 18 Aug 2026 17:12:01 +0200 Subject: [PATCH] EgtMachKernel : - altre modifiche in SimulazioneSP per gestione visualizzazione VMill (ora gestito anche gruppo con Id da EMT.VMILLSHOW). --- OutputConst.h | 1 + SimulatorSP.cpp | 81 +++++++++++++++++++++++++------------------------ 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/OutputConst.h b/OutputConst.h index d12c529..60cbec0 100644 --- a/OutputConst.h +++ b/OutputConst.h @@ -194,6 +194,7 @@ static const std::string GVAR_SAFEDIST = ".SAFEDIST" ; // (num) distanza static const std::string GVAR_SIMVMID = ".SIMVMID" ; // (int) identificativo grezzo Vmill in collisione static const std::string GVAR_SIMCOBIND = ".SIMCOBIND" ; // (int) indice oggetto in collisione static const std::string GVAR_TOOLTRACE = ".TOOLTRACE" ; // (int) identificativo gruppo di tracciatura utensile +static const std::string GVAR_VMILLSHOW = ".VMILLSHOW" ; // (int) identificativo gruppo per Vmill da visualizzare/nascondere static const std::string GVAR_MPSIM = ".MPSIM" ; // (bool) flag simulazione multiprocesso static const std::string GVAR_MPSEST = ".MPSEST" ; // (string) path del file di stima speciale per simulazione multiprocesso static const std::string GVAR_RECORD = ".RECORD" ; // (bool) flag modalità registrazione comandi in simulazione diff --git a/SimulatorSP.cpp b/SimulatorSP.cpp index 244c0d1..bc800d4 100644 --- a/SimulatorSP.cpp +++ b/SimulatorSP.cpp @@ -349,7 +349,7 @@ SimulatorSP::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 ; } @@ -521,7 +521,7 @@ SimulatorSP::SetUiStatus( int nUiStatus) bool SimulatorSP::GoHome( void) { - // controllo validità stato + // controllo validità stato if ( m_pGeomDB == nullptr || m_pMchMgr == nullptr || m_pMachine == nullptr) return false ; // reset visualizzazione collisioni @@ -558,9 +558,9 @@ SimulatorSP::UpdateTool( bool bFirst, 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()) { // eventuale lancio script per scarico utensile int nCurrErr ; @@ -610,7 +610,7 @@ SimulatorSP::UpdateTool( 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 ; @@ -779,7 +779,7 @@ SimulatorSP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nStatus // 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 ; @@ -836,7 +836,7 @@ SimulatorSP::FindAndManageOperationStart( bool bStart, bool bFirst, int& nStatus nStatus = CalcStatusOnError( 0) ; 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) ; @@ -854,15 +854,15 @@ bool SimulatorSP::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() ; @@ -902,7 +902,7 @@ SimulatorSP::FindAndManagePathStart( int& nStatus) } // reset eventuale curva di TipTrace m_nCurrTrace = GDB_ID_NULL ; - // 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 ; // verifico se Path in doppio @@ -1037,9 +1037,9 @@ SimulatorSP::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 ; } @@ -1097,7 +1097,7 @@ SimulatorSP::ManageSingleMove( int& nStatus, double& dMove) } // 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 @@ -1108,7 +1108,7 @@ SimulatorSP::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))) ; @@ -1185,7 +1185,7 @@ SimulatorSP::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) ; @@ -1215,7 +1215,7 @@ SimulatorSP::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 ; @@ -1252,7 +1252,7 @@ SimulatorSP::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. ; @@ -1350,7 +1350,7 @@ SimulatorSP::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) ; @@ -1363,7 +1363,7 @@ SimulatorSP::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 ; @@ -1402,7 +1402,7 @@ SimulatorSP::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) ; } @@ -1417,14 +1417,14 @@ SimulatorSP::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 ; @@ -1534,11 +1534,11 @@ SimulatorSP::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])) ; @@ -1551,19 +1551,19 @@ SimulatorSP::ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType) string sCdName ; m_pGeomDB->GetName( m_CdId[i], sCdName) ; // 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 ; - // se contiene info con nome da saltare, verifico se è il caso + // se contiene info con nome da saltare, verifico se è il caso string sCollSkip ; if ( m_pGeomDB->GetInfo( m_CollObj[j].nFrameId, "CollSkip", sCollSkip) && sCollSkip == sCdName) continue ; @@ -1703,19 +1703,20 @@ SimulatorSP::ShowVMill( bool bShow) // ciclo sugli oggetti del grezzo int nId = m_pGeomDB->GetFirstInGroup( nRawId) ; while ( nId != GDB_ID_NULL) { - // se è il VMill + // se è il VMill if ( find( m_VmId.begin(), m_VmId.end(), nId) != m_VmId.end()) m_pGeomDB->SetStatus( nId, ( bShow ? GDB_ST_ON : GDB_ST_OFF)) ; - // se altrimenti è il gruppo di tracciatura - else if ( nId == m_nTraceGroup) - m_pGeomDB->SetStatus( nId, GDB_ST_ON) ; - // altro - else + // se altro ma non gruppo di tracciatura + else if ( nId != m_nTraceGroup) m_pGeomDB->SetStatus( nId, ( bShow ? GDB_ST_OFF : GDB_ST_ON)) ; nId = m_pGeomDB->GetNext( nId) ; } } - } + } + // gestione eventuale gruppo VMill sotto radice + int nVMillShowId = GDB_ID_NULL ; + if ( m_pMachine->LuaGetGlobVar( GLOB_VAR + GVAR_VMILLSHOW, nVMillShowId)) + m_pGeomDB->SetStatus( nVMillShowId, ( bShow ? GDB_ST_ON : GDB_ST_OFF)) ; return true ; } @@ -1981,7 +1982,7 @@ SimulatorSP::OnToolSelect( const string& sTool, const string& sHead, int nExit, m_pMachine->GetAxisOffset( sName, dOffset) && m_pMachine->GetAxisType( sName, bLinear) && m_pMachine->GetAxisPos( sName, dVal)) { - // se non è già negli assi principali, lo aggiungo + // 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) ; @@ -2302,7 +2303,7 @@ SimulatorSP::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) ; @@ -2378,7 +2379,7 @@ SimulatorSP::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) ; @@ -2506,7 +2507,7 @@ SimulatorSP::SetToolForVmill( const string& sTool, const string& sHead, int nExi string sNotes ; m_pMchMgr->TdbGetCurrToolParam( TPA_USERNOTES, sNotes) ; // verifico se additivo bool bAdditive = ( nFlag == 1) ; - // se flottante, il primo parametro è l'offset di lunghezza + // se flottante, il primo parametro è l'offset di lunghezza if ( nFlag == 2) dLen += dPar1 ; // ricerca dell'outline e del diametro gambo