From 42fcb1847bca4340cf9cd283d095a6d5276cd86e Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Thu, 22 Jan 2026 11:23:58 +0100 Subject: [PATCH] EgtGeomKernel : - GetSurfBezierRuledGuided. --- SbzFromCurves.cpp | 5 ++-- SurfBezier.cpp | 66 ++++++++++------------------------------------- SurfBezier.h | 2 +- Trimming.cpp | 3 +-- 4 files changed, 18 insertions(+), 58 deletions(-) diff --git a/SbzFromCurves.cpp b/SbzFromCurves.cpp index 0fa537b..af0d46e 100644 --- a/SbzFromCurves.cpp +++ b/SbzFromCurves.cpp @@ -735,8 +735,7 @@ GetSurfBezierRuled( const ICurve* pCurve1, const ICurve* pCurve2, int nType, dou //------------------------------------------------------------------------------- ISurfBezier* -GetSurfBezierRuledGuided( const ICurve* pCurve1, const ICurve* pCurve2, const BIPNTVECTOR& vCrv, - const INTVECTOR& vShown, const INTVECTOR& vEdited, const INTVECTOR& vNew, double dLinTol) +GetSurfBezierRuledGuided( const ICurve* pCurve1, const ICurve* pCurve2, const BIPNTVECTOR& vCrv, double dLinTol) { // verifica parametri if ( pCurve1 == nullptr || pCurve2 == nullptr) @@ -763,7 +762,7 @@ GetSurfBezierRuledGuided( const ICurve* pCurve1, const ICurve* pCurve2, const BI // creo e setto la superficie trimesh PtrOwner pSbz( CreateBasicSurfBezier()) ; - if ( IsNull( pSbz) || ! pSbz->CreateByIsoParamSet( pCC1, pCC2, vCrv, vShown, vEdited, vNew)) + if ( IsNull( pSbz) || ! pSbz->CreateByIsoParamSet( pCC1, pCC2, vCrv)) return nullptr ; // restituisco la superficie diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 65982c5..7b6cd02 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -5653,10 +5653,8 @@ struct IsoParam { int nCrv ; double dParam0 ; double dParam1 ; - bool bNew ; // new or edited - bool bShown ; - IsoParam( int _nCrv, double _dParam0, double _dParam1, bool _bNew = false, bool _bShown = false) : - nCrv(_nCrv), dParam0( _dParam0), dParam1( _dParam1), bNew( _bNew), bShown( _bShown){ } ; + IsoParam( int _nCrv, double _dParam0, double _dParam1) : + nCrv(_nCrv), dParam0( _dParam0), dParam1( _dParam1){ } ; bool operator < ( IsoParam& b) { return ( abs(dParam0 - b.dParam0) > EPS_SMALL ? dParam0 < b.dParam0 : dParam1 < b.dParam1) ; @@ -5667,12 +5665,13 @@ typedef vector ISOPARVECT ; //---------------------------------------------------------------------------- bool -SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv, const INTVECTOR& vShown, const INTVECTOR& vEdited, const INTVECTOR& vNew) +SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv) { - // vCrv è il vettore delle isocurve (nel parametro V) di una surf ( creata come rigata) che si vuole modificare ( già ordinato) - // vNewCrv è il vettore delle isocurve mostrate durante l'editing, che comprende le curve editate e le curve nuove - // vShown indica gli indici delle curve in vCrv che sono mostrate in vCrv - // vNewOrEdited indica la coppia di indici (nId1, nId2) (in vCrv, in vNewCrv) per le curve editate e una coppia (-1, nId) per le curve aggiunte + // vCrv è il vettore delle isocurve (nel parametro V) che si vogliono forzare per la creazione della rigata tra Curve0 e Curve1 + + //controllo che siano entrambe chiuse o entrambe aperte + if( pCurve0->IsClosed() ^ pCurve1->IsClosed()) + return false ; // converto in bezier la curva iniziale CurveComposite CrvU0 ; CrvU0.AddCurve( CurveToBezierCurve(pCurve0)) ; @@ -5711,63 +5710,24 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c // costruisco il vettore delle nuove curve isoparamtriche per la nuova superficie ISOPARVECT vIso ; - int nNewCounter = 0 ; - int nShowCounter = 0 ; - int nEditCounter = 0 ; for ( int i = 0 ; i < ssize( vCrv) ; ++i) { Point3d ptU0 = vCrv[i].first ; Point3d ptU1 = vCrv[i].second ; double dParam0 ; CrvU0.GetParamAtPoint( ptU0, dParam0) ; double dParam1 ; CrvU1.GetParamAtPoint( ptU1, dParam1) ; - if ( nEditCounter < ssize( vEdited) && i == vEdited[nEditCounter]) { - vIso.emplace_back( i, dParam0, dParam1, true, true) ; - ++ nEditCounter ; - ++ nShowCounter ; - } - else if ( nNewCounter < ssize( vNew) && i == vNew[nNewCounter]) { - vIso.emplace_back( i, dParam0, dParam1, true) ; - ++ nNewCounter ; - } - else if ( nShowCounter < ssize( vShown) && i == vShown[nShowCounter]) { - vIso.emplace_back( i, dParam0, dParam1, false, true) ; - ++ nShowCounter ; - } - else - vIso.emplace_back( i, dParam0, dParam1) ; + vIso.emplace_back( i, dParam0, dParam1) ; } sort( vIso.begin(), vIso.end()) ; - // scorro vIso per eliminare le isocurve non più necessarie + // scorro vIso per verificare che non ci siano curve che si intersecano int c = 0 ; dLastParam0 = vIso[c].dParam0 ; dLastParam1 = vIso[c].dParam1 ; ++c ; while ( c < ssize( vIso)) { - if ( vIso[c].dParam1 >= dLastParam1 && ! vIso[c].bNew) - ; // non devo fare nulla - else { - dLastParam0 = vIso[c].dParam0 ; - dLastParam1 = vIso[c].dParam1 ; - // cancello tutte le curve avanti e indietro finché incontro una show che non viene intersecata - int c_temp = c + 1 ; - while ( c_temp < ssize( vIso) && ! ( vIso[c_temp].bShown && vIso[c_temp].dParam0 >= dLastParam0 && vIso[c_temp].dParam1 >= dLastParam1)) { - if ( vIso[c_temp].bNew) - ++c_temp ; - else - vIso.erase(vIso.begin() + c_temp) ; - } - c_temp = c - 1 ; - while ( c_temp > 0 && ! ( vIso[c_temp].bShown && vIso[c_temp].dParam0 <= dLastParam0 && vIso[c_temp].dParam1 <= dLastParam1)) { - if ( vIso[c_temp].bNew) - --c_temp ; - else { - vIso.erase(vIso.begin() + c_temp) ; - --c_temp ; - --c ; - } - } - } + if ( vIso[c].dParam0 < dLastParam0 || vIso[c].dParam1 < dLastParam1) + return false ; dLastParam0 = vIso[c].dParam0 ; dLastParam1 = vIso[c].dParam1 ; ++c ; @@ -5775,6 +5735,8 @@ SurfBezier::CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, c dLastParam0 = 0 ; dLastParam1 = 0 ; + if( vIso[0].dParam0 > 0 || vIso[0].dParam1 > 1) + vPairs.emplace_back( 0, 0) ; for ( int i = 0 ; i < ssize( vIso) ; ++i) { const BIPOINT& pCrv = vCrv[vIso[i].nCrv] ; Point3d ptU0 = pCrv.first ; diff --git a/SurfBezier.h b/SurfBezier.h index 32e7d97..80c4286 100644 --- a/SurfBezier.h +++ b/SurfBezier.h @@ -150,7 +150,7 @@ class SurfBezier : public ISurfBezier, public IGeoObjRW bool CreateBySetOfCurves( const ICURVEPOVECTOR& vCrvBez, bool bReduceToDeg3) override ; PNTVECTOR GetAllControlPoints( void) const ; bool GetAllPatchesIsocurves( bool bUorV, ICURVEPOVECTOR& vCrv) const ; - bool CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv, const INTVECTOR& vShown, const INTVECTOR& vEdited, const INTVECTOR& vNew) ; + bool CreateByIsoParamSet( const ICurve* pCurve0, const ICurve* pCurve1, const BIPNTVECTOR& vCrv) ; bool RemoveCollapsedSpans() override ; bool SwapParameters() ; diff --git a/Trimming.cpp b/Trimming.cpp index 7745054..252353d 100644 --- a/Trimming.cpp +++ b/Trimming.cpp @@ -3855,8 +3855,7 @@ GetTrimmingRuledBezier( const CISURFPVECTOR& vSurf, const ICurve* pCrvEdge1, #endif // Definisco la superficie INTVECTOR vInd( ssize( vSyncPoints)) ; iota( vInd.begin(), vInd.end(), 0) ; - pSurfBz.Set( GetSurfBezierRuledGuided( pCompoEdge1, pCompoEdge2, vSyncPoints, vInd, - INTVECTOR{}, INTVECTOR{}, dMyLinTol)) ; + pSurfBz.Set( GetSurfBezierRuledGuided( pCompoEdge1, pCompoEdge2, vSyncPoints, dMyLinTol)) ; if ( IsNull( pSurfBz) || ! pSurfBz->IsValid()) { LOG_ERROR( GetEGkLogger(), "Error in Trimming : Ruled Bezier with Sync Points invalid") ; return nullptr ;