]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
0003998: External 20809 Coordinates plot surfaces
authorouv <oleg.uvarov@opencascade.com>
Thu, 4 Aug 2016 10:48:12 +0000 (13:48 +0300)
committerouv <oleg.uvarov@opencascade.com>
Thu, 4 Aug 2016 10:48:12 +0000 (13:48 +0300)
src/Plot3d/Plot3d_ViewWindow.cxx
src/Plot3d/Plot3d_ViewWindow.h
src/Plot3d/resources/Plot3d_msg_en.ts
src/SVTK/SVTK_InteractorStyle.cxx
src/SVTK/SVTK_InteractorStyle.h
src/SVTK/SVTK_RenderWindowInteractor.cxx

index c318478e31a21f4584d8fe93d04b932f7952c3bc..412dd8977f7d43383680d702ad065b68b1275dd5 100644 (file)
@@ -27,6 +27,7 @@
 #include <QtxActionToolMgr.h>
 #include <QtxMultiAction.h>
 
+#include <SUIT_Desktop.h>
 #include <SUIT_MessageBox.h>
 #include <SUIT_ResourceMgr.h>
 
 #include <SVTK_InteractorStyle.h>
 #include <SVTK_KeyFreeInteractorStyle.h>
 #include <SVTK_Renderer.h>
+#include <SVTK_RenderWindowInteractor.h>
 
 #include <VTKViewer_Algorithm.h>
 
 #include <QMenu>
+#include <QMouseEvent>
+#include <QStatusBar>
 
 #include <vtkAxisActor2D.h>
 #include <vtkCamera.h>
 #include <vtkLookupTable.h>
+#include <vtkPoints.h>
 #include <vtkRenderer.h>
 #include <vtkRenderWindow.h>
+#include <vtkRenderWindowInteractor.h>
 #include <vtkScalarBarActor.h>
 #include <vtkScalarBarWidget.h>
 #include <vtkTextProperty.h>
@@ -120,6 +126,10 @@ Plot3d_ViewWindow::Plot3d_ViewWindow( SUIT_Desktop* theDesktop ):
   myFitDataBounds[3] = -1;
   myFitDataBounds[4] = 0;
   myFitDataBounds[5] = -1;
