From ac7ba1b12c0b173e09b1e07097d62215a0ec510e Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Wed, 25 Feb 2026 16:56:30 +0100 Subject: [PATCH] EgtGeomKernel : - in CalcPocketing piccola miglioria su tolleranza trapezi. --- CalcPocketing.cpp | 174 ++++++++++++++++++++++++---------------------- 1 file changed, 89 insertions(+), 85 deletions(-) diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index 5cee0cf..39bbf3e 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -1058,9 +1058,9 @@ ExtendPath( ICurveComposite* pCompo, const ISurfFlatRegion* pSfr, const PocketPa bool bInside = true ; bool bOkOut = true ; if ( PockParams.SfrLimit.IsValid()) { - bOkOut = ( IsPointInsideSurfFr( ptFall, &PockParams.SfrLimit, dMinDist, bInside) && ! bInside) ; + bOkOut = ( IsPointInsideSurfFr( ptFall, &PockParams.SfrLimit, dMinDist - 10. * EPS_SMALL, bInside) && ! bInside) ; if ( bOkOut) - bOkOut = ( IsPointInsideSurfFr( Media( ptFall, pt), &PockParams.SfrLimit, dMinDist, bInside) && ! bInside) ; + bOkOut = ( IsPointInsideSurfFr( Media( ptFall, pt), &PockParams.SfrLimit, dMinDist - 10. * EPS_SMALL, bInside) && ! bInside) ; } if ( bOkOut) bOkOut = ( IsPointInsideSurfFr( ptFall, pSfr, dMinDist, bInside) && ! bInside) ; @@ -2635,6 +2635,87 @@ PreparareTrapezoidTwoBases( const ICurveComposite* pCrvCompo, const double dDiam return true ; } +//---------------------------------------------------------------------------- +static bool +IsForcedStepTrapezoid( const ICurveComposite* pCrvTrap, const PocketParams& PockParam, + int nBase, int nSecondBase, bool& bForced) +{ + bForced = false ; + // se la curva non è valida, allora non può essere forzato + if ( pCrvTrap == nullptr || ! pCrvTrap->IsValid()) + return false ; + + // scorro la curva e ricavo le TempProps + array vnProps ; + int nClose = 0 ; + for ( int i = 0 ; i < 4 ; ++ i) { + if ( ! pCrvTrap->GetCurveTempProp( i, vnProps[i], 0)) + return false ; + if ( vnProps[i] == TEMP_PROP_CLOSE_EDGE) + ++ nClose ; + } + + double dDiam = 2. * PockParam.dRad ; + switch ( nClose) { + // se trapezio tutto aperto, allora non è forzato + case 0 : + bForced = false ; + break ; + // se ho un lato chiuso, non è forzato + case 1 : + bForced = false ; + break ; + // se ho due lati chiusi + case 2 : { + if ( nBase < 0 || nBase > 4 || nSecondBase < 0 || nSecondBase > 4) + return false ; + // se entrambe le basi sono chiuse, è forzato + if ( vnProps[nBase] == TEMP_PROP_CLOSE_EDGE && vnProps[nSecondBase] == TEMP_PROP_CLOSE_EDGE) + bForced = true ; + // se entrambe le basi sono aperte + else if ( vnProps[nBase] == TEMP_PROP_OPEN_EDGE && vnProps[nSecondBase] == TEMP_PROP_OPEN_EDGE) { + const ICurve* pCrvOpenBase = pCrvTrap->GetCurve( nBase) ; + const ICurve* pCrvOpenSecondBase = pCrvTrap->GetCurve( nSecondBase) ; + if ( pCrvOpenBase == nullptr || ! pCrvOpenBase->IsValid() || + pCrvOpenSecondBase == nullptr || ! pCrvOpenSecondBase->IsValid()) + return false ; + double dLenOpenBase ; pCrvOpenBase->GetLength( dLenOpenBase) ; + double dLenSecondOpenBase ; pCrvOpenSecondBase->GetLength( dLenSecondOpenBase) ; + bForced = ( dLenOpenBase < dDiam + 10. * EPS_SMALL && + dLenSecondOpenBase < dDiam + 10. * EPS_SMALL) ; + } + // se alternate, non forzo + else + bForced = false ; + } + break ; + // se ho tre lati chiusi + case 3 : { + // diventa forzato se il lato aperto non è grande + double dLenOpen = 0. ; + for ( int i = 0 ; i < 4 ; ++ i) { + if ( vnProps[i] == TEMP_PROP_OPEN_EDGE) { + const ICurve* pCrvOpen = pCrvTrap->GetCurve( i) ; + if ( pCrvOpen == nullptr || ! pCrvOpen->IsValid()) + return false ; + pCrvOpen->GetLength( dLenOpen) ; + break ; + } + } + bForced = ( dLenOpen < dDiam + 10. * EPS_SMALL) ; + } + break ; + // se tutto chiuso, è forzato + case 4 : + bForced = true ; + break ; + default : + return false ; + } + + return true ; +} + //---------------------------------------------------------------------------- static bool GetTrapezoidFromShape( const ICurveComposite* pCrvCompo, ICurveComposite* pCrvTrap, @@ -3037,8 +3118,12 @@ GetTrapezoidFromShape( const ICurveComposite* pCrvCompo, ICurveComposite* pCrvTr return false ; // se parametro MaxOptSize non compatibile => non è ottimizzato - if ( PockParams.dMaxOptSize > EPS_SMALL && dPocketSize > PockParams.dMaxOptSize) - pCrvTrap->Clear() ; + bool bForced = false ; + IsForcedStepTrapezoid( pCrvTrap, PockParams, nBase, nSecondBase, bForced) ; + if ( ! bForced) { + if ( PockParams.dMaxOptSize > EPS_SMALL && dPocketSize > PockParams.dMaxOptSize) + pCrvTrap->Clear() ; + } return true ; } @@ -3616,87 +3701,6 @@ CalcTrapezoidSpiral( ICurveComposite* pCrvPocket, const Frame3d& frTrap, double return true ; } -//---------------------------------------------------------------------------- -static bool -IsForcedStepTrapezoid( const ICurveComposite* pCrvTrap, const PocketParams& PockParam, - int nBase, int nSecondBase, bool& bForced) -{ - bForced = false ; - // se la curva non è valida, allora non può essere forzato - if ( pCrvTrap == nullptr || ! pCrvTrap->IsValid()) - return false ; - - // scorro la curva e ricavo le TempProps - array vnProps ; - int nClose = 0 ; - for ( int i = 0 ; i < 4 ; ++ i) { - if ( ! pCrvTrap->GetCurveTempProp( i, vnProps[i], 0)) - return false ; - if ( vnProps[i] == TEMP_PROP_CLOSE_EDGE) - ++ nClose ; - } - - double dDiam = 2. * PockParam.dRad ; - switch ( nClose) { - // se trapezio tutto aperto, allora non è forzato - case 0 : - bForced = false ; - break ; - // se ho un lato chiuso, non è forzato - case 1 : - bForced = false ; - break ; - // se ho due lati chiusi - case 2 : { - if ( nBase < 0 || nBase > 4 || nSecondBase < 0 || nSecondBase > 4) - return false ; - // se entrambe le basi sono chiuse, è forzato - if ( vnProps[nBase] == TEMP_PROP_CLOSE_EDGE && vnProps[nSecondBase] == TEMP_PROP_CLOSE_EDGE) - bForced = true ; - // se entrambe le basi sono aperte - else if ( vnProps[nBase] == TEMP_PROP_OPEN_EDGE && vnProps[nSecondBase] == TEMP_PROP_OPEN_EDGE) { - const ICurve* pCrvOpenBase = pCrvTrap->GetCurve( nBase) ; - const ICurve* pCrvOpenSecondBase = pCrvTrap->GetCurve( nSecondBase) ; - if ( pCrvOpenBase == nullptr || ! pCrvOpenBase->IsValid() || - pCrvOpenSecondBase == nullptr || ! pCrvOpenSecondBase->IsValid()) - return false ; - double dLenOpenBase ; pCrvOpenBase->GetLength( dLenOpenBase) ; - double dLenSecondOpenBase ; pCrvOpenSecondBase->GetLength( dLenSecondOpenBase) ; - bForced = ( dLenOpenBase < dDiam + 10. * EPS_SMALL && - dLenSecondOpenBase < dDiam + 10. * EPS_SMALL) ; - } - // se alternate, non forzo - else - bForced = false ; - } - break ; - // se ho tre lati chiusi - case 3 : { - // diventa forzato se il lato aperto non è grande - double dLenOpen = 0. ; - for ( int i = 0 ; i < 4 ; ++ i) { - if ( vnProps[i] == TEMP_PROP_OPEN_EDGE) { - const ICurve* pCrvOpen = pCrvTrap->GetCurve( i) ; - if ( pCrvOpen == nullptr || ! pCrvOpen->IsValid()) - return false ; - pCrvOpen->GetLength( dLenOpen) ; - break ; - } - } - bForced = ( dLenOpen < dDiam + 10. * EPS_SMALL) ; - } - break ; - // se tutto chiuso, è forzato - case 4 : - bForced = true ; - break ; - default : - return false ; - } - - return true ; -} - //---------------------------------------------------------------------------- static bool AdjustTrapeziodLeadIn( ICurveComposite* pCrvRes, const PocketParams& PockParam,