From 42c150905c5e9fbd5582687d0c78b8f102a77cea Mon Sep 17 00:00:00 2001 From: nds Date: Fri, 27 Dec 2013 07:41:07 +0000 Subject: [PATCH] Refs #289 - Spline profile is represented in OCC view as polyline profile --- src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx | 30 +++--- src/HYDROGUI/HYDROGUI_Displayer.cxx | 100 ++++++++++++++++++ src/HYDROGUI/HYDROGUI_Displayer.h | 19 ++++ src/HYDROGUI/HYDROGUI_Module.cxx | 96 ++++------------- src/HYDROGUI/HYDROGUI_Module.h | 8 +- 5 files changed, 159 insertions(+), 94 deletions(-) diff --git a/src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx b/src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx index c959cf54..0139ce9c 100644 --- a/src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx +++ b/src/HYDROGUI/HYDROGUI_CopyPastePositionOp.cxx @@ -22,14 +22,14 @@ #include "HYDROGUI_CopyPastePositionOp.h" -#include "HYDROGUI_DataModel.h" #include "HYDROGUI_Module.h" -#include "HYDROGUI_UpdateFlags.h" +#include "HYDROGUI_Displayer.h" -#include +#include +#include -#include #include +#include 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(); } diff --git a/src/HYDROGUI/HYDROGUI_Displayer.cxx b/src/HYDROGUI/HYDROGUI_Displayer.cxx index 548f5e47..39cb1f54 100644 --- a/src/HYDROGUI/HYDROGUI_Displayer.cxx +++ b/src/HYDROGUI/HYDROGUI_Displayer.cxx @@ -30,9 +30,22 @@ #include "HYDROGUI_PrsZoneDriver.h" #include "HYDROGUI_Tool.h" +#include + +#include +#include +#include + +#include +#include +#include +#include + #include #include +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 +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(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(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; +} diff --git a/src/HYDROGUI/HYDROGUI_Displayer.h b/src/HYDROGUI/HYDROGUI_Displayer.h index f7948dca..c3dcfce3 100644 --- a/src/HYDROGUI/HYDROGUI_Displayer.h +++ b/src/HYDROGUI/HYDROGUI_Displayer.h @@ -26,8 +26,12 @@ #include "HYDROGUI_AbstractDisplayer.h" #include +#include +#include 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 myPicker; }; #endif diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index fb192aff..09cd00f8 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -85,10 +85,6 @@ #include #include #include -#include -#include -#include -#include #include @@ -103,8 +99,7 @@ #include #include #include - -const double LOCAL_SELECTION_TOLERANCE = 0.0001; +#include 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(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(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; +} diff --git a/src/HYDROGUI/HYDROGUI_Module.h b/src/HYDROGUI/HYDROGUI_Module.h index 58583ab5..1cfd15c8 100644 --- a/src/HYDROGUI/HYDROGUI_Module.h +++ b/src/HYDROGUI/HYDROGUI_Module.h @@ -28,15 +28,13 @@ #include #include - -#include +#include 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 myPicker; - + QPoint myPopupPos; bool myIsUpdateEnabled; QStringList myGeomObjectsToImport; ///< entries of GEOM objects to be imported -- 2.39.2