diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 895c851..c16d588 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/OffsetCurve.cpp b/OffsetCurve.cpp index a41817d..ed433dc 100644 --- a/OffsetCurve.cpp +++ b/OffsetCurve.cpp @@ -422,10 +422,6 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) m_CrvLst.push_back( Release( pCrvCompo)) ; CurveComposite* pCompo1 = GetBasicCurveComposite( m_CrvLst.front()) ; - // salvo punto iniziale - Point3d ptStart ; - pCompo1->GetStartPoint( ptStart) ; - // quinto passo : spezzatura della curva composita negli eventuali punti di auto-intersezione // calcolo le auto-intersezioni SelfIntersCurve sintC( *pCompo1) ; @@ -477,18 +473,13 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) dLenPrev = vLen[i] ; } // se fatta almeno una suddivisione + bool bFirstLastSame = false ; if ( dUPrev > EPS_PARAM) { // trimmo l'ultima parte pCompo1->TrimStartAtParam( dUPrev) ; - // sistemo le curve chiuse con due parti di una stessa curva all'inizio e alla fine - if ( bClosed) { - if ( vU[0] > EPS_PARAM && vLen[0] >= 2 * EPS_SMALL) { - // accodo il finale al'iniziale - pCompo1 = GetBasicCurveComposite( m_CrvLst.front()) ; - pCompo1->AddCurve( m_CrvLst.back(), false, 10 * EPS_SMALL) ; - m_CrvLst.pop_back() ; - } - } + // rilevo le curve chiuse con due parti di una stessa curva all'inizio e alla fine + if ( bClosed && vU[0] > EPS_PARAM && vLen[0] >= 2 * EPS_SMALL) + bFirstLastSame = true ; } // sesto passo : se curva aperta, elimino i tratti che stanno nella circonferenza di offset dei punti estremi @@ -594,6 +585,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) } // settimo passo : elimino le parti che sono troppo vicine al percorso originale + bool bFirstLastDeleted = false ; for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ;) { ICurve* pCrv = *iIter ; // distanza minima di alcuni punti interni della curva dalla curva originale @@ -604,8 +596,24 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) GetMinDist( 0.875, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL || GetMinDist( 0.0625, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL || GetMinDist( 0.9375, pCrv, &ccCopy) < abs( dDist) - 5 * EPS_SMALL) { + // se prima e ultima sono la stessa curva e non ancora cancellate e prima da cancellare + if ( bFirstLastSame && ! bFirstLastDeleted && iIter == m_CrvLst.begin()) { + bFirstLastDeleted = true ; + // cancello ultima + delete *prev( m_CrvLst.end()) ; + m_CrvLst.pop_back() ; + } + // se prima e ultima sono la stessa curva e non ancora cancellate e ultima da cancellare + if ( bFirstLastSame && ! bFirstLastDeleted && iIter == prev( m_CrvLst.end())) { + bFirstLastDeleted = true ; + // cancello prima + delete *m_CrvLst.begin() ; + m_CrvLst.pop_front() ; + } + // cancello la corrente delete pCrv ; iIter = m_CrvLst.erase( iIter) ; + // evito incremento continue ; } // passo alla successiva @@ -644,19 +652,6 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) } ++ iIter ; } - // se chiusa riporto l'inizio del primo loop alla posizione iniziale - if ( bClosed) { - for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ; ++ iIter) { - CurveComposite* pCrvCo = GetBasicCurveComposite( *iIter) ; - DistPointCurve dstPC( ptStart, *pCrvCo) ; - if ( dstPC.IsEpsilon( 10 * EPS_SMALL)) { - double dU ; int nFlag ; - dstPC.GetParamAtMinDistPoint( 0, dU, nFlag) ; - pCrvCo->ChangeStartPoint( round( dU)) ; - break ; - } - } - } // nono passo : se con smusso o estensione, sostituisco i fillet con questi if ( ( nType & ICurve::OFF_CHAMFER) != 0 || ( nType & ICurve::OFF_EXTEND) != 0) {