Salome HOME
Merge branch 'master' of https://git.salome-platform.org/git/modules/hydro
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Displayer.cxx
index 045b7db3c5e904f43d05d5d7f27497ac51058f89..64bbb6e462a62dd205c32635b2c6f423b8bc3dcc 100644 (file)
@@ -1,12 +1,8 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
+// Copyright (C) 2014-2015  EDF-R&D
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 #include "HYDROGUI_PrsImageDriver.h"
 #include "HYDROGUI_PrsPolylineDriver.h"
 #include "HYDROGUI_PrsZoneDriver.h"
-#include "HYDROGUI_Tool.h"
+#include "HYDROGUI_Tool2.h"
+
+#include <CurveCreator_Utils.hxx>
+
+#include <LightApp_Application.h>
+#include <SVTK_ViewWindow.h>
+#include <OCCViewer_ViewWindow.h>
+#include <OCCViewer_ViewPort3d.h>
+#include <SUIT_ViewManager.h>
+
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkWorldPointPicker.h>
+#include <vtkCamera.h>
 
 #include <GraphicsView_Viewer.h>
 #include <GraphicsView_ViewPort.h>
 
+const double LOCAL_SELECTION_TOLERANCE = 0.0001;
+
 HYDROGUI_Displayer::HYDROGUI_Displayer( HYDROGUI_Module* theModule )
-: HYDROGUI_AbstractDisplayer( theModule )
+: HYDROGUI_AbstractDisplayer( theModule ),
+  myXPosition( -1 ), myYPosition( -1 ), myIsPositionSaved( false )
 {
 }
 
@@ -201,7 +213,7 @@ HYDROGUI_PrsDriver* HYDROGUI_Displayer::getDriver( const Handle(HYDROData_Entity
       case KIND_IMAGE:
         aDriver = new HYDROGUI_PrsImageDriver();
         break;
-      case KIND_POLYLINE:
+      case KIND_POLYLINEXY:
         aDriver = new HYDROGUI_PrsPolylineDriver();
         break;
       case KIND_ZONE:
@@ -222,3 +234,123 @@ QString HYDROGUI_Displayer::GetType() const
 {
   return GraphicsView_Viewer::Type();
 }
+
+void HYDROGUI_Displayer::SaveCursorViewPosition( SUIT_ViewWindow* theViewWindow )
+{
+  myIsPositionSaved = false;
+  myXPosition = 0;
+  myYPosition = 0;
+
+  SUIT_ViewWindow* aViewWindow = theViewWindow;
+  if ( !theViewWindow ) {
+    SUIT_ViewManager* aViewMgr = module()->getApp()->activeViewManager();
+    aViewWindow = aViewMgr ? aViewMgr->getActiveView() : 0;
+    if ( !aViewWindow )
+      return;
+  }
+  
+  OCCViewer_ViewWindow* anOCCViewWindow = 
+    dynamic_cast<OCCViewer_ViewWindow*>( aViewWindow );
+  if ( anOCCViewWindow ) {
+    // Get the selected point coordinates
+    OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort();
+    if ( aViewPort ) {
+      QPoint aViewPos = aViewPort->mapFromGlobal( QCursor::pos() );
+      myXPosition = aViewPos.x();
+      myYPosition = aViewPos.y();
+      myIsPositionSaved = true;
+    }
+  }
+  else {
+    SVTK_ViewWindow* aVTKViewWindow = 
+      dynamic_cast<SVTK_ViewWindow*>(aViewWindow);
+    if ( aVTKViewWindow ) {
+      vtkRenderer* aRen = aVTKViewWindow->getRenderer();
+      if ( aRen )
+      {
+        vtkCamera* aCamera = aRen->GetActiveCamera();
+        double* aNormal = aCamera->GetViewPlaneNormal();
+        vtkRenderWindowInteractor* anInteractor = aVTKViewWindow->getInteractor();
+        if ( anInteractor )
+        {
+          anInteractor->GetLastEventPosition( myXPosition, myYPosition );
+          myIsPositionSaved = true;
+        }
+      }
+    }
+  }
+  if (!myIsPositionSaved)
+    int aValue = 0;
+}
+
+bool HYDROGUI_Displayer::GetCursorViewCoordinates( SUIT_ViewWindow* theViewWindow,
+                                                   double& theXCoordinate,
+                                                   double& theYCoordinate,
+                                                   double& theZCoordinate )
+{
+  theXCoordinate = 0;
+  theYCoordinate = 0;
+  theZCoordinate = 0;
+  bool doShow = false;
+  if ( !theViewWindow || !myIsPositionSaved )
+    return doShow;
+  
+  OCCViewer_ViewWindow* anOCCViewWindow = 
+    dynamic_cast<OCCViewer_ViewWindow*>(theViewWindow);
+  if ( anOCCViewWindow ) {
+    // Get the selected point coordinates
+    OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort();
+    if ( !aViewPort ) {
+      return doShow;
+    }
+    gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( myXPosition, myYPosition,
+                                                           aViewPort->getView() );
+    theXCoordinate = aPnt.X();
+    theYCoordinate = aPnt.Y();
+    doShow = true;
+  } 
+  else
+  {
+    SVTK_ViewWindow* aVTKViewWindow = 
+      dynamic_cast<SVTK_ViewWindow*>(theViewWindow);
+    if ( aVTKViewWindow ) {
+      vtkRenderer* aRen = aVTKViewWindow->getRenderer();
+      if ( aRen )
+      {
+        vtkCamera* aCamera = aRen->GetActiveCamera();
+        double* aNormal = aCamera->GetViewPlaneNormal();
+        myPicker->Pick( myXPosition, myYPosition, 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;
+        }
+        /////////////////////////
+        theXCoordinate = aXp;
+        theYCoordinate = aYp;
+        doShow = true;
+      }
+    } 
+  }
+  return doShow;
+}