diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 99d26b7..e64e2ea 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/GeoConst.h b/GeoConst.h index 4b3b058..f9667c7 100644 --- a/GeoConst.h +++ b/GeoConst.h @@ -16,6 +16,9 @@ //----------------- Costanti generali ---------------------------------------- #include "/EgtDev/Include/EGkGeoConst.h" +//----------- Minima distanza di sicurezza ---------------------------------- +const double MIN_SAFEDIST = 5.0 ; + //----------- Costanti per approssimazioni con polilinee o poliarchi -------- const double LIN_TOL_STD = 0.1 ; const double LIN_TOL_MID = 0.05 ; diff --git a/Milling.cpp b/Milling.cpp index 6574bda..ece3158 100644 --- a/Milling.cpp +++ b/Milling.cpp @@ -46,7 +46,6 @@ using namespace std ; //------------------------------ Constants ------------------------------------ const double OSC_MIN_LEN = 0.1 ; -const double MIN_SAFEDIST = 5.0 ; const double LIM_DOWN_APPRZ = -0.5 ; const double DELTA_ELEV_RAD = 4.0 ; const double LIM_SIN_DIFF_DIR = 0.175 ; diff --git a/Operation.cpp b/Operation.cpp index 18a6647..bb895f1 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -4172,7 +4172,6 @@ Operation::OneMoveTestCollisionAvoid( const STRVECTOR& vAxName, const DBLVECTOR& // distanza di sicurezza const double TOL_SAFEDIST = 5.0 ; - const double MIN_SAFEDIST = 5.0 ; double dSafeDist = GetSafeZ() ; dSafeDist = max( dSafeDist - TOL_SAFEDIST, MIN_SAFEDIST) ; // Vado nelle posizioni da controllare diff --git a/Sawing.cpp b/Sawing.cpp index 82c80c5..a54e82d 100644 --- a/Sawing.cpp +++ b/Sawing.cpp @@ -16,6 +16,7 @@ #include "MachMgr.h" #include "DllMain.h" #include "Sawing.h" +#include "GeoConst.h" #include "OperationConst.h" #include "/EgtDev/Include/EXeCmdLogOff.h" #include "/EgtDev/Include/EXeConst.h" @@ -98,6 +99,7 @@ Sawing::Clone( void) const pSaw->m_nPhase = m_nPhase ; pSaw->m_Params = m_Params ; pSaw->m_TParams = m_TParams ; + pSaw->m_bDownSE = m_bDownSE ; pSaw->m_nStatus = m_nStatus ; pSaw->m_nCuts = m_nCuts ; } @@ -211,6 +213,7 @@ Sawing::Sawing( void) m_Params.m_sToolName = "*" ; m_TParams.m_sName = "*" ; m_TParams.m_sHead = "*" ; + m_bDownSE = false ; m_nStatus = MCH_ST_TO_VERIFY ; m_nCuts = 0 ; } @@ -689,6 +692,11 @@ Sawing::Apply( bool bRecalc, bool bPostApply) if ( ! VerifySideAngle()) return false ; + // verifiche per attacchi/uscite senza approcci e retrazioni + int nDownSE = 0 ; + FromString( ExtractInfo( m_Params.m_sUserNotes, "DownSE="), nDownSE) ; + m_bDownSE = ( nDownSE != 0 && m_Params.m_nStepType == SAW_ST_TOANDFROM) ; + // recupero gruppo per geometria di lavorazione (Cutter Location) int nClId = m_pGeomDB->GetFirstNameInGroup( m_nOwnerId, MCH_CL) ; // se non c'è, lo aggiungo @@ -3822,8 +3830,16 @@ Sawing::GenerateIntArcCl( const ICurveArc* pArc, bool Sawing::AddApproach( const Point3d& ptP, const Vector3d& vtCorr, double dSafeZ, double dElev, double dAppr) { - // se distanza di sicurezza minore di distanza di inizio - if ( dSafeZ < m_Params.m_dStartPos + 10 * EPS_SMALL) { + // se abilitato approccio diretto fuori dal grezzo (solo per lavorazione ToAndFrom) + if ( m_bDownSE) { + // 1 -> punto sopra inizio + SetFlag( 1) ; + Point3d ptP1 = ptP + vtCorr * ( dElev / 2 + dAppr / vtCorr.z) ; + if ( AddRapidStart( ptP1) == GDB_ID_NULL) + return false ; + } + // se distanza di sicurezza minore di distanza di inizio + else if ( dSafeZ < m_Params.m_dStartPos + 10 * EPS_SMALL) { // 1 -> punto sopra inizio SetFlag( 1) ; Point3d ptP1 = ptP + vtCorr * ( dElev + dAppr / vtCorr.z) ; @@ -3849,7 +3865,17 @@ Sawing::AddApproach( const Point3d& ptP, const Vector3d& vtCorr, double dSafeZ, bool Sawing::AddRetract( const Point3d& ptP, const Vector3d& vtCorr, double dSafeZ, double dElev, double dAppr) { - if ( dSafeZ < m_Params.m_dStartPos + 10 * EPS_SMALL) { + // se abilitato retrazione diretta fuori dal grezzo (solo per lavorazione ToAndFrom) + if ( m_bDownSE) { + // 4 -> movimento di risalita sopra il punto finale + SetFeed( GetEndFeed()) ; + Point3d ptP4 = ptP + vtCorr * ( dElev / 2 + dAppr / vtCorr.z) ; + if ( AddRapidMove( ptP4) == GDB_ID_NULL) + return false ; + // elevazione da considerare nella retrazione + double dRtrElev = ( m_bDownSE ? 0 : dElev) ; + } + else if ( dSafeZ < m_Params.m_dStartPos + 10 * EPS_SMALL) { // 4 -> movimento di risalita sopra il punto finale SetFeed( GetEndFeed()) ; Point3d ptP4 = ptP + vtCorr * ( dElev + dAppr / vtCorr.z) ; @@ -3964,7 +3990,7 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC bool& bToSkip, double& dDeltaLiExt, double& dDeltaLoExt) { // distanza XY tra centro e bordo taglio - double dDeltaT = (( dElev < 0.5 * m_TParams.m_dDiam) ? sqrt( dElev * m_TParams.m_dDiam - dElev * dElev) : 0) ; + double dDeltaT = (( dElev < 0.5 * m_TParams.m_dDiam) ? sqrt( dElev * m_TParams.m_dDiam - dElev * dElev) : 0.5 * m_TParams.m_dDiam) ; // lunghezza aggiuntiva per attacco speciale a zigzag double dDeltaLi = 0 ; if ( dLiElev > EPS_SMALL) @@ -4000,7 +4026,7 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC for ( int i = 0 ; i < 4 ; ++i) dDeltaI = max( dDeltaI, dDist[i]) ; if ( m_Params.m_nLeadInType == SAW_LI_EXT_OUT) - dDeltaI += dDeltaT ; + dDeltaI += dDeltaT + ( m_bDownSE ? MIN_SAFEDIST : 0) ; dDeltaLiExt = dDeltaI ; } } @@ -4024,7 +4050,7 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC for ( int i = 0 ; i < 4 ; ++i) dDeltaI = max( dDeltaI, dDist[i]) ; if ( m_Params.m_nLeadInType == SAW_LI_EXT_OUT) - dDeltaI += dDeltaT ; + dDeltaI += dDeltaT + ( m_bDownSE ? MIN_SAFEDIST : 0) ; dDeltaLiExt = dDeltaI ; } } @@ -4059,7 +4085,7 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC for ( int i = 0 ; i < 4 ; ++i) dDeltaF = max( dDeltaF, dDist[i]) ; if ( m_Params.m_nLeadOutType == SAW_LO_EXT_OUT) - dDeltaF += dDeltaT ; + dDeltaF += dDeltaT + ( m_bDownSE ? MIN_SAFEDIST : 0) ; dDeltaLoExt = dDeltaF ; } } @@ -4084,7 +4110,7 @@ Sawing::AdjustLineForEdges( ICurveLine* pLine, double dElev, const Vector3d& vtC dDeltaF = max( dDeltaF, dDist[i]) ; // se LeadOut EXT_OUT vado all'esterno if ( m_Params.m_nLeadOutType == SAW_LO_EXT_OUT) - dDeltaF += dDeltaT ; + dDeltaF += dDeltaT + ( m_bDownSE ? MIN_SAFEDIST : 0) ; dDeltaLoExt = dDeltaF ; } } diff --git a/Sawing.h b/Sawing.h index 666efb8..a44fc58 100644 --- a/Sawing.h +++ b/Sawing.h @@ -164,6 +164,7 @@ class Sawing : public Machining SELVECTOR m_vId ; // identificativi entità geometriche da lavorare SawingData m_Params ; // parametri lavorazione ToolData m_TParams ; // parametri utensile + bool m_bDownSE ; // flag per attacco/uscita senza risalite se fuori dal grezzo int m_nStatus ; // stato di aggiornamento della lavorazione int m_nCuts ; // numero di tagli generati } ; diff --git a/SurfFinishingData.cpp b/SurfFinishingData.cpp index 8ac83d8..fac40bc 100644 --- a/SurfFinishingData.cpp +++ b/SurfFinishingData.cpp @@ -390,7 +390,8 @@ bool SurfFinishingData::VerifySubType( int nVal) const { return ( nVal == SURFFIN_SUB_ZIGZAG || nVal == SURFFIN_SUB_ONEWAY || - nVal == SURFFIN_SUB_SPIRALIN || nVal == SURFFIN_SUB_SPIRALOUT) ; + nVal == SURFFIN_SUB_SPIRALIN || nVal == SURFFIN_SUB_SPIRALOUT || + nVal == SURFFIN_SUB_Z_CONST || nVal == SURFFIN_SUB_OPTIMAL) ; } //----------------------------------------------------------------------------