From 4f64b1efc2ef24b0ac469b45c852a645d3325b06 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Tue, 30 Jan 2024 13:30:18 +0100 Subject: [PATCH] EgtMachKernel : - Entrate Helix e ZigZag ( codice di prova). --- Pocketing.cpp | 68 ++++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 33 deletions(-) diff --git a/Pocketing.cpp b/Pocketing.cpp index 71fd199..f997488 100644 --- a/Pocketing.cpp +++ b/Pocketing.cpp @@ -55,6 +55,7 @@ #include "/EgtDev/Include/EGkStmFromCurves.h" #include "/EgtDev/Include/EGkStmFromTriangleSoup.h" #include +#include using namespace std ; @@ -6311,9 +6312,6 @@ Pocketing::AddSpiralIn( ISURFFRPOVECTOR& vSfr, const vector& if ( bOutStart && ! bOptimizedTrap) { // calcolo il punto fuori per il LeadIn Point3d ptOut = ptStart + vtMidOut * ( 0.5 * m_TParams.m_dDiam + max( dSafeZ, m_dOpenMinSafe)) ; - IGeoPoint3d* ptOUTTTTT( CreateGeoPoint3d()) ; ptOUTTTTT->Set( ptOut) ; - int b = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, ptOUTTTTT->Clone()) ; - m_pGeomDB->SetMaterial( b, BLUE) ; double dStElev ; // controllo l'elevazione bOutStart = ( ! GetElevation( m_nPhase, ptOut, vtTool, 0.5 * m_TParams.m_dDiam, vtTool, dStElev) || dStElev < EPS_SMALL) ; @@ -6842,7 +6840,7 @@ Pocketing::CalcLinkOnStep( const Point3d& ptS, const Point3d& ptE, const ISurfFl PtrOwner pSfrSafe( pSfr->CreateOffsetSurf( - 0.5 * m_TParams.m_dDiam - GetOffsR() + 5 * EPS_SMALL, ICurve::OFF_FILLET)) ; if ( IsNull( pSfrSafe) || ! pSfrSafe->IsValid() || - ! pSfrSafe->CalcMedialAxis( vCrvBisectors, Voronoi::WMAT_LEFT) || + ! pSfrSafe->CalcMedialAxis( vCrvBisectors, WMAT_IN) || vCrvBisectors.empty()) return false ; @@ -7341,7 +7339,8 @@ Pocketing::AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vector vvtMidOut ; // vettore dei versori delle direzioni di uscita dello step precedente INTVECTOR vnRegTot ; // vettore dei numeri delle regioni formate dal primo Offset nello step precedente - BOOLVECTOR vbOptTrap ; + BOOLVECTOR vbOptTrap ; // vettore di flag per casi ottimizzati + Point3d ptEndPath ; // punto finale del percorso di svuotatura attuale } ; SpiralData SDStepPrec ; // informazioni Spiral attuali int nOffs_act = 0 ; // Shift indice dei vettori causato da nReg @@ -7357,6 +7356,7 @@ Pocketing::AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vectorGetCurveCount() == 0) @@ -7465,6 +7468,9 @@ Pocketing::AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vectorGetEndPoint( ptEnd) ; + SDStepCurr.ptEndPath = ptEnd ; } // se il tool non è cilindrico... @@ -7587,6 +7593,8 @@ Pocketing::AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vectorAddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCurve->Clone()) ; + // se prima curva del percorso if ( u == 0) { // ricavo il punto inziale @@ -7627,10 +7635,10 @@ Pocketing::AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vectorSetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; - // return false ; - //} + if ( ! AddLeadIn( vMCrv[i], ptP1, ptStart, vtStart, V_INVALID, vtExtr, pSrfLeanInOut, vRCrv[i], !m_Params.m_bInvert, bSplitArcs, vbOut[i])) { + m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; + return false ; + } } // ... se devo aggiungere l'uscita del percorso precedente e calcolare l'entrata // per il percorso attuale @@ -7640,9 +7648,15 @@ Pocketing::AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vectorGetStartPoint( ptDest) ; + // modifico il punto di destinazione a seconda del tipo di attacco per tangenza + Vector3d vtEnd = vtStart ; + if ( ! vbOut[i]) { + if ( ! SetLeadInPointStart( ptCurr, vtTool, !m_Params.m_bInvert, vtStart, ptDest)) + return false ; + } // calcolo il percorso di ritorno del percorso attuale if ( IsNull( pRCrv) || - ! CalcLinkOnStep( ptCurr, ptDest, vSfr[j-2], vSrfLimit[j-2], pRCrv)) { + ! CalcLinkOnStep( ptCurr, ptDest, vSfr[j-2], ! SDStepCurr.vbOptTrap[i] ? vSrfLimit[j-2] : CreateSurfFlatRegion(), pRCrv)) { m_pMchMgr->SetLastError( 2441, "Error in Pocketing : Return path not computable") ; return false ; } @@ -7654,10 +7668,10 @@ Pocketing::AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vectorSetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; - // return false ; - //} + if ( ! AddLeadIn( vMCrv[i], ptAbove, ptStart, vtStart, vtEnd, vtExtr, pSrfLeanInOut, vRCrv[i], !m_Params.m_bInvert, bSplitArcs, vbOut[i])) { + m_pMchMgr->SetLastError( 2415, "Error in Pocketing : LeadIn not computable") ; + return false ; + } } } @@ -7713,9 +7727,10 @@ Pocketing::AddSpiralOut( ISURFFRPOVECTOR& vSfr, const std::vectorAddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pSrfAct->Clone()) ; PtrOwner pSfrOffsVR( pSrfAct->CreateOffsetSurf( - dOffs, ICurve::OFF_FILLET)) ; if ( IsNull( pSfrOffsVR)) return false ; @@ -10326,8 +10340,9 @@ Pocketing::AddLeadIn( const ICurveComposite* pCrvCompo, const Point3d& ptP1, con Point3d ptCen = ptP1 + vtCen * dRad ; double dDeltaN = ( ptStart - ptP1) * vtN ; double dExtraAng = 0. ; - if ( vtEnd.IsValid()) + if ( vtEnd.IsValid()) { vtEnd.GetAngle( vtStart, dExtraAng) ; + } double dAngCen = ( bAtLeft ? dExtraAng : - dExtraAng) + ceil( - dDeltaN / ( m_Params.m_dLiElev + 20 * EPS_SMALL)) * ( bAtLeft ? ANG_FULL : - ANG_FULL) ; // verifico se fattibile @@ -10372,9 +10387,6 @@ Pocketing::AddLeadIn( const ICurveComposite* pCrvCompo, const Point3d& ptP1, con } // per sicurezza... pCrvCompoFirstOffs->Close() ; - m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvCompoFirstOffs->Clone()) ; - IGeoPoint3d* ptSSSS( CreateGeoPoint3d()) ; ptSSSS->Set( ptStart) ; - m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, ptSSSS->Clone()) ; // la traslo della quantità richiesta ( il percorso a ZigZag incomincia sopra al piano di pocketing) pCrvCompoFirstOffs->Translate( - vtN * dDeltaN) ; double dLen, dUA, dUB ; @@ -10390,10 +10402,6 @@ Pocketing::AddLeadIn( const ICurveComposite* pCrvCompo, const Point3d& ptP1, con // inverto la curva sinistra pCrvB->Invert() ; - int A = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvA->Clone()) ; - m_pGeomDB->SetMaterial( A, RED) ; - int B = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrvB->Clone()) ; - m_pGeomDB->SetMaterial( B, BLUE) ; // traslo MAX_NUM_PT punti della curva lungo -vtN e creo quindi le curve per lo ZigZag const int MAX_NUM_PT = 100 ; @@ -11807,12 +11815,6 @@ Pocketing::SetBetterPtStartForSubChunks( ICurveComposite* pCrvOffsAct, const ISu if ( bSomeOpen) // se ho dei lati aperti, cerco un parametro ideale per entrare bMidOut = GetParamOnOpenSide( pCrv, vOtherCrv, frPocket, ptStart, vtMidOut) ; if ( bMidOut) { // se ho trovato e valido, allora imposto il punto inziale trovato - if ( ptEndPrec.IsValid()) { - IGeoPoint3d* ptE( CreateGeoPoint3d()) ; ptE->Set( ptEndPrec) ; - m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, ptE->Clone()) ; - } - int b = m_pGeomDB->AddGeoObj( GDB_ID_NULL, GDB_ID_ROOT, pCrv->Clone()) ; - m_pGeomDB->SetMaterial( b, BLUE) ; const double LEN_OUT = 5 ; double dPar ; int nFlag ; bMidOut = ( DistPointCurve( ptStart + LEN_OUT * vtMidOut, *pCrv).GetParamAtMinDistPoint( 0, dPar, nFlag)