diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc index 465c027..5b66bd6 100644 Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ 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