From fe2aba43e535c9aaff0374bc8a74878df35dfcae Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 17 May 2024 10:31:59 +0200 Subject: [PATCH] EgtGeomKernel 2.6e5 : - sistemato il MergeTwoCurves tra due archi non piani per caso problematico di CurveArc::Set2PVN. --- CurveComposite.cpp | 107 +++++++++++++++++++++++---------------------- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes 2 files changed, 55 insertions(+), 52 deletions(-) diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 10e732c..5255d23 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -3225,61 +3225,64 @@ MergeTwoCurves( ICurve* pCrvP, ICurve* pCrvC, double& dCurrLinTol, double dCosAn // verifico di non superare l'angolo giro al centro if ( abs( pArcP->GetAngCenter() + pArcC->GetAngCenter()) > ANG_FULL + EPS_ANG_SMALL) return 0 ; - // se archi piatti - if ( pArcP->IsPlane() && pArcC->IsPlane()) { - // se calcolo nuovo arco ok, procedo con l'unione - Point3d ptP1 ; - pArcP->GetStartPoint( ptP1) ; - Point3d ptP2 ; - pArcP->GetEndPoint( ptP2) ; - Point3d ptP3 ; - pArcC->GetEndPoint( ptP3) ; - // verifico se circonferenza completa - bool bCirc = ( AreSamePointApprox( ptP1, ptP3)) ; - if ( bCirc) - pArcC->GetMidPoint( ptP3) ; - CurveArc NewArc ; - if ( NewArc.Set3P( ptP1, ptP2, ptP3, bCirc)) { - // verifico normale al piano dell'arco - if ( NewArc.GetNormVersor() * pArcC->GetNormVersor() < 0) - NewArc.InvertN() ; - // se curve originali con la stessa proprietà, la riporto - if ( nTpr0P == nTpr0C) - NewArc.SetTempProp( nTpr0C, 0) ; - if ( nTpr1P == nTpr1C) - NewArc.SetTempProp( nTpr1C, 1) ; - // aggiorno l'arco corrente e torno flag modifica - *pArcC = NewArc ; - return -1 ; - } - else + // verifico se archi piatti + bool bPlaneArcs = pArcP->IsPlane() && pArcC->IsPlane() ; + // se archi non piatti verifico coincidenza pendenza sulla normale + if ( ! bPlaneArcs) { + double dN = pArcP->GetNormVersor() * pArcC->GetNormVersor() ; + if ( abs(( pArcC->GetDeltaN() * pArcP->GetAngCenter() - dN * pArcP->GetDeltaN() * pArcC->GetAngCenter()) / + ( pArcP->GetAngCenter() + pArcC->GetAngCenter())) > dCurrLinTol) return 0 ; } - // verifico coincidenza pendenza sulla normale - double dN = pArcP->GetNormVersor() * pArcC->GetNormVersor() ; - if ( abs(( pArcC->GetDeltaN() * pArcP->GetAngCenter() - dN * pArcP->GetDeltaN() * pArcC->GetAngCenter()) / - ( pArcP->GetAngCenter() + pArcC->GetAngCenter())) < dCurrLinTol) { - // se calcolo nuovo arco ok, procedo con l'unione - Point3d ptP1 ; - pArcP->GetStartPoint( ptP1) ; - Vector3d vtDir1 ; - pArcP->GetStartDir( vtDir1) ; - Point3d ptP3 ; - pArcC->GetEndPoint( ptP3) ; - CurveArc NewArc ; - if ( NewArc.Set2PVN( ptP1, ptP3, vtDir1, pArcC->GetNormVersor())) { - // se curve originali con la stessa proprietà, la riporto - if ( nTpr0P == nTpr0C) - NewArc.SetTempProp( nTpr0C, 0) ; - if ( nTpr1P == nTpr1C) - NewArc.SetTempProp( nTpr1C, 1) ; - // aggiorno l'arco corrente e torno flag modifica - *pArcC = NewArc ; - return -1 ; - } - else - return 0 ; + + // se calcolo nuovo arco ok, procedo con l'unione + Point3d ptP1 ; + pArcP->GetStartPoint( ptP1) ; + Point3d ptP2 ; + pArcP->GetEndPoint( ptP2) ; + Point3d ptP3 ; + pArcC->GetEndPoint( ptP3) ; + + // se archi non piani costruisco arco sul piano definito dalla normale e dal punto di partenza del primo arco + Frame3d frRef ; + if ( ! frRef.Set( ptP1, pArcP->GetNormVersor())) + return 0 ; + if ( ! bPlaneArcs) { + ptP1.Scale( frRef, 1, 1, 0) ; + ptP2.Scale( frRef, 1, 1, 0) ; + ptP3.Scale( frRef, 1, 1, 0) ; } + + // verifico se circonferenza completa + bool bCirc = ( AreSamePointApprox( ptP1, ptP3)) ; + if ( bCirc) { + pArcC->GetMidPoint( ptP3) ; + if ( ! bPlaneArcs) + ptP3.Scale( frRef, 1, 1, 0) ; + } + + CurveArc NewArc ; + if ( NewArc.Set3P( ptP1, ptP2, ptP3, bCirc)) { + // verifico normale al piano dell'arco + if ( NewArc.GetNormVersor() * pArcC->GetNormVersor() < 0) + NewArc.InvertN() ; + // se archi non piani ripristino il deltaN + if ( ! bPlaneArcs) { + double dDeltaN1 = pArcP->GetDeltaN() ; + double dDeltaN2 = pArcC->GetDeltaN() ; + NewArc.ChangeDeltaN( dDeltaN1 + dDeltaN2) ; + } + // se curve originali con la stessa proprietà, la riporto + if ( nTpr0P == nTpr0C) + NewArc.SetTempProp( nTpr0C, 0) ; + if ( nTpr1P == nTpr1C) + NewArc.SetTempProp( nTpr1C, 1) ; + // aggiorno l'arco corrente e torno flag modifica + *pArcC = NewArc ; + return -1 ; + } + else + return 0 ; } // nessuna fusione diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 159c2b9e6e60d7212196ca1711425447755c62e3..bb6aeb524e13f2c20507f40a998d45b85e8cb98e 100644 GIT binary patch delta 238 zcmdlNy)SyhI%aiGhCGIJh8%`ehGHOAV9;O)W+-7u1ma8}FBB-731Uy?R&U)L$1;bB z(RA}~HbrJe)5(h5x|_YYCa?fSZu8k9MBErR_Xv9d`53|-(qLf}{T_^)vy{Iv66=o5 l-Kxcmg85*FdV(FA19V{GW^VP3%$UNHyHyWv?$S140s!>=I%@y` delta 236 zcmdlNy)SyhI%aKGhCGIJh8%`WhGK>c1_cHUhESkLCPN8BDnkm89}HwAf_cT0PijeT z{=m$}%xJRtyqqG4`lwjSxVewp10r;uY4S3`JfN_k6i~QJ7*lvJ3$os9QmsEYnTvVZ l