From 96907d5952e58e199e8f7a8cf4a09feed385bd82 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 19 Jan 2026 15:27:19 +0100 Subject: [PATCH] =?UTF-8?q?EgtGeomKernel=20:=20-=20aggiunta=20di=20una=20f?= =?UTF-8?q?unzionalit=C3=A0=20per=20il=20chain=20diretto=20di=20un=20vetto?= =?UTF-8?q?re=20di=20curve.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChainCurves.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) 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 ; +}