]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Refs #289 - Spline profile is represented in OCC view as polyline profile
authornds <nds@opencascade.com>
Fri, 27 Dec 2013 07:41:07 +0000 (07:41 +0000)
committernds <nds@opencascade.com>
Fri, 27 Dec 2013 07:41:07 +0000 (07:41 +0000)
src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx
src/HYDROGUI/HYDROGUI_Displayer.cxx
src/HYDROGUI/HYDROGUI_Displayer.h
src/HYDROGUI/HYDROGUI_Module.cxx
src/HYDROGUI/HYDROGUI_Module.h

index c959cf544795c03cb4c21ea4aa773a12f7745c69..0139ce9ce95bcfe50be20cb1292bb3264d0bd481 100644 (file)
 
 #include "HYDROGUI_CopyPastePositionOp.h"
 
-#include "HYDROGUI_DataModel.h"
 #include "HYDROGUI_Module.h"
-#include "HYDROGUI_UpdateFlags.h"
+#include "HYDROGUI_Displayer.h"
 
-#include <gp_Pnt.hxx>
+#include <SUIT_ViewManager.h>
+#include <LightApp_Application.h>
 
-#include <QApplication>
 #include <QClipboard>
+#include <QApplication>
 
 HYDROGUI_CopyPastePositionOp::HYDROGUI_CopyPastePositionOp( HYDROGUI_Module* theModule,
                                                             const bool theIsPaste )
@@ -47,22 +47,24 @@ void HYDROGUI_CopyPastePositionOp::startOperation()
 {
   HYDROGUI_Operation::startOperation();
 
-  HYDROGUI_DataModel* aModel = module()->getDataModel();
-
   if( !myIsPaste )
   {
-    QClipboard* aClBoard = QApplication::clipboard();
-
-
-    gp_Pnt aPoint( 100, 100, 0 );
-    QString aResult = tr( "%1,%2" ).arg( aPoint.X() ).arg( aPoint.Y() );
+    QString aResult;
+    HYDROGUI_Module* aModule = module();
+    HYDROGUI_Displayer* aDisplayer = aModule->getDisplayer();
+    if ( aDisplayer ) {
+      SUIT_ViewManager* aViewMgr = aModule->getApp()->activeViewManager();
+      SUIT_ViewWindow* aViewWindow = aViewMgr ? aViewMgr->getActiveView() : 0;
+      double aX, aY, aZ;
+      if ( aDisplayer->GetCursorViewCoordinates( aViewWindow, aModule->getPopupPosition(),
+                                                 aX, aY, aZ ) )
+        aResult = tr( "%1,%2" ).arg( aX ).arg( aY );
+    }
     if ( !aResult.isEmpty() ) {
+      QClipboard* aClBoard = QApplication::clipboard();
       aClBoard->clear();
       QApplication::clipboard()->setText( aResult );
     }
   }
-  else
-  {
-  }
   commit();
 }
index 548f5e47953bf70b5ac697f2499f2718aaa39bec..39cb1f54f1e2758e6a3bb9d96a477c8a6e4a8c20 100644 (file)
 #include "HYDROGUI_PrsZoneDriver.h"
 #include "HYDROGUI_Tool.h"
 
+#include <CurveCreator_Utils.h>
+
+#include <SVTK_ViewWindow.h>
+#include <OCCViewer_ViewWindow.h>
+#include <OCCViewer_ViewPort3d.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 )
 {
@@ -222,3 +235,90 @@ QString HYDROGUI_Displayer::GetType() const
 {
   return GraphicsView_Viewer::Type();
 }
+
+#include <iostream>
+bool HYDROGUI_Displayer::GetCursorViewCoordinates( SUIT_ViewWindow* theViewWindow,
+                                                   const QPoint& theCursorPos,
+                                                   double& theXCoordinate,
+                                                   double& theYCoordinate,
+                                                   double& theZCoordinate )
+{
+  theXCoordinate = 0;
+  theYCoordinate = 0;
+  theZCoordinate = 0;
+  
+  bool doShow = false;
+  if ( !theViewWindow )
+    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;
+    }
+    QPoint aViewPos = aViewPort->mapFromGlobal( theCursorPos );
+    gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( aViewPos.x(), aViewPos.y(),
+                                                           aViewPort->getView() );
+    theXCoordinate = aPnt.X();
+    theYCoordinate = aPnt.Y();
+    //std::cout << "Coordinates: " << theCursorPos.x() << ", " << theCursorPos.y() << std::endl;
+    doShow = true;
+  } 
+  else
+  {
+    SVTK_ViewWindow* aViewWindow = 
+      dynamic_cast<SVTK_ViewWindow*>(theViewWindow);
+    if ( aViewWindow ) {
+      vtkRenderer* aRen = aViewWindow->getRenderer();
+      if ( aRen )
+      {
+        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
+          //std::cout << "Coordinates: " << theCursorPos.x() << ", " << theCursorPos.y() << std::endl;
+          //SVTK_RenderWindowInteractor* anInteractor = 
+          //std::cout << "VTK Coordinates: " << event_x << ", " << event_y << std::endl;
+          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;
+          }
+          /////////////////////////
+          theXCoordinate = aXp;
+          theYCoordinate = aYp;
+          doShow = true;
+        }
+      }
+    } 
+  }
+  return doShow;
+}
index f7948dcab39993540c2e8d25c0970bf673316f1b..c3dcfce3f95c365ec4e518bfc39423ade1d2f243 100644 (file)
 #include "HYDROGUI_AbstractDisplayer.h"
 
 #include <QMap>
+#include <QPoint>
+#include <vtkNew.h>
 
 class HYDROGUI_PrsDriver;
