diff --git a/EgtMachKernel.rc b/EgtMachKernel.rc index c14c243..f337191 100644 Binary files a/EgtMachKernel.rc and b/EgtMachKernel.rc differ diff --git a/Operation.cpp b/Operation.cpp index 0b536a8..a88f9a7 100644 --- a/Operation.cpp +++ b/Operation.cpp @@ -485,8 +485,9 @@ Operation::GetRawGlobBox( int nPhase, const BBox3d& b3Test, double dToler, BBox3 //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- inline Vector3d -GetDirInFacePerpSide( int nFaceUse, const Vector3d& vtN) +GetDirInFacePerpSide( int nFaceUse, const Vector3d& vtN, ICurveComposite* pCrvCompo) { + // determino la direzione di riferimento proiettata nella faccia Vector3d vtRef ; switch ( nFaceUse) { case FACE_DOWN : vtRef = Z_AX ; break ; @@ -499,6 +500,22 @@ GetDirInFacePerpSide( int nFaceUse, const Vector3d& vtN) vtRef -= vtRef * vtN * vtN ; if ( ! vtRef.Normalize()) vtRef = V_NULL ; + // sostituisco questa direzione con quella perpendicolare alla curva pił adatta + double dCosMax = -1 ; + Vector3d vtPerpMax ; + const ICurve* pCrv = pCrvCompo->GetFirstCurve() ; + while ( pCrv != nullptr) { + Vector3d vtDir ; pCrv->GetMidDir( vtDir) ; + Vector3d vtPerp = vtN ^ vtDir ; + double dCos = vtPerp * vtRef ; + if ( dCos > dCosMax) { + dCosMax = dCos ; + vtPerpMax = vtPerp ; + } + pCrv = pCrvCompo->GetNextCurve() ; + } + if ( dCosMax > 0) + vtRef = vtPerpMax ; return vtRef ; } @@ -533,10 +550,10 @@ Operation::AdjustCurveFromSurf( ICurveComposite* pCrvCompo, int nToolDir, int nF // altrimenti else { // determino la direzione di riferimento - Vector3d vtRef = GetDirInFacePerpSide( nFaceUse, vtN) ; + Vector3d vtRef = GetDirInFacePerpSide( nFaceUse, vtN, pCrvCompo) ; // la curva gira in senso antiorario attorno al contorno faccia vista dalla normale uscente - // elimino i segmenti che hanno la direzione di riferimento a destra o quasi (30deg) - const double COS_ANG_MAX = 0.5 ; + // elimino i segmenti che hanno la direzione di riferimento a destra o quasi (45deg) + const double COS_ANG_MAX = 0.707 ; // cerco primo elemento del contorno non valido e vi pongo inizio/fine della curva int i = 0 ; const ICurve* pCrv = pCrvCompo->GetFirstCurve() ;