diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index 8df702e..6be7f0d 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Pocketing.cpp b/Pocketing.cpp index 55ac7a9..82e9d90 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -2611,7 +2611,7 @@ Pocketing::OptimizedZigZag( int nPathId, Frame3d& frPocket, bool& bOptimizedZigZ bool Pocketing::ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClosedId, bool& bOptimizedZigZag) { - // verifico sia una linea + // verifico che il lato chiuso sia una linea PtrOwner pCrv( CloneCurveLine( pCrvPocket->GetCurve( nClosedId))) ; if ( IsNull( pCrv)) return true ; @@ -2621,7 +2621,7 @@ Pocketing::ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClose pCrvPocket->GetExtrusion( vtExtr) ; pCrv->SetExtrusion( vtExtr) ; - pCrv->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; + pCrv->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; pCrv->ExtendStartByLen( 100) ; pCrv->ExtendEndByLen( 100) ; @@ -2637,10 +2637,9 @@ Pocketing::ZigZagOptimizedOneClosedEdge( ICurveComposite* pCrvPocket, int nClose bool Pocketing::ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag, bool& bOpposite) { - // recupero le due curve chiuse + // verifico che i lati chiusi siano linee PtrOwner pCrv1( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[0]))) ; PtrOwner pCrv2( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[1]))) ; - // verifico siano linee if ( IsNull( pCrv1) || IsNull( pCrv2)) return true ; // verifico abbiano direzioni opposte @@ -2677,19 +2676,17 @@ Pocketing::ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INT // taglio per ultima la curva pił lunga if ( dLen1 > dLen2) { - PtrOwner pTmp( Release( pCrv1)) ; - pCrv1.Set( Release( pCrv2)) ; - pCrv2.Set( Release( pTmp)) ; + swap( pCrv1, pCrv2) ; } - pCrv1->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; + pCrv1->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; pCrv1->ExtendStartByLen( 100) ; pCrv1->ExtendEndByLen( 100) ; if ( ! CutCurveWithLine( pCrvPocket, pCrv1)) return false ; // sarą la prima curva del percorso - pCrv2->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; + pCrv2->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; pCrv2->ExtendStartByLen( 100) ; pCrv2->ExtendEndByLen( 100) ; if ( ! CutCurveWithLine( pCrvPocket, pCrv2)) @@ -2703,14 +2700,15 @@ Pocketing::ZigZagOptimizedTwoClosedEdges( ICurveComposite* pCrvPocket, const INT bool Pocketing::ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const INTVECTOR& vnClosedIds, bool& bOptimizedZigZag) { - // recupero le tre curve chiuse + // verifico che i lati chiusi siano linee PtrOwner pCrv1( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[0]))) ; PtrOwner pCrv2( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[1]))) ; PtrOwner pCrv3( CloneCurveLine( pCrvPocket->GetCurve( vnClosedIds[2]))) ; - // verifico siano linee if ( IsNull( pCrv1) || IsNull( pCrv2) || IsNull( pCrv3)) return true ; - // verifico siano consecutive + // verifico siano consecutivi + Point3d ptStart1 ; + pCrv1->GetStartPoint( ptStart1) ; Point3d ptEnd1 ; pCrv1->GetEndPoint( ptEnd1) ; Point3d ptStart2 ; @@ -2719,14 +2717,26 @@ Pocketing::ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const I pCrv2->GetEndPoint( ptEnd2) ; Point3d ptStart3 ; pCrv3->GetStartPoint( ptStart3) ; - if ( ! AreSamePointApprox( ptEnd1, ptStart2) || ! AreSamePointApprox( ptEnd2, ptStart3)) + Point3d ptEnd3 ; + pCrv3->GetEndPoint( ptEnd3) ; + if ( AreSamePointApprox( ptEnd1, ptStart2) && AreSamePointApprox( ptEnd2, ptStart3)) + ; + else if ( AreSamePointApprox( ptEnd2, ptStart3) && AreSamePointApprox( ptEnd3, ptStart1)) { + swap( pCrv1, pCrv2) ; + swap( pCrv2, pCrv3) ; + } + else if ( AreSamePointApprox( ptEnd3, ptStart1) && AreSamePointApprox( ptEnd1, ptStart2)) { + swap( pCrv1, pCrv3) ; + swap( pCrv3, pCrv2) ; + } + else return true ; - // verifico che primo e terzo non siano troppo lunghe + // verifico che primo e terzo non siano troppo lunghi double dLen1 ; pCrv1->GetLength( dLen1) ; - double dLen2 ; - pCrv2->GetLength( dLen2) ; - if ( dLen1 > 1.5 * m_TParams.m_dDiam || dLen2 > 1.5 * m_TParams.m_dDiam) + double dLen3 ; + pCrv3->GetLength( dLen3) ; + if ( dLen1 > 1.5 * m_TParams.m_dDiam || dLen3 > 1.5 * m_TParams.m_dDiam) return true ; // setto il vettore estrusione per eseguire correttamente offset @@ -2736,20 +2746,20 @@ Pocketing::ZigZagOptimizedThreeClosedEdges( ICurveComposite* pCrvPocket, const I pCrv2->SetExtrusion( vtExtr) ; pCrv3->SetExtrusion( vtExtr) ; - pCrv1->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; + pCrv1->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; pCrv1->ExtendStartByLen( 100) ; pCrv1->ExtendEndByLen( 100) ; if ( ! CutCurveWithLine( pCrvPocket, pCrv1)) return false ; - pCrv3->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; + pCrv3->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; pCrv3->ExtendStartByLen( 100) ; pCrv3->ExtendEndByLen( 100) ; if ( ! CutCurveWithLine( pCrvPocket, pCrv3)) return false ; // sarą la prima curva del percorso - pCrv2->SimpleOffset( - m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; + pCrv2->SimpleOffset( -m_TParams.m_dDiam / 2 + 10 * EPS_SMALL) ; pCrv2->ExtendStartByLen( 100) ; pCrv2->ExtendEndByLen( 100) ; if ( ! CutCurveWithLine( pCrvPocket, pCrv2))