diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index d4d1698..8221726 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/MachMgr.h b/MachMgr.h index 1cedcad..34c0ac1 100644 --- a/MachMgr.h +++ b/MachMgr.h @@ -376,10 +376,12 @@ class MachMgr : public IMachMgr double GetCalcRot1W( void) const ; bool SetCalcSolCh( int nScc) ; bool VerifyAngleOutstroke( int nInd, double dAng) const ; - // operations + // Operations bool GetOperationNewName( std::string& sName) const ; const ToolData* GetMachiningToolData( void) const ; - + // Machine + bool GetHeadAbove( const std::string& sHead) const ; + private : // Basic void Clear( void) ; diff --git a/MachMgrMachines.cpp b/MachMgrMachines.cpp index dd53656..67a6c5d 100644 --- a/MachMgrMachines.cpp +++ b/MachMgrMachines.cpp @@ -233,6 +233,16 @@ MachMgr::GetHeadExitCount( const string& sHead) const return ( ( pMch != nullptr) ? pMch->GetHeadExitCount( sHead) : 0) ; } +//---------------------------------------------------------------------------- +bool +MachMgr::GetHeadAbove( const string& sHead) const +{ + if ( m_pGeomDB == nullptr) + return false ; + bool bAbove = true ; + return ( ! m_pGeomDB->GetInfo( GetHeadId( sHead), "ABOVE", bAbove) || bAbove) ; +} + //---------------------------------------------------------------------------- bool MachMgr::GetAxisToken( const string& sAxis, string& sToken) const diff --git a/Milling.cpp b/Milling.cpp index eaef887..3225d2b 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -1752,7 +1752,7 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo // determino se l'inizio dell'attacco è fuori dal grezzo bool bOutStart = GetPointOutOfRaw( ptP1, vtTool) ; // determino se l'inizio dell'attacco è sopra il grezzo - bool bAboveStart = GetPointAboveRaw( ptP1) ; + bool bAboveStart = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // aggiungo approccio per frese normali con spazio sopra attacco if ( ( m_TParams.m_nType & TF_SAWBLADE) == 0) { // correggo elevazione iniziale con punto inizio attacco @@ -1829,7 +1829,7 @@ Milling::AddStandardMilling( const ICurveComposite* pCompo, const Vector3d& vtTo // correggo elevazione finale con punto fine uscita dEndElev -= ( ptP1 - ptEnd) * vtExtr ; // determino se la fine dell'uscita è sopra il grezzo - bool bAboveEnd = GetPointAboveRaw( ptP1) ; + bool bAboveEnd = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // aggiungo retrazione if ( ! AddRetract( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dEndElev, dAppr, bAboveEnd)) { m_pMchMgr->SetLastError( 2312, "Error in Milling : Retract not computable") ; @@ -1898,7 +1898,7 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // determino se l'inizio dell'attacco è fuori dal grezzo bool bOutStart = GetPointOutOfRaw( ptP1, vtTool) ; // determino se l'inizio dell'attacco è sopra il grezzo - bool bAboveStart = GetPointAboveRaw( ptP1) ; + bool bAboveStart = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // se primo step aggiungo approccio per frese normali if ( j == 1 && ( m_TParams.m_nType & TF_SAWBLADE) == 0) { // correggo elevazione iniziale con punto inizio attacco @@ -1989,7 +1989,7 @@ Milling::AddZigZagMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // correggo elevazione finale con punto fine uscita dEndElev -= ( ptP1 - ptEnd) * vtExtr ; // determino se la fine dell'uscita è sopra il grezzo - bool bAboveEnd = GetPointAboveRaw( ptP1) ; + bool bAboveEnd = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // aggiungo retrazione if ( ! AddRetract( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dEndElev, dAppr, bAboveEnd)) { m_pMchMgr->SetLastError( 2312, "Error in Milling : Retract not computable") ; @@ -2059,7 +2059,7 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // determino se l'inizio dell'attacco è fuori dal grezzo bool bOutStart = GetPointOutOfRaw( ptP1, vtTool) ; // determino se l'inizio dell'attacco è sopra il grezzo - bool bAboveStart = GetPointAboveRaw( ptP1) ; + bool bAboveStart = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // aggiungo approccio per frese normali if ( ( m_TParams.m_nType & TF_SAWBLADE) == 0) { // correggo elevazione iniziale con punto inizio attacco @@ -2140,7 +2140,7 @@ Milling::AddOneWayMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // correggo elevazione finale con punto fine uscita dEndElev -= ( ptP1 - ptEnd) * vtExtr ; // determino se la fine dell'uscita è sopra il grezzo - bool bAboveEnd = GetPointAboveRaw( ptP1) ; + bool bAboveEnd = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // aggiungo retrazione if ( ! AddRetract( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dEndElev, dAppr, bAboveEnd)) { m_pMchMgr->SetLastError( 2312, "Error in Milling : Retract not computable") ; @@ -2205,6 +2205,7 @@ Milling::AddSpiralMilling( const ICurveComposite* pCompo, const Vector3d& vtTool double dStElev ; if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), dStElev)) dStElev = 0 ; + dStElev -= dStart ; // determino inizio attacco Point3d ptP1 ; if ( ! CalcLeadInStart( ptStart, vtStart, vtExtr, dStElev, false, pCompo, ptP1)) @@ -2212,7 +2213,7 @@ Milling::AddSpiralMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // determino se l'inizio dell'attacco è fuori dal grezzo bool bOutStart = GetPointOutOfRaw( ptP1, vtTool) ; // determino se l'inizio dell'attacco è sopra il grezzo - bool bAboveStart = GetPointAboveRaw( ptP1) ; + bool bAboveStart = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // aggiungo approccio per frese normali if ( ( m_TParams.m_nType & TF_SAWBLADE) == 0) { // correggo elevazione iniziale con punto inizio attacco @@ -2288,7 +2289,7 @@ Milling::AddSpiralMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // correggo elevazione finale con punto fine uscita dEndElev -= ( ptP1 - ptEnd) * vtExtr ; // determino se la fine dell'uscita è sopra il grezzo - bool bAboveEnd = GetPointAboveRaw( ptP1) ; + bool bAboveEnd = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // aggiungo retrazione if ( ! AddRetract( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dEndElev, dAppr, bAboveEnd)) { m_pMchMgr->SetLastError( 2312, "Error in Milling : Retract not computable") ; @@ -2335,6 +2336,7 @@ Milling::AddSpiralMilling( const ICurveComposite* pCompo, const Vector3d& vtTool double dStElev ; if ( ! GetElevation( m_nPhase, ptStart - 10 * EPS_SMALL * vtTool, vtTool, GetRadiusForStartEndElevation(), dStElev)) dStElev = dElev ; + dStElev -= dStart ; // determino inizio attacco Point3d ptP1 ; if ( ! CalcLeadInStart( ptStart, vtStart, vtExtr, dStElev, bInvert, pCompo, ptP1)) @@ -2346,7 +2348,7 @@ Milling::AddSpiralMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // determino se l'inizio dell'attacco è fuori dal grezzo bool bOutStart = GetPointOutOfRaw( ptP1, vtTool) ; // determino se l'inizio dell'attacco è sopra il grezzo - bool bAboveStart = GetPointAboveRaw( ptP1) ; + bool bAboveStart = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // approccio al punto iniziale if ( ! AddApproach( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dStElev, dAppr, bOutStart, bAboveStart)) { m_pMchMgr->SetLastError( 2309, "Error in Milling : Approach not computable") ; @@ -2412,7 +2414,7 @@ Milling::AddSpiralMilling( const ICurveComposite* pCompo, const Vector3d& vtTool // correggo elevazione finale con punto fine uscita dEndElev -= ( ptP1 - ptEnd) * vtExtr ; // determino se la fine dell'uscita è sopra il grezzo - bool bAboveEnd = GetPointAboveRaw( ptP1) ; + bool bAboveEnd = m_pMchMgr->GetHeadAbove( m_TParams.m_sHead) && GetPointAboveRaw( ptP1) ; // aggiungo retrazione if ( ! AddRetract( ptP1, vtTool, dSafeZ, dSafeAggrBottZ, dEndElev, dAppr, bAboveEnd)) { m_pMchMgr->SetLastError( 2312, "Error in Milling : Retract not computable") ; @@ -2466,6 +2468,7 @@ Milling::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, } // se non sono già sopra il pezzo e sopra attacco c'è spazio per sicurezza o approccio double dSafeDist = ( m_bAggrBottom ? dSafeAggrBottZ : dSafeZ) ; + double dElevZ = vtTool.z * dElev ; if ( ! bAboveStart && dElev + max( dSafeDist, dAppr) > 10 * EPS_SMALL) { // se distanza di sicurezza minore di distanza di inizio if ( dSafeDist < dAppr + 10 * EPS_SMALL) { @@ -2495,12 +2498,25 @@ Milling::AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, if ( AddLinearMove( ptP) == GDB_ID_NULL) return false ; } + // sono sopra il pezzo ma non abbastanza + else if ( bAboveStart && ( min( dElevZ, 0.) + dAppr) > 10 * EPS_SMALL) { + // 1b -> punto appena sopra inizio (in Z globale) + Point3d ptP1b = ptP + Z_AX * ( min( dElevZ, 0.) + dAppr) ; + if ( AddRapidStart( ptP1b) == GDB_ID_NULL) + return false ; + // affondo al punto iniziale + SetFlag( 0) ; + SetFeed( bOutStart ? GetStartFeed() : GetTipFeed()) ; + if ( AddLinearMove( ptP) == GDB_ID_NULL) + return false ; + } + // altrimenti else { // affondo diretto al punto iniziale - SetFlag( 0) ; if ( ( ! m_bAggrBottom && AddRapidStart( ptP) == GDB_ID_NULL) || ( m_bAggrBottom && AddRapidMove( ptP) == GDB_ID_NULL)) return false ; + SetFlag( 0) ; } return true ; } @@ -2512,6 +2528,7 @@ Milling::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, { // se non sono già sopra il pezzo e sopra uscita c'è spazio per sicurezza o approccio double dSafeDist = ( m_bAggrBottom ? dSafeAggrBottZ : dSafeZ) ; + double dElevZ = vtTool.z * dElev ; if ( ! bAboveEnd && dElev + max( dSafeDist, dAppr) > 10 * EPS_SMALL) { if ( dSafeDist < dAppr + 10 * EPS_SMALL) { // 4 -> movimento di risalita sopra il punto finale @@ -2534,6 +2551,29 @@ Milling::AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, return false ; } } + // sono sopra il pezzo ma non abbastanza + else if ( bAboveEnd && ( min( dElevZ, 0.) + dAppr) > 10 * EPS_SMALL) { + if ( dSafeDist < dAppr + 10 * EPS_SMALL) { + // 4 -> movimento di risalita sopra il punto finale + SetFeed( GetEndFeed()) ; + Point3d ptP4 = ptP + Z_AX * ( min( dElevZ, 0.) + dAppr) ; + if ( AddLinearMove( ptP4) == GDB_ID_NULL) + return false ; + } + else { + // 4a -> movimento di risalita appena sopra il punto finale + Point3d ptP4a = ptP + Z_AX * ( min( dElevZ, 0.) + dAppr) ; + if ( dElev + dAppr > EPS_SMALL) { + SetFeed( GetEndFeed()) ; + if ( AddLinearMove( ptP4a) == GDB_ID_NULL) + return false ; + } + // 4b -> movimento di risalita sopra il punto finale + Point3d ptP4b = ptP4a + Z_AX * ( dSafeDist - dAppr) ; + if ( AddRapidMove( ptP4b) == GDB_ID_NULL) + return false ; + } + } // se con aggregato da sotto if ( m_bAggrBottom) { // aggiuntivo in Z