EgtMachKernel :
- LeadIn/Out Spiral per tool non cilindrici.
This commit is contained in:
+46
-4
@@ -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 ;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user