diff --git a/Pocketing.cpp b/Pocketing.cpp index 58e79b5..1a10371 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -27,6 +27,7 @@ #include "/EgtDev/Include/EGkSfrCreate.h" #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkExtText.h" +#include "/EgtDev/Include/EGkDistPointCurve.h" #include "/EgtDev/Include/EGkUserObjFactory.h" #include "/EgtDev/Include/EGkIntervals.h" #include "/EgtDev/Include/EGkStringUtils3d.h" @@ -1653,7 +1654,7 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con // recupero la prima curva di offset PtrOwner pOffs( CreateCurveComposite()) ; - if ( IsNull( pOffs) || ! pOffs->AddCurve( OffsCrv.GetLongerCurve())) { + if ( IsNull( pOffs) || ! pOffs->AddCurve( OffsCrv.GetLongerCurve())) { m_pMchMgr->SetLastError( 2413, "Error in Pocketing : Toolpath not computable") ; return false ; } @@ -1719,7 +1720,7 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con } // aggiungo attacco SetFeed( GetStartFeed()) ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, nullptr, ! m_Params.m_bInvert, bSplitArcs, true)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, nullptr, ! m_Params.m_bInvert, bSplitArcs, true)) { m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; return false ; } @@ -1839,7 +1840,7 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con } // aggiungo attacco SetFeed( GetStartFeed()) ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, nullptr, ! m_Params.m_bInvert, bSplitArcs)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, nullptr, ! m_Params.m_bInvert, bSplitArcs)) { m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; return false ; } @@ -1848,7 +1849,7 @@ Pocketing::AddZigZag( const ICurveComposite* pCompo, const Vector3d& vtTool, con else { SetFeed( GetStartFeed()) ; ptP1 -= vtExtr * dStep ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, nullptr, ! m_Params.m_bInvert, bSplitArcs)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, nullptr, ! m_Params.m_bInvert, bSplitArcs)) { m_pMchMgr->SetLastError( 2418, "Error in Pocketing : Link not computable") ; return false ; } @@ -2196,7 +2197,7 @@ Pocketing::AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, con } // aggiungo attacco SetFeed( GetStartFeed()) ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, nullptr, ! m_Params.m_bInvert, bSplitArcs)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, nullptr, ! m_Params.m_bInvert, bSplitArcs)) { m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; return false ; } @@ -2205,7 +2206,7 @@ Pocketing::AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, con else { SetFeed( GetStartFeed()) ; ptP1 -= vtExtr * dStep ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, nullptr, ! m_Params.m_bInvert, bSplitArcs)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, nullptr, ! m_Params.m_bInvert, bSplitArcs)) { m_pMchMgr->SetLastError( 2418, "Error in Pocketing : Link not computable") ; return false ; } @@ -2339,7 +2340,7 @@ Pocketing::AddOneWay( const ICurveComposite* pCompo, const Vector3d& vtTool, con } // aggiungo attacco SetFeed( GetStartFeed()) ; - if ( ! AddLeadIn( ptP, ptS, frPocket.VersX(), vtExtr, nullptr, ! m_Params.m_bInvert, bSplitArcs, true)) { + if ( ! AddLeadIn( ptP, ptS, frPocket.VersX(), vtExtr, pCompo, nullptr, ! m_Params.m_bInvert, bSplitArcs, true)) { m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; return false ; } @@ -2456,7 +2457,7 @@ Pocketing::AddSpiralIn( const ICurveComposite* pCompo, const Vector3d& vtTool, c } // aggiungo attacco SetFeed( GetStartFeed()) ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pRCrv, ! m_Params.m_bInvert, bSplitArcs)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, pRCrv, ! m_Params.m_bInvert, bSplitArcs)) { m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; return false ; } @@ -2465,7 +2466,7 @@ Pocketing::AddSpiralIn( const ICurveComposite* pCompo, const Vector3d& vtTool, c else { SetFeed( GetStartFeed()) ; ptP1 -= vtExtr * dStep ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pRCrv, ! m_Params.m_bInvert, bSplitArcs)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, pRCrv, ! m_Params.m_bInvert, bSplitArcs)) { m_pMchMgr->SetLastError( 2418, "Error in Pocketing : Link not computable") ; return false ; } @@ -2620,7 +2621,7 @@ Pocketing::AddSpiralOut( const ICurveComposite* pCompo, const Vector3d& vtTool, } // aggiungo attacco SetFeed( GetStartFeed()) ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pRCrv, m_Params.m_bInvert, bSplitArcs)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, pRCrv, m_Params.m_bInvert, bSplitArcs)) { m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; return false ; } @@ -2629,7 +2630,7 @@ Pocketing::AddSpiralOut( const ICurveComposite* pCompo, const Vector3d& vtTool, else { SetFeed( GetStartFeed()) ; ptP1 -= vtExtr * dStep ; - if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pRCrv, m_Params.m_bInvert, bSplitArcs)) { + if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtExtr, pCompo, pRCrv, m_Params.m_bInvert, bSplitArcs)) { m_pMchMgr->SetLastError( 2418, "Error in Pocketing : Link not computable") ; return false ; } @@ -3072,6 +3073,8 @@ Pocketing::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, con // Calcolo punto iniziale switch ( nType) { case POCKET_LI_NONE : + case POCKET_LI_ZIGZAG : + case POCKET_LI_HELIX : ptP1 = ptStart ; return true ; case POCKET_LI_GLIDE : @@ -3085,10 +3088,6 @@ Pocketing::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, con ptP1 += vtN * ( vtN * ( ptStart - ptP1)) ; return true ; } - case POCKET_LI_ZIGZAG : - case POCKET_LI_HELIX : - ptP1 = ptStart ; - return true ; default : return false ; } @@ -3096,28 +3095,71 @@ Pocketing::CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, con //---------------------------------------------------------------------------- bool -Pocketing::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, - const Vector3d& vtN, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs, bool bNoneForced) +Pocketing::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN, + const ICurveComposite* pCompo, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs, bool bNoneForced) { // Assegno il tipo int nType = GetLeadInType() ; if ( bNoneForced || ( nType == POCKET_LI_GLIDE && ( pRCrv == nullptr || pRCrv->GetCurveCount() == 0))) nType = POCKET_LI_NONE ; - // Eseguo a seconda del tipo - switch ( nType) { - case POCKET_LI_NONE : - { - Point3d ptCurr = ptP1 ; - GetCurrPos( ptCurr) ; - if ( ! AreSamePointApprox( ptCurr, ptStart)) { - if ( AddLinearMove( ptStart, MCH_CL_LEADIN) == GDB_ID_NULL) + // Se elica e fattibile lo creo + if ( nType == POCKET_LI_HELIX) { + // vettore dal punto al centro elica + Vector3d vtCen = vtStart ; + vtCen.Rotate( vtN, 0, ( bAtLeft ? 1 : - 1)) ; + // dati dell'elica + double dRad = min( 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam), m_dMaxHelixRad) ; + Point3d ptCen = ptP1 + vtCen * dRad ; + double dDeltaN = ( ptStart - ptP1) * vtN ; + double dAngCen = ceil( - dDeltaN / ( m_Params.m_dLiElev + 10 * EPS_SMALL)) * ( bAtLeft ? ANG_FULL : - ANG_FULL) ; + // verifico se fattibile + if ( VerifyLeadInHelix( pCompo, ptCen, dRad)) { + // creo l'elica + PtrOwner pArc( CreateCurveArc()) ; + if ( IsNull( pArc) || ! pArc->Set( ptCen, vtN, dRad, - vtCen, dAngCen, dDeltaN)) + return false ; + // eventuale spezzatura + if ( bSplitArcs) { + PtrOwner pCompo( CreateCurveComposite()) ; + if ( IsNull( pCompo) || ! pCompo->AddCurve( Release( pArc)) || ! ApproxWithLines( pCompo)) + return false ; + return ( AddCurveMove( pCompo, MCH_CL_LEADIN) != GDB_ID_NULL) ; + } + else { + // emetto l'elica + return ( AddCurveMove( pArc, MCH_CL_LEADIN) != GDB_ID_NULL) ; + } + } + // altrimenti zigzag + else + nType = POCKET_LI_ZIGZAG ; + } + // Se zigzag e fattibile lo creo + if ( nType == POCKET_LI_ZIGZAG) { + // dati dello zigzag + double dDeltaN = ( ptStart - ptP1) * vtN ; + int nStep = int( ceil( - dDeltaN / ( m_Params.m_dLiElev + 10 * EPS_SMALL))) ; + double dStep = - dDeltaN / nStep ; + Point3d ptPa = ptP1 + vtStart * 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; + Point3d ptPb = ptP1 - vtStart * 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; + // verifico se fattibile + if ( VerifyLeadInZigZag( pCompo, ptPa, ptPb)) { + for ( int i = 1 ; i <= nStep ; ++ i) { + if ( AddLinearMove( ptPa - vtN * ( i - 0.75) * dStep, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + if ( AddLinearMove( ptPb - vtN * ( i - 0.25) * dStep, MCH_CL_LEADIN) == GDB_ID_NULL) return false ; } - return true ; + return ( AddLinearMove( ptStart, MCH_CL_LEADIN) != GDB_ID_NULL) ; } - case POCKET_LI_GLIDE : - { + // altrimenti diretto + else + nType = POCKET_LI_NONE ; + } + // Se a scivolo e fattibile + if ( nType == POCKET_LI_GLIDE) { + if ( pRCrv != nullptr) { // recupero la parte richiesta della curva di ritorno PtrOwner pCrv ; double dLen, dU ; @@ -3146,50 +3188,22 @@ Pocketing::AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3 // emetto return ( AddCurveMove( pCrv) != GDB_ID_NULL) ; } - case POCKET_LI_ZIGZAG : - { - double dDeltaN = ( ptStart - ptP1) * vtN ; - int nStep = int( ceil( - dDeltaN / ( m_Params.m_dLiElev + 10 * EPS_SMALL))) ; - double dStep = - dDeltaN / nStep ; - Point3d ptPa = ptP1 + vtStart * 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; - Point3d ptPb = ptP1 - vtStart * 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; - for ( int i = 1 ; i <= nStep ; ++ i) { - if ( AddLinearMove( ptPa - vtN * ( i - 0.75) * dStep, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; - if ( AddLinearMove( ptPb - vtN * ( i - 0.25) * dStep, MCH_CL_LEADIN) == GDB_ID_NULL) - return false ; - } - return ( AddLinearMove( ptStart, MCH_CL_LEADIN) != GDB_ID_NULL) ; - } - case POCKET_LI_HELIX : - { - // vettore dal punto al centro elica - Vector3d vtCen = vtStart ; - vtCen.Rotate( vtN, 0, ( bAtLeft ? 1 : - 1)) ; - // dati dell'elica - double dRad = min( 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam), m_dMaxHelixRad) ; - Point3d ptCen = ptP1 + vtCen * dRad ; - double dDeltaN = ( ptStart - ptP1) * vtN ; - double dAngCen = ceil( - dDeltaN / ( m_Params.m_dLiElev + 10 * EPS_SMALL)) * ( bAtLeft ? ANG_FULL : - ANG_FULL) ; - // creo l'elica - PtrOwner pArc( CreateCurveArc()) ; - if ( IsNull( pArc) || ! pArc->Set( ptCen, vtN, dRad, - vtCen, dAngCen, dDeltaN)) - return false ; - // eventuale spezzatura - if ( bSplitArcs) { - PtrOwner pCompo( CreateCurveComposite()) ; - if ( IsNull( pCompo) || ! pCompo->AddCurve( Release( pArc)) || ! ApproxWithLines( pCompo)) - return false ; - return ( AddCurveMove( pCompo, MCH_CL_LEADIN) != GDB_ID_NULL) ; - } - else { - // emetto l'elica - return ( AddCurveMove( pArc, MCH_CL_LEADIN) != GDB_ID_NULL) ; - } - } - default : - return false ; + // altrimenti diretto + else + nType = POCKET_LI_NONE ; } + // Se diretto + if ( nType == POCKET_LI_NONE) { + Point3d ptCurr = ptP1 ; + GetCurrPos( ptCurr) ; + if ( ! AreSamePointApprox( ptCurr, ptStart)) { + if ( AddLinearMove( ptStart, MCH_CL_LEADIN) == GDB_ID_NULL) + return false ; + } + return true ; + } + // Altrimenti errore + return false ; } //---------------------------------------------------------------------------- @@ -3262,20 +3276,34 @@ Pocketing::GetRadiusForStartEndElevation( void) bool Pocketing::AdjustContourStart( ICurveComposite* pCompo) { - // cerco il tratto pił lungo + // cerco il tratto lineare pił lungo int i = 0 ; int nMax = - 1 ; double dLenMax = 0 ; const ICurve* pCrv = pCompo->GetFirstCurve() ; while ( pCrv != nullptr) { double dLen ; - if ( pCrv->GetLength( dLen) && dLen > dLenMax) { + if ( pCrv->GetType() == CRV_LINE && pCrv->GetLength( dLen) && dLen > dLenMax) { dLenMax = dLen ; nMax = i ; } ++ i ; pCrv = pCompo->GetNextCurve() ; } + // se non trovato o troppo corto, cerco il tratto generico pił lungo + if ( nMax < 0 || dLenMax < 2 * m_TParams.m_dDiam) { + i = 0 ; + pCrv = pCompo->GetFirstCurve() ; + while ( pCrv != nullptr) { + double dLen ; + if ( pCrv->GetType() != CRV_LINE && pCrv->GetLength( dLen) && dLen > dLenMax) { + dLenMax = dLen ; + nMax = i ; + } + ++ i ; + pCrv = pCompo->GetNextCurve() ; + } + } // sposto inizio if ( nMax >= 0) @@ -3283,3 +3311,41 @@ Pocketing::AdjustContourStart( ICurveComposite* pCompo) return true ; } + +//---------------------------------------------------------------------------- +bool +Pocketing::VerifyLeadInHelix( const ICurveComposite* pCompo, const Point3d& ptCen, double dRad) +{ + // recupero il piano della curva di contorno + Point3d ptStart ; + Vector3d vtN ; + if ( pCompo == nullptr || ! pCompo->GetStartPoint( ptStart) || ! pCompo->GetExtrusion( vtN)) + return false ; + // porto il centro sullo stesso piano del contorno + Point3d ptCenL = ptCen - ( ptCen - ptStart) * vtN * vtN ; + // calcolo la distanza del centro dal contorno + double dMinDist ; + return ( DistPointCurve( ptCenL, *pCompo).GetDist( dMinDist) && dMinDist > dRad + 0.5 * m_TParams.m_dDiam - 10 * EPS_SMALL) ; +} + +//---------------------------------------------------------------------------- +bool +Pocketing::VerifyLeadInZigZag( const ICurveComposite* pCompo, const Point3d& ptPa, const Point3d& ptPb) +{ + // recupero il piano della curva di contorno + Point3d ptStart ; + Vector3d vtN ; + if ( pCompo == nullptr || ! pCompo->GetStartPoint( ptStart) || ! pCompo->GetExtrusion( vtN)) + return false ; + // porto i punti sullo stesso piano del contorno + Point3d ptPaL = ptPa - ( ptPa - ptStart) * vtN * vtN ; + Point3d ptPbL = ptPb - ( ptPb - ptStart) * vtN * vtN ; + // calcolo la distanza dei due punti dal contorno + double dMinDistPa ; + if ( ! DistPointCurve( ptPaL, *pCompo).GetDist( dMinDistPa)) + return false ; + double dMinDistPb ; + if ( ! DistPointCurve( ptPbL, *pCompo).GetDist( dMinDistPb)) + return false ; + return ( dMinDistPa > 0.5 * m_TParams.m_dDiam - 10 * EPS_SMALL && dMinDistPb > 0.5 * m_TParams.m_dDiam - 10 * EPS_SMALL) ; +} diff --git a/Pocketing.h b/Pocketing.h index ca64547..3926c00 100644 --- a/Pocketing.h +++ b/Pocketing.h @@ -93,12 +93,14 @@ class Pocketing : public Machining double dElev, double dAppr) ; bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN, const ICurveComposite* pRCrv, Point3d& ptP1) ; - bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, - const Vector3d& vtN, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs, bool bNoneForced = false) ; + bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN, + const ICurveComposite* pCompo, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs, bool bNoneForced = false) ; bool AddLeadOut( const Point3d& ptEnd, const Vector3d& vtEnd, const Vector3d& vtN, const ICurveComposite* pRCrv, bool bSplitArcs, Point3d& ptP1, double& dElev, bool bNoneForced = false) ; double GetRadiusForStartEndElevation( void) ; bool AdjustContourStart( ICurveComposite* pCompo) ; + bool VerifyLeadInHelix( const ICurveComposite* pCompo, const Point3d& ptCen, double dRad) ; + bool VerifyLeadInZigZag( const ICurveComposite* pCompo, const Point3d& ptPa, const Point3d& ptPb) ; private : double GetSpeed( void) const