From f0137d26f42d3db7390ef65000db31a17ae1acaa Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 7 Jul 2026 16:13:17 +0200 Subject: [PATCH] EgtGeomKernel : - migliorie e correzioni a SurfExtend e Offset3d. --- OffsetCurve3d.cpp | 4 ++-- ProjectCurveSurf.cpp | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/OffsetCurve3d.cpp b/OffsetCurve3d.cpp index 21e0ad4..ccee0c2 100644 --- a/OffsetCurve3d.cpp +++ b/OffsetCurve3d.cpp @@ -269,7 +269,7 @@ OffsetCurve3d::Make( const PNT5AXVECTOR& vPnt5Ax, double dOffDist, int nType) if ( vtDirPrevOff.IsValid()) dProj = vtDirCurrOff * vtDirPrevOff ; // prima di inserirlo controllo che il tratto non torni indietro - if ( vFlag[nCurr] != ANG_STR || dProj > - 0.966) { + if ( ( vFlag[nCurr] != ANG_STR || dProj > - 0.966) && Dist( ptPrev, ptP) > 2 * EPS_SMALL) { // aggiungo tratto ICurveLine* pCL = CreateBasicCurveLine() ; pCL->Set( ptPrev, ptP) ; @@ -446,7 +446,7 @@ IsPointInsideCylinder( const Point3d& ptTest, const Cyl& offCyl, double dLinTol) bool CalcAdjustConcavePartsInPath( const ICurveComposite* pCrv, const OFFSETSEGVEC& vOffsetCrvs, double dRad, EDITCRVINFOVEC& vEditInfo) { - const double dLinTol = 10 * EPS_SMALL ; + const double dLinTol = 0 * EPS_SMALL ; for ( int i = 0 ; i < ssize( vOffsetCrvs) ; ++i) { int nFlag = vOffsetCrvs[i].nFlag ; // considero tutt le zone concave diff --git a/ProjectCurveSurf.cpp b/ProjectCurveSurf.cpp index b39727d..a57a928 100644 --- a/ProjectCurveSurf.cpp +++ b/ProjectCurveSurf.cpp @@ -1295,8 +1295,7 @@ GetCurveOnSurfInfo( const ICurve& crCrv, const ISurfTriMesh& pSurf, // approssimo la curva con una polilinea entro la tolleranza PolyLine PL ; - if ( ! crCrv.ApproxWithLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL) || - ! PL.RemoveAlignedPoints( dLinTol, false) ) + if ( ! crCrv.ApproxWithLines( 10 * EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_SPECIAL, PL)) return false ; const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ; if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN)) @@ -1345,7 +1344,7 @@ GetCurveOnSurfInfo( const ICurve& crCrv, const ISurfTriMesh& pSurf, nTria = nTriaCurr ; if ( bJoint) { int nTria2 ; pCC->GetCurveTempProp( int( dPar), nTria2, 0) ; - Triangle3d trTria2 ; pSurf.GetTriangle( nTria2, trTria2) ; + Triangle3dEx trTria2 ; pSurf.GetTriangle( nTria2, trTria2) ; if ( ! CalcNormal( ptP, trTria2, Pt5ax.vtDir2)) Pt5ax.vtDir2 = trTria2.GetN() ; nTria = nTria2 ; @@ -1368,13 +1367,15 @@ GetCurveOnSurfInfo( const ICurve& crCrv, const ISurfTriMesh& pSurf, else vtDir = vtDirPrev ; // in caso sia stato superato l'angolo limite dò priorità alla direzione precedente + bool bEdge = false ; if ( vtDirPrev.IsValid() && (! bFirst || ( bFirst && bClosed))) { double dProj = vtDirNext * vtDirPrev ; - if ( dProj > COS_ANG_MAX_CORNER) + bEdge = dProj < COS_ANG_MAX_CORNER ; + if ( ! bEdge) vtDir = Media( vtDirNext, vtDirPrev) ; } vtDirPrev = vtDirNext ; - bool bEdge = ! AreSameVectorExact( vPt5ax.back().vtDir1, vPt5ax.back().vtDir2) ; + bEdge = bEdge || ! AreSameVectorExact( vPt5ax.back().vtDir1, vPt5ax.back().vtDir2) ; Vector3d vtTang = vtDir ^ vtNorm ; vtTang.Normalize() ; vPt5ax.back().vtDir1 = vtTang ; if ( bEdge) {