diff --git a/Pocketing.cpp b/Pocketing.cpp index 3e470a4..1c57c57 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -4175,7 +4175,7 @@ Pocketing::CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Vector3d& vtD // calcolo percorso di svuotatura // se lati obliqui sono entrambi chiusi e dimensione svuotatura è minore di 2 * diamentro fresa gestione speciale - if ( vnProp[0] != 0 && vnProp[3] == 0 && vnProp[1] == 0 && max( dLen0, dLen2) < 2 * m_TParams.m_dDiam + EPS_SMALL) { + if ( vnProp[0] != 0 && vnProp[2] != 0 && vnProp[3] == 0 && vnProp[1] == 0 && max( dLen0, dLen2) < 2 * m_TParams.m_dDiam + EPS_SMALL) { if ( ! SpecialAdjustTrapezoidSpiralForAngles( pMCrv, pCrvPocket)) { pMCrv->Clear() ; return false ; @@ -4498,22 +4498,65 @@ Pocketing::SpecialAdjustTrapezoidSpiralForAngles( ICurveComposite* pMCrv, const // calcolo gli offset dei lati obliqui PtrOwner pLineS( GetCurveLine( pCrvPocket->GetCurve( 3)->Clone())) ; pLineS->SimpleOffset( - 0.5 * m_TParams.m_dDiam - GetOffsR()) ; + pLineS->Invert() ; PtrOwner pLineE( GetCurveLine( pCrvPocket->GetCurve( 1)->Clone())) ; pLineE->SimpleOffset( - 0.5 * m_TParams.m_dDiam - GetOffsR()) ; - + pLineE->Invert() ; + + Point3d ptS, ptE ; + pLineS->GetEndPoint( ptS) ; + pLineE->GetStartPoint( ptE) ; + Vector3d vtS, vtE ; + pLineS->GetStartDir( vtS) ; + pLineE->GetStartDir( vtE) ; + + PtrOwner pLineLink( CreateCurveLine()) ; + pLineLink->Set( ptS, ptE) ; + pMCrv->Clear() ; if ( ! pMCrv->AddCurve( Release( pLineS))) return false ; - Point3d ptP ; - pLineE->GetStartPoint( ptP) ; - if ( ! pMCrv->AddLine( ptP)) - return false ; + + // creo raccordi + bool bUseBiArcs = false ; + Vector3d vtDir, vtDir2 ; + pLineLink->GetStartDir( vtDir) ; + pCrvPocket->GetStartDir( vtDir2) ; + + if ( Dist( ptS, ptE) > 500 * EPS_SMALL && AreSameOrOppositeVectorApprox( vtDir, vtDir2)) { + + Point3d ptCrv1, ptCrv2 ; + pLineLink->GetPointD1D2( 0.3, ICurve::FROM_MINUS, ptCrv1) ; + pLineLink->GetPointD1D2( 0.7, ICurve::FROM_MINUS, ptCrv2) ; + + // primo raccordo + double dAng ; + vtS.GetAngleXY( X_AX, dAng) ; + PtrOwner pBiArc1( GetBiArc( ptS, - dAng, ptCrv1, 0, 0.5)) ; + + // secondo raccordo + vtE.GetAngleXY( X_AX, dAng) ; + PtrOwner pBiArc2( GetBiArc( ptE, dAng, ptCrv2, 180, 0.5)) ; + pBiArc2->Invert() ; + + if ( ! IsNull( pBiArc1) && ! IsNull( pBiArc2)) { + bUseBiArcs = true ; + pMCrv->AddCurve( Release( pBiArc1)) ; + pMCrv->AddLine( ptCrv2) ; + pMCrv->AddCurve( Release( pBiArc2)) ; + } + } + + // se non è stato possibile creare raccordo, unisco linearmente + if ( ! bUseBiArcs) + pMCrv->AddCurve( Release( pLineLink)) ; + if ( ! pMCrv->AddCurve( Release( pLineE))) return false ; - + // setto temp prop per ricordare curve aggiuntive per pulire angoli pMCrv->SetCurveTempProp( 0, 1) ; - pMCrv->SetCurveTempProp( 2, 1) ; + pMCrv->SetCurveTempProp( pMCrv->GetCurveCount() - 1, 1) ; return true ; }