diff --git a/ChainCurves.cpp b/ChainCurves.cpp index ad5d615..3c12153 100644 --- a/ChainCurves.cpp +++ b/ChainCurves.cpp @@ -16,6 +16,7 @@ #include "/EgtDev/Include/EGkChainCurves.h" #include "/EgtDev/Include/EGkGeomDB.h" #include "/EgtDev/Include/EGkCurve.h" +#include "/EgtDev/Include/EGkCurveComposite.h" #include using namespace std ; @@ -496,3 +497,46 @@ ChainCurves::GetForkPoint( const Point3d& ptP) return ( find_if( m_vForkData.begin(), m_vForkData.end(), [&]( const ForkData& frkData) { return AreSamePointEpsilon( frkData.ptFork, ptP, m_dToler) ; })) ; } + +//---------------------------------------------------------------------------- +bool +ChainCurves::GetChainedCurves( ICRVCOMPOPOVECTOR& vCrv, double dChainTol, bool bAllowInvert) +{ + if( ssize( vCrv) == 1) + return true ; + // modifico direttamente le curve passate in input + Init( bAllowInvert, dChainTol, ssize( vCrv)) ; + for ( int c = 0 ; c < ssize( vCrv) ; ++c) { + Point3d ptStart, ptEnd ; + Vector3d vtStart, vtEnd ; + vCrv[c]->GetStartPoint( ptStart) ; + vCrv[c]->GetEndPoint( ptEnd) ; + vCrv[c]->GetStartDir( vtStart) ; + vCrv[c]->GetEndDir( vtEnd) ; + AddCurve( 1 + c, ptStart, vtStart, ptEnd, vtEnd) ; + } + INTVECTOR vIds ; + Point3d ptStart = ORIG ; + while ( GetChainFromNear( ptStart, false, vIds)) { + ICurveComposite* pFirstCrv = vCrv[vIds[0]] ; + for ( int nId : vIds) { + bool bInvert = false ; + if( nId < 0) + bInvert = true ; + nId = abs( nId) - 1 ; + if( bInvert) + vCrv[nId]->Invert() ; + if( ! pFirstCrv->AddCurve( Release( vCrv[nId]), true, dChainTol)) ; + return false ; + } + pFirstCrv->GetEndPoint( ptStart) ; + } + // elimino gli elementi del vettore che non contengono più curve + int c = ssize( vCrv) ; + while( c > -1) { + if( IsNull( vCrv[c])) + vCrv.erase( vCrv.begin() + c) ; + --c ; + } + return true ; +}