diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 3e87ed3..29875b5 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -1096,24 +1096,6 @@ CurveComposite::GetPointD1D2( double dU, Side nS, Point3d& ptPos, Vector3d* pvtD return m_CrvSmplS[nC]->GetPointD1D2( dUc, ICurve::FROM_MINUS, ptPos, pvtDer1, pvtDer2) ; } -//---------------------------------------------------------------------------- -bool -CurveComposite::IsAPoint( void) const -{ - // verifico lo stato - if ( m_nStatus != OK) - return false ; - - // ciclo di verifica - for ( auto Iter = m_CrvSmplS.begin() ; Iter != m_CrvSmplS.end() ; ++Iter) { - if ( (*Iter)->GetType() != CRV_BEZIER || - ! GetBasicCurveBezier(*Iter)->IsAPoint()) - return false ; - } - - return true ; -} - //---------------------------------------------------------------------------- bool CurveComposite::GetApproxLength( double& dLen) const @@ -1838,6 +1820,75 @@ CurveComposite::RemoveJoint( int nU) return true ; } +//---------------------------------------------------------------------------- +bool +CurveComposite::ModifyCurveToArc( int nCrv, const Point3d& ptMid) +{ + // verifico lo stato + if ( m_nStatus != OK) + return false ; + // numero di curve + int nCrvCount = GetCurveCount() ; + // la curva deve esistere + if ( nCrv < 0 || nCrv > nCrvCount - 1) + return false ; + // recupero la curva corrente + ICurve* pCrv = *(m_CrvSmplS.begin() + nCrv) ; + // recupero gli estremi + Point3d ptStart, ptEnd ; + if ( ! pCrv->GetStartPoint( ptStart) || ! pCrv->GetEndPoint( ptEnd)) + return false ; + // creo l'arco + PtrOwner pArc( CreateBasicCurveArc()) ; + if ( IsNull( pArc) || ! pArc->Set3P( ptStart, ptMid, ptEnd)) + return false ; + // sostituisco l'arco alla curva precedente + m_CrvSmplS[nCrv] = Release( pArc) ; + // elimino la curva originale + delete( pCrv) ; + + // imposto ricalcolo della grafica + m_OGrMgr.Reset() ; + + return true ; +} + +//---------------------------------------------------------------------------- +bool +CurveComposite::ModifyCurveToLine( int nCrv) +{ + // verifico lo stato + if ( m_nStatus != OK) + return false ; + // numero di curve + int nCrvCount = GetCurveCount() ; + // la curva deve esistere + if ( nCrv < 0 || nCrv > nCrvCount - 1) + return false ; + // recupero la curva corrente + ICurve* pCrv = *(m_CrvSmplS.begin() + nCrv) ; + // se giā linea non devo fare alcunchč + if ( pCrv->GetType() == CRV_LINE) + return true ; + // recupero gli estremi + Point3d ptStart, ptEnd ; + if ( ! pCrv->GetStartPoint( ptStart) || ! pCrv->GetEndPoint( ptEnd)) + return false ; + // creo la linea + PtrOwner pLine( CreateBasicCurveLine()) ; + if ( IsNull( pLine) || ! pLine->Set( ptStart, ptEnd)) + return false ; + // sostituisco la linea alla curva precedente + m_CrvSmplS[nCrv] = Release( pLine) ; + // elimino la curva originale + delete( pCrv) ; + + // imposto ricalcolo della grafica + m_OGrMgr.Reset() ; + + return true ; +} + //---------------------------------------------------------------------------- bool CurveComposite::TrimStartAtParam( double dUTrim) @@ -2963,6 +3014,52 @@ CurveComposite::RemoveUndercutOnY( double dLinTol, double dAngTolDeg) return AddCurve( Release( pOutLoop)) ; } +//---------------------------------------------------------------------------- +bool +CurveComposite::IsAPoint( void) const +{ + // verifico lo stato + if ( m_nStatus != OK) + return false ; + + // ciclo di verifica + for ( auto Iter = m_CrvSmplS.begin() ; Iter != m_CrvSmplS.end() ; ++Iter) { + if ( (*Iter)->GetType() != CRV_BEZIER || + ! GetBasicCurveBezier(*Iter)->IsAPoint()) + return false ; + } + + return true ; +} + +//---------------------------------------------------------------------------- +bool +CurveComposite::IsALine( double dLinTol, Point3d& ptStart, Point3d& ptEnd) const +{ + // verifico lo stato + if ( m_nStatus != OK || m_CrvSmplS.empty()) + return false ; + + // recupero gli estremi + if ( ! m_CrvSmplS.front()->GetStartPoint( ptStart) || + ! m_CrvSmplS.back()->GetEndPoint( ptEnd)) + return false ; + + // verifico non siano coincidenti + if ( AreSamePointEpsilon( ptStart, ptEnd, min( dLinTol, EPS_SMALL))) + return false ; + + // provo ad approssimarla con segmenti e verifico se si riduce ad un segmento di retta + PolyLine PL ; + if ( ! ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, APL_SPECIAL, PL)) + return false ; + // elimino i punti allineati entro la tolleranza + if ( ! PL.RemoveAlignedPoints( dLinTol)) + return false ; + // se sono rimasti due punti č una retta + return ( PL.GetPointNbr() == 2) ; +} + //---------------------------------------------------------------------------- bool CurveComposite::IsOneCircle( Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW) const diff --git a/CurveComposite.h b/CurveComposite.h index 9cc7acb..9b4fc0e 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -1,7 +1,7 @@ //---------------------------------------------------------------------------- -// EgalTech 2013-2013 +// EgalTech 2013-2021 //---------------------------------------------------------------------------- -// File : CurveComposite.h Data : 23.11.13 Versione : 1.3a1 +// File : CurveComposite.h Data : 03.04.21 Versione : 2.3d1 // Contenuto : Dichiarazione della classe Curva composita. // // @@ -148,11 +148,14 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool AddJoint( double dU) override ; bool ModifyJoint( int nU, const Point3d& ptNewJoint) override ; bool RemoveJoint( int nU) override ; + bool ModifyCurveToArc( int nCrv, const Point3d& ptMid) override ; + bool ModifyCurveToLine( int nCrv) override ; bool ArcsToBezierCurves( void) override ; bool ArcsBezierCurvesToArcsPerpExtr( double dLinTol, double dAngTolDeg) override ; bool MergeCurves( double dLinTol, double dAngTolDeg, bool bStartEnd = true, bool bNeedSameProp = false) override ; bool RemoveUndercutOnY( double dLinTol, double dAngTolDeg) override ; bool IsAPoint( void) const override ; + bool IsALine( double dLinTol, Point3d& ptStart, Point3d& ptEnd) const override ; bool IsACircle( double dLinTol, Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW) const override ; bool SetCurveTempProp( int nCrv, int nProp) override ; bool GetCurveTempProp( int nCrv, int& nProp) const override ;