From 819b11b671c02afd3b87851b4f4848f7f0cbb947 Mon Sep 17 00:00:00 2001 From: nds Date: Fri, 27 Dec 2013 10:07:21 +0000 Subject: [PATCH] Refs #279 - Copy for the view position coordinates --- src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx | 3 +- src/HYDROGUI/HYDROGUI_Displayer.cxx | 136 +++++++++++------- src/HYDROGUI/HYDROGUI_Displayer.h | 12 +- src/HYDROGUI/HYDROGUI_Module.cxx | 13 +- src/HYDROGUI/HYDROGUI_Module.h | 2 - 5 files changed, 99 insertions(+), 67 deletions(-) diff --git a/src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx b/src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx index 0139ce9c..55a41afc 100644 --- a/src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx +++ b/src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx @@ -56,8 +56,7 @@ void HYDROGUI_CopyPastePositionOp::startOperation() 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 ) ) + if ( aDisplayer->GetCursorViewCoordinates( aViewWindow, aX, aY, aZ ) ) aResult = tr( "%1,%2" ).arg( aX ).arg( aY ); } if ( !aResult.isEmpty() ) { diff --git a/src/HYDROGUI/HYDROGUI_Displayer.cxx b/src/HYDROGUI/HYDROGUI_Displayer.cxx index 39cb1f54..030ca3ed 100644 --- a/src/HYDROGUI/HYDROGUI_Displayer.cxx +++ b/src/HYDROGUI/HYDROGUI_Displayer.cxx @@ -32,9 +32,11 @@ #include +#include #include #include #include +#include #include #include @@ -47,7 +49,8 @@ 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 ) { } @@ -236,9 +239,55 @@ QString HYDROGUI_Displayer::GetType() const return GraphicsView_Viewer::Type(); } -#include +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( 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(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, - const QPoint& theCursorPos, double& theXCoordinate, double& theYCoordinate, double& theZCoordinate ) @@ -246,9 +295,8 @@ bool HYDROGUI_Displayer::GetCursorViewCoordinates( SUIT_ViewWindow* theViewWindo theXCoordinate = 0; theYCoordinate = 0; theZCoordinate = 0; - bool doShow = false; - if ( !theViewWindow ) + if ( !theViewWindow || !myIsPositionSaved ) return doShow; OCCViewer_ViewWindow* anOCCViewWindow = @@ -259,64 +307,52 @@ bool HYDROGUI_Displayer::GetCursorViewCoordinates( SUIT_ViewWindow* theViewWindo if ( !aViewPort ) { return doShow; } - QPoint aViewPos = aViewPort->mapFromGlobal( theCursorPos ); - gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( aViewPos.x(), aViewPos.y(), + gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( myXPosition, myYPosition, aViewPort->getView() ); theXCoordinate = aPnt.X(); theYCoordinate = aPnt.Y(); - //std::cout << "Coordinates: " << theCursorPos.x() << ", " << theCursorPos.y() << std::endl; doShow = true; } else { - SVTK_ViewWindow* aViewWindow = + SVTK_ViewWindow* aVTKViewWindow = dynamic_cast(theViewWindow); - if ( aViewWindow ) { - vtkRenderer* aRen = aViewWindow->getRenderer(); + if ( aVTKViewWindow ) { + vtkRenderer* aRen = aVTKViewWindow->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; + 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; } } } diff --git a/src/HYDROGUI/HYDROGUI_Displayer.h b/src/HYDROGUI/HYDROGUI_Displayer.h index c3dcfce3..f99815ae 100644 --- a/src/HYDROGUI/HYDROGUI_Displayer.h +++ b/src/HYDROGUI/HYDROGUI_Displayer.h @@ -65,17 +65,22 @@ public: */ virtual QString GetType() const; + /* + * Get the current cursor view position and save it in the displayer + * to be used in the obtaining the view coordinates of the cursor. + * \param theViewWindow a view window. If a view window is null, an active view is used + * only OCC and VTK views are processed + */ + void SaveCursorViewPosition( SUIT_ViewWindow* theViewWindow = 0 ); /** * \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 ); @@ -124,6 +129,9 @@ private: typedef QMap< ObjectKind, HYDROGUI_PrsDriver* > PrsDriversMap; PrsDriversMap myPrsDriversMap; vtkNew myPicker; + int myXPosition; + int myYPosition; + bool myIsPositionSaved; }; #endif diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index 09cd00f8..ae7dad74 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -655,7 +655,6 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, if ( anIsOCCView || anIsVTKView ) { theMenu->addSeparator(); theMenu->addAction( action( CopyViewerPositionId ) ); - myPopupPos = QCursor::pos(); } } @@ -1457,7 +1456,8 @@ void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* bool doShow = false; HYDROGUI_Displayer* aDisplayer = getDisplayer(); if ( aDisplayer ) - doShow = aDisplayer->GetCursorViewCoordinates( theViewWindow, QCursor::pos(), aX, aY, aZ ); + aDisplayer->SaveCursorViewPosition( theViewWindow ); + doShow = aDisplayer->GetCursorViewCoordinates( theViewWindow, aX, aY, aZ ); if ( doShow ) { @@ -1485,12 +1485,3 @@ int HYDROGUI_Module::getObjectDisplayOrder( return anObjectEntries.indexOf( anEntry ); } - -/** - * Get the popup menu position - * \return the position - */ -QPoint HYDROGUI_Module::getPopupPosition() const -{ - return myPopupPos; -} diff --git a/src/HYDROGUI/HYDROGUI_Module.h b/src/HYDROGUI/HYDROGUI_Module.h index 1cfd15c8..f4a87f48 100644 --- a/src/HYDROGUI/HYDROGUI_Module.h +++ b/src/HYDROGUI/HYDROGUI_Module.h @@ -28,7 +28,6 @@ #include #include -#include class QGraphicsSceneMouseEvent; @@ -244,7 +243,6 @@ private: ViewId2ListOfShapes myShapesMap; ViewId2ListOfVTKPrs myVTKPrsMap; - QPoint myPopupPos; bool myIsUpdateEnabled; QStringList myGeomObjectsToImport; ///< entries of GEOM objects to be imported -- 2.39.2