diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index e21ec0f..d31586c 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/MachMgr.h b/MachMgr.h index cea3dd9..93b25e6 100644 --- a/MachMgr.h +++ b/MachMgr.h @@ -278,6 +278,7 @@ class MachMgr : public IMachMgr bool GetCalcTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool bOverall, bool bBottom, Point3d& ptTip) const ; bool GetCalcToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const override ; + bool GetCalcAuxDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const override ; bool GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const override ; bool LimitAngleToStroke( int nInd, double& dAng) const override ; bool VerifyOutstroke( double dX, double dY, double dZ, double dAngA, double dAngB, int& nStat) override ; diff --git a/MachMgrMachines.cpp b/MachMgrMachines.cpp index 59d3f34..c8f2d19 100644 --- a/MachMgrMachines.cpp +++ b/MachMgrMachines.cpp @@ -537,6 +537,14 @@ MachMgr::GetCalcToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) return ( ( pMch != nullptr) ? pMch->GetToolDirFromAngles( dAngA, dAngB, vtDir) : false) ; } +//---------------------------------------------------------------------------- +bool +MachMgr::GetCalcAuxDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const +{ + Machine* pMch = GetCurrMachine() ; + return ( ( pMch != nullptr) ? pMch->GetAuxDirFromAngles( dAngA, dAngB, vtDir) : false) ; +} + //---------------------------------------------------------------------------- bool MachMgr::GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const diff --git a/Machine.h b/Machine.h index 2cde62e..a66dab8 100644 --- a/Machine.h +++ b/Machine.h @@ -109,6 +109,7 @@ class Machine bool GetTipFromPositions( double dX, double dY, double dZ, const DBLVECTOR& vAng, bool bBottom, bool bOverall, Point3d& ptTip) const ; bool GetToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const ; + bool GetAuxDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const ; bool GetNearestAngleInStroke( int nInd, double dAngRef, double& dAng) const ; bool LimitAngleToStroke( int nInd, double& dAng) const ; bool VerifyAngleOutstroke( int nInd, double dAng) const ; diff --git a/MachineCalc.cpp b/MachineCalc.cpp index 01888fc..1ecdfd7 100644 --- a/MachineCalc.cpp +++ b/MachineCalc.cpp @@ -1061,6 +1061,14 @@ Machine::GetToolDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) cons return GetDirection( m_vtCalcDir, vAng, vtDir) ; } +//---------------------------------------------------------------------------- +bool +Machine::GetAuxDirFromAngles( double dAngA, double dAngB, Vector3d& vtDir) const +{ + DBLVECTOR vAng( 2) ; vAng[0] = dAngA ; vAng[1] = dAngB ; + return GetDirection( m_vtCalcADir, vAng, vtDir) ; +} + //---------------------------------------------------------------------------- bool Machine::GetSccDir( int nSolCh, const Vector3d& vtDirA, Vector3d& vtDirScc) const diff --git a/Operation.cpp b/Operation.cpp index d01c1fc..78af160 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -1088,7 +1088,7 @@ Operation::AdjustStartEndMovements( void) // determino posizione precedente assi DBLVECTOR vAxVal ; - bool bHomeZ = false ; + bool bMaxZ = false ; // se primo utensile o richiesto, uso la posizione home if ( sPrevTool.empty() || NeedPrevHome()) { // imposto l'utensile per i calcoli macchina @@ -1097,8 +1097,8 @@ Operation::AdjustStartEndMovements( void) // recupero posizione home if ( ! m_pMchMgr->GetAllCalcAxesHomePos( vAxVal)) return false ; - // si parte da HomeZ - bHomeZ = true ; + // si parte da Z massima + bMaxZ = true ; } // se utensile non cambiato o su diversa uscita della stessa testa, uso posizione finale della lavorazione precedente else if ( ! ToolChangeNeeded( *pPrevOp, *this)) { @@ -1111,19 +1111,22 @@ Operation::AdjustStartEndMovements( void) DBLVECTOR vAxIni ; if ( ! pPrevOp->GetFinalAxesValues( vAxVal) || ! GetInitialAxesValues( vAxIni)) return false ; + // aggiungo eventuale delta Z + double dDelta = 0 ; // determino delta Z rispetto a posizione finale if ( vAxVal.size() >= 4 && vAxIni.size() >= 4) { // verifico se movimento assi rotanti richiede una risalita parziale - double dDelta = 0 ; if ( ! CalcDeltaZForHeadRotation( vAxVal, vAxIni, dDelta)) return false ; - // se necessaria, aggiungo risalita parziale - if ( dDelta > EPS_SMALL) { - if ( ! pPrevOp->AddRise( vAxVal, dDelta)) - return false ; - // aggiorno quota in Z della posizione iniziale ( anche se verrà aggiornata solo in seguito) - vAxIni[2] = vAxVal[2] ; - } + } + // confronto con eventuale risalita di inizio lavorazione + dDelta = max( dDelta, ( vAxIni[2] - vAxVal[2])) ; + // se necessaria, aggiungo risalita parziale + if ( dDelta > 100 * EPS_SMALL) { + if ( ! pPrevOp->AddRise( vAxVal, dDelta)) + return false ; + // aggiorno quota in Z della posizione iniziale ( anche se verrà aggiornata solo in seguito) + vAxIni[2] = vAxVal[2] ; } // verifico se la testa interferisce con i pezzi o i bloccaggi sulla tavola if ( ! TestCollisionAvoid( vAxVal, vAxIni)) { @@ -1132,8 +1135,8 @@ Operation::AdjustStartEndMovements( void) // aggiungo risalita a Zmax if ( ! pPrevOp->AddRise( vAxVal)) return false ; - // si parte da HomeZ - bHomeZ = true ; + // si parte da Z massima + bMaxZ = true ; } } // altrimenti aggiungo uscita per cambio utensile alla lavorazione precedente e parto da questa @@ -1148,8 +1151,8 @@ Operation::AdjustStartEndMovements( void) // imposto l'utensile per i calcoli macchina if ( ! m_pMchMgr->SetCalcTool( GetToolName(), GetHeadName(), GetExitNbr())) return false ; - // si parte da HomeZ - bHomeZ = true ; + // si parte da Z massima + bMaxZ = true ; } // aggiusto l'inizio di ogni percorso di lavoro @@ -1157,9 +1160,9 @@ Operation::AdjustStartEndMovements( void) int nClPathId = m_pGeomDB->GetFirstGroupInGroup( nClId) ; while ( bOk && nClPathId != GDB_ID_NULL) { // sistemo inizio - if ( ! AdjustOneStartMovement( nClPathId, vAxVal, bHomeZ)) + if ( ! AdjustOneStartMovement( nClPathId, vAxVal, bMaxZ)) bOk = false ; - bHomeZ = false ; + bMaxZ = false ; // recupero nuovi finali if ( ! GetClPathFinalAxesValues( nClPathId, vAxVal)) bOk = false ; @@ -1170,15 +1173,18 @@ Operation::AdjustStartEndMovements( void) // aggiungo risalita finale bOk = bOk && AddRise( vAxVal) ; - // vado in home - bOk = bOk && AddHome() ; + // se ultima operazione o la successiva lo richiede, vado in home + int nNextOpId = m_pMchMgr->GetNextActiveOperation( m_nOwnerId) ; + Operation* pNextOp = GetOperation( m_pGeomDB->GetUserObj( nNextOpId)) ; + if ( pNextOp == nullptr || pNextOp->NeedPrevHome()) + bOk = bOk && AddHome() ; return bOk ; } //---------------------------------------------------------------------------- bool -Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bHomeZ) +Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bMaxZ) { if ( m_pMchMgr == nullptr || m_pGeomDB == nullptr) return false ; @@ -1191,8 +1197,8 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool // recupero i valori degli assi DBLVECTOR vAxCurr ; vAxCurr = pCamData->GetAxesVal() ; - // se provengo da HomeZ (ovvero Z massima) - if ( bHomeZ) { + // se provengo da Z massima + if ( bMaxZ) { // copio l'entità if ( m_pGeomDB->Copy( nEntId, GDB_ID_NULL, nEntId, GDB_AFTER) == GDB_ID_NULL) return false ; @@ -1283,7 +1289,7 @@ Operation::AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool // altrimenti else { // se Z pressochè uguali non devo fare alcunché - if ( fabs( vAxCurr[2] - vAxPrev[2]) < 10 * EPS_SMALL) + if ( fabs( vAxCurr[2] - vAxPrev[2]) < 100 * EPS_SMALL) return true ; // se Z corrente maggiore della precedente else if ( vAxCurr[2] > vAxPrev[2]) { diff --git a/Operation.h b/Operation.h index 75ed1db..c73c0de 100644 --- a/Operation.h +++ b/Operation.h @@ -84,7 +84,7 @@ class Operation : public IUserObj bool CalculateClPathAxesValues( int nClPathId, int nLinAxes, int nRotAxes, double dRot1W, DBLVECTOR& vAxRotPrec, int& nOutStrC) ; bool AdjustStartEndMovements( void) ; - bool AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bHomeZ) ; + bool AdjustOneStartMovement( int nClPathId, const DBLVECTOR& vAxPrev, bool bMaxZ) ; bool ToolChangeNeeded( const Operation& Op1, const Operation& Op2) ; bool AddRise( DBLVECTOR& vAxVal, double dDelta = - 1) ; bool RemoveRise( void) ;