EgtGeomKernel :
- in CurveComposite aggiunti ModifyCurveToArc, ModifyCurveToLine e IsALine.
This commit is contained in:
+115
-18
@@ -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
@@ -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 ;
|
||||
|
||||
Reference in New Issue
Block a user