EgtMachKernel :

- correzioni e modifiche a CalcSpiral di Pocketing.
This commit is contained in:
Dario Sassi
2019-06-24 07:28:20 +00:00
parent fd99ed62f4
commit ef5a9aae46
+76 -18
View File
@@ -2888,13 +2888,13 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, bool bSplitArcs,
// ciclo di offset verso l'interno
const int MAX_ITER = 100 ;
int nIter = 0 ;
ICURVEPOVECTOR vOffs ;
PtrOwner<ICurve> pOffs ;
const ICurve* pCurr = pCompo ;
double dCurrRad = GetCurveRadius( pCurr) ;
double dCurrRad = GetCurveRadius( pCompo) ;
while ( nIter < MAX_ITER) {
// calcolo
OffsetCurve OffsCrv ;
if ( ! OffsCrv.Make( pCurr, - dOffs, ICurve::OFF_FILLET)) {
if ( ! OffsCrv.Make( ( nIter == 0 ? (ICurve*) pCompo : pOffs), - dOffs, ICurve::OFF_FILLET)) {
m_pMchMgr->SetLastError( 2412, "Error in Pocketing : Offset not computable") ;
return false ;
}
@@ -2905,27 +2905,14 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, bool bSplitArcs,
bool bSmallRad = ( nIter == 0 ? dOffs < dTRad + GetOffsR() + EPS_ZERO : dOffs < dTRad + EPS_ZERO) ;
// se completato step di offset, accodo la curva offsettata al percorso di lavoro
if ( ! IsNull( pOffs) && ( bNextOk || bSmallRad)) {
// verifico se aggiungere linea di congiunzione
if ( pMCrv->GetCurveCount() > 0) {
Point3d ptStart ;
pOffs->GetStartPoint( ptStart) ;
// aggiungo al percorso principale
pMCrv->AddLine( ptStart) ;
// copio nel percorso di ritorno
pRCrv->AddCurve( *pMCrv->GetLastCurve()) ;
}
// se richiesta percorrenza invertita
if ( m_Params.m_bInvert)
pOffs->Invert() ;
// aggiungo la curva
pMCrv->AddCurve( Release( pOffs)) ;
// inserisco l'offset nel vettore
vOffs.emplace_back( Release( pOffs)) ;
}
// se offset va bene
if ( bNextOk) {
// sistemo per prossimo step
dCurrRad = dRad ;
pOffs.Set( Release( pNextOffs)) ;
pCurr = Get( pOffs) ;
// nuovo valore pari allo step
dOffs = GetSideStep() ;
}
@@ -2941,6 +2928,77 @@ Pocketing::CalcSpiral( const ICurveComposite* pCompo, bool bSplitArcs,
++ nIter ;
}
// calcolo i collegamenti
ICURVEPOVECTOR vLinks( vOffs.size()) ;
for ( int i = 1 ; i < int( vOffs.size()) ; ++ i) {
// punti di inizio e fine
Point3d ptStart ;
vOffs[i-1]->GetStartPoint( ptStart) ;
Point3d ptEnd ;
vOffs[i]->GetStartPoint( ptEnd) ;
// creo la retta che li unisce
PtrOwner<ICurveLine> pLine( CreateCurveLine()) ;
if ( IsNull( pLine) || ! pLine->Set( ptStart, ptEnd))
return false ;
// la classifico rispetto al primo offset (il più esterno)
CRVCVECTOR ccClass ;
IntersCurveCurve intCC( *pLine, *vOffs[0]) ;
intCC.GetCurveClassification( 0, ccClass) ;
// se nessuno o un solo tratto e interno, la retta è il collegamento
if ( ccClass.empty() || ( ccClass.size() == 1 && ccClass[0].nClass == CRVC_IN)) {
vLinks[i].Set( Release( pLine)) ;
}
// altrimenti combino i tratti interni di retta con tratti del primo offset
else {
PtrOwner<ICurveComposite> pCompo( CreateCurveComposite()) ;
if ( IsNull( pCompo))
return false ;
for ( int j = 0 ; j < int( ccClass.size()) ; ++ j) {
if ( ccClass[j].nClass == CRVC_IN || ccClass[j].nClass == CRVC_ON_P || ccClass[j].nClass == CRVC_ON_M)
pCompo->AddCurve( pLine->CopyParamRange( ccClass[j].dParS, ccClass[j].dParE)) ;
else if ( ccClass[j].nClass == CRVC_OUT) {
Point3d ptS ;
pLine->GetPointD1D2( ccClass[j].dParS, ICurve::FROM_PLUS, ptS) ;
double dOffS ;
vOffs[0]->GetParamAtPoint( ptS, dOffS) ;
Point3d ptE ;
pLine->GetPointD1D2( ccClass[j].dParE, ICurve::FROM_MINUS, ptE) ;
double dOffE ;
vOffs[0]->GetParamAtPoint( ptE, dOffE) ;
// recupero i due possibili percorsi e uso il più corto
PtrOwner<ICurve> pCrvA( vOffs[0]->CopyParamRange( dOffS, dOffE)) ;
PtrOwner<ICurve> pCrvB( vOffs[0]->CopyParamRange( dOffE, dOffS)) ;
double dLenA ; pCrvA->GetLength( dLenA) ;
double dLenB ; pCrvB->GetLength( dLenB) ;
if ( dLenA < dLenB) {
pCompo->AddCurve( Release( pCrvA)) ;
}
else {
pCrvB->Invert() ;
pCompo->AddCurve( Release( pCrvB)) ;
}
}
}
vLinks[i].Set( Release( pCompo)) ;
}
}
// creo i percorsi di lavoro e di ritorno a partire dalla raccolta degli offset e dei collegamenti
for ( int i = 0 ; i < int( vOffs.size()) ; ++ i) {
// se collegamento da aggiungere
if ( ! IsNull( vLinks[i])) {
// accodo una copia nel percorso di ritorno
pRCrv->AddCurve( vLinks[i]->Clone()) ;
// accodo nel percorso di lavorazione
pMCrv->AddCurve( Release( vLinks[i])) ;
}
// se richiesta percorrenza invertita
if ( m_Params.m_bInvert)
vOffs[i]->Invert() ;
// aggiungo la curva
pMCrv->AddCurve( Release( vOffs[i])) ;
}
// verifico il percorso di lavoro
if ( pMCrv->GetCurveCount() == 0) {
m_pMchMgr->SetLastError( 2413, "Error in Pocketing : Toolpath not computable") ;