4925ab462c
- in SimulatorSP e SimulatorMP aggiunta gestione lavorazioni in doppio per OnPathStart.
221 lines
13 KiB
C++
221 lines
13 KiB
C++
//----------------------------------------------------------------------------
|
|
// EgalTech 2024-2024
|
|
//----------------------------------------------------------------------------
|
|
// File : SimulatorMP.h Data : 01.09.24 Versione : 2.6i1
|
|
// Contenuto : Dichiarazione della classe SimulatorMP.
|
|
// Simulatore multi-processo.
|
|
//
|
|
//
|
|
// Modifiche : 01.09.24 DS Creazione modulo.
|
|
//
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include "Simulator.h"
|
|
#include "CamData.h"
|
|
|
|
class IGeomDB ;
|
|
class Machine ;
|
|
class PerformanceCounter ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
ISimulator* CreateSimulatorMP( void) ;
|
|
|
|
//----------------------------------------------------------------------------
|
|
class SimulatorMP : public ISimulator
|
|
{
|
|
public : // ISimulator
|
|
~SimulatorMP( void) override ;
|
|
bool Init( MachMgr* pMchMgr) override ;
|
|
bool Start( bool bFirst) override ;
|
|
bool Move( int& nStatus) override ;
|
|
bool GoHome( void) override ;
|
|
bool SetStep( double dStep) override ;
|
|
bool SetUiStatus( int nUiStatus) override ;
|
|
bool GetAxisInfoPos( int nI, std::string& sName, std::string& sToken, bool& bLinear, double& dVal) const override ;
|
|
bool GetToolInfo( std::string& sName, double& dSpeed) const override ;
|
|
bool GetOperationInfo( std::string& sName, int& nType) const override ;
|
|
bool GetMoveInfo( int& nGmove, double& dFeed) const override ;
|
|
bool AddCollisionObj( int nInd, bool bToolOn, int nFrameId, int nType,
|
|
const Vector3d& vtMove, double dPar1, double dPar2, double dPar3) override ;
|
|
bool RemoveCollisionObj( int nFrameId) override ;
|
|
bool GetCollisionObj( int nPos, int& nInd, bool& bToolOn, int& nFrameId, int& nType,
|
|
Vector3d& vtMove, double& dPar1, double& dPar2, double& dPar3) override ;
|
|
bool ExecCollisionCheck( int& nCdInd, int& nObjInd, int nMoveType) override ;
|
|
bool OnCollision( int nCdInd, int nObjInd, int& nErr) override ;
|
|
bool SetToolForVmill( const std::string& sTool, const std::string& sHead, int nExit, int nFlag,
|
|
double dPar1, double dPar2, const INTVECTOR& vVmill, bool bFirst) override ;
|
|
bool EnableToolsForVmill( bool bEnable) override ;
|
|
bool EnableToolTipTrace( bool bEnable) override
|
|
{ return false ; }
|
|
int MoveAxes( int nMoveType, const SAMVECTOR& vAxNaEpSt) override ;
|
|
bool SaveCmd( int nType, int nPar, const std::string& sPar, const std::string& sPar2) override ;
|
|
|
|
public :
|
|
SimulatorMP( void) ;
|
|
|
|
private :
|
|
bool UpdateMachiningTool( bool bFirst, int& nChangeTool, int& nErr) ;
|
|
bool UpdateDispositionTool( bool bFirst, int& nErr) ;
|
|
bool UpdateAxes( void) ;
|
|
bool UpdateAxesPos( void) ;
|
|
bool ResetInterpolation( void) ;
|
|
bool ResetAxes( void) ;
|
|
bool ResetAuxAxes( void) ;
|
|
|
|
private :
|
|
bool VerifySetup( void) ;
|
|
bool FindAndManageOperationStart( bool bStart, bool bFirst, int& nChangeTool, int& nStatus) ;
|
|
bool ManageOperationEnd( int& nStatus) ;
|
|
bool FindAndManagePathStart( int& nStatus) ;
|
|
bool ManagePathEnd( int& nStatus) ;
|
|
bool ManagePathStartAux( int& nStatus) ;
|
|
bool ManagePathEndAux( int& nStatus) ;
|
|
bool ManageMove( int& nStatus) ;
|
|
bool ManageSingleMove( int& nStatus, double& dMove) ;
|
|
int CalcStatusOnError( int nErr) ;
|
|
bool GetHeadCurrPosDirAux( const std::string& sHead, int nExit, Point3d& ptH, Vector3d& vtH, Vector3d& vtA) ;
|
|
bool ExecLineVmill( int nVmId, int nCurrTool, double dVmTdOffs, double dVmAdOffs,
|
|
const Point3d& ptHi, const Vector3d& vtHi, const Vector3d& vtAi, const Frame3d& frVzmI,
|
|
const Point3d& ptHf, const Vector3d& vtHf, const Vector3d& vtAf, const Frame3d& frVzmF) ;
|
|
bool NeedCollisionCheck( void) const
|
|
{ return ( ! m_CollObj.empty() && ! m_CdId.empty()) ; }
|
|
bool Stopped( void)
|
|
{ return ( m_nUiStatus == MCH_UISIM_STOP) ; }
|
|
bool SetCollisionMark( int nCdInd, int nObjInd) ;
|
|
bool ResetCollisionMark( void) ;
|
|
bool CallFunction( const std::string& sFun, bool bSetRecord = false, bool bSetModifiedOff = true) ;
|
|
bool OnInit( void) ;
|
|
bool OnExit( void) ;
|
|
bool OnProgramStart( bool bFirst) ;
|
|
bool OnProgramEnd( void) ;
|
|
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,
|
|
const std::string& sTable, const Point3d& ptOri1, bool bEmpty, bool bSomeByHand) ;
|
|
bool OnDispositionEnd( void) ;
|
|
bool OnToolSelect( const std::string& sTool, const std::string& sHead, int nExit, const std::string& sTcPos,
|
|
bool bFirst, bool bFloating, int& nErr) ;
|
|
bool OnToolDeselect( const std::string& sNextTool, const std::string& sNextHead, int nNextExit, const std::string& sNextTcPos, int& nErr) ;
|
|
bool OnMachiningStart( int nOpId, int nOpInd, const Point3d& ptMin, const Point3d& ptMax,
|
|
const DBLVECTOR& vAxMin, const DBLVECTOR& vAxMax) ;
|
|
bool OnMachiningEnd( void) ;
|
|
bool OnPathStartAux( int nInd, const std::string& sAS, int& nErr) ;
|
|
bool OnPathEndAux( int nInd, const std::string& sAE, int& nErr) ;
|
|
bool OnPathStart( int nClPathId, int nClPathInd, int nDBLPathId, int nAS, const Point3d& ptStart, const Point3d& ptEnd,
|
|
const Vector3d& vtExtr, const Point3d& ptMin, const Point3d& ptMax,
|
|
const DBLVECTOR& vAxMin, const DBLVECTOR& vAxMax, double dElev, const INTVECTOR& vActiveExit) ;
|
|
bool OnPathEnd( int nAE) ;
|
|
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) ;
|
|
|
|
private :
|
|
struct CollObj {
|
|
int nInd ;
|
|
bool bToolOn ;
|
|
int nFrameId ;
|
|
int nType ;
|
|
Vector3d vtMove ;
|
|
double dPar1 ;
|
|
double dPar2 ;
|
|
double dPar3 ;
|
|
CollObj( void) : nInd( 0), bToolOn( false), nFrameId( -1), nType( 0), vtMove(), dPar1( 0), dPar2( 0), dPar3( 0) {}
|
|
CollObj( int nI, bool bTOn, int nF, int nT, const Vector3d& vtM, double dP1, double dP2, double dP3)
|
|
: nInd( nI), bToolOn( bTOn), nFrameId( nF), nType( nT), vtMove( vtM), dPar1( dP1), dPar2( dP2), dPar3( dP3) {}
|
|
} ;
|
|
typedef std::vector<CollObj> COBVECTOR ;
|
|
struct VmTool
|
|
{
|
|
std::string sName ;
|
|
std::string sHead ;
|
|
int nExit ;
|
|
double dTdOffs ;
|
|
double dAdOffs ;
|
|
VmTool( void) : nExit( 0), dTdOffs( 0), dAdOffs( 0) {}
|
|
VmTool( std::string sN, std::string sH, int nE, double dT, double dA)
|
|
: sName( sN), sHead( sH), nExit( nE), dTdOffs( dT), dAdOffs( dA) {}
|
|
} ;
|
|
typedef std::vector<VmTool> VMTVECTOR ;
|
|
enum { SIS_CREATED = 0,
|
|
SIS_INITIALIZED = 1,
|
|
SIS_READYTOSTART = 2,
|
|
SIS_READYTORUN = 3} ;
|
|
|
|
private :
|
|
struct CmdData {
|
|
int nType ;
|
|
int nMoveType ;
|
|
SAMVECTOR vAxNaEpSt ;
|
|
int nPar ;
|
|
std::string sPar ;
|
|
std::string sPar2 ;
|
|
CmdData( void) : nType(0) {}
|
|
CmdData( int nM, const SAMVECTOR& vAx)
|
|
: nType( 1), nMoveType( nM), vAxNaEpSt( vAx) {}
|
|
CmdData( int nT, int nP, const std::string& sP, const std::string& sP2)
|
|
: nType( nT), nPar( nP), sPar( sP), sPar2( sP2) {}
|
|
} ;
|
|
typedef std::vector<CmdData> CMDVECTOR ;
|
|
|
|
private :
|
|
MachMgr* m_pMchMgr ; // puntatore al gestore di tutte le lavorazioni
|
|
IGeomDB* m_pGeomDB ; // puntatore al DB geometrico
|
|
Machine* m_pMachine ; // puntatore alla macchina
|
|
PerformanceCounter* m_pPerfCnt ; // timer per calcolo FPS
|
|
std::string m_sSpecEstim ; // path del file con i dati della stima speciale
|
|
int m_nStatus ; // stato interno del simulatore (creato, inizializzato, pronto al movimento)
|
|
double m_dStep ; // lunghezza di riferimento per la velocità di simulazione
|
|
int m_nUiStatus ; // stato simulazione a livello utente
|
|
INTVECTOR m_vOperId ; // vettore identificativi operazioni ordinate per simulazione
|
|
int m_nOpId ; // identificativo della operazione (lavoraz.) corrente
|
|
int m_nOpInd ; // contatore della operazione (lavoraz.) corrente
|
|
int m_nCLPathId ; // identificativo del percorso di lavoro corrente
|
|
int m_nCLPathInd ; // contatore del percorso di lavoro corrente nell'operazione
|
|
int m_nEntId ; // identificativo dell'entità corrente
|
|
int m_nEntInd ; // contatore dell'entità corrente nel percorso di lavoro
|
|
double m_dCoeff ; // coefficiente di esecuzione del movimento corrente (0...1)
|
|
int m_nChangeTool ; // stato di carico e scarico dell'utensile
|
|
int m_nAuxSTot ; // numero totale movimenti ausiliari di inizio percorso
|
|
int m_nAuxSInd ; // indice del movimento ausiliario di inizio percorso corrente
|
|
int m_nAuxETot ; // numero totale movimenti ausiliari di fine percorso
|
|
int m_nAuxEInd ; // indice del movimento ausiliario di fine percorso corrente
|
|
std::string m_sTool ; // nome dell'utensile corrente
|
|
std::string m_sHead ; // nome della testa corrente
|
|
int m_nExit ; // indice dell'uscita corrente
|
|
double m_dTDiam ; // diametro dell'utensile corrente
|
|
bool m_bCutOnTip ; // flag capacità di lavorare di testa dell'utensile corrente
|
|
bool m_bEnableVm ; // flag abilitazione Virtual Milling
|
|
INTVECTOR m_VmId ; // vettore identificativi Zmap per Virtual Milling
|
|
INTVECTOR m_CdId ; // vettore identificativi Zmap per Collision Detection
|
|
VMTVECTOR m_VmTool ; // vettore utensili attivi per virtual milling
|
|
COBVECTOR m_CollObj ; // vettore oggetti da testare per collisione con grezzo
|
|
double m_dSafeDist ; // distanza di sicurezza per verifica collisioni
|
|
INTVECTOR m_nCollMarkId ; // elenco oggetti marcati per visualizzare meglio la collisione rilevata
|
|
int m_nAxesMask ; // maschera a bit di abilitazione movimento assi (solo se rapido)
|
|
bool m_bEnabAxes ; // flag abilitazione movimento assi attivi
|
|
bool m_bShowAxes ; // flag visualizzazione assi attivi
|
|
STRVECTOR m_AxesName ; // nomi degli assi macchina attivi
|
|
STRVECTOR m_AxesToken ; // token degli assi macchina attivi
|
|
BOOLVECTOR m_AxesInvert ; // flag di asse con verso invertito degli assi macchina attivi
|
|
DBLVECTOR m_AxesOffset ; // valore di offset delgli assi macchina ttivi
|
|
BOOLVECTOR m_AxesLinear ; // flag di lineare degli assi macchina attivi
|
|
DBLVECTOR m_AxesVal ; // valori degli assi macchina all'inizio del movimento corrente
|
|
STRVECTOR m_AuxAxesName ; // nomi degli assi macchina ausiliari abilitati
|
|
STRVECTOR m_AuxAxesToken ; // token degli assi macchina ausiliari abilitati
|
|
BOOLVECTOR m_AuxAxesInvert ; // flag di asse con verso invertito degli assi macchina ausiliari abilitati
|
|
DBLVECTOR m_AuxAxesOffset ; // valore di offset degli assi macchina ausiliari abilitati
|
|
BOOLVECTOR m_AuxAxesLinear ; // flag di lineare degli assi macchina ausiliari abilitati
|
|
DBLVECTOR m_AuxAxesVal ; // valori degli assi macchina ausiliari all'inizio del movimento corrente
|
|
DBLVECTOR m_AuxAxesEnd ; // valori degli assi macchina ausiliari alla fine del movimento corrente
|
|
INTVECTOR m_AuxAxesLink ; // indice + 1 asse principale di aggancio (negativo valore opposto, 0 nessuno)
|
|
CMDVECTOR m_CmdData ; // vettore comandi in attesa di esecuzione
|
|
int m_nCmdInd ; // indice prossimo comando da eseguire
|
|
double m_dCmdCoeff ; // coefficiente di movimento nel comando
|
|
} ;
|