diff --git a/SurfFinishing.cpp b/SurfFinishing.cpp index ac98571..a22a4ae 100644 --- a/SurfFinishing.cpp +++ b/SurfFinishing.cpp @@ -1408,7 +1408,7 @@ SurfFinishing::AddZigZag( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons double dPockRadOffs = m_TParams.m_dDiam / 2 - m_Params.m_dSideStep - m_Params.m_dOverlap ; ICRVCOMPOPOVECTOR vpCrvs ; if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle, - POCKET_ZIGZAG, false, false, true, nullptr, vpCrvs)) { + POCKET_ZIGZAG, false, false, true, false, nullptr, vpCrvs)) { m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ; return false ; } @@ -1609,7 +1609,7 @@ SurfFinishing::AddOneWay( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons double dPockRadOffs = m_TParams.m_dDiam / 2 - m_Params.m_dSideStep - m_Params.m_dOverlap ; ICRVCOMPOPOVECTOR vpCrvs ; if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle, - POCKET_ONEWAY, false, false, true, nullptr, vpCrvs)) { + POCKET_ONEWAY, false, false, true, false, nullptr, vpCrvs)) { m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ; return false ; } @@ -1811,7 +1811,7 @@ SurfFinishing::AddSpiral( ICAvToolSurfTm* pCAvTlStm, const Frame3d& frSurf, cons int nType = ( bInVsOut ? POCKET_SPIRALIN : POCKET_SPIRALOUT) ; ICRVCOMPOPOVECTOR vpCrvs ; if ( ! CalcPocketing( pSfrPock, dPockRad, dPockRadOffs, m_Params.m_dSideStep, m_Params.m_dSideAngle, - nType, false, false, true, nullptr, vpCrvs)) { + nType, false, false, true, false, nullptr, vpCrvs)) { m_pMchMgr->SetLastError( 3125, "Error in SurfFinishing : CalcPocketing failed") ; return false ; } diff --git a/SurfRoughing.cpp b/SurfRoughing.cpp index 6a9a214..14cd55f 100644 --- a/SurfRoughing.cpp +++ b/SurfRoughing.cpp @@ -1843,7 +1843,7 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co ICRVCOMPOPOVECTOR vpCrvs ; // percorso di svuotatura // se si tratta di uno step base, allora lavoro l'intera superficie if ( ! CalcPocketing( pSfrPock, m_TParams.m_dDiam / 2, 0., m_Params.m_dSideStep, m_Params.m_dSideAngle, - nSubType, true, bInvert, false, pSfrLimit, vpCrvs)) { + nSubType, true, bInvert, false, true, pSfrLimit, vpCrvs)) { if ( bIsSubStep) { string sWarn = "Warning in SurfRoughing : CalcPocketing failed with substep (" + ToString( pSfrPock->GetTempParam( 0), 1) + ")" ; m_pMchMgr->SetWarning( 3055, sWarn) ; @@ -1872,7 +1872,7 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co // controllo se il punto di ingresso è valido bool bValidOutLeadIn = true ; if ( bOutStart) { - if ( ! VerifyLeadIn( vpCrvs[k]->GetFirstCurve(), vCrvPocketCompo[nCurrStep], bValidOutLeadIn)) + if ( ! VerifyLeadInLeadOut( vpCrvs[k]->GetFirstCurve(), vCrvPocketCompo[nCurrStep], bValidOutLeadIn)) return false ; if ( ! bValidOutLeadIn) { // se non valido, rimuovo il primo tratto @@ -1880,6 +1880,18 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co vpCrvs[k]->RemoveFirstOrLastCurve( false) ; } } + // controllo se il percorso ha un'uscita presso un lato aperto + bool bOutEnd = ( vpCrvs[k]->GetCurveCount() > 0 && + vpCrvs[k]->GetLastCurve()->GetTempProp( 0) == TEMP_PROP_OUT_START) ; + // controllo se il punto d'uscita va limitata + bool bValidOutLeadOut = true ; + if ( bOutEnd) { + if ( ! VerifyLeadInLeadOut( vpCrvs[k]->GetLastCurve(), vCrvPocketCompo[nCurrStep], bValidOutLeadOut)) + return false ; + // se non valido, rimuovo l'ultimo tratto + if ( ! bValidOutLeadOut) + vpCrvs[k]->RemoveFirstOrLastCurve( true) ; + } // controllo se il percorso è formato da una singola curva seguente il lato chiuso bool bSingleCrv = ( vpCrvs[k]->GetCurveCount() > 0 && vpCrvs[k]->GetTempProp( 0) == TEMP_PROP_SINGLE_CURVE) ; @@ -1888,8 +1900,8 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co vpCrvs[k]->GetTempProp( 0) == TEMP_PROP_OPT_TRAPEZOID) ; // controllo se è un percorso a ZigZag/OneWay ( non curva di bordo) bool bIsZigZagOneWayPath = ( vpCrvs[k]->GetCurveCount() > 0 && - ( nSubType == SURFROU_SUB_ONEWAY || nSubType == SURFROU_SUB_ZIGZAG) && - vpCrvs[k]->GetTempProp( 0) != TEMP_PROP_BORDER_CURVE) ; + ( nSubType == SURFROU_SUB_ONEWAY || nSubType == SURFROU_SUB_ZIGZAG) && + vpCrvs[k]->GetTempProp( 0) == TEMP_PROP_BORDER_CURVE) ; // inizializzo la curva di Ritorno per LeadIn/LeadOut PtrOwner pRCrv( CreateCurveComposite()) ; if ( IsNull( pRCrv)) @@ -1950,27 +1962,32 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co return false ; } // se attacco elica od equivalente di step pieno, devo fare elica o similari solo sulla parte con materiale - bool bLower = ( nSubType != SURFROU_SUB_ONEWAY && nSubType != SURFROU_SUB_ZIGZAG && - nBasicStep > 0 && ! bOutStart && GetLeadInType() != POCKET_LI_NONE) ; + bool bLower = ( ( nSubType != SURFROU_SUB_ONEWAY || bIsZigZagOneWayPath) && + ( nSubType != SURFROU_SUB_ZIGZAG && + nBasicStep > 0 && ! bOutStart && + GetLeadInType() != POCKET_LI_NONE)) ; if ( bLower) { if ( bIsSubStep) { double dExtra = - dStep ; if ( dDepth < - dStep) dExtra = - dSubStep ; - ptP1 -= ( dStElev + dExtra) * vtTool ; + ptP1 -= ( ( ptP1 - ptStart) * vtTool + dExtra) * vtTool ; } else ptP1 -= ( nBasicStep * dStep) * vtTool ; SetFeed( GetStartFeed()) ; SetFlag( 0) ; - if ( AddLinearMove( ptP1) == GDB_ID_NULL) + if ( AddLinearMove( ptP1) == GDB_ID_NULL) { + m_pMchMgr->SetLastError( 3012, "Error in SurfRoughing : Link not computable") ; return false ; + } } } // aggiungo attacco SetFeed( GetStartFeed()) ; bool bNoneForced = ( bOutStart || bSingleCrv || - ( bIsZigZagOneWayPath && ! vpCrvs[k]->IsClosed())) ; + ( nSubType == SURFROU_SUB_ZIGZAG) || + ( nSubType == SURFROU_SUB_ONEWAY && ! bIsZigZagOneWayPath)) ; if ( ! AddLeadIn( ptP1, ptStart, vtStart, vtTool, pSfrPock, ( ( nSubType == SURFROU_SUB_SPIRALIN || nSubType == SURFROU_SUB_SPIRALOUT)) ? Get( pRCrv) : nullptr, ( nSubType == SURFROU_SUB_SPIRALOUT) ? bInvert : ! bInvert, @@ -2495,7 +2512,6 @@ SurfRoughing::RemoveChunksUnderTolerance( ISurfFlatRegion* pSfr) const return true ; // scorro tutti i chunk della superficie - bool bSameSurf = true ; for ( int nC = 0 ; nC < pSfr->GetChunkCount() ; ++ nC) { // verifico se l'Offset massimo del chunk è sopra alla tolleranza double dMaxOffs = EPS_SMALL ; @@ -2978,7 +2994,7 @@ SurfRoughing::GetHomogeneousParts( const ICurveComposite* pCrvCompo, ICRVCOMPOPO //---------------------------------------------------------------------------- bool -SurfRoughing::VerifyLeadIn( const ICurve* pCrv, const ICurveComposite* pCrvPock, bool& bValidLeadIn) const +SurfRoughing::VerifyLeadInLeadOut( const ICurve* pCrv, const ICurveComposite* pCrvPock, bool& bValidLeadIn) const { /* Verifica se il segmento di LeadIn per entrate da fuori sia valido diff --git a/SurfRoughing.h b/SurfRoughing.h index 3e66edb..b63ce6b 100644 --- a/SurfRoughing.h +++ b/SurfRoughing.h @@ -83,7 +83,7 @@ class SurfRoughing : public Machining bool AddLinkRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dElev, double dAppr) ; bool AddRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dElev, double dAppr) ; bool CalcLeadInStart( const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtTool, const ICurveComposite* pCrvPath, Point3d& ptP1) const ; - bool VerifyLeadIn( const ICurve* pCrv, const ICurveComposite* pCrvPock, bool& bSkip) const ; + bool VerifyLeadInLeadOut( const ICurve* pCrv, const ICurveComposite* pCrvPock, bool& bSkip) const ; bool AddLeadIn( const Point3d& ptP1, const Point3d& ptStart, const Vector3d& vtStart, const Vector3d& vtN, const ISurfFlatRegion* pSfr, const ICurveComposite* pRCrv, bool bAtLeft, bool bSplitArcs, bool bNoneForced, bool bSkipControl) ;