From 7a01f67c8b48bc66dc839786c863943723ead7e9 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Wed, 4 Sep 2024 15:50:01 +0200 Subject: [PATCH] EgtGeomKernel : - aggiunto un argomento alla CalcRegionPolyLines. --- SbzFromCurves.cpp | 7 ++----- SfrCreate.cpp | 10 ++++++++-- StmFromCurves.cpp | 6 ++++-- Triangulate.cpp | 3 ++- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/SbzFromCurves.cpp b/SbzFromCurves.cpp index a9510bf..aa2d01f 100644 --- a/SbzFromCurves.cpp +++ b/SbzFromCurves.cpp @@ -72,7 +72,8 @@ GetSurfBezierByRegion( const CICURVEPVECTOR& vpCurve, double dLinTol) } Vector3d vtN ; INTMATRIX vnPLIndMat ; - if ( ! CalcRegionPolyLines( vPL, vPLOrd, vtN, vnPLIndMat)) + BOOLVECTOR vbInvert ; + if ( ! CalcRegionPolyLines( vPL, vPLOrd, vtN, vnPLIndMat,vbInvert)) return nullptr ; // creo e setto la superficie di bezier PtrOwner pSbz( CreateBasicSurfBezier()) ; @@ -136,8 +137,6 @@ GetSurfBezierByExtrusion( const ICurve* pCurve, const Vector3d& vtExtr, // //if ( ! pSbz->DoSewing( STM1) || ! pSTM->DoSewing( STM2)) // // return nullptr ; //} - //// salvo tolleranza lineare usata - //pSbz->SetLinearTolerance( dLinTol) ; // restituisco la superficie return Release( pSbz) ; } @@ -181,8 +180,6 @@ GetSurfBezierByExtrusion( const ICurve* pCurve, const Vector3d& vtExtr, // if ( ! SbzLat.CreateByExtrusion( vPL[i], vtExtr)) // qui mi serve la curva e non la polyline della curva. vuol dire che dalla CalcRegionPolyLines devo farmi restituire anche le curve ordinate // return nullptr ; // } -// //// salvo tolleranza lineare usata -// //pSTM->SetLinearTolerance( dLinTol) ; // // restituisco la superficie // return Release( pSrfCompo) ; // in realtà dovrei restituire tre superfici!!! due basi e una sup laterale( e quindi fare una SurfCompo) oppure dovrei spezzare le basi in tot pezzi e creare una superficie unica //} diff --git a/SfrCreate.cpp b/SfrCreate.cpp index c019618..ab14894 100644 --- a/SfrCreate.cpp +++ b/SfrCreate.cpp @@ -575,7 +575,7 @@ SurfFlatRegionByContours::GetUnusedCurveTempProps( INTVECTOR& vId) //------------------------------------------------------------------------------- bool -CalcRegionPolyLines( const POLYLINEVECTOR& vPL, POLYLINEVECTOR& vPLOrd, Vector3d& vtN, INTMATRIX& vnPLIndMat) +CalcRegionPolyLines( const POLYLINEVECTOR& vPL, POLYLINEVECTOR& vPLOrd, Vector3d& vtN, INTMATRIX& vnPLIndMat, BOOLVECTOR& vbInvert) { // matrice di interi : ogni riga corrisponde ad un chunk, dove in posizione 0 c'è il loop esterno e nelle // successive i loop interni @@ -638,6 +638,8 @@ CalcRegionPolyLines( const POLYLINEVECTOR& vPL, POLYLINEVECTOR& vPLOrd, Vector3d bool bFirstCrv ; Plane3d plExtLoop ; double dAreaExtLoop = 0. ; + vbInvert.resize( vPL.size()) ; + fill( vbInvert.begin(), vbInvert.end(), false) ; do { bFirstCrv = true ; for ( int i = 0 ; i < int( m_vArea.size()) ; ++ i) { @@ -655,6 +657,7 @@ CalcRegionPolyLines( const POLYLINEVECTOR& vPL, POLYLINEVECTOR& vPLOrd, Vector3d vPLOrd[j].Invert() ; vCrvCompo[j]->Invert() ; dAreaExtLoop *= -1 ; + vbInvert[j] = true ; } bFirstCrv = false ; } @@ -689,6 +692,7 @@ CalcRegionPolyLines( const POLYLINEVECTOR& vPL, POLYLINEVECTOR& vPLOrd, Vector3d if ( m_vArea[i].second * dAreaExtLoop > 0.) { vPLOrd[j].Invert() ; vCrvCompo[j]->Invert() ; + vbInvert[j] = true ; } } } @@ -696,8 +700,10 @@ CalcRegionPolyLines( const POLYLINEVECTOR& vPL, POLYLINEVECTOR& vPLOrd, Vector3d } while ( ! bFirstCrv) ; if ( bInvertAll) { - for ( int i = 0 ; i < int( vPLOrd.size()) ; ++i) + for ( int i = 0 ; i < int( vPLOrd.size()) ; ++i) { vPLOrd[i].Invert() ; + vbInvert[i] = ! vbInvert[i] ; + } } //// ordino le PolyLine per area diff --git a/StmFromCurves.cpp b/StmFromCurves.cpp index 88f920e..e90cbab 100644 --- a/StmFromCurves.cpp +++ b/StmFromCurves.cpp @@ -69,7 +69,8 @@ GetSurfTriMeshByRegion( const CICURVEPVECTOR& vpCurve, double dLinTol) } Vector3d vtN ; INTMATRIX vnPLIndMat ; - if ( ! CalcRegionPolyLines( vPL, vPLOrd, vtN, vnPLIndMat)) + BOOLVECTOR vbInvert ; + if ( ! CalcRegionPolyLines( vPL, vPLOrd, vtN, vnPLIndMat, vbInvert)) return nullptr ; // creo e setto la superficie trimesh PtrOwner pSTM( CreateBasicSurfTriMesh()) ; @@ -156,7 +157,8 @@ GetSurfTriMeshByRegionExtrusion( const CICURVEPVECTOR& vpCurve, const Vector3d& } Vector3d vtN ; INTMATRIX vnPLIndMat ; - if ( ! CalcRegionPolyLines( vPL, vPLOrd, vtN, vnPLIndMat)) + BOOLVECTOR vbInvert ; + if ( ! CalcRegionPolyLines( vPL, vPLOrd, vtN, vnPLIndMat, vbInvert)) return nullptr ; // verifico la direzione di estrusione double dOrthoExtr = vtN * vtExtr ; diff --git a/Triangulate.cpp b/Triangulate.cpp index 5768c07..ce3f8a2 100644 --- a/Triangulate.cpp +++ b/Triangulate.cpp @@ -243,8 +243,9 @@ Triangulate::MakeAdvanced( const POLYLINEVECTOR& vPLORIG, PNTVECTOR& vPt, INTVEC Vector3d vtN ; // se non sono stati passate le info per ordinare le polyline allora le ordino INTMATRIX vnPLIndMat ; + BOOLVECTOR vbInvert ; if( vnPLIndMatPre.size() == 0){ - if ( ! CalcRegionPolyLines( vPLORIG, vPL, vtN, vnPLIndMat)) + if ( ! CalcRegionPolyLines( vPLORIG, vPL, vtN, vnPLIndMat, vbInvert)) return false ; } else {