+class SUIT_ViewWindow;
+class vtkWorldPointPicker;
 
 /**
  * \class HYDROGUI_Displayer
@@ -61,6 +65,20 @@ public:
    */
   virtual QString  GetType() const;
 
+  /**
+   * \brief Get the coodinates from the view window, projected on XOY plane
+   * \param theViewWindow a view window
+   * \param theCursorPos a cursor position point
+   * \param theXCoordinate a X coordinate
+   * \param theXCoordinate an Y coordinate
+   * \param theXCoordinate a Z coordinate, has a zero value because of the plane
+   * \return true if the coordinates are got
+   */
+  bool             GetCursorViewCoordinates( SUIT_ViewWindow* theViewWindow,
+                                             const QPoint& theCursorPos,
+                                             double& theXCoordinate,
+                                             double& theYCoordinate,
+                                             double& theZCoordinate );
 protected:
   /**
    * \brief Erase all viewer objects.
@@ -105,6 +123,7 @@ private:
 private:
   typedef QMap< ObjectKind, HYDROGUI_PrsDriver* > PrsDriversMap;
   PrsDriversMap                   myPrsDriversMap;
+  vtkNew<vtkWorldPointPicker>     myPicker;
 };
 
 #endif
index fb192aff8069ee159101f1efe13eb39cc3b15918..09cd00f85a37587359680c4b37a6453f03db52c5 100644 (file)
 #include <SVTK_ViewModel.h>
 #include <SVTK_ViewWindow.h>
 #include <SVTK_Selector.h>
-#include <vtkRenderWindowInteractor.h>
-#include <vtkRenderer.h>
-#include <vtkWorldPointPicker.h>
-#include <vtkCamera.h>
 
 #include <OCCViewer_ViewPort3d.h>
 
 #include <QMenu>
 #include <QMouseEvent>
 #include <QStatusBar>
-
-const double LOCAL_SELECTION_TOLERANCE = 0.0001;
+#include <QCursor>
 
 static int ViewManagerId = 0;
 
@@ -657,9 +652,10 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
     theMenu->addAction( action( HideAllId ) );
     theMenu->addSeparator();
   }
-  if ( anIsOCCView ) {
+  if ( anIsOCCView || anIsVTKView ) {
     theMenu->addSeparator();
     theMenu->addAction( action( CopyViewerPositionId ) );
+    myPopupPos = QCursor::pos();
   }
 }
 
@@ -1455,81 +1451,22 @@ void HYDROGUI_Module::restoreSelection( const QStringList& theEntryList )
   }
 }
 
-void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* theEvent )
+void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* )
 {
-  OCCViewer_ViewWindow* anOCCViewWindow = 
-    dynamic_cast<OCCViewer_ViewWindow*>(theViewWindow);
+  double aX, aY, aZ;
   bool doShow = false;
-  gp_Pnt aPnt;
-  if ( anOCCViewWindow ) {
-    // Get the selected point coordinates
-    OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort();
-    if ( !aViewPort ) {
-      return;
-    }
+  HYDROGUI_Displayer* aDisplayer = getDisplayer();
+  if ( aDisplayer )
+    doShow = aDisplayer->GetCursorViewCoordinates( theViewWindow, QCursor::pos(), aX, aY, aZ );
 
-    aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(), 
-                                                           aViewPort->getView() );
-    doShow = true;
-  } 
-  else
-  {
-    SVTK_ViewWindow* aViewWindow = 
-      dynamic_cast<SVTK_ViewWindow*>(theViewWindow);
-    if ( aViewWindow ) {
-      vtkRenderer* aRen = aViewWindow->getRenderer();
-      if ( aRen )
-      {
-        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 ) );
+      QString aXStr = HYDROGUI_Tool::GetCoordinateString( aX );
+      QString anYStr = HYDROGUI_Tool::GetCoordinateString( aY );
+      aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aXStr ).arg( anYStr ) );
     }
   }
 }
@@ -1547,4 +1484,13 @@ int HYDROGUI_Module::getObjectDisplayOrder(
   QStringList anObjectEntries = myObjectDisplayOrderMap.value( theViewId );
 
   return anObjectEntries.indexOf( anEntry );
-}
\ No newline at end of file
+}
+
+/**
+ * Get the popup menu position
+ * \return the position
+ */
+QPoint HYDROGUI_Module::getPopupPosition() const
+{
+ return myPopupPos;
+}
index 58583ab50477a05e058e2d2e050d5c26040eeaf3..1cfd15c837b815be5171ec8b64775ac96557cfc0 100644 (file)
 #include <LightApp_Module.h>
 
 #include <QEvent>
-
-#include <vtkNew.h>
+#include <QPoint>
 
 class QGraphicsSceneMouseEvent;
 
 class GraphicsView_Viewer;
 class OCCViewer_Viewer;
 class SVTK_Viewer;
-class vtkWorldPointPicker;
 
 class SUIT_ViewWindow;
 class SUIT_ViewManager;
@@ -173,6 +171,7 @@ public:
 
   int                             getObjectDisplayOrder( const int theViewId,
                                                          const Handle(HYDROData_Entity)& theObject ) const;
+  QPoint                          getPopupPosition() const;
 
 protected:
   CAM_DataModel*                  createDataModel();
@@ -245,8 +244,7 @@ private:
 
   ViewId2ListOfShapes             myShapesMap;
   ViewId2ListOfVTKPrs             myVTKPrsMap;
-  vtkNew<vtkWorldPointPicker>     myPicker;
-
+  QPoint                          myPopupPos;
   bool                            myIsUpdateEnabled;
 
   QStringList                     myGeomObjectsToImport; ///< entries of GEOM objects to be imported