EgtMachKernel :

- LeadIn/Out Spiral per tool non cilindrici.
This commit is contained in:
Riccardo Elitropi
2024-01-15 13:36:53 +01:00
parent c163fe503e
commit 28e76415ed
+46 -4
View File
@@ -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<ICRVCOMPOPOVECTOR>&
//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<ISurfFlatRegion> 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 ;
}
}