From 5c287d49bb53e0aedcd7f12c3c51ee9d9fd0d3a7 Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 14 Oct 2025 16:30:45 +0200 Subject: [PATCH] EgtGeomKernel : - aggiornamento funzioni per recuperare i loop di una surf di bezier. --- SurfBezier.cpp | 43 ++++++++++++++++++------------------------- SurfBezier.h | 8 ++++---- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/SurfBezier.cpp b/SurfBezier.cpp index b8c35ba..5bb06c0 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -3333,7 +3333,7 @@ SurfBezier::CalcPoles( void) const //---------------------------------------------------------------------------- bool -SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) const +SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier) const { // se necessario calcolo i poli if ( m_vbPole.empty()) @@ -3347,30 +3347,23 @@ SurfBezier::GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge) con // se la superficie non è trimmata mi basta recuperare gli edge della superficie if ( ! m_bTrimmed) { // se decidessi di non restituire gli edge chiusi e i poli posso discriminare qui - if ( nEdge == -1 ) { - vCC = ICRVCOMPOPOVECTOR(4) ; - if ( ! m_bClosedV ) { - if ( ! m_vbPole[0]) - vCC[0].Set( GetSingleEdge3D( bLineOrBezier, 0)) ; - if ( ! m_vbPole[2]) - vCC[2].Set( GetSingleEdge3D( bLineOrBezier, 2)) ; - } - if ( ! m_bClosedU ) { - if ( ! m_vbPole[1]) - vCC[1].Set( GetSingleEdge3D( bLineOrBezier, 1)) ; - if ( ! m_vbPole[3]) - vCC[3].Set( GetSingleEdge3D( bLineOrBezier, 3)) ; - } - //// se li volessi restituire tutti - //vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, 0)) ; - //vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, 1)) ; - //vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, 2)) ; - //vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, 3)) ; - } - else { - if ( (((nEdge == 0 || nEdge == 2) && ! m_bClosedV) || ((nEdge == 1 || nEdge == 3) && ! m_bClosedU)) && ! m_vbPole[nEdge]) - vCC.emplace_back( GetSingleEdge3D( bLineOrBezier, nEdge)) ; - } + vCC.emplace_back() ; + if ( ! m_bClosedV ) { + if ( ! m_vbPole[0]) + vCC.back()->AddCurve( GetSingleEdge3D( bLineOrBezier, 0)) ; + } + if ( ! m_bClosedU ) { + if ( ! m_vbPole[1]) + vCC.back()->AddCurve( GetSingleEdge3D( bLineOrBezier, 1)) ; + } + if ( ! m_bClosedV ) { + if ( ! m_vbPole[2]) + vCC.back()->AddCurve( GetSingleEdge3D( bLineOrBezier, 2)) ; + } + if ( ! m_bClosedU ) { + if ( ! m_vbPole[3]) + vCC.back()->AddCurve( GetSingleEdge3D( bLineOrBezier, 3)) ; + } } // se la superficie è trimmata devo recuperare i loop dello spazio parametrico else { diff --git a/SurfBezier.h b/SurfBezier.h index 26aaa4d..630f5bd 100644 --- a/SurfBezier.h +++ b/SurfBezier.h @@ -136,8 +136,10 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW bool IncreaseUV( double& dU, double dx, bool bUOrV, double* dUVCopy = nullptr, bool bModifyOrig = true) const override ; bool IncreaseUV( Point3d& ptUV, Vector3d vtH , Point3d* ptUVCopy, bool bModifyOrig) const override ; // funzione che restituisce gli edge della superficie o in forma di linea spezzata o in forma di curva di Bezier - // se la superficie è trimmata restituisce i loop dello spazio parametrico in forma di linee spezzate - bool GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier, int nEdge = -1) const override ; // se la superficie non è trimmata restituisce un vettore di 4 elementi. Se la superficie è chiusa lungo un parametro i lati algi estremi di quel parametro saranno null. + // restituisce un vettore con i loop della superficie ( più di uno solo se è trimmata con un parametrico con buchi o più di un chunk) + bool GetLoops( ICRVCOMPOPOVECTOR& vCC, bool bLineOrBezier) const override ; + // restituisce il singolo edge della superficie non trimmata + ICurveComposite* GetSingleEdge3D( bool bLineOrBezier, int nEdge) const override ; bool IsPlanar( void) const override ; bool CreateByFlatContour( const PolyLine& PL) override ; bool CreateByRegion( const POLYLINEVECTOR& vPL) override ; @@ -200,8 +202,6 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW // funzione che proietta nello spazio parametrico un trim derivante da un taglio con un piano, categorizzandolo come aperto o chiuso ( nel parametrico) bool AddCurveCompoToCuts( ICurveComposite* pCrvCompo, ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVECTOR& vpCCClosed, double dToler = EPS_SMALL, const Plane3d* pPlCut = nullptr) const ; ISurfFlatRegion* CreateTrimRegionFromCuts( ICRVCOMPOPOVECTOR& vpCCOpen, ICRVCOMPOPOVECTOR& vpCCClosed) const ; - // restituisce il singolo edge della superficie non trimmata - ICurveComposite* GetSingleEdge3D( bool bLineOrBezier, int nEdge) const ; // funzione che calcola se gli edge sono collassati in poli bool CalcPoles( void) const ; bool FindMatchByParam( const PolyLine& pl0, const PolyLine& pl1, INTVECTOR& vMatch, int& nLong) const ;