diff --git a/AdjustLoops.cpp b/AdjustLoops.cpp index 86447e0..df4d6f5 100644 --- a/AdjustLoops.cpp +++ b/AdjustLoops.cpp @@ -226,14 +226,14 @@ MyAdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst) Point3d ptEnd2 ; pCrvCo2->GetEndPoint( ptEnd2) ; // se aperta, verifico se concatenabile alla principale if ( ! AreSamePointEpsilon( ptStart2, ptEnd2, 10 * EPS_SMALL)) { - if ( AreSamePointEpsilon( ptEnd, ptStart2, 10 * EPS_SMALL)) { - pCrvCo->AddCurve( pCrvCo2, true, 10 * EPS_SMALL) ; + if ( AreSamePointEpsilon( ptEnd, ptStart2, 100 * EPS_SMALL)) { + pCrvCo->AddCurve( pCrvCo2, true, 100 * EPS_SMALL) ; CrvLst.erase( iIter2) ; ptEnd = ptEnd2 ; iIter2 = next( iIter) ; } - else if ( AreSamePointEpsilon( ptEnd2, ptStart, 10 * EPS_SMALL)) { - pCrvCo->AddCurve( pCrvCo2, false, 10 * EPS_SMALL) ; + else if ( AreSamePointEpsilon( ptEnd2, ptStart, 100 * EPS_SMALL)) { + pCrvCo->AddCurve( pCrvCo2, false, 100 * EPS_SMALL) ; CrvLst.erase( iIter2) ; ptStart = ptStart2 ; iIter2 = next( iIter) ; diff --git a/CurveComposite.cpp b/CurveComposite.cpp index bdfda4c..228752d 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -2039,7 +2039,7 @@ CurveComposite::ModifyCurveToArc( int nCrv, const Point3d& ptMid) if ( nCrv < 0 || nCrv > nCrvCount - 1) return false ; // recupero la curva corrente - ICurve* pCrv = *(m_CrvSmplS.begin() + nCrv) ; + ICurve* pCrv = m_CrvSmplS[nCrv] ; // recupero gli estremi Point3d ptStart, ptEnd ; if ( ! pCrv->GetStartPoint( ptStart) || ! pCrv->GetEndPoint( ptEnd)) @@ -2072,7 +2072,7 @@ CurveComposite::ModifyCurveToLine( int nCrv) if ( nCrv < 0 || nCrv > nCrvCount - 1) return false ; // recupero la curva corrente - ICurve* pCrv = *(m_CrvSmplS.begin() + nCrv) ; + ICurve* pCrv = m_CrvSmplS[nCrv] ; // se gią linea non devo fare alcunchč if ( pCrv->GetType() == CRV_LINE) return true ; @@ -2880,6 +2880,39 @@ CurveComposite::ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDe return true ; } +//---------------------------------------------------------------------------- +bool +CurveComposite::StraightArcsToLines( double dLinTol, double dAngTolDeg) +{ + // controllo le tolleranze + dLinTol = max( dLinTol, EPS_SMALL) ; + dAngTolDeg = Clamp( dAngTolDeg, EPS_ANG_SMALL, ANG_RIGHT) ; + // verifico le singole curve + for ( auto Iter = m_CrvSmplS.begin() ; Iter != m_CrvSmplS.end() ; ++ Iter) { + CurveArc* pArc = GetBasicCurveArc( *Iter) ; + if ( pArc != nullptr && + abs( pArc->GetAngCenter()) < dAngTolDeg && + pArc->GetRadius() * ( 1 - cos( pArc->GetAngCenter() / 2 * DEGTORAD)) < dLinTol) { + // recupero gli estremi + Point3d ptStart, ptEnd ; + if ( ! pArc->GetStartPoint( ptStart) || ! pArc->GetEndPoint( ptEnd)) + return false ; + // creo la linea + PtrOwner pLine( CreateBasicCurveLine()) ; + if ( IsNull( pLine) || ! pLine->Set( ptStart, ptEnd)) + return false ; + // elimino la curva originale e la sostituisco con la nuova + delete (*Iter) ; + (*Iter) = Release( pLine) ; + } + } + + // imposto ricalcolo della grafica + m_OGrMgr.Reset() ; + + return true ; +} + //---------------------------------------------------------------------------- static int MergeTwoCurves( ICurve* pCrvP, ICurve* pCrvC, double& dCurrLinTol, double dCosAngTol, bool bNeedSameProp) diff --git a/CurveComposite.h b/CurveComposite.h index 80ea1d6..eac578d 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -156,6 +156,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool ModifyCurveToLine( int nCrv) override ; bool ArcsToBezierCurves( void) override ; bool ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDeg) override ; + bool StraightArcsToLines( double dLinTol, double dAngTolDeg) override ; bool MergeCurves( double dLinTol, double dAngTolDeg, bool bStartEnd = true, bool bNeedSameProp = false) override ; bool RemoveSmallDefects( double dLinTol, double dAngTolDeg, bool bAlsoSpikes = false) override ; bool RemoveUndercutOnY( double dLinTol, double dAngTolDeg) override ; diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 1d89882..dd55861 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ diff --git a/OffsetCurve.cpp b/OffsetCurve.cpp index 64254bc..e7c1de0 100644 --- a/OffsetCurve.cpp +++ b/OffsetCurve.cpp @@ -161,10 +161,16 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) bool bClosed = ccCopy.IsClosed() && ( nType & ICurve::OFF_FORCE_OPEN) == 0 ; // elimino eventuali piccole Z - RemoveCurveSmallZs( &ccCopy, 10 * EPS_SMALL) ; + if ( ! RemoveCurveSmallZs( &ccCopy, 10 * EPS_SMALL)) + return false ; + + // converto archi diritti in segmenti di retta + if ( ! ccCopy.StraightArcsToLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG)) + return false ; // unisco parti allineate (tranne gli estremi) - ccCopy.MergeCurves( 10 * EPS_SMALL, ANG_TOL_STD_DEG, false) ; + if ( ! ccCopy.MergeCurves( 10 * EPS_SMALL, ANG_TOL_STD_DEG, false)) + return false ; // calcolo le lunghezze delle diverse entitą DBLVECTOR vLens ;