From 9705d1850d0d780075021595350c809973e802ab Mon Sep 17 00:00:00 2001 From: rkv Date: Wed, 25 Dec 2013 09:05:09 +0000 Subject: [PATCH] Fix for the Feature #102: Display of Lambert coordinates. --- src/HYDROGUI/HYDROGUI_Module.cxx | 83 +++++++++++++++++++++++--------- src/HYDROGUI/HYDROGUI_Module.h | 4 ++ 2 files changed, 64 insertions(+), 23 deletions(-) diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index ff2d3a0f..4d6b818b 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -85,7 +85,10 @@ #include #include #include -#include +#include +#include +#include +#include #include @@ -101,6 +104,8 @@ #include #include +const double LOCAL_SELECTION_TOLERANCE = 0.0001; + static int ViewManagerId = 0; extern "C" HYDRO_EXPORT CAM_Module* createModule() @@ -1439,6 +1444,8 @@ void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* { OCCViewer_ViewWindow* anOCCViewWindow = dynamic_cast(theViewWindow); + bool doShow = false; + gp_Pnt aPnt; if ( anOCCViewWindow ) { // Get the selected point coordinates OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort(); @@ -1446,38 +1453,68 @@ void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* return; } - gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(), + aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(), aViewPort->getView() ); - // Show the coordinates in the status bar - SUIT_Desktop* aDesktop = getApp()->desktop(); - if ( aDesktop && aDesktop->statusBar() ) { - QString aX = HYDROGUI_Tool::GetCoordinateString( aPnt.X() ); - QString anY = HYDROGUI_Tool::GetCoordinateString( aPnt.Y() ); - aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) ); - } + doShow = true; } else { SVTK_ViewWindow* aViewWindow = dynamic_cast(theViewWindow); if ( aViewWindow ) { - // Get the selected point coordinates - double aCoords[3]; - SVTK_RenderWindowInteractor* anInteractor = aViewWindow->GetInteractor(); - if ( anInteractor ) + vtkRenderer* aRen = aViewWindow->getRenderer(); + if ( aRen ) { - //TODO: Use a WorldPicker to get current coords - //anInteractorStyle->ComputeDisplayToWorld( theEvent->x(), theEvent->y(), 0, aCoords ); - aCoords[0] = theEvent->x(); - aCoords[1] = theEvent->y(); - // Show the coordinates in the status bar - SUIT_Desktop* aDesktop = getApp()->desktop(); - if ( aDesktop && aDesktop->statusBar() ) { - QString aX = HYDROGUI_Tool::GetCoordinateString( aCoords[0] ); - QString anY = HYDROGUI_Tool::GetCoordinateString( aCoords[1] ); - aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) ); + vtkCamera* aCamera = aRen->GetActiveCamera(); + double* aNormal = aCamera->GetViewPlaneNormal(); + int event_x, event_y; + vtkRenderWindowInteractor* anInteractor = aViewWindow->getInteractor(); + if ( anInteractor ) + { + anInteractor->GetLastEventPosition(event_x, event_y); + // Use a WorldPicker to get current coords + myPicker->Pick( event_x, event_y, 0, aRen ); + double* aCoords = myPicker->GetPickPosition(); + /////////////////////// Use the same algorithm as for OCC + double X, Y, Z; + double aXp, aYp, aZp; + double Vx, Vy, Vz; + X = aCoords[0]; + Y = aCoords[1]; + Z = aCoords[2]; + Vx = aNormal[0]; + Vy = aNormal[1]; + Vz = aNormal[2]; + Standard_Real aPrec = LOCAL_SELECTION_TOLERANCE; + if ( fabs( Vz ) > aPrec ) { + double aT = -Z/Vz; + aXp = X + aT*Vx; + aYp = Y + aT*Vy; + aZp = Z + aT*Vz; + } + else { // Vz = 0 - the eyed plane is orthogonal to Z plane - XOZ, or YOZ + aXp = aYp = aZp = 0; + if ( fabs( Vy ) < aPrec ) // Vy = 0 - the YOZ plane + aYp = Y; + else if ( fabs( Vx ) < aPrec ) // Vx = 0 - the XOZ plane + aXp = X; + } + ///////////////////////// + doShow = true; + aPnt.SetX( aXp ); + aPnt.SetY( aYp ); } } } } + if ( doShow ) + { + // Show the coordinates in the status bar + SUIT_Desktop* aDesktop = getApp()->desktop(); + if ( aDesktop && aDesktop->statusBar() ) { + QString aX = HYDROGUI_Tool::GetCoordinateString( aPnt.X() ); + QString anY = HYDROGUI_Tool::GetCoordinateString( aPnt.Y() ); + aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) ); + } + } } \ No newline at end of file diff --git a/src/HYDROGUI/HYDROGUI_Module.h b/src/HYDROGUI/HYDROGUI_Module.h index a0b91265..a51ef9d2 100644 --- a/src/HYDROGUI/HYDROGUI_Module.h +++ b/src/HYDROGUI/HYDROGUI_Module.h @@ -29,11 +29,14 @@ #include +#include + class QGraphicsSceneMouseEvent; class GraphicsView_Viewer; class OCCViewer_Viewer; class SVTK_Viewer; +class vtkWorldPointPicker; class SUIT_ViewWindow; class SUIT_ViewManager; @@ -237,6 +240,7 @@ private: ViewId2ListOfShapes myShapesMap; ViewId2ListOfVTKPrs myVTKPrsMap; + vtkNew myPicker; bool myIsUpdateEnabled; -- 2.39.2