#include <CurveCreator_Utils.h>
+#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>
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 )
{
}
return GraphicsView_Viewer::Type();
}
-#include <iostream>
+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,
- const QPoint& theCursorPos,
double& theXCoordinate,
double& theYCoordinate,
double& theZCoordinate )
theXCoordinate = 0;
theYCoordinate = 0;
theZCoordinate = 0;
-
bool doShow = false;
- if ( !theViewWindow )
+ if ( !theViewWindow || !myIsPositionSaved )
return doShow;
OCCViewer_ViewWindow* anOCCViewWindow =
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<SVTK_ViewWindow*>(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;
}
}
}
*/
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 );
typedef QMap< ObjectKind, HYDROGUI_PrsDriver* > PrsDriversMap;
PrsDriversMap myPrsDriversMap;
vtkNew<vtkWorldPointPicker> myPicker;
+ int myXPosition;
+ int myYPosition;
+ bool myIsPositionSaved;
};
#endif