From 7abf3027d4072844db21d7b3589d4e2fa3a34459 Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Thu, 24 Jul 2025 11:21:22 +0200 Subject: [PATCH] EgtGeomKernel : - in CalcPocketing corretta gestione superficie limite per Conformal. --- CalcPocketing.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index 8e0baa2..fc1d346 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -7361,10 +7361,10 @@ CalcConformalLink( ICurveComposite* pCrvOffs0, ICurveComposite* pCrvOffs1, Pocke vCrvChunk.emplace_back( vCrvClassBorder[vIndOffs0[i]]->Clone()) ; // se la curva successiva รจ chiusa, aggiorno il suo punto iniziale a quello a minima distanza if ( ! bOpen1) { - Point3d ptS ; pCrvOffs0->GetStartPoint( ptS) ; + Point3d ptE ; pCrvOffs0->GetEndPoint( ptE) ; double dPar ; int nFlag ; - if ( DistPointCurve( ptS, *pCrvOffs1).GetParamAtMinDistPoint( 0., dPar, nFlag)) + if ( DistPointCurve( ptE, *pCrvOffs1).GetParamAtMinDistPoint( 0., dPar, nFlag)) pCrvOffs1->ChangeStartPoint( dPar) ; } if ( ! CutCurveToConnect( pCrvOffs0, pCrvOffs1, vCrvChunk, PockParams, @@ -7810,13 +7810,27 @@ CalcConformalOffsAndLinks( VICRVCOMPOPOVECTOR& vvCrvOffs, const ISurfFlatRegion* I link che collegano due curve di Offset aperte devono partire dalla prima e, seguendo il bordo della regione di classificazione ( pSfrClass) arrivare alla seconda. */ + /* NB. + La regione di classificazione ( pSfrClass) deve tenere conto della regione limite; nel caso di + bordi chiusi, bisogna stare a distanza opportuna da essi, non raccordandoci i Links + */ /* NB. I link che collegano due curve di Offset chiuse tra di loro vengono calcolati esattamente come per i percorsi SPIRAL, pertanto devo definire un insieme di curve di primo Offset sui quali smussare i Link per evitare di uscire dalla regione di svuotatura */ ICRVCOMPOPOVECTOR vCrvSfrClass ; - if ( ! GetSfrCrvCompoLoops( pSfrClass, vCrvSfrClass)) + PtrOwner pSfrClassReal( CloneSurfFlatRegion( pSfrClass)) ; + if ( IsNull( pSfrClassReal) || ! pSfrClassReal->IsValid()) + return false ; + if ( PockParams.SfrLimit.IsValid()) { + PtrOwner pSfrLimit( CloneSurfFlatRegion( &PockParams.SfrLimit)) ; + if ( IsNull( pSfrLimit) || ! pSfrLimit->IsValid() || + ! pSfrLimit->Offset( PockParams.dRad + PockParams.dRadialOffset, ICurve::OFF_FILLET) || + ! pSfrClassReal->Subtract( *pSfrLimit)) + return false ; + } + if ( ! GetSfrCrvCompoLoops( pSfrClassReal, vCrvSfrClass)) return false ; /* NB.