//---------------------------------------------------------------------------- // 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 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 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 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 } ;