diff --git a/CamData.cpp b/CamData.cpp index 6abbe6a..3e17a5a 100644 --- a/CamData.cpp +++ b/CamData.cpp @@ -447,7 +447,7 @@ CamData::SetFlag( int nFlag) bool CamData::SetAxes( int nStatus, const DBLVECTOR& vAxVal) { - if ( nStatus != AS_OK && nStatus != AS_ERR && nStatus != AS_OUTSTROKE) + if ( nStatus != AS_OK && nStatus != AS_OUTSTROKE && nStatus != AS_DIR_ERR && nStatus != AS_ERR) return false ; m_nAxesStatus = nStatus ; m_vMachAxes = vAxVal ; diff --git a/CamData.h b/CamData.h index 253386d..4d96fb0 100644 --- a/CamData.h +++ b/CamData.h @@ -74,8 +74,9 @@ class CamData : public IUserObj public : enum { AS_NONE = 0, AS_OK = 1, - AS_ERR = 2, - AS_OUTSTROKE = 3} ; + AS_OUTSTROKE = 2, + AS_DIR_ERR = 3, + AS_ERR = 4} ; private : void ResetObjGraphics( void) ; diff --git a/Disposition.cpp b/Disposition.cpp index 4d953db..742fa60 100644 --- a/Disposition.cpp +++ b/Disposition.cpp @@ -245,11 +245,12 @@ Disposition::SetTable( const string& sTable) // imposta questa tavola come corrente if ( ! pMch->SetCurrTable( sTable)) return false ; - // recupero il primo riferimento della tavola + // recupero il primo riferimento e l'area utile della tavola Table* pTab = pMch->GetTable( sTable) ; if ( pTab == nullptr) return false ; m_ptRef1 = pTab->GetRef1() ; + m_b3Area1 = pTab->GetArea1() ; // salvo il nome e dichiaro tavola verificata m_sTabName = sTable ; m_bTabOk = true ; @@ -286,6 +287,21 @@ Disposition::GetTableRef1( Point3d& ptRef1) const return true ; } +//---------------------------------------------------------------------------- +bool +Disposition::GetTableArea1( BBox3d& b3Area1) const +{ + // verifico MachMgr e GeomDB + if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) + return false ; + // verifico tavola + if ( ! m_bTabOk && ! const_cast(this)->SetTable( m_sTabName)) + return false ; + // recupero la prima area utile della tavola + b3Area1 = m_b3Area1 ; + return true ; +} + //---------------------------------------------------------------------------- bool Disposition::Apply(void) @@ -343,6 +359,9 @@ Disposition::AddFixture( const string& sName, const Point3d& ptPos, double dAngD // verifico tavola if ( ! m_bTabOk && ! SetTable( m_sTabName)) return GDB_ID_NULL ; + // verifico che la posizione sia nell'area della tavola + if ( ! m_b3Area1.EnclosesXY( m_ptRef1 + ptPos)) + return GDB_ID_NULL ; // recupero il gruppo delle fixtures nella macchinata corrente int nFixtGrpId = m_pMchMgr->GetCurrFixtGroupId() ; if ( nFixtGrpId == GDB_ID_NULL) @@ -381,6 +400,11 @@ Disposition::MoveFixture( int nId, const Vector3d& vtMove) // verifico aggiornamento tavola if ( ! m_bTabOk && ! SetTable( m_sTabName)) return false ; + // verifico che la posizione finale sia nell'area della tavola + Frame3d frFixt ; + if ( ! m_pGeomDB->GetGlobFrame( nId, frFixt) || + ! m_b3Area1.EnclosesXY( frFixt.Orig() + vtMove)) + return false ; // muovo l'oggetto m_pGeomDB->TranslateGlob( nId, vtMove) ; // aggiorno la posizione dell'oggetto nel vettore dei comandi @@ -469,6 +493,10 @@ Disposition::MoveToCornerRawPart( int nRawId, const Point3d& ptP, int nFlag, boo vtMove = ( m_ptRef1 + ptP) - Point3d( b3Raw.GetMax().x, b3Raw.GetMin().y, b3Raw.GetMin().z) ; break ; } + // verifico se il grezzo nella posizione finale sarà nella tavola + b3Raw.Translate( vtMove) ; + if ( ! m_b3Area1.EnclosesXY( b3Raw)) + return false ; // eseguo traslazione in globale if ( ! vtMove.IsSmall()) m_pGeomDB->TranslateGlob( nRawId, vtMove) ; @@ -521,6 +549,10 @@ Disposition::MoveToCenterRawPart( int nRawId, const Point3d& ptP, int nFlag, boo vtMove = ( m_ptRef1 + ptP) - Point3d( ptCen.x, ptCen.y, b3Raw.GetMin().z) ; break ; } + // verifico se il grezzo nella posizione finale sarà nella tavola + b3Raw.Translate( vtMove) ; + if ( ! m_b3Area1.EnclosesXY( b3Raw)) + return false ; // eseguo traslazione in globale if ( ! vtMove.IsSmall()) m_pGeomDB->TranslateGlob( nRawId, vtMove) ; @@ -555,6 +587,16 @@ Disposition::MoveRawPart( int nRawId, const Vector3d& vtMove) ( Mrv.nType == MoveRawData::COR || Mrv.nType == MoveRawData::CEN)) ; }) ; if ( iIter == m_vMvrData.end()) return false ; + // recupero il solido + int nRawSolId = m_pGeomDB->GetFirstNameInGroup( nRawId, MACH_RAW_SOLID) ; + // determino il box del grezzo (solo il solido ovviamente) + BBox3d b3Raw ; + if ( ! m_pGeomDB->GetGlobalBBox( nRawSolId, b3Raw)) + return false ; + // verifico se il grezzo nella posizione finale sarà nella tavola + b3Raw.Translate( vtMove) ; + if ( ! m_b3Area1.EnclosesXY( b3Raw)) + return false ; // eseguo traslazione in globale m_pGeomDB->TranslateGlob( nRawId, vtMove) ; // aggiorno comando di movimento diff --git a/Disposition.h b/Disposition.h index 08018c1..d9a295e 100644 --- a/Disposition.h +++ b/Disposition.h @@ -68,6 +68,7 @@ class Disposition : public IUserObj bool Apply( void) ; bool GetTable( std::string& sTable) const ; bool GetTableRef1( Point3d& ptRef1) const ; + bool GetTableArea1( BBox3d& b3Area1) const ; int AddFixture( const std::string& sName, const Point3d& ptPos, double dAngDeg = 0, bool bAddToList = true) ; bool MoveFixture( int nId, const Vector3d& vtMove) ; bool RotateFixture( int nId, double dAngDeg) ; @@ -91,6 +92,7 @@ class Disposition : public IUserObj MachMgr* m_pMchMgr ; // puntatore al gestore di tutte le lavorazioni std::string m_sTabName ; // nome della tavola di appartenenza Point3d m_ptRef1 ; // origine 1 della tavola + BBox3d m_b3Area1 ; // area utile 1 della tavola bool m_bTabOk ; // flag di tavola verificata FIXDATAVECTOR m_vFixData ; // elenco posizionamento bloccaggi MVRDATAVECTOR m_vMvrData ; // elenco movimenti grezzi diff --git a/MachMgr.h b/MachMgr.h index 9aac3b4..fe53832 100644 --- a/MachMgr.h +++ b/MachMgr.h @@ -94,8 +94,8 @@ class MachMgr : public IMachMgr virtual bool RotatePartInRawPart( int nPartId, const Vector3d& vtAx, double dAngRotDeg) ; // Tables and Fixtures virtual bool SetTable( const std::string& sTable) ; - virtual bool GetTableRef1( Point3d& ptPos) ; - virtual bool GetTableArea1( int& nAreaId) ; + virtual bool GetTableRef( int nInd, Point3d& ptPos) ; + virtual bool GetTableArea( int nInd, BBox3d& b3Area) ; virtual int AddFixture( const std::string& sName, const Point3d& ptPos, double dAngRotDeg) ; virtual bool ShowOnlyTable( bool bVal) ; // Tools DataBase @@ -169,7 +169,7 @@ class MachMgr : public IMachMgr virtual bool GetMachiningParam( int nType, std::string& sVal) const ; // Simulation virtual bool SimStart( void) ; - virtual bool SimMove( void) ; + virtual bool SimMove( int& nStatus) ; virtual bool SimGetAxisInfoPos( int nI, std::string& sName, double& dVal) ; virtual bool SimSetStep( double dStep) ; virtual bool SimStop( void) ; diff --git a/MachMgrFixtures.cpp b/MachMgrFixtures.cpp index 5eb1227..d13ed3c 100644 --- a/MachMgrFixtures.cpp +++ b/MachMgrFixtures.cpp @@ -35,11 +35,14 @@ MachMgr::SetTable( const string& sTable) //---------------------------------------------------------------------------- bool -MachMgr::GetTableRef1( Point3d& ptPos) +MachMgr::GetTableRef( int nInd, Point3d& ptPos) { + // attualmente previsto solo il riferimento 1 + if ( nInd != 1) + return false ; // recupero la prima operazione, deve essere la disposizione int nDispId = GetFirstOperation() ; - // recupero l'oggetto disposizione + // recupero il primo oggetto disposizione Disposition* pDisp = dynamic_cast( m_pGeomDB->GetUserObj( nDispId)) ; if ( pDisp == nullptr) return false ; @@ -49,22 +52,19 @@ MachMgr::GetTableRef1( Point3d& ptPos) //---------------------------------------------------------------------------- bool -MachMgr::GetTableArea1( int& nAreaId) +MachMgr::GetTableArea( int nInd, BBox3d& b3Area1) { - // verifico DB geometrico - if ( m_pGeomDB == nullptr) + // attualmente prevista solo l'area 1 + if ( nInd != 1) return false ; - // recupero la macchina corrente - Machine* pMch = GetCurrMachine() ; - if ( pMch == nullptr) + // recupero la prima operazione, deve essere la disposizione + int nDispId = GetFirstOperation() ; + // recupero il primo oggetto disposizione + Disposition* pDisp = dynamic_cast( m_pGeomDB->GetUserObj( nDispId)) ; + if ( pDisp == nullptr) return false ; - // recupero la tavola corrente - int nTabId = pMch->GetCurrTable() ; - if ( nTabId == GDB_ID_NULL) - return false ; - // recupero l'oggetto che ne definisce l'area utile - nAreaId = m_pGeomDB->GetFirstNameInGroup( nTabId, MCH_TAREA + "1") ; - return ( nAreaId != GDB_ID_NULL) ; + // recupero il bounding box + return pDisp->GetTableArea1( b3Area1) ; } //---------------------------------------------------------------------------- diff --git a/MachMgrSimulation.cpp b/MachMgrSimulation.cpp index c46398a..3b040a4 100644 --- a/MachMgrSimulation.cpp +++ b/MachMgrSimulation.cpp @@ -39,13 +39,15 @@ MachMgr::SimStart( void) //---------------------------------------------------------------------------- bool -MachMgr::SimMove( void) +MachMgr::SimMove( int& nStatus) { // verifico simulatore - if ( m_pSimul == nullptr) + if ( m_pSimul == nullptr) { + nStatus = MCH_SIM_ERR ; return false ; + } // eseguo movimento - return m_pSimul->Move() ; + return m_pSimul->Move( nStatus) ; } //---------------------------------------------------------------------------- diff --git a/Machine.cpp b/Machine.cpp index 2ae6aec..efb2f44 100644 --- a/Machine.cpp +++ b/Machine.cpp @@ -172,15 +172,20 @@ Machine::LoadMachineTable( const string& sName, const string& sParent, int nType return false ; // gli assegno il nome m_pGeomDB->SetName( nLay, sName) ; + // aggiusto la posizione della tavola + if ( ! AdjustTablePos( nLay, ptRef1)) + return false ; + // recupero l'area valida + int nAreaId = m_pGeomDB->GetFirstNameInGroup( nLay, MCH_TAREA + "1") ; + BBox3d b3Area1 ; + if ( ! m_pGeomDB->GetGlobalBBox( nAreaId, b3Area1)) + return false ; // installo e inizializzo il gestore della tavola Table* pTab = new(nothrow) Table ; if ( pTab == nullptr) return false ; - pTab->Set( sName, nType, ptRef1) ; + pTab->Set( sName, nType, ptRef1, b3Area1) ; m_pGeomDB->SetUserObj( nLay, pTab) ; - // aggiusto la posizione della tavola - if ( ! AdjustTablePos( nLay, ptRef1)) - return false ; // lo inserisco nel dizionario dei gruppi della macchina return m_mapGroups.emplace( sName, nLay).second ; } diff --git a/MachineCalc.cpp b/MachineCalc.cpp index 3a780d4..71a508c 100644 --- a/MachineCalc.cpp +++ b/MachineCalc.cpp @@ -436,6 +436,7 @@ Machine::GetPositions( const Point3d& ptP, double dAngA, double dAngB, dY = ptP.y + vtDtHe.y + vtDtAx.y + vtDtTL.y ; dZ = ptP.z + vtDtHe.z + vtDtAx.z + vtDtTL.z ; + // tutto ok nStat = 0 ; return true ; } diff --git a/Machining.cpp b/Machining.cpp index 1c622e3..53f9724 100644 --- a/Machining.cpp +++ b/Machining.cpp @@ -349,7 +349,7 @@ Machining::GetFinalAxesValues( DBLVECTOR& vAxVal) return false ; // assegno i valori degli assi vAxVal = pCamData->GetAxisVal() ; - return true ; + return ( vAxVal.size() > 0) ; } //---------------------------------------------------------------------------- @@ -375,10 +375,10 @@ Machining::CalculateAxesValues( void) // assegno gli angoli iniziali double dAngAprec = 0 ; double dAngBprec = 0 ; + DBLVECTOR vAxVal ; // se utensile non cambiato, uso gli angoli finali della lavorazione precedente - if ( ! sPrevTool.empty() && GetToolData().m_sName == sPrevTool) { - DBLVECTOR vAxVal ; - pPrevMch->GetFinalAxesValues( vAxVal) ; + if ( ! sPrevTool.empty() && GetToolData().m_sName == sPrevTool && + pPrevMch->GetFinalAxesValues( vAxVal)) { if ( nRotAxes >= 1) dAngAprec = vAxVal[nLinAxes - 1 + 1] ; if ( nRotAxes >= 2) @@ -386,7 +386,6 @@ Machining::CalculateAxesValues( void) } // altrimenti uso gli angoli home else { - DBLVECTOR vAxVal ; m_pMchMgr->GetAllCalcAxesHomePos( vAxVal) ; if ( nRotAxes >= 1) dAngAprec = vAxVal[nLinAxes - 1 + 1] ; @@ -438,7 +437,7 @@ Machining::CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, bool bROk = m_pMchMgr->GetCalcAngles( pCamData->GetToolDir(), pCamData->GetCorrDir(), nRStat, dAngA1, dAngB1, dAngA2, dAngB2) ; if ( ! bROk || nRStat == 0) { bOk = false ; - pCamData->SetAxes( CamData::AS_ERR, vAxVal) ; + pCamData->SetAxes( CamData::AS_DIR_ERR, vAxVal) ; continue ; } if ( nRStat == 1) { diff --git a/Sawing.cpp b/Sawing.cpp index a9508bc..e3bad4c 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -845,13 +845,16 @@ Sawing::EntityApply( const ICurve* pCrvP, const ICurve* pCrvC, const ICurve* pCr } // aggiungo affondamento pLine->Translate( - vtCorr * dDepth) ; - // calcolo elevazione - double dElev ; - if ( ! GetElevation( pLine->GetStart(), pLine->GetEnd(), vtCorr, dElev)) { + // calcolo elevazione (sui due bordi della striscia + double dElev, dElev2 ; + Vector3d vtThick = vtTool * m_TParams.m_dThick ; + if ( ! GetElevation( pLine->GetStart(), pLine->GetEnd(), vtCorr, dElev) || + ! GetElevation( pLine->GetStart() + vtThick, pLine->GetEnd() + vtThick, vtCorr, dElev2) ) { string sOut = "Entity not elevation-enabled by Sawing" ; LOG_INFO( GetEMkLogger(), sOut.c_str()) ; return false ; } + dElev = max( dElev, dElev2) ; // direzione linea corrente Vector3d vtDirC ; pLine->GetStartDir( vtDirC) ; diff --git a/Simulator.cpp b/Simulator.cpp index b943aac..09f39e2 100644 --- a/Simulator.cpp +++ b/Simulator.cpp @@ -95,11 +95,13 @@ Simulator::Start( void) //---------------------------------------------------------------------------- bool -Simulator::Move( void) +Simulator::Move( int& nStatus) { // Verifiche - if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) + if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) { + nStatus = MCH_SIM_ERR ; return false ; + } // Se arrivato alla fine dell'interpolazione, recupero una nuova entità if ( m_dCoeff > 0.999) { m_nEntId = m_pGeomDB->GetNext( m_nEntId) ; @@ -115,22 +117,41 @@ Simulator::Move( void) if ( m_nCLPathId == GDB_ID_NULL) { m_nOpId = m_pMchMgr->GetNextOperation( m_nOpId) ; // se non ce ne sono altre, sono alla fine - if ( m_nOpId == GDB_ID_NULL) + if ( m_nOpId == GDB_ID_NULL) { + nStatus = MCH_SIM_END ; return false ; + } // aggiorno gli altri dati int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOpId, MCH_CL) ; m_nCLPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ; m_nEntId = m_pGeomDB->GetFirstInGroup( m_nCLPathId) ; m_dCoeff = 0 ; // aggiorno utensile e assi conseguenti - if ( ! UpdateTool() || ! UpdateAxes()) + if ( ! UpdateTool() || ! UpdateAxes()) { + nStatus = MCH_SIM_ERR ; return false ; + } } // Cerco prossima posizione su interpolazione corrente CamData* pCamData = dynamic_cast( m_pGeomDB->GetUserObj( m_nEntId)) ; - if ( pCamData == nullptr || pCamData->GetAxesStatus() != CamData::AS_OK) + if ( pCamData == nullptr) { + nStatus = MCH_SIM_ERR ; return false ; + } + switch ( pCamData->GetAxesStatus()) { + case CamData::AS_OK : + break ; + case CamData::AS_OUTSTROKE : + nStatus = MCH_SIM_OUTSTROKE ; + return false ; + case CamData::AS_DIR_ERR : + nStatus = MCH_SIM_DIR_ERR ; + return false ; + default : + nStatus = MCH_SIM_ERR ; + return false ; + } const DBLVECTOR& AxesEnd = pCamData->GetAxisVal() ; // Verifico se movimento in rapido bool bRapid = ( pCamData->GetFeed() < EPS_SMALL) ; @@ -152,6 +173,7 @@ Simulator::Move( void) if ( m_dCoeff > 0.999) m_AxesVal = AxesEnd ; + nStatus = MCH_SIM_OK ; return true ; } diff --git a/Simulator.h b/Simulator.h index 2b2bf1c..fc90542 100644 --- a/Simulator.h +++ b/Simulator.h @@ -14,6 +14,7 @@ #pragma once #include "CamData.h" +#include "/EgtDev/Include/EMkSimuGenConst.h" class MachMgr ; class IGeomDB ; @@ -26,7 +27,7 @@ class Simulator ~Simulator( void) ; bool Init( MachMgr* pMchMgr) ; bool Start( void) ; - bool Move( void) ; + bool Move( int& nStatus) ; bool GetAxisInfoPos( int nI, std::string& sName, double& dVal) ; bool SetStep( double dStep) ; bool Stop( void) ; diff --git a/Table.cpp b/Table.cpp index 2827160..d0c7549 100644 --- a/Table.cpp +++ b/Table.cpp @@ -99,11 +99,12 @@ Table::Table( void) //---------------------------------------------------------------------------- bool -Table::Set( const string& sName, int nType, const Point3d& ptRef1) +Table::Set( const string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1) { m_sName = sName ; m_nType = nType ; m_ptRef1 = ptRef1 ; + m_b3Area1 = b3Area1 ; return true ; } diff --git a/Table.h b/Table.h index 27bb8ab..6081c86 100644 --- a/Table.h +++ b/Table.h @@ -30,10 +30,15 @@ class Table : public IUserObj public : Table( void) ; - bool Set( const std::string& sName, int nType, const Point3d& ptRef1) ; - const std::string& GetName( void) { return m_sName ; } - int GetType( void) { return m_nType ; } - const Point3d& GetRef1( void) { return m_ptRef1 ; } + bool Set( const std::string& sName, int nType, const Point3d& ptRef1, const BBox3d& b3Area1) ; + const std::string& GetName( void) + { return m_sName ; } + int GetType( void) + { return m_nType ; } + const Point3d& GetRef1( void) + { return m_ptRef1 ; } + const BBox3d& GetArea1( void) + { return m_b3Area1 ; } private : int m_nOwnerId ; @@ -41,4 +46,5 @@ class Table : public IUserObj std::string m_sName ; int m_nType ; Point3d m_ptRef1 ; + BBox3d m_b3Area1 ; } ; \ No newline at end of file