From 5195c23dfb54197d037071d9b6254c9f06e5780d Mon Sep 17 00:00:00 2001 From: Riccardo Elitropi Date: Fri, 16 Jan 2026 17:27:33 +0100 Subject: [PATCH 1/3] EgtGeomKernel : - in CalcPocketing piccola modifica sulle Entrate per casi a Trapezio. --- CalcPocketing.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/CalcPocketing.cpp b/CalcPocketing.cpp index 2805622..80033b3 100644 --- a/CalcPocketing.cpp +++ b/CalcPocketing.cpp @@ -3735,16 +3735,25 @@ GetSpiralOptimizedCurves( const ISurfFlatRegion* pSfrChunk, const PocketParams& if ( bOkTrap) { // calcolo eventuali uscite e ingressi if ( pCrvRes->GetTempProp( 0) > 0) { + // Recupero gli estremi della curva corrente e la inverto in base alla Testa + Point3d ptS ; pCrvRes->GetStartPoint( ptS) ; + Point3d ptE ; pCrvRes->GetEndPoint( ptE) ; + Point3d ptSGlob = GetToGlob( ptS, PockParam.frLocXY) ; + Point3d ptEGlob = GetToGlob( ptE, PockParam.frLocXY) ; + if ( ( PockParam.bAboveHead && ptEGlob.z > ptSGlob.z) || + ( ! PockParam.bAboveHead && ptEGlob.z < ptSGlob.z)) + pCrvRes->Invert() ; + if ( PockParam.bInvert) + pCrvRes->Invert() ; + // Calcolo eventuale entrata da fuori Vector3d vtRef ; pCrvRes->GetStartDir( vtRef) ; vtRef.Invert() ; bool bIsStartExtended = false ; if ( ! ExtendPath( pCrvRes, pSfrChunk, PockParam, vtRef, false, PockParam.dRad + PockParam.dOpenMinSafe, bIsStartExtended)) return false ; - pCrvRes->GetEndDir( vtRef) ; - bool bIsEndExtended = false ; - if ( ! ExtendPath( pCrvRes, pSfrChunk, PockParam, vtRef, true, PockParam.dRad + PockParam.dOpenMinSafe, bIsEndExtended)) - return false ; - if ( bIsEndExtended && ! bIsStartExtended) + } + else { + if ( PockParam.bInvert) pCrvRes->Invert() ; } } From 3ded6fe87d0bf87903c75185087c4897ac3ef60d Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Fri, 16 Jan 2026 18:44:36 +0100 Subject: [PATCH 2/3] EgtGeomKernel : - piccole modifiche estetiche. --- IntersCurveCurve.cpp | 32 ++++++++++++++++---------------- IntersLineLine.cpp | 8 ++++---- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/IntersCurveCurve.cpp b/IntersCurveCurve.cpp index ec3ee45..7aa10d5 100644 --- a/IntersCurveCurve.cpp +++ b/IntersCurveCurve.cpp @@ -47,7 +47,7 @@ IntersCurveCurve::IntersCurveCurve( const ICurve& CurveA, const ICurve& CurveB, // ciclo sulle curve per verificare se da approssimare for ( int i = 0 ; i < 2 ; ++ i) { - // se curva è arco da approssimare oppure è curva di Bezier + // se curva è arco da approssimare oppure è curva di Bezier if ( ( m_pCurve[i]->GetType() == CRV_ARC && IsArcToApprox( *m_pCurve[i])) || m_pCurve[i]->GetType() == CRV_BEZIER) { // approssimo con rette @@ -127,7 +127,7 @@ IntersCurveCurve::IsArcToApprox( const ICurve& Curve) const CurveArc* pArc = GetBasicCurveArc( &Curve) ; if ( pArc == nullptr) return false ; - // verifico se non è nel piano XY o ha più di un giro al centro + // verifico se non è nel piano XY o ha più di un giro al centro return ( ( ! pArc->GetNormVersor().IsZplus() && ! pArc->GetNormVersor().IsZminus()) || abs( pArc->GetAngCenter()) > ANG_FULL + EPS_ANG_ZERO) ; } @@ -252,10 +252,10 @@ IntersCurveCurve::CrvCompoCrvCompoCalculate( const ICurve& CurveA, const ICurve& bool IntersCurveCurve::AdjustIntersParams( bool bAdjCrvA, bool bAdjCrvB) { - // se non ci sono intersezioni, non va fatto alcunché + // se non ci sono intersezioni, non va fatto alcunché if ( m_Info.empty()) return true ; - // se le curve originali non sono state approssimate, non va fatto alcunché + // se le curve originali non sono state approssimate, non va fatto alcunché if ( ! bAdjCrvA && ! bAdjCrvB) return true ; // procedo ad aggiustare @@ -389,11 +389,11 @@ IntersCurveCurve::GetIntersPointNearTo( int nCrv, const Point3d& ptNear, Point3d if ( m_nIntersCount == 0 || nCrv < 0 || nCrv > 1) return false ; - // ricerca del punto più vicino tra le intersezioni singole + // ricerca del punto più vicino tra le intersezioni singole bool bFound = false ; double dMinSqDist = SQ_INFINITO ; for ( int i = 0 ; i < m_nIntersCount ; ++ i) { - // se è un'intersezione singola + // se è un'intersezione singola if ( ! m_Info[i].bOverlap) { // faccio la verifica sul punto Point3d ptP = ( nCrv == 0 ? m_Info[i].IciA[0].ptI : m_Info[i].IciB[0].ptI) ; @@ -458,7 +458,7 @@ IntersCurveCurve::GetCurveClassification( int nCrv, double dLenMin, CRVCVECTOR& // se esiste almeno una intersezione if ( m_nIntersCount >= 1) return CalcCurveClassification( m_pCurve[0], m_Info, dLenMin, ccClass) ; - // altrimenti la curva è completamente interna oppure completamente esterna + // altrimenti la curva è completamente interna oppure completamente esterna else return CalcCurveInOrOut( m_pCurve[0], m_pCurve[1], ccClass) ; } @@ -475,7 +475,7 @@ IntersCurveCurve::GetCurveClassification( int nCrv, double dLenMin, CRVCVECTOR& // se esiste almeno una intersezione if ( m_nIntersCount >= 1) return CalcCurveClassification( m_pCurve[1], InfoTmp, dLenMin, ccClass) ; - // altrimenti la curva è completamente interna oppure completamente esterna + // altrimenti la curva è completamente interna oppure completamente esterna else return CalcCurveInOrOut( m_pCurve[1], m_pCurve[0], ccClass) ; } @@ -540,7 +540,7 @@ IntersCurveCurve::CalcCurveClassification( const ICurve* pCurve, const ICCIVECTO double dU2 = Info[j].IciA[1].dU ; if ( dU2 < dU1 && pCurve->IsClosed()) dU2 += dEndPar ; - // se cade nell'intervallo è da saltare + // se cade nell'intervallo è da saltare if ( Info[i].IciA[0].dU >= dU1 && Info[i].IciA[0].dU <= dU2) { bToSkip = true ; break ; @@ -559,7 +559,7 @@ IntersCurveCurve::CalcCurveClassification( const ICurve* pCurve, const ICCIVECTO double dCurrPar = dStartPar ; double dCurrLen = 0 ; double dEndLen ; pCurve->GetLength( dEndLen) ; - // se è chiusa, recupero come finisce + // se è chiusa, recupero come finisce if ( pCurve->IsClosed()) { if ( ! InfoCorr[nNumInters-1].bOverlap) nLastTy = InfoCorr[nNumInters-1].IciA[0].nNextTy ; @@ -577,7 +577,7 @@ IntersCurveCurve::CalcCurveClassification( const ICurve* pCurve, const ICCIVECTO } // costruisco il vettore delle classificazioni for ( int i = 0 ; i < nNumInters ; ++ i) { - // se è definito un tratto precedente + // se è definito un tratto precedente double dLenU ; pCurve->GetLengthAtParam( InfoCorr[i].IciA[0].dU, dLenU) ; if ( InfoCorr[i].IciA[0].dU > dCurrPar + EPS_PARAM && dLenU - dCurrLen > dLenMin) { // verifico che la definizione sul tratto sia omogenea e valida @@ -599,7 +599,7 @@ IntersCurveCurve::CalcCurveClassification( const ICurve* pCurve, const ICCIVECTO // altrimenti, salvo il tipo else nLastTy = InfoCorr[i].IciA[0].nNextTy ; - // se è definito un tratto in sovrapposizione + // se è definito un tratto in sovrapposizione if ( InfoCorr[i].bOverlap) { // assegno i dati CrvClass segClass ; @@ -639,7 +639,7 @@ IntersCurveCurve::CalcCurveInOrOut( const ICurve* pCurveA, const ICurve* pCurveB double dStartParB, dEndParB ; if ( ! pCurveB->GetDomain( dStartParB, dEndParB)) return false ; - // se almeno un punto di ciascuna curva è esterno al box dell'altra, sono sicuramente esterne + // se almeno un punto di ciascuna curva è esterno al box dell'altra, sono sicuramente esterne BBox3d boxCrvA, boxCrvB ; if ( ! pCurveA->GetLocalBBox( boxCrvA) || ! pCurveB->GetLocalBBox( boxCrvB)) @@ -682,9 +682,9 @@ IntersCurveCurve::CalcCurveInOrOut( const ICurve* pCurveA, const ICurve* pCurveB IntersCurveCurve iCC( clLine, *pCurveB) ; // dichiaro la classe della curva per default int nClass = CRVC_OUT ; - // se c'è almeno una intersezione + // se c'è almeno una intersezione if ( iCC.GetIntersCount() > 0) { - // se quanto precede la prima intersezione è interno, allora la curva è interna + // se quanto precede la prima intersezione è interno, allora la curva è interna IntCrvCrvInfo aInfo ; iCC.GetIntCrvCrvInfo( 0, aInfo) ; if ( aInfo.IciA[0].nPrevTy == ICCT_IN) @@ -700,7 +700,7 @@ IntersCurveCurve::CalcCurveInOrOut( const ICurve* pCurveA, const ICurve* pCurveB // calcolo l'intersezione IntersCurveCurve iCC( clLine, *pCurveB) ; if ( iCC.GetIntersCount() > 0) { - // se quanto precede la prima intersezione è interno, allora la curva è interna + // se quanto precede la prima intersezione è interno, allora la curva è interna IntCrvCrvInfo aInfo ; iCC.GetIntCrvCrvInfo( 0, aInfo) ; if ( aInfo.IciA[0].nPrevTy == ICCT_IN) diff --git a/IntersLineLine.cpp b/IntersLineLine.cpp index 5e204d2..12e0ce7 100644 --- a/IntersLineLine.cpp +++ b/IntersLineLine.cpp @@ -162,18 +162,18 @@ IntersLineLine::IntersFiniteLines( const CurveLine& Line1, const CurveLine& Line // analisi casi speciali di quasi parallelismo // segmento sovrapposto all'altro double dDist1, dDist2 ; - if( nS1Side == 0 || nE1Side == 0 || nS1Side == nE1Side) { + if ( nS1Side == 0 || nE1Side == 0 || nS1Side == nE1Side) { dDist1 = CrossXY( ptS1 - ptS2, vtDir2) ; dDist2 = CrossXY( ptE1 - ptS2, vtDir2) ; - if( abs( dDist1 - dDist2) < EPS_SMALL * dLen2XY) { + if ( abs( dDist1 - dDist2) < EPS_SMALL * dLen2XY) { bParallel = true ; bFarEnds = ! ( (nS1Side == 0 && nE1Side == 0) || (nS2Side == 0 && nE2Side == 0)) ; } } - else if( nS2Side == 0 || nE2Side == 0 || nS2Side == nE2Side) { + else if ( nS2Side == 0 || nE2Side == 0 || nS2Side == nE2Side) { dDist1 = CrossXY( ptS2 - ptS1, vtDir1) ; dDist2 = CrossXY( ptE2 - ptS1, vtDir1) ; - if( abs( dDist1 - dDist2) < EPS_SMALL * dLen1XY){ + if ( abs( dDist1 - dDist2) < EPS_SMALL * dLen1XY) { bParallel = true ; bFarEnds = ! ( (nS1Side == 0 && nE1Side == 0) || (nS2Side == 0 && nE2Side == 0)) ; } From b971eda771c62f6007ed2e9c32129d4596ab63b7 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Mon, 19 Jan 2026 08:03:57 +0100 Subject: [PATCH 3/3] EgtGeomJKernel : - in Zmap sostituiti mutex con atomic_flag. --- VolZmap.h | 7 +++---- VolZmapGraphics.cpp | 36 ++++++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/VolZmap.h b/VolZmap.h index c8d6f76..b41d063 100644 --- a/VolZmap.h +++ b/VolZmap.h @@ -21,9 +21,8 @@ #include "/EgtDev/Include/EGkSurfTriMesh.h" #include #include -#include -#include #include +#include typedef std::pair PNTVEC3D ; typedef std::vector PNTVEC3DVECTOR ; // vettore di intersezioni punto, vettore, tipo superficie @@ -557,9 +556,9 @@ class VolZmap : public IVolZmap, public IGeoObjRW mutable std::vector m_SliceXY ; mutable std::vector m_SliceXZ ; mutable std::vector m_SliceYZ ; - mutable std::mutex m_SliceMutex ; + mutable std::atomic_flag m_SliceFlag ; - std::atomic m_bIsBox ; + bool m_bIsBox ; int m_nCurrTool ; std::vector m_vTool ; diff --git a/VolZmapGraphics.cpp b/VolZmapGraphics.cpp index 3159877..2cd8b29 100644 --- a/VolZmapGraphics.cpp +++ b/VolZmapGraphics.cpp @@ -1271,13 +1271,15 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bDefTopology = true ; } if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { - m_SliceMutex.lock() ; + while ( m_SliceFlag.test_and_set( memory_order_acquire)) + m_SliceFlag.wait( true, memory_order_relaxed) ; auto it = m_SliceYZ[nSlBlockN].find( nSliceN) ; if ( it != m_SliceYZ[nSlBlockN].end()) { bMatOnSlice = it->second ; bDefTopology = true ; } - m_SliceMutex.unlock() ; + m_SliceFlag.clear( memory_order_release) ; + m_SliceFlag.notify_one() ; } } else if ( abs( nAdjVox3[nCount]) == 2) { @@ -1287,13 +1289,15 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bDefTopology = true ; } if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { - m_SliceMutex.lock() ; + while ( m_SliceFlag.test_and_set( memory_order_acquire)) + m_SliceFlag.wait( true, memory_order_relaxed) ; auto it = m_SliceXZ[nSlBlockN].find( nSliceN) ; if ( it != m_SliceXZ[nSlBlockN].end()) { bMatOnSlice = it->second ; bDefTopology = true ; } - m_SliceMutex.unlock() ; + m_SliceFlag.clear( memory_order_release) ; + m_SliceFlag.notify_one() ; } } else if ( abs( nAdjVox3[nCount]) == 3) { @@ -1303,13 +1307,15 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const bDefTopology = true ; } if ( GetBlockNFromIJK( nSlBlockIJK, nSlBlockN)) { - m_SliceMutex.lock() ; + while ( m_SliceFlag.test_and_set( memory_order_acquire)) + m_SliceFlag.wait( true, memory_order_relaxed) ; auto it = m_SliceXY[nSlBlockN].find( nSliceN) ; if ( it != m_SliceXY[nSlBlockN].end()) { bMatOnSlice = it->second ; bDefTopology = true ; } - m_SliceMutex.unlock() ; + m_SliceFlag.clear( memory_order_release) ; + m_SliceFlag.notify_one() ; } } } @@ -1374,27 +1380,33 @@ VolZmap::ExtMarchingCubes( int nBlock, VoxelContainer& vVox) const if ( nSlBlockN == nBlock) SliceYZ.emplace( nSliceN, bMatOnSlice) ; else { - m_SliceMutex.lock() ; + while ( m_SliceFlag.test_and_set( memory_order_acquire)) + m_SliceFlag.wait( true, memory_order_relaxed) ; m_SliceYZ[nSlBlockN].emplace( nSliceN, bMatOnSlice) ; - m_SliceMutex.unlock() ; + m_SliceFlag.clear( memory_order_release) ; + m_SliceFlag.notify_one() ; } } else if ( abs(nAdjVox3[nCount]) == 2) { if ( nSlBlockN == nBlock) SliceXZ.emplace( nSliceN, bMatOnSlice) ; else { - m_SliceMutex.lock() ; + while ( m_SliceFlag.test_and_set( memory_order_acquire)) + m_SliceFlag.wait( true, memory_order_relaxed) ; m_SliceXZ[nSlBlockN].emplace( nSliceN, bMatOnSlice) ; - m_SliceMutex.unlock() ; + m_SliceFlag.clear( memory_order_release) ; + m_SliceFlag.notify_one() ; } } else if ( abs(nAdjVox3[nCount]) == 3) { if ( nSlBlockN == nBlock) SliceXY.emplace(nSliceN, bMatOnSlice) ; else { - m_SliceMutex.lock() ; + while ( m_SliceFlag.test_and_set( memory_order_acquire)) + m_SliceFlag.wait( true, memory_order_relaxed) ; m_SliceXY[nSlBlockN].emplace( nSliceN, bMatOnSlice) ; - m_SliceMutex.unlock() ; + m_SliceFlag.clear( memory_order_release) ; + m_SliceFlag.notify_one() ; } } }