EgtMachKernel :

- altre modifiche in SimulazioneSP per gestione visualizzazione VMill (ora gestito anche gruppo con Id da EMT.VMILLSHOW).
This commit is contained in:
Dario Sassi
2026-08-18 17:12:01 +02:00
parent 4957e09abe
commit 3b18f41438
2 changed files with 42 additions and 40 deletions
+41 -40
View File
@@ -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