diff --git a/Pocketing.cpp b/Pocketing.cpp index 62f6d4a..dc159b7 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -1950,7 +1950,7 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con // verifico se si tratta di caso ottimizzato bool bOptimizedZigZag = false ; bool bOutRawLeadIn = false ; - if ( ! OptimizedZigZag( nPathId, frPocket, bOptimizedZigZag, vpCrvs)) + if ( ! OptimizedZigZag( nPathId, vtTool, dDepth, dSafeZ, frPocket, bOptimizedZigZag, vpCrvs)) return false ; if ( bOptimizedZigZag && ! vpCrvs.empty()) { nOffsCrvNbr = 1 ; @@ -2504,7 +2504,8 @@ Pocketing::CalcZigZag( const ICurveComposite* pOffs, //---------------------------------------------------------- bool -Pocketing::OptimizedZigZag( int nPathId, Frame3d& frPocket, bool& bOptimizedZigZag, ICRVCOMPOPOVECTOR& vpCrvs) +Pocketing::OptimizedZigZag( int nPathId, const Vector3d& vtTool, double dDepth, double dSafeZ, + Frame3d& frPocket, bool& bOptimizedZigZag, ICRVCOMPOPOVECTOR& vpCrvs) { // recupero la curva originale che delimita la svuotatura int nCrvId = m_pGeomDB->GetFirstInGroup( nPathId) ; @@ -2574,19 +2575,32 @@ Pocketing::OptimizedZigZag( int nPathId, Frame3d& frPocket, bool& bOptimizedZigZ if ( nClosedSides == 1) { // inverto il percorso vpCrvs[0]->Invert() ; - // allungo opportunamente inizio e fine + // verifico se attacco fuori dal grezzo Point3d ptStart ; vpCrvs[0]->GetStartPoint( ptStart) ; Vector3d vtDir ; vpCrvs[0]->GetStartDir( vtDir) ; - vtDir.Rotate( Z_AX, ( m_Params.m_bInvert ? - 90 : 90)) ; - ptStart += vtDir ; - vpCrvs[0]->AddLine( ptStart, false) ; - vpCrvs[0]->ExtendEndByLen( m_TParams.m_dDiam / 4) ; + Point3d ptTest = ptStart + ( -vtDir) * ( m_TParams.m_dDiam / 2 + dSafeZ) ; + ptTest.ToGlob( frPocket) ; + ptTest += - vtTool * dDepth ; + double dTestElev ; + // se è nel grezzo provo a ruotare di 90 gradi + if ( GetElevation( m_nPhase, ptTest, vtTool, m_TParams.m_dDiam / 2, vtTool, dTestElev) && dTestElev > EPS_SMALL) { + Vector3d vtDirO = vtDir ; + vtDirO.Rotate( Z_AX, ( m_Params.m_bInvert ? -90 : 90)) ; + Point3d ptTestO = ptStart + vtDirO * ( m_TParams.m_dDiam / 2 + dSafeZ) ; + ptTestO.ToGlob( frPocket) ; + ptTestO += - vtTool * dDepth ; + double dTestElevO ; + // se è fuori dal grezzo uso inizio ruotato + if ( ! GetElevation( m_nPhase, ptTestO, vtTool, m_TParams.m_dDiam / 2, vtTool, dTestElevO) || dTestElevO < EPS_SMALL) { + Point3d ptNewStart = ptStart + vtDirO ; + vpCrvs[0]->AddLine( ptNewStart, false) ; + } + } } - // se due lati chiusi consecutivi o tre lati chiusi... - if (( nClosedSides == 2 && ! bTwoOpposite) || nClosedSides == 3) { + else if ( ( nClosedSides == 2 && ! bTwoOpposite) || nClosedSides == 3) { // inverto il percorso vpCrvs[0]->Invert() ; // allungo opportunamente inizio e fine @@ -2594,7 +2608,7 @@ Pocketing::OptimizedZigZag( int nPathId, Frame3d& frPocket, bool& bOptimizedZigZ vpCrvs[0]->GetStartPoint( ptStart) ; Vector3d vtDir ; vpCrvs[0]->GetStartDir( vtDir) ; - vtDir.Rotate( Z_AX, ( m_Params.m_bInvert ? - 90 : 90)) ; + vtDir.Rotate( Z_AX, ( m_Params.m_bInvert ? -90 : 90)) ; ptStart += vtDir ; Point3d ptEnd ; vpCrvs[0]->GetEndPoint( ptEnd) ; diff --git a/Pocketing.h b/Pocketing.h index 14c93e9..9cdc481 100644 --- a/Pocketing.h +++ b/Pocketing.h @@ -78,7 +78,8 @@ class Pocketing : public Machining bool AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, const Vector3d& vtExtr, double dDepth, double dElev, double dOkStep, bool bSplitArcs, int nPathId) ; bool CalcZigZag( const ICurveComposite* pOffs, ICRVCOMPOPOVECTOR& vpCrvs) ; - bool OptimizedZigZag( int nPathId, Frame3d& frPocket, bool& bOptimizedZigZag, ICRVCOMPOPOVECTOR& vpCrvs) ; + bool OptimizedZigZag( int nPathId, const Vector3d& vtTool, double dDepth, double dSafeZ, + Frame3d& frPocket, bool& bOptimizedZigZag, ICRVCOMPOPOVECTOR& vpCrvs) ; bool ZigZagOptimizedNoClosedEdges( ICurveComposite* pCrvPocket, bool& bOptimizedZigZag) ; bool ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClosedId, bool& bOptimizedZigZag) ; bool ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag, bool& bOpposite) ;