From 4af6caf657ede99d3dc1507cad110d55936e827c Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Mon, 22 Jul 2024 11:44:45 +0200 Subject: [PATCH] EgtMachKernel : - migliorie LeadIn ed Entrate - Semplificazione codice con funzioni in classe SurfFlatRegion. --- SurfRoughing.cpp | 61 +++++++++++++++++------------------------------- SurfRoughing.h | 6 ++--- 2 files changed, 24 insertions(+), 43 deletions(-) diff --git a/SurfRoughing.cpp b/SurfRoughing.cpp index 2bbcbca..91727a2 100644 --- a/SurfRoughing.cpp +++ b/SurfRoughing.cpp @@ -1614,7 +1614,7 @@ SurfRoughing::ProcessPath( int nPathId, int nTempId, int nPvId, int nClId) // Eseguo le svuotature double dElev = dDepth ; - if ( ! AddPocket( vPocket, vtTool, vtExtr, vCrvPocketCompo, dElev, dStep, bSplitArcs)) + if ( ! AddPocket( vPocket, vtTool, vtExtr, vCrvPocketCompo, dElev, dStep, dSubStep, bSplitArcs)) return false ; } @@ -1798,7 +1798,7 @@ SurfRoughing::GetActiveSurfaces( INTVECTOR& vSurfId) const //---------------------------------------------------------------------------- bool SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, const Vector3d& vtExtr, - const ICRVCOMPOPOVECTOR& vCrvPocketCompo, double dElev, double dStep, bool bSplitArcs) + const ICRVCOMPOPOVECTOR& vCrvPocketCompo, double dElev, double dStep, double dSubStep, bool bSplitArcs) { // recupero distanze di sicurezza double dSafeZ = GetSafeZ() ; @@ -1864,11 +1864,6 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co for ( int i = 0 ; i < int( vpCrvs.size()) ; ++ i) VerifyArcs( vpCrvs[i]) ; - // salvo i loop esterni della superficie corrente come Polylinee ( per LeadIn/LeadOut) - ICURVEPOVECTOR vLoops ; vLoops.resize( pSfrPock->GetChunkCount()) ; - for ( int c = 0 ; c < int( vLoops.size()) ; ++ c) - vLoops[c].Set( pSfrPock->GetLoop( c, 0)) ; - // ciclo sui percorsi for ( int k = 0 ; k < int( vpCrvs.size()) ; ++ k) { // controllo se il percorso ha un ingresso presso un lato aperto @@ -1877,7 +1872,6 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co // controllo se il punto di ingresso è valido bool bValidOutLeadIn = true ; if ( bOutStart) { - bool bValidOutLeadIn = true ; if ( ! VerifyLeadIn( vpCrvs[k]->GetFirstCurve(), vCrvPocketCompo[nCurrStep], bValidOutLeadIn)) return false ; if ( ! bValidOutLeadIn) { @@ -1937,9 +1931,7 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co double dStElev = - dDepth ; dStElev -= ( ptP1 - ptStart) * vtExtr ; // se attacco a zigzag o a spirale o a scivolo, l'elevazione va nell'attacco - if ( GetLeadInType() == POCKET_LI_ZIGZAG || - GetLeadInType() == POCKET_LI_HELIX || - GetLeadInType() == POCKET_LI_GLIDE) { + if ( GetLeadInType() != POCKET_LI_NONE) { ptP1 += vtExtr * ( dStElev + LIO_ELEV_TOL) ; dStElev = - LIO_ELEV_TOL ; } @@ -1958,13 +1950,17 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co return false ; } // se attacco elica od equivalente di step pieno, devo fare elica o similari solo sulla parte con materiale - if ( nSubType != SURFROU_SUB_ONEWAY && - nSubType != SURFROU_SUB_ZIGZAG && - nBasicStep > 0 && ! bOutStart && - ( GetLeadInType() == POCKET_LI_ZIGZAG || - GetLeadInType() == POCKET_LI_HELIX || - GetLeadInType() == POCKET_LI_GLIDE)) { - ptP1 -= ( nBasicStep * dStep) * vtTool ; + bool bLower = ( nSubType != SURFROU_SUB_ONEWAY && nSubType != SURFROU_SUB_ZIGZAG && + nBasicStep > 0 && ! bOutStart && GetLeadInType() != POCKET_LI_NONE) ; + if ( bLower) { + if ( bIsSubStep) { + double dExtra = - dStep ; + if ( dDepth < - dStep) + dExtra = - dSubStep ; + ptP1 -= ( dStElev + dExtra) * vtTool ; + } + else + ptP1 -= ( nBasicStep * dStep) * vtTool ; SetFeed( GetStartFeed()) ; SetFlag( 0) ; if ( AddLinearMove( ptP1) == GDB_ID_NULL) @@ -2003,7 +1999,7 @@ SurfRoughing::AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, co return false ; } #if ENABLE_DEBUG - vpCrvs[k]->SetCurveTempParam( i, dCoeffFeed * GetFeed()) ; // ok... + vpCrvs[k]->SetCurveTempParam( i, dCoeffFeed * GetFeed()) ; #endif // se ultima entità if ( i == nMaxInd) { @@ -2497,34 +2493,19 @@ SurfRoughing::RemoveChunksUnderTolerance( ISurfFlatRegion* pSfr) const if ( m_dSubStepToler < EPS_SMALL) // se tolleranza non presente, non faccio nulla return true ; - // inizializzo la superficie da restituire - PtrOwner pSfrBeauty( CreateSurfFlatRegion()) ; - if ( IsNull( pSfrBeauty)) - return false ; - // scorro tutti i chunk della superficie bool bSameSurf = true ; for ( int nC = 0 ; nC < pSfr->GetChunkCount() ; ++ nC) { // verifico se l'Offset massimo del chunk è sopra alla tolleranza double dMaxOffs = EPS_SMALL ; pSfr->GetChunkMaxOffset( nC, dMaxOffs) ; - if ( dMaxOffs > m_dSubStepToler) { - // recupero il loop esterno - if ( ! pSfrBeauty->AddExtLoop( pSfr->GetLoop( nC, 0))) - return false ; - // inserisco le isole del Chunk corrente - for ( int nL = 1 ; nL < pSfr->GetLoopCount( nC) ; ++ nL) - if ( ! pSfrBeauty->AddIntLoop( pSfr->GetLoop( nC, nL))) - return false ; + // rimuovo il Chunk c-esimo se l'Offset massimo è minore della tolleranza + if ( dMaxOffs < m_dSubStepToler) { + pSfr->EraseChunk( nC) ; + -- nC ; } - else - bSameSurf = false ; } - // se ho fatto modifiche, sostituisco la superficie con quella nuova - if ( ! bSameSurf) - pSfr->CopyFrom( pSfrBeauty) ; - return true ; } @@ -2881,7 +2862,7 @@ SurfRoughing::CalcRetCrv( const ICurveComposite* pCompo, const Point3d& ptRef, b //---------------------------------------------------------------------------- bool SurfRoughing::VerifyLeadInHelix( const ISurfFlatRegion* pSfr, const Point3d& ptStart, const Point3d& ptCen, - double dHelixRad) + double dHelixRad) const { // controllo validità dei parametri if ( pSfr == nullptr || ! pSfr->IsValid()) @@ -2915,7 +2896,7 @@ SurfRoughing::VerifyLeadInHelix( const ISurfFlatRegion* pSfr, const Point3d& ptS //---------------------------------------------------------------------------- bool SurfRoughing::VerifyLeadInZigZag( const ISurfFlatRegion* pSfr, const Point3d& ptStart, const Point3d& ptPa, - const Point3d& ptPb) + const Point3d& ptPb) const { // controllo validità dei parametri if ( pSfr == nullptr || ! pSfr->IsValid()) diff --git a/SurfRoughing.h b/SurfRoughing.h index c1a20c5..996ab06 100644 --- a/SurfRoughing.h +++ b/SurfRoughing.h @@ -77,7 +77,7 @@ class SurfRoughing : public Machining bool Chain( int nGrpDestId) ; bool ProcessPath( int nPathId, int nTempId, int nPvId, int nClId) ; bool AddPocket( const INTINTVECTOR& vPocket, const Vector3d& vtTool, const Vector3d& vtExtr, - const ICRVCOMPOPOVECTOR& vCrvPocketCompo, double dElev, double dStep, bool bSplitArcs) ; + const ICRVCOMPOPOVECTOR& vCrvPocketCompo, double dElev, double dStep, double dSubStep, bool bSplitArcs) ; bool AddApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dElev, double dAppr) ; bool AddLinkApproach( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dElev, double dAppr, bool bOutMove) ; bool AddLinkRetract( const Point3d& ptP, const Vector3d& vtTool, double dSafeZ, double dElev, double dAppr) ; @@ -106,8 +106,8 @@ class SurfRoughing : public Machining bool CalcRetCrv( const ICurveComposite* pCompo, const Point3d& ptRef, bool bOutStart, ICurveComposite* pRCrv) const ; bool GetHomogeneousParts( const ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vpCrvs) const ; - bool VerifyLeadInHelix( const ISurfFlatRegion* pSfr, const Point3d& ptStart, const Point3d& ptCen, double dHelixRad) ; - bool VerifyLeadInZigZag( const ISurfFlatRegion* pSfr, const Point3d& ptStart, const Point3d& ptPa, const Point3d& ptPb) ; + bool VerifyLeadInHelix( const ISurfFlatRegion* pSfr, const Point3d& ptStart, const Point3d& ptCen, double dHelixRad) const ; + bool VerifyLeadInZigZag( const ISurfFlatRegion* pSfr, const Point3d& ptStart, const Point3d& ptPa, const Point3d& ptPb) const ; private : double GetSpeed() const