From bbc98fe282fe2a117453d8a7b444ae410bea04fa Mon Sep 17 00:00:00 2001 From: Daniele Bariletti Date: Tue, 28 Apr 2026 11:09:34 +0200 Subject: [PATCH] EgtGeomKernel : - cambiata la chiamata a ModifyJoint - cambiato nome alla ModifySingleCurve - estesa la ModifyJoint con tolleranza - modifiche stilistiche e pulizia codice. --- CurveAux.cpp | 6 ++++- CurveComposite.cpp | 60 +++++++++++++++++++++++++++++++--------------- CurveComposite.h | 9 +++++-- PolyLine.cpp | 10 ++------ SurfBezier.cpp | 49 ------------------------------------- Trimming.cpp | 2 +- 6 files changed, 56 insertions(+), 80 deletions(-) diff --git a/CurveAux.cpp b/CurveAux.cpp index 9291c93..5299277 100644 --- a/CurveAux.cpp +++ b/CurveAux.cpp @@ -1724,7 +1724,11 @@ CalcApproxError( const ICurve* pCrvOri, const ICurve* pCrvNew, double& dErr, int // controllo l'errore effettivo campionando più finemente double dLenOri = 0 ; pCrvOri->GetLength( dLenOri) ; double dLenNew = 0 ; pCrvNew->GetLength( dLenNew) ; - dErr = 0 ; + Point3d ptStart0 ; pCrvOri->GetStartPoint( ptStart0) ; + Point3d ptStart1 ; pCrvNew->GetStartPoint( ptStart1) ; + Point3d ptEnd0 ; pCrvOri->GetEndPoint( ptEnd0) ; + Point3d ptEnd1 ; pCrvNew->GetEndPoint( ptEnd1) ; + dErr = max( Dist( ptStart1, ptStart0), Dist( ptEnd1, ptEnd0)) ; for ( int i = 1 ; i < nPoints ; ++i) { Point3d ptOri, ptNew ; double dParOri, dParNew ; diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 61d17c8..74982f5 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -1976,13 +1976,13 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint, double dTol) // salvo le vecchie curve e nel caso le ripristino int nPrevCrv = -1 ; // recupero l'indice e il puntatore alla curva precedente (se esiste) - if ( nU > 0) + if ( nU >= 0) nPrevCrv = nU - 1 ; else if ( IsClosed()) nPrevCrv = nCrvCount - 1 ; - else - return false ; - PtrOwner pOrigCrv( ConvertCurveToComposite(m_CrvSmplS[ nPrevCrv]->Clone())) ; + PtrOwner pOrigCrv( CreateBasicCurveComposite()) ; + if ( nPrevCrv >= 0) + pOrigCrv->AddCurve( m_CrvSmplS[ nPrevCrv]->Clone()) ; // recupero il puntatore alla curva successiva (se esiste) int nNextCrv = -1 ; if ( nU < nCrvCount) @@ -1990,8 +1990,9 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint, double dTol) else if ( IsClosed()) nNextCrv = 0 ; else - return false ; - pOrigCrv->AddCurve( m_CrvSmplS[ nNextCrv]->Clone()) ; + nNextCrv = - 1 ; + if ( nNextCrv >= 0) + pOrigCrv->AddCurve( m_CrvSmplS[ nNextCrv]->Clone()) ; int nCrvNmbr = GetCurveCount() ; int nFlagDel = DeletedCurve::NONE ; @@ -1999,8 +2000,25 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint, double dTol) return false ; bool bErasedSomeCrv = nCrvCount > GetCurveCount() ; - bool bErasedPrev = nFlagDel == DeletedCurve::PREV ; - bool bErasedNext = nFlagDel == DeletedCurve::NEXT ; + bool bErasedPrev = ( nFlagDel == DeletedCurve::PREV) ; + bool bErasedNext = ( nFlagDel == DeletedCurve::NEXT) ; + if ( ( bErasedPrev && nNextCrv == -1) || ( bErasedNext && nPrevCrv == -1)) { + // se sono su un estremo di una curva aperta e ho cancellato la sottocurva di estremità devo verificare che fosse più piccola della tolleranza + if ( bErasedPrev && nNextCrv == -1) { + Point3d ptOrigEnd ; pOrigCrv->GetEndPoint( ptOrigEnd) ; + Point3d ptNewEnd ; GetEndPoint( ptNewEnd) ; + if ( Dist( ptOrigEnd, ptNewEnd) > dTol) + m_CrvSmplS.push_back( Release( pOrigCrv)) ; + return true ; + } + if ( bErasedNext && nPrevCrv == -1) { + Point3d ptOrigStart ; pOrigCrv->GetStartPoint( ptOrigStart) ; + Point3d ptNewStart ; GetStartPoint( ptNewStart) ; + if ( Dist( ptOrigStart, ptNewStart) > dTol) + m_CrvSmplS.insert( m_CrvSmplS.begin(), Release( pOrigCrv)) ; + return true ; + } + } double dStart ; double dEnd ; if ( bErasedPrev) { @@ -2014,18 +2032,22 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint, double dTol) dStart -= 1 ; } else { // ! bErasedSomeCrv - dStart = nPrevCrv ; - dEnd = nNextCrv + 1 ; + dStart = ( nPrevCrv != -1 ? nPrevCrv : 0) ; + dEnd = ( nNextCrv != -1 ? nNextCrv + 1 : nCrvNmbr) ; } PtrOwner pNewCurve( CopyParamRange( dStart, dEnd)) ; double dErr = 0 ; - if ( ! CalcApproxError( pOrigCrv, pNewCurve, dErr) || dErr > dTol) { + if ( ! CalcApproxError( pOrigCrv, pNewCurve, dErr, 6) || dErr > dTol) { // se ho fallito il check o la variazione è superiore alla tolleranza richiesta, ripristino le curve originali if ( ! bErasedSomeCrv) { - delete m_CrvSmplS[nNextCrv] ; - m_CrvSmplS[nNextCrv] = pOrigCrv->RemoveFirstOrLastCurve( true) ; - delete m_CrvSmplS[nPrevCrv] ; - m_CrvSmplS[nPrevCrv] = pOrigCrv->RemoveFirstOrLastCurve( true) ; + if ( nNextCrv != -1) { + delete m_CrvSmplS[nNextCrv] ; + m_CrvSmplS[nNextCrv] = pOrigCrv->RemoveFirstOrLastCurve( true) ; + } + if ( nPrevCrv != -1) { + delete m_CrvSmplS[nPrevCrv] ; + m_CrvSmplS[nPrevCrv] = pOrigCrv->RemoveFirstOrLastCurve( true) ; + } } else { if ( bErasedNext) { @@ -2069,7 +2091,7 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint, int* pnFlagDel) if ( nU < 0 || nU > nCrvCount) return false ; if ( pnFlagDel != nullptr) - *pnFlagDel = 0 ; + *pnFlagDel = DeletedCurve::NONE ; // recupero l'indice e il puntatore alla curva precedente (se esiste) int nPrevCrv = -1 ; if ( nU > 0) @@ -2099,7 +2121,7 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint, int* pnFlagDel) delete pPrevCrv ; m_CrvSmplS.erase( m_CrvSmplS.begin() + nPrevCrv) ; if ( pnFlagDel != nullptr) - *pnFlagDel = 1 ; + *pnFlagDel = DeletedCurve::PREV ; } // altrimenti diventa un segmento di retta else { @@ -2120,7 +2142,7 @@ CurveComposite::ModifyJoint( int nU, const Point3d& ptNewJoint, int* pnFlagDel) delete pNextCrv ; m_CrvSmplS.erase( m_CrvSmplS.begin() + nNextCrv) ; if ( pnFlagDel != nullptr) - *pnFlagDel = 2 ; + *pnFlagDel = DeletedCurve::NEXT ; } // altrimenti diventa un segmento di retta else { @@ -3958,7 +3980,7 @@ CurveComposite::GetOnlyPoint(Point3d& ptStart) const //---------------------------------------------------------------------------- bool -CurveComposite::ModifySingleCurve( int nSubCrv, ICurve* pNewCurveToAdd, double dTolStartEnd, double dTolAlong) +CurveComposite::ReplaceSingleCurve( int nSubCrv, ICurve* pNewCurveToAdd, double dTolStartEnd, double dTolAlong) { // prendo il possesso e verifico la curva PtrOwner pNewCurve( pNewCurveToAdd) ; diff --git a/CurveComposite.h b/CurveComposite.h index 3edaf6c..d81a08b 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -26,6 +26,9 @@ class Voronoi ; //---------------------------------------------------------------------------- class CurveComposite : public ICurveComposite, public IGeoObjRW { + public : + enum DeletedCurve { NONE = 0, PREV = 1, NEXT = 2 } ; + public : // IGeoObj ~CurveComposite( void) override ; CurveComposite* Clone( void) const override ; @@ -156,7 +159,8 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool AddArc2P( const Point3d& ptOther, const Point3d& ptNew, bool bEndOrStart = true) override ; bool AddArcTg( const Point3d& ptNew, bool bEndOrStart = true) override ; bool AddJoint( double dU) override ; - bool ModifyJoint( int nU, const Point3d& ptNewJoint, int* pnFlagDel = nullptr) override ; + bool ModifyJoint( int nU, const Point3d& ptNewJoint) override + { return ModifyJoint( nU, ptNewJoint, nullptr) ; } bool ModifyJoint( int nU, const Point3d& ptNewJoint, double dTol) override ; // verifico se le curve interessate sono in tolleranza con la versione prima della modifica bool RemoveJoint( int nU) override ; bool MoveCurve( int nCrv, const Vector3d& vtMove) override ; @@ -179,7 +183,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool SetCurveTempParam( int nCrv, double dParam, int nParamInd = 0) override ; bool GetCurveTempParam( int nCrv, double& dParam, int nParamInd = 0) const override ; bool GetOnlyPoint( Point3d& ptStart) const override ; - bool ModifySingleCurve( int nSubCrv, ICurve* pNewCurve, double dTolStartEnd, double dTolAlong = INFINITO) override ; + bool ReplaceSingleCurve( int nSubCrv, ICurve* pNewCurve, double dTolStartEnd, double dTolAlong = INFINITO) override ; public : // IGeoObjRW int GetNgeId( void) const override ; @@ -213,6 +217,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool SimpleOffsetXY( double dDist, int nType = OFF_FILLET, double dMaxAngExt = ANG_RIGHT) ; bool IsOneCircle( Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW) const ; bool CalcVoronoiObject( void) const ; + bool ModifyJoint( int nU, const Point3d& ptNewJoint, int* pnFlagDel) ; private : enum Status { ERR = 0, OK = 1, TO_VERIFY = 2, IS_A_POINT = 3} ; diff --git a/PolyLine.cpp b/PolyLine.cpp index d11f74c..d216913 100644 --- a/PolyLine.cpp +++ b/PolyLine.cpp @@ -1991,17 +1991,11 @@ MatchPolyLinesAddingPoints( const PolyLine& PL1, const PolyLine& PL2, int nType, nAddedSpan = 0 ; nCrv1 = 0 ; nCrv2 = 0 ; - bool bLast1 = false ; - bool bLast2 = false ; while ( nAddedSpan < nPnt) { - if ( nCrv1 >= nPnt1) { + if ( nCrv1 >= nPnt1) nCrv1 = nPnt1 - 1 ; - bLast1 = true ; - } - if ( nCrv2 >= nPnt2) { + if ( nCrv2 >= nPnt2) nCrv2 = nPnt2 - 1 ; - bLast2 = true ; - } bool bRep1 = vbRep1[nCrv1] ; bool bRep2 = vbRep2[nCrv2] ; const ICurve* pSubCrv1 = cc1.GetCurve( nCrv1) ; diff --git a/SurfBezier.cpp b/SurfBezier.cpp index 28e530f..d2cfe86 100644 --- a/SurfBezier.cpp +++ b/SurfBezier.cpp @@ -4502,55 +4502,6 @@ ChangeStartForClosed( PolyLine& plU0, PolyLine& plU1, ICurveComposite* pCrvU0, I return true ; } -static bool -GetEdgeSplitByAngTol( const PolyLine& PL, double dAngTol, BOOLVECTOR& vEdgeSplit) -{ - int nPoints = PL.GetPointNbr() ; - vEdgeSplit.clear() ; - vEdgeSplit.resize( nPoints) ; - fill( vEdgeSplit.begin(), vEdgeSplit.end(), false) ; - bool bClosed = PL.IsClosed() ; - // Recupero l'insieme di punti associati alla PolyLine - PNTVECTOR vPoints ; vPoints.reserve( nPoints) ; - Point3d ptCurr = P_INVALID ; - // aggiungo come primo punto il penultimo punto della polyline in modo da analizzare direttamente anche la chiusura ( se è una polyline chiusa) - PL.GetLastPoint( ptCurr) ; - PL.GetPrevPoint( ptCurr) ; - vPoints.emplace_back( ptCurr) ; - bool bFound = PL.GetFirstPoint( ptCurr) ; - while ( bFound) { - vPoints.emplace_back( ptCurr) ; - bFound = PL.GetNextPoint( ptCurr) ; - } - Vector3d vtTanCurr = V_INVALID, vtTanNext = V_INVALID ; - // cos della tolleranza angolare massima - double dCosTol = cos( dAngTol * DEGTORAD) ; - for ( int nP = 0 ; nP < nPoints - 2 ; ++ nP) { - // Recupero il punto corrente e i due punti successivi - Point3d& ptCurr = vPoints[nP] ; - Point3d& ptNext = vPoints[nP + 1] ; - Point3d& ptNextNext = vPoints[nP + 2] ; - // Recupero i versori tangenti definiti dai tre punti ( ptCurr|ptNext e ptNext|ptNextNext) - if ( nP == 0) { - vtTanCurr = ptNext - ptCurr ; - vtTanCurr.Normalize() ; - } - else - vtTanCurr = vtTanNext ; - vtTanNext = ptNextNext - ptNext ; vtTanNext.Normalize() ; - // Calcolo il Coseno tra i due versori - double dCos = vtTanCurr * vtTanNext ; - // Se oltre la tolleranza allora ho incontrato un edge - if ( dCos < dCosTol) - vEdgeSplit[nP] = true ; - } - - if ( ! bClosed) - vEdgeSplit[0] = false ; - - return true ; -} - static bool GetEdgeSplitByAngTol( const ICurveComposite* pCC, double dAngTol, BOOLVECTOR& vEdgeSplit) { diff --git a/Trimming.cpp b/Trimming.cpp index 8c3a93c..46b8666 100644 --- a/Trimming.cpp +++ b/Trimming.cpp @@ -36,8 +36,8 @@ #include "/EgtDev/Include/EGkIntersLineBox.h" #include "/EgtDev/Include/EGkIntersCurvePlane.h" #include "/EgtDev/Include/EGkSurfTriMeshAux.h" -#include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Include/EGkRotationMinimizingFrame.h" +#include "/EgtDev/Include/EgtNumUtils.h" #include #include #include