diff --git a/Mortising.cpp b/Mortising.cpp index b160acc..15f915a 100644 --- a/Mortising.cpp +++ b/Mortising.cpp @@ -1345,7 +1345,7 @@ Mortising::ProcessPath( int nPathId, int nPvId, int nClId) GetValInNotes( m_Params.m_sUserNotes, "Plunge", nPlunge) ; // verifico che lo step dell'utensile sia sensato - double dOkStep = ( nPlunge == MORTISE_PLUNGE_STEP ? m_Params.m_dStep : 0) ; + double dOkStep = ( nPlunge == MORTISE_PLUNGE_STEP || nPlunge == MORTISE_PLUNGE_STEP_NO_SAFEZ ? m_Params.m_dStep : 0) ; const double MIN_ZSTEP = 1.0 ; if ( dOkStep >= EPS_SMALL && dOkStep < MIN_ZSTEP) { dOkStep = MIN_ZSTEP ; @@ -1567,6 +1567,15 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co { // compensazione elevazione/affondamento double dDelta = dElev - dDepth ; + // pre-calcolo step per modalità con step + int nStep = 1 ; + double dStep = dElev ; + if ( nPlunge == MORTISE_PLUNGE_STEP || nPlunge == MORTISE_PLUNGE_STEP_NO_SAFEZ) { + if ( dOkStep < EPS_SMALL) + dOkStep = dElev ; + nStep = max( 1, static_cast( ceil( ( dElev - 10 * EPS_SMALL) / dOkStep))) ; + dStep = dElev / nStep ; + } // determino se l'inizio dell'attacco è esattamente sotto il grezzo, nel qual caso ricalcolo l'elevazione double dSafeZ = GetSafeZ() + GetDeltaSafeZ( vtTool) ; @@ -1578,17 +1587,26 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co if ( ! bUnderStart) GetElevation( m_nPhase, ptLi, vtTool, GetRadiusForStartEndElevation(), vtTool, dStartElev) ; + // sicurezza su punto iniziale + double dAppr = dStartElev + dSafeZ ; + if ( nPlunge == MORTISE_PLUNGE_STEP_NO_SAFEZ) { + double dStartDownElev ; + if ( ! GetElevation( m_nPhase, ptStart, vtTool, GetRadiusForStartEndElevation(), vtTool, dStartDownElev)) + dStartDownElev = dDelta ; + if ( dStartDownElev < EPS_SMALL) + dAppr = -dStep ; + } + // 1 -> punto approccio int nFirstFlag = ( bFirst ? 1 : 0) ; SetFlag( nFirstFlag) ; - Point3d ptP1 = ( nPlunge != MORTISE_PLUNGE_END ? ptStart : ptEnd) + vtTool * ( dDelta + dStartElev + dSafeZ) ; - int nStart = AddRapidStartOrMove( ptP1, bFirst) ; - if ( nStart == GDB_ID_NULL) + Point3d ptP1 = ( nPlunge != MORTISE_PLUNGE_END ? ptStart : ptEnd) + vtTool * ( dDelta + dAppr) ; + if ( AddRapidStartOrMove( ptP1, bFirst) == GDB_ID_NULL) return false ; SetFlag( 0) ; // 2 -> punto fuori (se diverso dal precedente) - if ( m_Params.m_dStartPos < dSafeZ - 10 * EPS_SMALL) { + if ( m_Params.m_dStartPos < dAppr - 10 * EPS_SMALL) { Point3d ptP2 = ( nPlunge != MORTISE_PLUNGE_END ? ptStart : ptEnd) + vtTool * ( dDelta + m_Params.m_dStartPos) ; if ( AddRapidMove( ptP2) == GDB_ID_NULL) return false ; @@ -1616,10 +1634,6 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co } else { // determino numero e affondamento degli step - if ( dOkStep < EPS_SMALL) - dOkStep = dElev ; - int nStep = max( 1, static_cast( ceil( ( dElev - 10 * EPS_SMALL) / dOkStep))) ; - double dStep = dElev / nStep ; const double RETURN_DIST = 10 ; // a seconda del tipo switch ( m_Params.m_nStepType) { @@ -1629,7 +1643,7 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co SetFeed( GetStartFeed()) ; SetFlag( 0) ; Point3d ptP3 = (( i % 2 == 1) ? ptStart : ptEnd) + ( dDelta - i * dStep) * vtTool ; - if ( AddLinearMove( ptP3) == GDB_ID_NULL) + if ( AddLinearMove( ptP3) == GDB_ID_NULL && ! ( i == 1 && nPlunge == MORTISE_PLUNGE_STEP_NO_SAFEZ)) return false ; // 4 -> punto termine SetFeed( GetFeed()) ; @@ -1683,11 +1697,21 @@ Mortising::GenerateOnePlungeCl( const Point3d& ptStart, const Point3d& ptEnd, co // altrimenti ridetermino elevazione su fine percorso di lavoro if ( ! bUnderEnd) GetElevation( m_nPhase, ptLo, vtTool, GetRadiusForStartEndElevation(), vtTool, dEndElev) ; + + // sicurezza su punto finale + double dRetr = dEndElev + dSafeZ ; + if ( nPlunge == MORTISE_PLUNGE_STEP_NO_SAFEZ) { + double dEndDownElev ; + if ( ! GetElevation( m_nPhase, ptStart, vtTool, GetRadiusForStartEndElevation(), vtTool, dEndDownElev)) + dEndDownElev = dDelta ; + if ( dEndDownElev < EPS_SMALL) + dRetr = dEndElev - dStep ; + } // 6 -> ritorno all'approccio SetFeed( GetEndFeed()) ; SetFlag( 104) ; // risalita sopra la fine - Point3d ptP6 = ptLast + vtTool * ( dDelta + dEndElev + dSafeZ) ; + Point3d ptP6 = ptLast + vtTool * ( dDelta + dRetr) ; if ( AddLinearMove( ptP6) == GDB_ID_NULL) return false ;