EgtGeomKernel :

- aggiunta di una funzionalità per il chain diretto di un vettore di curve.
This commit is contained in:
Daniele Bariletti
2026-01-19 15:27:19 +01:00
parent 3c5d2571fe
commit 96907d5952
+44
View File
@@ -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 <algorithm>
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 ;
}