From a4cc43dadb9e273e5260e2addcfc368c07defbc3 Mon Sep 17 00:00:00 2001 From: DarioS Date: Wed, 25 Aug 2021 15:03:56 +0200 Subject: [PATCH] EgtGeomKernel 2.3h2 : - OffsetCurve ora gestisce anche il caso di curve piane con estrusione inclinata fino a 60gradi dalla normale del piano (l'offest si basa su un ellisse). --- EgtGeomKernel.rc | Bin 11710 -> 11710 bytes OffsetCurve.cpp | 52 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 465c0275db9b01f38b31caface3abc9d3c71b624..5b66bd69087d4c192605a1c7db58eccb92208e91 100644 GIT binary patch delta 94 zcmdlNy)SyhFE&P_&A-_cnHh~HD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-Vf-5U delta 94 zcmdlNy)SyhFE&QQ&A-_cnHdcyD{|{@_Trkr0u;H;XNwSVW8B;$>;>dw2zN+>g;Df- LFmBFL4&ed-U|t&X diff --git a/OffsetCurve.cpp b/OffsetCurve.cpp index 5030197..a0b0684 100644 --- a/OffsetCurve.cpp +++ b/OffsetCurve.cpp @@ -70,16 +70,23 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) Reset() ; // verifico che la curva esista e sia piana Plane3d plPlane ; - if ( pCrv == nullptr || ! pCrv->IsFlat( plPlane)) + if ( pCrv == nullptr || ! pCrv->IsFlat( plPlane, false, 10 * EPS_SMALL)) return false ; - // se esiste estrusione, verifico sia perpendicolare al piano della curva + // recupero o assegno estrusione Vector3d vtExtr ; - if ( pCrv->GetExtrusion( vtExtr) && ! vtExtr.IsSmall()) { - if ( ! AreSameOrOppositeVectorApprox( plPlane.GetVersN(), vtExtr)) - return false ; - } - else + if ( ! pCrv->GetExtrusion( vtExtr) || vtExtr.IsSmall()) { vtExtr = plPlane.GetVersN() ; + if ( vtExtr.IsZminus()) + vtExtr.Invert() ; + } + // recupero normale al piano della curva + Vector3d vtNorm = plPlane.GetVersN() ; + if ( vtNorm * vtExtr < 0) + vtNorm.Invert() ; + // verifico che estrusione non sia troppo vicina al piano della curva (almeno 30 gradi di angolazione) + double dExtrOnN = vtExtr * vtNorm ; + if ( dExtrOnN < 0.5) + return false ; // recupero spessore double dThick ; pCrv->GetThickness( dThick) ; @@ -102,6 +109,9 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) // determino se necessario cambiare riferimento ( dal vettore estrusione) bool bNeedRef = ( ! vtExtr.IsZplus()) ; + // determino se necessario effettuare scalatura + bool bNeedScale = ( abs( dExtrOnN) < cos( 0.1 * DEGTORAD)) ; + // creo una copia della curva CurveComposite ccCopy ; if ( ! ccCopy.CopyFrom( pCrv)) @@ -109,13 +119,23 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) ccCopy.SetExtrusion( vtExtr) ; // se necessario cambio il riferimento - Frame3d frExtr ; - if ( bNeedRef) { + Frame3d frCopy ; + if ( bNeedScale) { + // calcolo il riferimento con vtNorm come asse Z e componente di vtExtr perpendicolare a vtNorm come asse X + if ( ! frCopy.Set( ORIG, vtNorm, vtExtr - dExtrOnN * vtNorm)) + return false ; + ccCopy.SetExtrusion( vtNorm) ; + // esprimo la curva in questo riferimento + ccCopy.ToLoc( frCopy) ; + // scalo lungo l'asse X locale + ccCopy.Scale( GLOB_FRM, dExtrOnN, 1, 1) ; + } + else if ( bNeedRef) { // calcolo il riferimento OCS con VtExtr come asse Z - if ( ! frExtr.Set( ORIG, vtExtr)) + if ( ! frCopy.Set( ORIG, vtExtr)) return false ; // esprimo la curva in questo riferimento - ccCopy.ToLoc( frExtr) ; + ccCopy.ToLoc( frCopy) ; } // verifico che la curva sia fatta solo da rette e archi che giacciono nel piano XY (VtExtr è ora Z+) @@ -601,9 +621,15 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType) } // riporto il risultato nel riferimento originale - if ( bNeedRef) { + if ( bNeedScale) { + for ( auto pCrv : m_CrvLst) { + pCrv->Scale( GLOB_FRM, 1 / dExtrOnN, 1, 1) ; + pCrv->ToGlob( frCopy) ; + } + } + else if ( bNeedRef) { for ( auto pCrv : m_CrvLst) - pCrv->ToGlob( frExtr) ; + pCrv->ToGlob( frCopy) ; } // assegno estrusione e spessore come curva originale