]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Refs #275 - Coordinates projection
authornds <nds@opencascade.com>
Tue, 24 Dec 2013 09:50:52 +0000 (09:50 +0000)
committernds <nds@opencascade.com>
Tue, 24 Dec 2013 09:50:52 +0000 (09:50 +0000)
src/HYDROCurveCreator/CurveCreator_Utils.cxx
src/HYDROGUI/HYDROGUI_Module.cxx

index 25371beb09d6e7032849828b0e4b79cfa5d1fd64..322d856e523dc247d833bfe7f8774d38c5466602 100644 (file)
@@ -89,7 +89,48 @@ void CurveCreator_Utils::ConvertPointToClick( const gp_Pnt& thePoint,
 //=======================================================================
 gp_Pnt CurveCreator_Utils::ConvertClickToPoint( int x, int y, Handle(V3d_View) aView )
 {
-  return GEOMUtils::ConvertClickToPoint( x, y, aView );
+  // the 3D point, that is a projection of the pixels to the XYZ view plane
+  //return GEOMUtils::ConvertClickToPoint( x, y, aView );
+
+  // we need the projection to the XOY plane
+  // 1. find a point in the plane of the eye and the normal to the plane
+  Standard_Real X, Y, Z;
+  Quantity_Parameter Vx, Vy, Vz;
+  aView->ConvertWithProj( x, y, X, Y, Z, Vx, Vy, Vz );
+
+  // 2. build a ray from the point by the normal to the XOY plane and intersect it
+  // The ray equation is the following : p(x,y,z) = p0(x,y,z) + t*V(x,y,z)
+  // X,Y,Z - defines p0(x,y,z), Vx,Vy,Vz - defines V(x,y,z)
+  // p(x,y,z) - is a searched point, t - should to be calculated by the condition of XOY plane
+  // The system of equations is the following:
+  // p(x) = p0(x)+t*V(x)
+  // p(y) = p0(y)+t*V(y)
+  // p(z) = p0(z)+t*V(z)
+  // p(z) = 0
+
+  Standard_Real aXp, aYp, aZp;
+  //It is not possible to use Precision::Confusion(), because it is e-0.8, but V is sometimes e-6
+  Standard_Real aPrec = LOCAL_SELECTION_TOLERANCE;
+  if ( fabs( Vz ) > aPrec ) {
+    Standard_Real 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;
+  }
+  /*std::cout << "ConvertClickToPoint: " << std::endl
+            << "XYZ1 = (" << X << ", " << Y << ", " << Z << "); " << std::endl
+            << "Vxyz = (" << Vx << ", " << Vy << ", " << Vz << "); " << std::endl
+            << "Resp = (" << aXp << ", " << aYp << ", " << aZp << "); " << std::endl;*/
+
+  gp_Pnt ResultPoint( aXp, aYp, aZp );
+  return ResultPoint;
 }
 
 void CurveCreator_Utils::constructShape( const CurveCreator_ICurve* theCurve,
index 3b007d9ce5c25cf631284b3efc93c7433e2e2da6..1d24042baf71cdccd3ae5103484cd06cb2b0a4a9 100644 (file)
@@ -49,6 +49,8 @@
 
 #include <HYDROData_OperationsFactory.h>
 
+#include <CurveCreator_Utils.h>
+
 #include <GraphicsView_ViewFrame.h>
 #include <GraphicsView_ViewManager.h>
 #include <GraphicsView_ViewPort.h>
@@ -1410,9 +1412,8 @@ void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent*
     return;
   }
 
-  gp_Pnt aPnt = GEOMUtils::ConvertClickToPoint( theEvent->x(), theEvent->y(), 
-                                                aViewPort->getView() );
-
+  gp_Pnt 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() ) {