EgtGeomKernel :

- in CurveComposite aggiunti ModifyCurveToArc, ModifyCurveToLine e IsALine.
This commit is contained in:
Dario Sassi
2021-04-03 17:58:26 +00:00
parent 6d7aacf00a
commit c20d29602f
2 changed files with 120 additions and 20 deletions
+115 -18
View File
@@ -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<CurveArc> 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<CurveLine> 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
+5 -2
View File
@@ -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 ;