#include <SVTK_ViewModel.h>
#include <SVTK_ViewWindow.h>
#include <SVTK_Selector.h>
-#include <SVTK_RenderWindowInteractor.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkRenderer.h>
+#include <vtkWorldPointPicker.h>
+#include <vtkCamera.h>
#include <OCCViewer_ViewPort3d.h>
#include <QMouseEvent>
#include <QStatusBar>
+const double LOCAL_SELECTION_TOLERANCE = 0.0001;
+
static int ViewManagerId = 0;
extern "C" HYDRO_EXPORT CAM_Module* createModule()
{
OCCViewer_ViewWindow* anOCCViewWindow =
dynamic_cast<OCCViewer_ViewWindow*>(theViewWindow);
+ bool doShow = false;
+ gp_Pnt aPnt;
if ( anOCCViewWindow ) {
// Get the selected point coordinates
OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort();
return;
}
- gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(),
+ aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(),
aViewPort->getView() );
- // 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 ) );
- }
+ doShow = true;
}
else
{
SVTK_ViewWindow* aViewWindow =
dynamic_cast<SVTK_ViewWindow*>(theViewWindow);
if ( aViewWindow ) {
- // Get the selected point coordinates
- double aCoords[3];
- SVTK_RenderWindowInteractor* anInteractor = aViewWindow->GetInteractor();
- if ( anInteractor )
+ vtkRenderer* aRen = aViewWindow->getRenderer();
+ if ( aRen )
{
- //TODO: Use a WorldPicker to get current coords
- //anInteractorStyle->ComputeDisplayToWorld( theEvent->x(), theEvent->y(), 0, aCoords );
- aCoords[0] = theEvent->x();
- aCoords[1] = theEvent->y();
- // Show the coordinates in the status bar
- SUIT_Desktop* aDesktop = getApp()->desktop();
- if ( aDesktop && aDesktop->statusBar() ) {
- QString aX = HYDROGUI_Tool::GetCoordinateString( aCoords[0] );
- QString anY = HYDROGUI_Tool::GetCoordinateString( aCoords[1] );
- aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) );
+ 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 ) );
+ }
+ }
}
\ No newline at end of file