From 67131a14820e01240f327398393e5f560a1ba777 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 25 Feb 2026 15:17:56 +0100 Subject: [PATCH 1/2] EgtGeomKernel : - salvato file come UTF-8. --- IntersCrvCompoCrvCompo.cpp | 88 +++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/IntersCrvCompoCrvCompo.cpp b/IntersCrvCompoCrvCompo.cpp index b80d786..5a237ab 100644 --- a/IntersCrvCompoCrvCompo.cpp +++ b/IntersCrvCompoCrvCompo.cpp @@ -197,7 +197,7 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, // se coincidono U e ptInt tra A e B if ( abs( m_Info[i].IciA[0].dU - m_Info[j].IciB[0].dU) < EPS_SMALL && AreSamePointXYEpsilon( m_Info[i].IciA[0].ptI, m_Info[j].IciB[0].ptI, 10 * EPS_SMALL)) { - // se non è alla fine di curva chiusa + // se non è alla fine di curva chiusa if ( ! bCrvAClosed || abs( m_Info[j].IciA[0].dU - dCrvBSpan) > EPS_SMALL) // elimino la seconda EraseOtherInfo( i, j) ; @@ -272,13 +272,13 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, m_Info[j].IciA[kj].nNextTy = m_Info[i].IciA[ki].nNextTy ; // se overlap equiverso if ( m_Info[i].bOverlap && m_Info[i].bCBOverEq) { - // per la seconda curva ogni sottotipo è il duale di quello della prima + // per la seconda curva ogni sottotipo è il duale di quello della prima m_Info[i].IciB[ki].nPrevTy = GetDualIcct( m_Info[i].IciA[ki].nPrevTy) ; m_Info[i].IciB[ki].nNextTy = GetDualIcct( m_Info[i].IciA[ki].nNextTy) ; } // se altrimenti overlap controverso else if ( m_Info[i].bOverlap && ! m_Info[i].bCBOverEq) { - // per la seconda curva ogni sottotipo è come quello della prima ma in posizione invertita + // per la seconda curva ogni sottotipo è come quello della prima ma in posizione invertita m_Info[i].IciB[ki].nPrevTy = m_Info[i].IciA[ki].nNextTy ; m_Info[i].IciB[ki].nNextTy = m_Info[i].IciA[ki].nPrevTy ; } @@ -314,25 +314,25 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, m_Info[j].IciA[kj].nPrevTy = m_Info[i].IciA[ki].nPrevTy ; // se overlap equiverso if ( m_Info[i].bOverlap && m_Info[i].bCBOverEq) { - // per la seconda curva ogni sottotipo è il duale di quello della prima + // per la seconda curva ogni sottotipo è il duale di quello della prima m_Info[i].IciB[ki].nPrevTy = GetDualIcct( m_Info[i].IciA[ki].nPrevTy) ; m_Info[i].IciB[ki].nNextTy = GetDualIcct( m_Info[i].IciA[ki].nNextTy) ; } // se altrimenti overlap controverso else if ( m_Info[i].bOverlap && ! m_Info[i].bCBOverEq) { - // per la seconda curva ogni sottotipo è come quello della prima ma in posizione scambiata + // per la seconda curva ogni sottotipo è come quello della prima ma in posizione scambiata m_Info[i].IciB[ki].nPrevTy = m_Info[i].IciA[ki].nNextTy ; m_Info[i].IciB[ki].nNextTy = m_Info[i].IciA[ki].nPrevTy ; } // se overlap equiverso if ( m_Info[j].bOverlap && m_Info[j].bCBOverEq) { - // per la seconda curva ogni sottotipo è il duale di quello della prima + // per la seconda curva ogni sottotipo è il duale di quello della prima m_Info[j].IciB[kj].nPrevTy = GetDualIcct( m_Info[i].IciA[ki].nPrevTy) ; m_Info[j].IciB[kj].nNextTy = GetDualIcct( m_Info[i].IciA[ki].nNextTy) ; } // se altrimenti overlap controverso else if ( m_Info[i].bOverlap && ! m_Info[i].bCBOverEq) { - // per la seconda curva ogni sottotipo è come quello della prima ma in posizione scambiata + // per la seconda curva ogni sottotipo è come quello della prima ma in posizione scambiata m_Info[j].IciB[kj].nPrevTy = m_Info[i].IciA[ki].nNextTy ; m_Info[j].IciB[kj].nNextTy = m_Info[i].IciA[ki].nPrevTy ; } @@ -422,25 +422,25 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, m_Info[j].IciB[kj].nNextTy = m_Info[i].IciB[ki].nNextTy ; // se overlap equiverso if ( m_Info[i].bOverlap && m_Info[i].bCBOverEq) { - // per la prima curva ogni sottotipo è il duale di quello della seconda + // per la prima curva ogni sottotipo è il duale di quello della seconda m_Info[i].IciA[ki].nPrevTy = GetDualIcct( m_Info[i].IciB[ki].nPrevTy) ; m_Info[i].IciA[ki].nNextTy = GetDualIcct( m_Info[i].IciB[ki].nNextTy) ; } // se altrimenti overlap controverso else if ( m_Info[i].bOverlap && ! m_Info[i].bCBOverEq) { - // per la prima curva ogni sottotipo è come quello della seconda ma in posizione scambiata + // per la prima curva ogni sottotipo è come quello della seconda ma in posizione scambiata m_Info[i].IciA[ki].nPrevTy = m_Info[i].IciB[ki].nNextTy ; m_Info[i].IciA[ki].nNextTy = m_Info[i].IciB[ki].nPrevTy ; } // se overlap equiverso if ( m_Info[j].bOverlap && m_Info[j].bCBOverEq) { - // per la prima curva ogni sottotipo è il duale di quello della seconda + // per la prima curva ogni sottotipo è il duale di quello della seconda m_Info[j].IciA[kj].nPrevTy = GetDualIcct( m_Info[i].IciB[ki].nPrevTy) ; m_Info[j].IciA[kj].nNextTy = GetDualIcct( m_Info[i].IciB[ki].nNextTy) ; } // se altrimenti overlap controverso else if ( m_Info[j].bOverlap && ! m_Info[j].bCBOverEq) { - // per la prima curva ogni sottotipo è come quello della seconda ma in posizione scambiata + // per la prima curva ogni sottotipo è come quello della seconda ma in posizione scambiata m_Info[j].IciA[kj].nPrevTy = m_Info[i].IciB[ki].nNextTy ; m_Info[j].IciA[kj].nNextTy = m_Info[i].IciB[ki].nPrevTy ; } @@ -466,25 +466,25 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, m_Info[j].IciB[kj].nPrevTy = m_Info[i].IciB[ki].nPrevTy ; // se overlap equiverso if ( m_Info[i].bOverlap && m_Info[i].bCBOverEq) { - // per la prima curva ogni sottotipo è il duale di quello della seconda + // per la prima curva ogni sottotipo è il duale di quello della seconda m_Info[i].IciA[ki].nPrevTy = GetDualIcct( m_Info[i].IciB[ki].nPrevTy) ; m_Info[i].IciA[ki].nNextTy = GetDualIcct( m_Info[i].IciB[ki].nNextTy) ; } // se altrimenti overlap controverso else if ( m_Info[i].bOverlap && ! m_Info[i].bCBOverEq) { - // per la prima curva ogni sottotipo è come quello della seconda ma in posizione scambiata + // per la prima curva ogni sottotipo è come quello della seconda ma in posizione scambiata m_Info[i].IciA[ki].nPrevTy = m_Info[i].IciB[ki].nNextTy ; m_Info[i].IciA[ki].nNextTy = m_Info[i].IciB[ki].nPrevTy ; } // se overlap equiverso if ( m_Info[j].bOverlap && m_Info[j].bCBOverEq) { - // per la prima curva ogni sottotipo è il duale di quello della seconda + // per la prima curva ogni sottotipo è il duale di quello della seconda m_Info[j].IciA[kj].nPrevTy = GetDualIcct( m_Info[i].IciB[ki].nPrevTy) ; m_Info[j].IciA[kj].nNextTy = GetDualIcct( m_Info[i].IciB[ki].nNextTy) ; } // se altrimenti overlap controverso else if ( m_Info[j].bOverlap && ! m_Info[j].bCBOverEq) { - // per la prima curva ogni sottotipo è come quello della seconda ma in posizione scambiata + // per la prima curva ogni sottotipo è come quello della seconda ma in posizione scambiata m_Info[j].IciA[kj].nPrevTy = m_Info[i].IciB[ki].nNextTy ; m_Info[j].IciA[kj].nNextTy = m_Info[i].IciB[ki].nPrevTy ; } @@ -541,16 +541,16 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, // ripristino ordinamento su prima curva stable_sort( m_Info.begin(), m_Info.end(), SortGreaterA) ; - // verifico se sono rimaste delle intersezioni di tipo non definito sulla curva A e cerco di risolverle per continuità + // verifico se sono rimaste delle intersezioni di tipo non definito sulla curva A e cerco di risolverle per continuità for ( int i = 0 ; i < m_nNumInters ; ++ i) { - // se il tipo di accostamento per la curva A non è definito + // se il tipo di accostamento per la curva A non è definito if ( m_Info[i].IciA[0].nPrevTy == ICCT_NULL) { if ( i > 0 || ( bCrvAClosed && ! bAutoInters)) { int j = ( i > 0 ? i - 1 : m_nNumInters - 1) ; m_Info[i].IciA[0].nPrevTy = ( m_Info[j].bOverlap ? m_Info[j].IciA[1].nNextTy : m_Info[j].IciA[0].nNextTy) ; } } - // se il tipo di allontanamento per la curva A non è definito + // se il tipo di allontanamento per la curva A non è definito int ki = ( m_Info[i].bOverlap ? 1 : 0) ; if ( m_Info[i].IciA[ki].nNextTy == ICCT_NULL) { if ( i < m_nNumInters - 1 || ( bCrvAClosed && ! bAutoInters)) { @@ -560,17 +560,17 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, } } - // verifico se sono rimaste delle intersezioni di tipo non definito sulla curva B e cerco di risolverle per continuità + // verifico se sono rimaste delle intersezioni di tipo non definito sulla curva B e cerco di risolverle per continuità stable_sort( m_Info.begin(), m_Info.end(), SortGreaterB) ; for ( int i = 0 ; i < m_nNumInters ; ++ i) { - // se il tipo di accostamento per la curva B non è definito + // se il tipo di accostamento per la curva B non è definito if ( m_Info[i].IciB[0].nPrevTy == ICCT_NULL) { if ( i > 0 || ( bCrvBClosed && ! bAutoInters)) { int j = ( i > 0 ? i - 1 : m_nNumInters - 1) ; m_Info[i].IciB[0].nPrevTy = ( m_Info[j].bOverlap ? m_Info[j].IciB[1].nNextTy : m_Info[j].IciB[0].nNextTy) ; } } - // se il tipo di allontanamento per la curva B non è definito + // se il tipo di allontanamento per la curva B non è definito int ki = ( m_Info[i].bOverlap ? 1 : 0) ; if ( m_Info[i].IciB[ki].nNextTy == ICCT_NULL) { if ( i < m_nNumInters - 1 || ( bCrvBClosed && ! bAutoInters)) { @@ -586,7 +586,7 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, for ( int i = 0 ; i < m_nNumInters ; ++ i) { // in assenza di overlap if ( ! m_Info[i].bOverlap) { - // se il tipo di accostamento per la curva A non è definito + // se il tipo di accostamento per la curva A non è definito if ( m_Info[i].IciA[0].nPrevTy == ICCT_NULL) { // devo studiare un intorno dell'intersezione int nType ; @@ -595,7 +595,7 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, // aggiorno il tipo di accostamento della curva A alla curva B m_Info[i].IciA[0].nPrevTy = nType ; } - // se il tipo di accostamento per la curva B non è definito + // se il tipo di accostamento per la curva B non è definito if ( m_Info[i].IciB[0].nPrevTy == ICCT_NULL) { // devo studiare un intorno dell'intersezione int nType ; @@ -604,7 +604,7 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, // aggiorno il tipo di accostamento della curva B alla curva A m_Info[i].IciB[0].nPrevTy = nType ; } - // se il tipo di allontanamento per la curva A non è definito + // se il tipo di allontanamento per la curva A non è definito if ( m_Info[i].IciA[0].nNextTy == ICCT_NULL) { // devo studiare un intorno dell'intersezione int nType ; @@ -613,7 +613,7 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, // aggiorno il tipo di allontanamento della curva A dalla curva B m_Info[i].IciA[0].nNextTy = nType ; } - // se il tipo di allontanamento per la curva B non è definito + // se il tipo di allontanamento per la curva B non è definito if ( m_Info[i].IciB[0].nNextTy == ICCT_NULL) { // devo studiare un intorno dell'intersezione int nType ; @@ -625,12 +625,12 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, } // in presenza di overlap else { - // se il tipo di accostamento è non definito per la curva A + // se il tipo di accostamento è non definito per la curva A if ( m_Info[i].IciA[0].nPrevTy == ICCT_NULL) { // se autointersezione con spike double dDeltaU = abs( m_Info[i].IciA[0].dU - m_Info[i].IciB[0].dU) ; if ( bAutoInters && ( dDeltaU < EPS_PARAM || ( bCrvAClosed && abs( dDeltaU - dCrvASpan) < EPS_PARAM))) { - // è punta di spike + // è punta di spike int nType = ICCT_SPK ; // aggiorno il tipo di allontanamento della curva A dalla curva B m_Info[i].IciA[0].nPrevTy = nType ; @@ -656,12 +656,12 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, } } } - // se il tipo di allontanamento è non definito per la curva A + // se il tipo di allontanamento è non definito per la curva A if ( m_Info[i].IciA[1].nNextTy == ICCT_NULL) { // se autointersezione con spike double dDeltaU = abs( m_Info[i].IciA[1].dU - m_Info[i].IciB[1].dU) ; if ( bAutoInters && ( dDeltaU < EPS_PARAM || ( bCrvAClosed && abs( dDeltaU - dCrvASpan) < EPS_PARAM))) { - // è punta di spike + // è punta di spike int nType = ICCT_SPK ; // aggiorno il tipo di allontanamento della curva A dalla curva B m_Info[i].IciA[1].nNextTy = nType ; @@ -698,10 +698,10 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, // se prima curva aperta, salto alla prossima if ( ! CCompoA.IsClosed()) continue ; - // è chiusa quindi prendo l'ultima + // è chiusa quindi prendo l'ultima j = m_nNumInters - 1 ; } - // se i due indici coincidono, c'è una sola intersezione e posso uscire + // se i due indici coincidono, c'è una sola intersezione e posso uscire if ( i == j) break ; // assegno sottoindici (considero solo intersezioni overlap) @@ -729,7 +729,7 @@ IntersCrvCompoCrvCompo::IntersCrvCompoCrvCompo( const ICurveComposite& CCompoA, } } - // se è rimasta una sola intersezione con overlap anche ad entrambi gli estremi e le curve sono chiuse + // se è rimasta una sola intersezione con overlap anche ad entrambi gli estremi e le curve sono chiuse if ( m_nNumInters == 1 && CCompoA.IsClosed() && CCompoB.IsClosed() && m_Info[0].IciA[0].nPrevTy == ICCT_ON && m_Info[0].IciA[1].nNextTy == ICCT_ON && GetCrvBDirANext( m_Info[0]) == ICCT_ON && GetCrvBDirAPrev( m_Info[0]) == ICCT_ON) { @@ -884,7 +884,7 @@ SortGreaterB( const IntCrvCrvInfo& aInfo1, const IntCrvCrvInfo& aInfo2) bool OrderNonManifoldInters( ICCIVECTOR& Info, const ICurve& CurveA, const ICurve& CurveB) { - // questi controlli sono validi solo se la curva B è chiusa + // questi controlli sono validi solo se la curva B è chiusa if ( ! CurveB.IsClosed()) return false ; @@ -913,7 +913,7 @@ OrderNonManifoldInters( ICCIVECTOR& Info, const ICurve& CurveA, const ICurve& Cu // se prima curva aperta, salto alla prossima if ( ! CurveA.IsClosed()) continue ; - // è chiusa quindi prendo l'ultima + // è chiusa quindi prendo l'ultima j = nNumInters - 1 ; } // se i due indici coincidono, salto @@ -1003,7 +1003,7 @@ MediaParamPoints( IntCrvInfo& Ici1, IntCrvInfo& Ici2, const ICurveComposite& crv //Point3d ptMed ; //if ( ! crvCompo.GetPointD1D2( dUmed, ICurve::FROM_MINUS, ptMed)) // return ; - // verifico che non sia più lontano dei punti originali dal loro medio + // verifico che non sia più lontano dei punti originali dal loro medio //if ( SqDist( Ici1.ptI, ptMed) > dSqDist / 4) // return ; // medio i parametri @@ -1017,13 +1017,13 @@ MediaParamPoints( IntCrvInfo& Ici1, IntCrvInfo& Ici2, const ICurveComposite& crv static int GetCrvBDirAPrev( IntCrvCrvInfo& Icci) { - // non è overlap, è il prev del primo punto + // non è overlap, è il prev del primo punto if ( ! Icci.bOverlap) return Icci.IciB[0].nPrevTy ; - // è overlap equiverso, è il prev del primo punto + // è overlap equiverso, è il prev del primo punto if ( Icci.bCBOverEq) return Icci.IciB[0].nPrevTy ; - // è overlap controverso, è il next del primo punto + // è overlap controverso, è il next del primo punto return Icci.IciB[0].nNextTy ; } @@ -1033,13 +1033,13 @@ GetCrvBDirAPrev( IntCrvCrvInfo& Icci) static int GetCrvBDirANext( IntCrvCrvInfo& Icci) { - // non è overlap, è il next del primo punto + // non è overlap, è il next del primo punto if ( ! Icci.bOverlap) return Icci.IciB[0].nNextTy ; - // è overlap equiverso, è il next del secondo punto + // è overlap equiverso, è il next del secondo punto if ( Icci.bCBOverEq) return Icci.IciB[1].nNextTy ; - // è overlap controverso, è il prev del secondo punto + // è overlap controverso, è il prev del secondo punto return Icci.IciB[1].nPrevTy ; } @@ -1083,7 +1083,7 @@ CalcATypeFromDisk( const ICurve& CurveA, double dUA, ICurve::Side nSideA, return false ; if ( dAngBpDeg < 0) dAngBpDeg += ANG_FULL ; - // se l'angolo di DirA è compreso tra DirBn e DirBp (muovendosi in senso CCW) allora è IN, altrimenti OUT + // se l'angolo di DirA è compreso tra DirBn e DirBp (muovendosi in senso CCW) allora è IN, altrimenti OUT if ( dAngADeg > 0 && dAngADeg < dAngBpDeg) nType = ICCT_IN ; else @@ -1156,12 +1156,12 @@ CalcATypeFromDisk2( const ICurve& CurveA, double dUA, ICurve::Side nSideA, // li ordino in senso crescente if ( dAngB1pDeg > dAngB2pDeg) swap( dAngB1pDeg, dAngB2pDeg) ; - // se non ci sono variazioni angolari significative, non posso decidere alcunché + // se non ci sono variazioni angolari significative, non posso decidere alcunché const double MIN_DEV_ANG = 2 ; if ( abs( DiffAngle( dAngB1pDeg + ANG_STRAIGHT, 0)) < MIN_DEV_ANG && abs( DiffAngle( dAngB2pDeg + ANG_STRAIGHT, dAngB2nDeg)) < MIN_DEV_ANG) return false ; - // IN è tra 0 e dAngB1pDeg e tra dAngB2nDeg e dAngB2pDeg + // IN è tra 0 e dAngB1pDeg e tra dAngB2nDeg e dAngB2pDeg if ( ( dAngADeg > 0 && dAngADeg < dAngB1pDeg) || ( dAngADeg > dAngB2nDeg && dAngADeg < dAngB2pDeg)) nType = ICCT_IN ; From ac7ba1b12c0b173e09b1e07097d62215a0ec510e Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Wed, 25 Feb 2026 16:56:30 +0100 Subject: [PATCH 2/2] 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,