From 4e6dd05aa997123ecb4d98d72b6f3cc25d2fe604 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Fri, 5 Jun 2026 10:08:16 +0200 Subject: [PATCH] EgtGeomKernel : - miglioria nella gestione degli angoli interni per lavorazioni a 5 assi. --- ProjectCurveSurf.cpp | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/ProjectCurveSurf.cpp b/ProjectCurveSurf.cpp index e403193..2ddc1df 100644 --- a/ProjectCurveSurf.cpp +++ b/ProjectCurveSurf.cpp @@ -40,6 +40,7 @@ const int P5AX_CVEX = 2 ; // su angolo convesso const int P5AX_CONC = 3 ; // in angolo concavo const int P5AX_BEFORE_CONC = 4 ; // adiacente ad angolo concavo const int P5AX_AFTER_CONC = 5 ; // adiacente ad angolo concavo +const int P5AX_SMOOTH_CONC = 6 ; // zona concava curva, senza spigolo netto //---------------------------------------------------------------------------- static double @@ -64,6 +65,7 @@ PointsInTolerance( const PNT5AXVECTOR& vPt5ax, int nPrec, int nCurr, int nNext, static bool AddPointsOnCorners( PNT5AXVECTOR& vPt5ax) { + const double dCosSmallAngle = cos( 2 * DEGTORAD) ; for ( int i = 1 ; i < ssize( vPt5ax) ; ++ i) { // precedente int j = i - 1 ; @@ -79,18 +81,24 @@ AddPointsOnCorners( PNT5AXVECTOR& vPt5ax) Point3d ptInt ; if ( IntersLinePlane( ptEdge, vtEdge, 1, plPlane3, ptInt, false) == ILPT_YES) { // verifico se spigolo convesso o concavo - bool bConvex ; - if ( ! AreSamePointApprox( ptInt, vPt5ax[j].ptP)) - bConvex = ( ( vPt5ax[j].vtDir1 ^ ( ptInt - vPt5ax[j].ptP)) * vtEdge > 0) ; - else - bConvex = (( vPt5ax[i].vtDir1 ^ ( ptInt - vPt5ax[i].ptP)) * vtEdge < 0) ; + bool bConvex = (vPt5ax[i].ptP - vPt5ax[j].ptP) * vPt5ax[j].vtDir1 < 0 ; + bool bValidInters = true ; + if ( i > 2) { + int k = i - 2 ; + // verifico la concavità anche tornando indietro lungo la linea + if ( ( vPt5ax[k].ptP - vPt5ax[j].ptP) * vPt5ax[i].vtDir1 < 0 != bConvex) { + LOG_WARN( GetEGkLogger(), "La superficie su cui si sta proiettando la curva ha delle normali incoerenti") + return false ; + } + // verifico che l'intersezione sia tra i e j e non prima di j + bValidInters = ( ptInt - vPt5ax[j].ptP) * ( vPt5ax[j].ptP - vPt5ax[k].ptP) > 0 ; + } // se convesso, metto due punti con direzione appena prima e appena dopo if ( bConvex) { Vector3d vtLine1 = ptInt - vPt5ax[j].ptP ; double dLen1 = vtLine1.Len() ; Vector3d vtLine2 = vPt5ax[i].ptP - ptInt ; double dLen2 = vtLine2.Len() ; - if ( dLen1 > 2 * EPS_SMALL) { + if ( dLen1 > 10 * EPS_SMALL && bValidInters) { Point5ax Pt5ax ; - Pt5ax.ptP = ptInt - vtLine1 / dLen1 * 2 * EPS_SMALL ; Pt5ax.vtDir1 = vPt5ax[j].vtDir1 ; Pt5ax.vtDir2 = vPt5ax[j].vtDir2 ; Pt5ax.vtDirU = vPt5ax[j].vtDirU ; @@ -102,9 +110,14 @@ AddPointsOnCorners( PNT5AXVECTOR& vPt5ax) } else vPt5ax[j].nFlag = P5AX_CVEX ; - if ( dLen2 > 2 * EPS_SMALL) { + if ( dLen2 > 10 * EPS_SMALL) { Point5ax Pt5ax ; - Pt5ax.ptP = ptInt + vtLine2 / dLen2 * 2 * EPS_SMALL ; + if ( bValidInters) + Pt5ax.ptP = ptInt + vtLine2 / dLen2 * 2 * EPS_SMALL ; + else { + Vector3d vtNewLine = vPt5ax[i].ptP - vPt5ax[j].ptP ; vtNewLine.Normalize() ; + Pt5ax.ptP = vPt5ax[j].ptP + vtNewLine * 2 * EPS_SMALL ; + } Pt5ax.vtDir1 = vPt5ax[i].vtDir1 ; Pt5ax.vtDir2 = vPt5ax[i].vtDir2 ; Pt5ax.vtDirU = vPt5ax[i].vtDirU ; @@ -133,6 +146,11 @@ AddPointsOnCorners( PNT5AXVECTOR& vPt5ax) } } } + // guardo se la proiezione il tratto successivo, lungo la normale precedente dà un valore positivo ( angolo interno smooth) + else if ( ( vPt5ax[i].ptP - vPt5ax[j].ptP) * vPt5ax[j].vtDir1 > 0) { + // se concavo senza spigolo netto segnalo zona concava smooth + vPt5ax[i].nFlag = P5AX_SMOOTH_CONC ; + } } return true ; } @@ -377,8 +395,10 @@ ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, } // se richiesto, inserimento punti intermedi in presenza di spigoli - if ( bSharpEdges) - AddPointsOnCorners( vPt5ax) ; + if ( bSharpEdges) { + if ( ! AddPointsOnCorners( vPt5ax)) + return false ; + } // rimozione punti in eccesso rispetto alle tolleranze RemovePointsInExcess( vPt5ax, dLinTol, dMaxSegmLen, bSharpEdges) ;