+
+  // Cell picker (required to display mapped coordinates in the status bar)
+  myCellPicker = vtkCellPicker::New();
+  myCellPicker->Delete();
 }
 
 /*!
@@ -158,6 +168,14 @@ void Plot3d_ViewWindow::Initialize( SVTK_ViewModelBase* theModel )
     }
   }
 
+  SVTK_RenderWindowInteractor* anInteractor = GetInteractor();
+  connect( anInteractor, SIGNAL( MouseMove( QMouseEvent* ) ), this, SLOT( onMouseMove( QMouseEvent* ) ) );
+  connect( anInteractor, SIGNAL( MouseButtonPressed( QMouseEvent* ) ), this, SLOT( onMouseButtonPressed( QMouseEvent* ) ) );
+  connect( anInteractor, SIGNAL( MouseButtonReleased( QMouseEvent* ) ), this, SLOT( onMouseButtonReleased( QMouseEvent* ) ) );
+
+  myStandardInteractorStyle->SetIsSelectionEnabled( false );
+  myKeyFreeInteractorStyle->SetIsSelectionEnabled( false );
+
   if( vtkRenderer* aRenderer = getRenderer() )
     aRenderer->AddActor( myScalarBarActor.GetPointer() );
 }
@@ -618,6 +636,61 @@ void Plot3d_ViewWindow::onFitData()
   }
 }
 
+/*!
+  Slot called when the mouse is moved.
+  \param theEvent mouse event
+*/
+void Plot3d_ViewWindow::onMouseMove( QMouseEvent* theEvent )
+{
+  QString aMsg;
+  if( theEvent->buttons() & Qt::LeftButton && !( theEvent->modifiers() & Qt::ControlModifier ) )
+  {
+    double aXPos = (double)theEvent->x();
+    double aYPos = (double)theEvent->y();
+
+    aYPos = getInteractor()->GetSize()[1] - aYPos - 1.0; // see SVTK_InteractorStyle.cxx, inline function GetEventPosition()
+
+    myCellPicker->Pick( aXPos, aYPos, 0, getRenderer() );
+    vtkPoints* aPoints = myCellPicker->GetPickedPositions();
+    if( aPoints && aPoints->GetNumberOfPoints() > 0 )
+    {
+      double* aPoint = aPoints->GetPoint( 0 );
+
+      double aScale[3];
+      GetScale( aScale ); // take into account the current scale
+
+      double aXCoord = fabs( aScale[0] ) > DBL_EPSILON ? aPoint[0] / aScale[0] : aPoint[0];
+      double aYCoord = fabs( aScale[1] ) > DBL_EPSILON ? aPoint[1] / aScale[1] : aPoint[1];
+      double aZCoord = fabs( aScale[2] ) > DBL_EPSILON ? aPoint[2] / aScale[2] : aPoint[2];
+
+      QString aXStr = QString().sprintf( "%g", aXCoord );
+      QString aYStr = QString().sprintf( "%g", aYCoord );
+      QString aZStr = QString().sprintf( "%g", aZCoord );
+
+      aMsg = tr( "INF_COORDINATES_XYZ" ).arg( aXStr, aYStr, aZStr );
+    }
+  }
+  putInfo( aMsg );
+}
+
+/*!
+  Slot called when the mouse button is pressed.
+  \param theEvent mouse event
+*/
+void Plot3d_ViewWindow::onMouseButtonPressed( QMouseEvent* theEvent )
+{
+  onMouseMove( theEvent );
+}
+
+/*!
+  Slot called when the mouse button is released.
+  \param theEvent mouse event
+*/
+void Plot3d_ViewWindow::onMouseButtonReleased( QMouseEvent* theEvent )
+{
+  putInfo( QString() );
+}
+
 /*!
   Store 2D/3D view state
   \param theViewState - view state to be stored
@@ -671,6 +744,16 @@ void Plot3d_ViewWindow::clearViewState( const bool theIs2D )
     myStored3DViewState.IsInitialized = false;
 }
 
+/*!
+  \brief Put message to the status bar.
+  \param theMsg message text
+*/
+void Plot3d_ViewWindow::putInfo( const QString& theMsg )
+{
+  QStatusBar* aStatusBar = myDesktop->statusBar();
+  aStatusBar->showMessage( theMsg );
+}
+
 /*!
   Get actor of the global scalar bar
   \return actor of the global scalar bar
index 18ce20042784123a35ea82d306834b651ef588e5..48e49e1c41c18157acef1f249a7e4dcdbaf79e62 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <SVTK_ViewWindow.h>
 
+class vtkCellPicker;
 class vtkLookupTable;
 class vtkScalarBarActor;
 class vtkScalarBarWidget;
@@ -54,6 +55,8 @@ public:
 
   void clearViewState( const bool theIs2D );
 
+  void putInfo( const QString& theMsg );
+
   vtkSmartPointer<vtkScalarBarActor> GetScalarBarActor() const;
   void UpdateScalarBar( const bool theIsRepaint = true );
 
@@ -66,6 +69,9 @@ public slots:
   void onSurfacesSettings();
   void onMergeScalarBars( bool theOn );
   void onFitData();
+  void onMouseMove( QMouseEvent* theEvent );
+  void onMouseButtonPressed( QMouseEvent* theEvent );
+  void onMouseButtonReleased( QMouseEvent* theEvent );
 
 protected:
   struct ViewState
@@ -107,6 +113,8 @@ protected:
   bool myIsFitDataInitialized;
   bool myIsFitDataEnabled;
   double myFitDataBounds[6];
+
+  vtkSmartPointer<vtkCellPicker> myCellPicker;
 };
 
 #endif
index 35e941a55ff02c69e802ba6b85e11bbd64753f64..0e5df8b5fdd3ebf93cc8e23061af62ece35c9d51 100644 (file)
@@ -18,6 +18,10 @@ The scale has been switched to linear.</translation>
 minimum value of the range is less or equal zero.
 Correct the range or switch to linear scale?</translation>
     </message>
+    <message>
+      <source>INF_COORDINATES_XYZ</source>
+      <translation>Coordinates: X : %1, Y : %2, Z: %3</translation>
+    </message>
     <message>
       <source>NO_OBJECTS_TO_FIT</source>
       <translation>No objects to fit</translation>
index 0e61dc1f2ebea0e14ddecaf8e80a84373b317baa..05cae30d02ade39b2e34f592defbf6dcea5e81e5 100644 (file)
@@ -94,7 +94,8 @@ SVTK_InteractorStyle::SVTK_InteractorStyle():
   myControllerOnKeyDown(SVTK_ControllerOnKeyDown::New()),
   myHighlightSelectionPointActor(SVTK_Actor::New()),
   myRectBand(0),
-  myIsRotationEnabled( true )
+  myIsRotationEnabled( true ),
+  myIsSelectionEnabled( true )
 {
   myPointPicker->Delete();
 
@@ -522,7 +523,7 @@ void SVTK_InteractorStyle::OnLeftButtonDown(int ctrl, int shift,
 
       GetRenderWidget()->setCursor(myDefCursor); 
     }
-    else
+    else if( myIsSelectionEnabled )
       startOperation(VTK_INTERACTOR_STYLE_CAMERA_SELECT);
   }
   
@@ -1724,6 +1725,14 @@ void SVTK_InteractorStyle::SetIsRotationEnabled( const bool theState )
   myIsRotationEnabled = theState;
 }
 
+/*!
+  Enable/disable selection
+*/
+void SVTK_InteractorStyle::SetIsSelectionEnabled( const bool theState )
+{
+  myIsSelectionEnabled = theState;
+}
+
 /*!
   To get current increment controller 
 */
index 15d329e93f5cc446dc65f4ecd9084557a93fe47b..b4a9616db303799a56ba8e5ca664d6fbb2653a91 100644 (file)
@@ -231,6 +231,9 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   //! Enable/disable rotation
   void SetIsRotationEnabled( const bool theState );
 
+  //! Enable/disable selection
+  void SetIsSelectionEnabled( const bool theState );
+
   protected:
   SVTK_InteractorStyle();
   ~SVTK_InteractorStyle();
@@ -355,6 +358,7 @@ class SVTK_EXPORT SVTK_InteractorStyle: public vtkInteractorStyle
   QRubberBand*                    myRectBand; //!< selection rectangle rubber band
 
   bool                            myIsRotationEnabled;
+  bool                            myIsSelectionEnabled;
 };
 
 #ifdef WIN32
index 6f96493b570a4ae088263fc9e29ff48f3b8923ee..55a696b6d14f2c6b6028c43c093030f3eef1f66c 100644 (file)
@@ -59,7 +59,7 @@
 
 using namespace std;
 
-static bool GENERATE_SUIT_EVENTS = false;
+static bool GENERATE_SUIT_EVENTS = true;
 static bool FOCUS_UNDER_MOUSE = false;