diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 0f1e8e0..c8de0c5 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/SceneSnap.cpp b/SceneSnap.cpp index 8b881d7..89a9798 100644 --- a/SceneSnap.cpp +++ b/SceneSnap.cpp @@ -25,7 +25,7 @@ #include "/EgtDev/Include/EGkDistPointCurve.h" #include "/EgtDev/Include/EGkSurfTriMesh.h" #include "/EgtDev/Include/EGkExtText.h" -#include "/EgtDev/Include/EgkIntersCurveCurve.h" +#include "/EgtDev/Include/EgkIntersCurves.h" #include "/EgtDev/Include/EGkIntersLineSurfTm.h" #include "/EgtDev/Include/EgtPointerOwner.h" @@ -164,8 +164,36 @@ Scene::FindSelectedIntersectionPoint( const Point3d& ptWin, int nW, int nH) ++ nCrvNum ; } } - if ( nCrvNum != 2) + // se nessuna curva, esco + if ( nCrvNum == 0) return false ; + // se una sola curva, può essere auto intersezione + if ( nCrvNum == 1) { + // recupero il riferimento di griglia + Frame3d frGrid = GetGridFrame() ; + // se il riferimento della curva è diverso da quello della griglia, devo trasformarla + PtrOwner crvTrans0( nullptr) ; + if ( ! AreSameFrame( frEnt[0], frGrid)) { + crvTrans0.Set( pCrv[0]->Clone()) ; + if ( IsNull( crvTrans0)) + return false ; + crvTrans0->LocToLoc( frEnt[0], frGrid) ; + pCrv[0] = ::Get( crvTrans0) ; + } + // uso il punto sketch come punto vicino e lo porto nel riferimento della griglia + Point3d ptWinZ( ptWin.x, ptWin.y, dWinZ) ; + Point3d ptNear ; + if ( ! UnProject( ptWinZ, ptNear)) + ptNear = ORIG ; + ptNear.ToLoc( frGrid) ; + // calcolo il punto di intersezione sulla prima curva più vicino al punto di riferimento + SelfIntersCurve sintC( *pCrv[0]) ; + if ( ! sintC.GetIntersPointNearTo( ptNear, m_ptLastSnapPnt)) + return false ; + m_ptLastSnapPnt.ToGlob( frGrid) ; + return true ; + } + // altrimenti due curve, procedo normalmente // recupero il riferimento di griglia Frame3d frGrid = GetGridFrame() ; // se il riferimento della prima curva è diverso da quello della griglia, devo trasformarla