diff --git a/Pocketing.cpp b/Pocketing.cpp index 031460d..f077c0b 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -2303,7 +2303,7 @@ Pocketing::ProcessPath( int nPathId, int nPvId, int nClId) BOOLVECTOR vbChangedPrec( nStep, false) ; // vettore di Flag per superfici uguali tra steps consecutivi VCT3DVECTOR vVtTrasl( nStep, V_NULL) ; // vettore contenente le quote per le passate di svuotature ISURFFRPOVECTOR vSrfLimit ; // vettore delle superfici limite - double dExtraLenInOut ; // Lunghezza extra per Tool non cilindrici per LeadIn/Out + double dExtraLenInOut = 0. ; // Lunghezza extra per Tool non cilindrici per LeadIn/Out // ricavo le superfici di svuotatura if ( ! SliceVolume( pStm_PartVolume, pStm_Part, pStm_Raw, vSrfSliced, vSrfLimit, vCrvOEWithFlags, @@ -2461,7 +2461,7 @@ Pocketing::SliceVolume( const ISurfTriMesh* pStmVol, const ISurfTriMesh* pStm_Pa return false ; // tolgo/aggiungo eventuali proiezioni if ( ! ProjectVolume( pStmVol, pStm_Part, vVtTrasl[j-1], j == 1 ? V_INVALID : vVtTrasl[j-2], pSfrLimit, - pSfrCurr, int( vVtTrasl.size()) == 1), dExtraLenInOut) + pSfrCurr, int( vVtTrasl.size()) == 1, dExtraLenInOut)) return false ; // ricavo le proprietà di lato aperto/chiuso if ( ! ChooseCloseOrOpenEdge( pSfrCurr, ( bIsExtraStep && ! m_bPocketPlane) ? vStmES_Edges_OC[j-1] : pStm_Part, @@ -3022,7 +3022,11 @@ Pocketing::CheckSideAngleForVolume( const ISurfTriMesh* pStmVol_Above, const ISu bProj = BBox.GetDimZ() > m_TParams.m_dLen ; if ( ! bProj) // se la lunghezza della faccia è valida, allora controllo la relazione con gli angoli - bProj = dAng < ANG_RIGHT - m_TParams.m_dSideAng - 2500 * EPS_ANG_SMALL ; + bProj = dAng > ANG_RIGHT - m_TParams.m_dSideAng + 2500 * EPS_ANG_SMALL ; + // determino di quanto devo uscire + if ( ! bProj && dAng > ANG_RIGHT) + if ( abs( m_TParams.m_dSideAng + ANG_RIGHT) > 100 * EPS_SMALL) + dExtraLenInOut = max( dExtraLenInOut, BBox.GetDimZ() * tan( - m_TParams.m_dSideAng * DEGTORAD)) ; } else if ( m_TParams.m_dSideAng < 0 && dAng > ANG_RIGHT - m_TParams.m_dSideAng + 2500 * EPS_ANG_SMALL) bProj = true ; @@ -6096,6 +6100,44 @@ Pocketing::AddSpiralIn( ISURFFRPOVECTOR& vSfr, const vector& //pRCrv->AddLine( ptOut, true) ; } } + // se non ho un'entrata da fuori e il tool non è cilindrico... + if ( ! bOutStart && ! bOptimizedTrap && m_TParams.m_dSideAng != 0 && dExtraLenInOut > EPS_SMALL) { + Vector3d vtDir ; + Point3d ptS ; + Vector3d vtIn ; + double dLenCheck = 0.; + // aggiungo al percorso un tratto interno + if ( pMCrv->GetCurveCount() > 0) { + pMCrv->GetStartDir( vtDir) ; + pMCrv->GetStartPoint( ptS) ; + vtIn = vtDir ; vtIn.Rotate( vtTool, ANG_RIGHT) ; + + if ( GetLeadInType() == POCKET_LI_HELIX) + dLenCheck = min( 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam), m_dMaxHelixRad) ; + else if ( GetLeadInType() ==POCKET_LI_ZIGZAG) + dLenCheck = 0.5 * min( m_Params.m_dLiTang, m_TParams.m_dDiam) ; + else if ( GetLeadInType() == POCKET_LI_GLIDE) + dLenCheck = m_Params.m_dLiTang ; + + pMCrv->AddLine( ptS + ( dExtraLenInOut + dLenCheck) * vtIn, false) ; + + // aggiorno la superficie limite di controllo + PtrOwner pNewSfrLeadInOut( CloneSurfFlatRegion( vSfr[j-1])) ; + if ( IsNull( pNewSfrLeadInOut) || + ! pNewSfrLeadInOut->Offset( - dExtraLenInOut, ICurve::OFF_CHAMFER) || + ! pNewSfrLeadInOut->IsValid() || + ! pSrfLeanInOut.Set( Release( pNewSfrLeadInOut))) { + m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; + return false ; + } + + // se ho un solo Offset dalla svuotatura, devo controllare anche l'uscita... + Point3d ptE ; + pMCrv->GetEndPoint( ptE) ; + if ( AreSamePointEpsilon( ptS, ptE, 500 * EPS_SMALL)) + pMCrv->AddLine( ptS + ( dExtraLenInOut + dLenCheck) * vtIn, true) ; + } + } // calcolo gli eventuali punti fuori dal grezzo nel caso ottimizzato int nOutsideRaw = 0 ; @@ -10442,7 +10484,7 @@ Pocketing::AdjustContourStart( ICurveComposite* pCompo, const ICRVCOMPOPOVECTOR& if ( ! bOk) { // se non riesco ad entrare da nessun lato chiuso, considerando che in precedenza ho già provato ad // entrare da tutti i lati aperti... - pCompo->ChangeStartPoint( 0.5) ; + pCompo->ChangeStartPoint( vInd[0] + 0.5) ; return true ; } }