From 63fb9a638b981e21b61cbf62fa2628df9124bf75 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Thu, 6 Nov 2025 18:49:55 +0100 Subject: [PATCH] EgtGeomKernel 2.7k3 : - a SimpleOffset di Curve aggiunto parametro opzionale dMaxAngExt (angolo esterno oltre il quale estendi diventa smussa) con default 90deg. --- CurveArc.cpp | 4 ++-- CurveArc.h | 8 ++++---- CurveBezier.h | 2 +- CurveComposite.cpp | 4 ++-- CurveComposite.h | 4 ++-- CurveCompositeOffset.cpp | 24 ++++++++++++++---------- CurveLine.cpp | 2 +- CurveLine.h | 2 +- EgtGeomKernel.rc | Bin 11718 -> 11718 bytes OffsetCurve.cpp | 8 ++++---- Voronoi.h | 10 +++++----- 11 files changed, 36 insertions(+), 32 deletions(-) diff --git a/CurveArc.cpp b/CurveArc.cpp index aaa6552..30e130c 100644 --- a/CurveArc.cpp +++ b/CurveArc.cpp @@ -1294,7 +1294,7 @@ CurveArc::Invert( void) //---------------------------------------------------------------------------- bool -CurveArc::SimpleOffset( double dDist, int nType) +CurveArc::SimpleOffset( double dDist, int nType, double dMaxAngExt) { // la curva deve essere validata if ( m_nStatus != OK) @@ -1329,7 +1329,7 @@ CurveArc::SimpleOffset( double dDist, int nType) //---------------------------------------------------------------------------- bool -CurveArc::MyExtendedOffset( double dDist, bool bAll, int nType) +CurveArc::MyExtendedOffset( double dDist, bool bAll) { // bAll == true fa accettare raggi nulli ==> da usare solo internamente // quando si è sicuri di aumentare subito il raggio o di cancellare diff --git a/CurveArc.h b/CurveArc.h index 12c267f..10ee53f 100644 --- a/CurveArc.h +++ b/CurveArc.h @@ -116,7 +116,7 @@ class CurveArc : public ICurveArc, public IGeoObjRW { return ApproxWithArcs( dLinTol, dAngTolDeg, PA) ; } ICurve* CopyParamRange( double dUStart, double dUEnd) const override ; bool Invert( void) override ; - bool SimpleOffset( double dDist, int nType = OFF_FILLET) override ; + bool SimpleOffset( double dDist, int nType = OFF_FILLET, double dMaxAngExt = ANG_RIGHT) override ; bool ModifyStart( const Point3d& ptNewStart) override ; bool ModifyEnd( const Point3d& ptNewEnd) override ; bool SetExtrusion( const Vector3d& vtExtr) override @@ -178,8 +178,8 @@ class CurveArc : public ICurveArc, public IGeoObjRW bool ChangeDeltaN( double dNewDeltaN) override ; bool ChangeAngCenter( double dNewAngCenDeg) override ; bool ChangeStartPoint( double dU) override ; - bool ExtendedOffset( double dDist, int nType = OFF_FILLET) override - { return MyExtendedOffset( dDist, false, nType) ; } + bool ExtendedOffset( double dDist) override + { return MyExtendedOffset( dDist, false) ; } bool ToExplementary( void) override ; bool Flip( void) override ; @@ -200,7 +200,7 @@ class CurveArc : public ICurveArc, public IGeoObjRW { if ( ! CopyFrom( caSrc)) LOG_ERROR( GetEGkLogger(), "CurveArc : copy error") return *this ; } - bool MyExtendedOffset( double dDist, bool bAll, int nType = OFF_FILLET) ; + bool MyExtendedOffset( double dDist, bool bAll) ; bool MyCalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos, double dLinTol) const ; Voronoi* GetVoronoiObject( void) const ; void ResetVoronoiObject( void) const ; diff --git a/CurveBezier.h b/CurveBezier.h index 3cd08d3..b91d282 100644 --- a/CurveBezier.h +++ b/CurveBezier.h @@ -116,7 +116,7 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW { return ApproxWithArcs( dLinTol, dAngTolDeg, PA) ; } ICurve* CopyParamRange( double dUStart, double dUEnd) const override ; bool Invert( void) override ; - bool SimpleOffset( double dDist, int nType = OFF_FILLET) override + bool SimpleOffset( double dDist, int nType = OFF_FILLET, double dMaxAngExt = ANG_RIGHT) override { return false ; } // l'offset di crvBezier non è crvBezier tranne in casi molto particolari bool ModifyStart( const Point3d& ptNewStart) override ; bool ModifyEnd( const Point3d& ptNewEnd) override ; diff --git a/CurveComposite.cpp b/CurveComposite.cpp index 3c1dde1..51abec2 100644 --- a/CurveComposite.cpp +++ b/CurveComposite.cpp @@ -1707,7 +1707,7 @@ CurveComposite::Invert( void) //---------------------------------------------------------------------------- bool -CurveComposite::SimpleOffset( double dDist, int nType) +CurveComposite::SimpleOffset( double dDist, int nType, double dMaxAngExt) { // se distanza di offset nulla, non devo fare alcunché if ( abs( dDist) < EPS_SMALL) @@ -1729,7 +1729,7 @@ CurveComposite::SimpleOffset( double dDist, int nType) } // eseguo l'offset nel piano XY - bool bOk = SimpleOffsetXY( dDist, nType) ; + bool bOk = SimpleOffsetXY( dDist, nType, dMaxAngExt) ; // riporto la curva nel riferimento originale if ( bNeedRef) diff --git a/CurveComposite.h b/CurveComposite.h index 646105e..cc07fdf 100644 --- a/CurveComposite.h +++ b/CurveComposite.h @@ -113,7 +113,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool ApproxWithArcsEx( double dLinTol, double dAngTolDeg, double dLinFea, PolyArc& PA) const override ; ICurve* CopyParamRange( double dUStart, double dUEnd) const override ; bool Invert( void) override ; - bool SimpleOffset( double dDist, int nType = OFF_FILLET) override ; + bool SimpleOffset( double dDist, int nType = OFF_FILLET, double dMaxAngExt = ANG_RIGHT) override ; bool ModifyStart( const Point3d& ptNewStart) override ; bool ModifyEnd( const Point3d& ptNewEnd) override ; bool SetExtrusion( const Vector3d& vtExtr) override @@ -208,7 +208,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW bool AddCurveByRelocate( CurveComposite& ccSrc, bool bEndOrStart = true, double dLinTol = EPS_SMALL) ; bool AddSimpleCurve( ICurve* pSmplCrv, bool bEndOrStart = true, double dLinTol = EPS_SMALL) ; bool GetIndSCurveAndLocPar( double dU, Side nS, int& nSCrv, double& dLocU) const ; - bool SimpleOffsetXY( double dDist, int nType = OFF_FILLET) ; + 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 ; diff --git a/CurveCompositeOffset.cpp b/CurveCompositeOffset.cpp index 41cc8d8..29bde1e 100644 --- a/CurveCompositeOffset.cpp +++ b/CurveCompositeOffset.cpp @@ -19,6 +19,7 @@ #include "GeoConst.h" #include "/EgtDev/Include/EGkCurve.h" #include "/EgtDev/Include/EGkIntersCurves.h" +#include "/EgtDev/Include/EgtNumUtils.h" #include "/EgtDev/Include/EgtPointerOwner.h" using namespace std ; @@ -30,14 +31,14 @@ static const int TP_IS_VERT_LINE = 1 ; static bool IsVerticalLine( const ICurve* pCrv, double* pdLenZ) ; static bool VerifyAndAdjustSamePoint( ICurve* pCrv1, ICurve* pCrv2, CurveComposite& ccAux) ; static bool VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2, CurveComposite& ccAux) ; -static bool VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dDist, int nType, +static bool VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dDist, int nType, double dMaxAngExt, CurveComposite& ccAux) ; static bool AddFirstLastVerticalLines( CurveComposite& ccOffs, double dLenVertFirst, double dLenVertLast) ; static bool MediaInternalAngleDeltaZ( CurveComposite& ccOffs) ; //---------------------------------------------------------------------------- bool -CurveComposite::SimpleOffsetXY( double dDist, int nType) +CurveComposite::SimpleOffsetXY( double dDist, int nType, double dMaxAngExt) { // creo una copia formata solo da rette e archi che giacciono nel piano XY (VtExtr è Z+) CurveComposite ccCopy ; @@ -98,7 +99,7 @@ CurveComposite::SimpleOffsetXY( double dDist, int nType) CurveComposite ccTemp ; if ( VerifyAndAdjustSamePoint( pCrvPrev, pCrv2, ccTemp) || VerifyAndAdjustInternalAngle( pCrvPrev, pCrv2, ccTemp) || - VerifyAndAdjustExternalAngle( pCrvPrev, pCrv2, dDist, nType, ccTemp)) { + VerifyAndAdjustExternalAngle( pCrvPrev, pCrv2, dDist, nType, dMaxAngExt, ccTemp)) { if ( ccTemp.GetCurveCount() > 0 && ! ccOffs.AddCurveByRelocate( ccTemp)) return false ; } @@ -122,7 +123,7 @@ CurveComposite::SimpleOffsetXY( double dDist, int nType) CurveComposite ccTemp ; if ( VerifyAndAdjustSamePoint( pCrvPrev, pCrvNext, ccTemp) || VerifyAndAdjustInternalAngle( pCrvPrev, pCrvNext, ccTemp) || - VerifyAndAdjustExternalAngle( pCrvPrev, pCrvNext, dDist, nType, ccTemp)) { + VerifyAndAdjustExternalAngle( pCrvPrev, pCrvNext, dDist, nType, dMaxAngExt, ccTemp)) { int nCrvCount = ccTemp.GetCurveCount() ; if ( nCrvCount > 0 && ! ccOffs.AddCurveByRelocate( ccTemp)) return false ; @@ -174,7 +175,7 @@ bool VerifyAndAdjustSamePoint( ICurve* pCrv1, ICurve* pCrv2, CurveComposite& ccAux) { // verifica dei puntatori - if ( pCrv1 == nullptr || pCrv2 == nullptr || &ccAux == nullptr) + if ( pCrv1 == nullptr || pCrv2 == nullptr) return false ; // pulisco la curva ausiliaria @@ -218,7 +219,7 @@ bool VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2, CurveComposite& ccAux) { // verifica dei puntatori - if ( pCrv1 == nullptr || pCrv2 == nullptr || &ccAux == nullptr) + if ( pCrv1 == nullptr || pCrv2 == nullptr) return false ; // pulisco la curva ausiliaria @@ -259,11 +260,11 @@ VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2, CurveComposite& ccAu //---------------------------------------------------------------------------- bool -VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dDist, int nType, +VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dDist, int nType, double dMaxAngExt, CurveComposite& ccAux) { // verifica dei puntatori - if ( pCrv1 == nullptr || pCrv2 == nullptr || &ccAux == nullptr) + if ( pCrv1 == nullptr || pCrv2 == nullptr) return false ; // pulisco la curva ausiliaria @@ -272,6 +273,9 @@ VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dDist, int nT // elimino dal tipo le parti estranee all'angolo esterno nType &= ( ICurve::OFF_FILLET | ICurve::OFF_CHAMFER | ICurve::OFF_EXTEND) ; + // porto il massimo angolo per tipo Extend in limiti accettabili (90° - 150°) + dMaxAngExt = Clamp( dMaxAngExt, ANG_RIGHT, 1.667 * ANG_RIGHT) ; + // calcolo direzioni tangenti sull'estremo in comune Vector3d vtDir1, vtDir2 ; if ( ! pCrv1->GetEndDir( vtDir1) || ! pCrv2->GetStartDir( vtDir2)) @@ -319,8 +323,8 @@ VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dDist, int nT ( dDist > 0 && dAngDeg < 0))) return false ; - // se l'angolo esterno supera il retto, offset extend diventa offset chamfer - if ( nType == ICurve::OFF_EXTEND && abs( dAngDeg) > ANG_RIGHT + EPS_ANG_SMALL) + // se l'angolo esterno supera il limite, offset extend diventa offset chamfer + if ( nType == ICurve::OFF_EXTEND && abs( dAngDeg) > dMaxAngExt + EPS_ANG_SMALL) nType = ICurve::OFF_CHAMFER ; // se angolo esterno molto piccolo, semplifico tutto diff --git a/CurveLine.cpp b/CurveLine.cpp index d5fd3e4..0731bbe 100644 --- a/CurveLine.cpp +++ b/CurveLine.cpp @@ -577,7 +577,7 @@ CurveLine::Invert( void) //---------------------------------------------------------------------------- bool -CurveLine::SimpleOffset( double dDist, int nType) +CurveLine::SimpleOffset( double dDist, int nType, double dMaxAngExt) { // verifico lo stato if ( m_nStatus != OK) diff --git a/CurveLine.h b/CurveLine.h index b409d44..6f224da 100644 --- a/CurveLine.h +++ b/CurveLine.h @@ -117,7 +117,7 @@ class CurveLine : public ICurveLine, public IGeoObjRW { return ApproxWithArcs( dLinTol, dAngTolDeg, PA) ; } ICurve* CopyParamRange( double dUStart, double dUEnd) const override ; bool Invert( void) override ; - bool SimpleOffset( double dDist, int nType = OFF_FILLET) override ; + bool SimpleOffset( double dDist, int nType = OFF_FILLET, double dMaxAngExt = ANG_RIGHT) override ; bool ModifyStart( const Point3d& ptNewStart) override ; bool ModifyEnd( const Point3d& ptNewEnd) override ; bool SetExtrusion( const Vector3d& vtExtr) override diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index f3c849c992d94942feee72fb8d1101a54f5f4aed..870da00af5ad06d489640978af753856b8156a75 100644 GIT binary patch delta 260 zcmX>WeJpyzI%aKGhCGIJh8%`WhGK>c1_cHUhESkLCPN8BDnkm89}HwAf_cT0FKS6| z{=m$^%xJv%Hs5)s$u(R$lRrqRF&aWeJpyzI%aiGhCGIJh8%`ehGHOAV9;O)W+-7u1ma8}FBB-731Uyas3kpFPd#gM z9Lqc=Mx)L5`OY&hX`jGK#;zcG^Fwu6)J>CBt_NlipBAM6KDupe@OZchZce6ybVG-gbx%@?)4G64W1 CWk|>X diff --git a/OffsetCurve.cpp b/OffsetCurve.cpp index 7e2a50d..c0e4fba 100644 --- a/OffsetCurve.cpp +++ b/OffsetCurve.cpp @@ -243,11 +243,11 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) if ( IsNull( pCrv1)) return false ; pCrv1->SetTempProp( nInd1) ; - if ( ! pCrv1->SimpleOffset( dDist, ICurve::OFF_FILLET)) { + if ( ! pCrv1->SimpleOffset( dDist)) { CurveArc* pArc = GetBasicCurveArc( pCrv1) ; if ( pArc == nullptr) return false ; - if ( pArc->MyExtendedOffset( dDist, true, ICurve::OFF_FILLET)) + if ( pArc->MyExtendedOffset( dDist, true)) pCrv1->SetTempProp( - nInd1) ; } // curve successive @@ -255,11 +255,11 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) while ( ! IsNull( pCrv2)) { // eseguo semplice offset pCrv2->SetTempProp( nInd1 + 1) ; - if ( ! pCrv2->SimpleOffset( dDist, ICurve::OFF_FILLET)) { + if ( ! pCrv2->SimpleOffset( dDist)) { CurveArc* pArc = GetBasicCurveArc( pCrv2) ; if ( pArc == nullptr) return false ; - if ( pArc->MyExtendedOffset( dDist, true, ICurve::OFF_FILLET)) + if ( pArc->MyExtendedOffset( dDist, true)) pCrv2->SetTempProp( - ( nInd1 + 1)) ; } // verifico relazione con la curva precedente e aggiungo eventuali curve intermedie diff --git a/Voronoi.h b/Voronoi.h index e39ad3a..9f83c12 100644 --- a/Voronoi.h +++ b/Voronoi.h @@ -21,11 +21,11 @@ #include "/EgtDev/Include/EGkCurveLine.h" //---------------------------------------------------------------------------- -static const bool USE_VORONOI = true ; -static const int VORONOI_STD_BOUND = 3 ; -static const double VRONI_OFFS_TOL = 1e-9 ; -static const double VRONI_JUNCTION_OPEN = 1.0 ; -static const double VRONI_JUNCTION_CLOSED = 2.0 ; +static constexpr bool USE_VORONOI = true ; +static constexpr int VORONOI_STD_BOUND = 3 ; +static constexpr double VRONI_OFFS_TOL = 1e-9 ; +static constexpr double VRONI_JUNCTION_OPEN = 1.0 ; +static constexpr double VRONI_JUNCTION_CLOSED = 2.0 ; //-------------------------- Forward Definitions ------------------------------- class ISurfFlatRegion ;