From 49ff6e79a832a4d1112f3c5ab98b9b20387fef89 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 29 Apr 2024 17:20:30 +0200 Subject: [PATCH 1/4] EgtGeomKernel : - correzione nella gestione della conversione delle curve/superfici NURBS. --- CurveAux.cpp | 2 +- SurfAux.cpp | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CurveAux.cpp b/CurveAux.cpp index 983eb8a..2f5d09b 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -597,7 +597,7 @@ NurbsCurveCanonicalize( CNurbsData& cnData) } } if ( bCollapsed) - return true ; + return false ; // va trasformata in non-periodica (clamped) // bisogna aumentare la molteplicità dei nodi u_p-1 e u_(m-p+1) fino ad arrivare al grado della nurbs diff --git a/SurfAux.cpp b/SurfAux.cpp index 50e1be2..00bd953 100644 --- a/SurfAux.cpp +++ b/SurfAux.cpp @@ -62,11 +62,12 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) nuCurve.vCP = vPtCtrl ; nuCurve.vW = vWeCtrl ; // i punti dell' oggetto nuCurve devono essere in forma non omogenea - NurbsCurveCanonicalize( nuCurve) ; - for ( int i = 0 ; i < snData.nCPU ; ++i) { - snData.mCP[i][j] = nuCurve.vCP[i] ; + if ( NurbsCurveCanonicalize( nuCurve)) { // se NurbsCurveCanonicalize ha restituito false (la curva potrebbe esserre un punto di polo) allora non modifico i punti e il vettore dei nodi della superficie + for ( int i = 0 ; i < snData.nCPU ; ++i) { + snData.mCP[i][j] = nuCurve.vCP[i] ; + } + snData.vU = nuCurve.vU ; } - snData.vU = nuCurve.vU ; } snData.bPeriodicU = false ; } @@ -99,11 +100,12 @@ NurbsSurfaceCanonicalize( SNurbsSurfData& snData) nuCurve.vCP = vPtCtrl ; nuCurve.vW = vWeCtrl ; // i punti dell' oggetto nuCurve devono essere in forma non omogenea - NurbsCurveCanonicalize( nuCurve) ; - for ( int j = 0 ; j < snData.nCPV ; ++j ) { - snData.mCP[i][j] = nuCurve.vCP[j] ; + if ( NurbsCurveCanonicalize( nuCurve)) { // se NurbsCurveCanonicalize ha restituito false (la curva potrebbe esserre un punto di polo) allora non modifico i punti e il vettore dei nodi della superficie + for ( int j = 0 ; j < snData.nCPV ; ++j ) { + snData.mCP[i][j] = nuCurve.vCP[j] ; + } + snData.vV = nuCurve.vU ; } - snData.vV = nuCurve.vU ; } snData.bPeriodicV = false ; } From 7e165a6deabfa315e196aa95e63378b39a15856b Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 29 Apr 2024 17:40:17 +0200 Subject: [PATCH 2/4] EgtGeomKernel : - eliminati dei memory leaks. --- SurfAux.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SurfAux.cpp b/SurfAux.cpp index 00bd953..4e9e612 100644 --- a/SurfAux.cpp +++ b/SurfAux.cpp @@ -620,6 +620,7 @@ MakeUniform( ISurfFlatRegion*& pSfr, bool& bRescaled, const DBLVECTOR& vU0, cons if ( pRescaledSfr->IsValid()) { if ( bRetry) pRescaledSfr->Offset( -10 * EPS_SMALL, ICurve::OFF_CHAMFER) ; //contro OFFSET + delete pSfr ; pSfr = Release( pRescaledSfr) ; } } @@ -631,6 +632,7 @@ MakeUniform( ISurfFlatRegion*& pSfr, bool& bRescaled, const DBLVECTOR& vU0, cons if ( ! IsNull( pRescaledSfr) && pRescaledSfr->IsValid()) { if ( bRetry) pRescaledSfr->Offset( -10 * EPS_SMALL, ICurve::OFF_CHAMFER) ; // contro OFFSET + delete pSfr ; pSfr = Release( pRescaledSfr) ; } From e490c173e84ed5bf576888ac4bc5f023c49680f7 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Mon, 29 Apr 2024 17:46:30 +0200 Subject: [PATCH 3/4] EgtGeomKernel : - svincolata la funzione GetSingleEdge della SurfBezier dalla creazione della trimesh. --- SurfBezier.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 3364e5a..ad0991d 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -3114,7 +3114,7 @@ SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) con ICurveComposite* SurfBezier::GetSingleEdge3D( bool bLineOrBezier, int nEdge) const { - if ( m_mCCEdge.size() == 0) + if ( m_mCCEdge.size() == 0 && bLineOrBezier) GetAuxSurf() ; // questa funzione dà per scontato che la superficie NON sia trimmata if ( nEdge < 0 || nEdge > 3 || m_bTrimmed) @@ -3215,10 +3215,10 @@ bool SurfBezier::IsPlanar( void) const { // costruisco il contorno della superficie unendo gli edge e chiedo se la polyline è piana. - PtrOwner pCCEdge( GetSingleEdge3D( true, 0)) ; - pCCEdge->AddCurve( GetSingleEdge3D( true, 1)) ; - pCCEdge->AddCurve( GetSingleEdge3D( true, 2)) ; - pCCEdge->AddCurve( GetSingleEdge3D( true, 3)) ; + PtrOwner pCCEdge( GetSingleEdge3D( false, 0)) ; + pCCEdge->AddCurve( GetSingleEdge3D( false, 1)) ; + pCCEdge->AddCurve( GetSingleEdge3D( false, 2)) ; + pCCEdge->AddCurve( GetSingleEdge3D( false, 3)) ; PolyLine plApprox ; pCCEdge->ApproxWithLines( 0.01, 15, 0, plApprox) ; Plane3d plPlane ; From e4c3c9a2a4408c342d6517dd9510a34032616bc1 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 30 Apr 2024 08:53:09 +0200 Subject: [PATCH 4/4] EgtGeomKernel : - aumentato il grado possibile per curve/superfici di Bezier. --- CurveBezier.h | 2 +- SurfBezier.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CurveBezier.h b/CurveBezier.h index 331d545..b0b7a94 100644 --- a/CurveBezier.h +++ b/CurveBezier.h @@ -190,7 +190,7 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW private : enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ; - static const int MAXDEG = 11 ; + static const int MAXDEG = 21 ; private : ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto diff --git a/SurfBezier.h b/SurfBezier.h index 758bb05..c58f9d2 100644 --- a/SurfBezier.h +++ b/SurfBezier.h @@ -159,7 +159,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW private : enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ; enum ParDir { ON_U = 1, ON_V = 2} ; - static const int MAXDEG = 11 ; + static const int MAXDEG = 21 ; private : bool CopyFrom( const SurfBezier& sbSrc) ;