]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
refs #30 - Sketch base GUI: create, draw lines
authornds <natalia.donis@opencascade.com>
Tue, 13 May 2014 08:38:14 +0000 (12:38 +0400)
committernds <natalia.donis@opencascade.com>
Tue, 13 May 2014 08:38:14 +0000 (12:38 +0400)
In case when the first line point is on the line, using the projection of the second point to this line to approximate it to the line.

src/PartSet/PartSet_OperationSketchLine.cpp
src/PartSet/PartSet_Tools.cpp
src/PartSet/PartSet_Tools.h

index 1b36cb183befb4f0bf06ac4dccdfeaca8742b94b..03912db526aef928e604e76ae73206545d818dee 100644 (file)
@@ -90,7 +90,7 @@ void PartSet_OperationSketchLine::mouseReleased(QMouseEvent* theEvent, Handle(V3
           PartSet_Tools::ConvertTo2D(aPoint, mySketch, theView, X1, Y1);
 
           double aX, anY;
-          PartSet_Tools::IntersectLines(X0, X1, X2, X3, Y0, Y1, Y2, Y3, aX, anY);
+          PartSet_Tools::IntersectLines(X0, Y0, X1, Y1, X2, Y2, X3, Y3, aX, anY);
 
           setLinePoint(aX, anY, LINE_ATTR_END);
           commit();
index 5d97e7002a1cb723f98ec070ee9e90d9d49cb590..3caf619cac56abe93aec6f184246c39c315b0f8b 100644 (file)
@@ -4,19 +4,24 @@
 
 #include <PartSet_Tools.h>
 
-#include <V3d_View.hxx>
-#include <gp_Pln.hxx>
-#include <ProjLib.hxx>
-#include <ElSLib.hxx>
-
 #include <ModelAPI_Data.h>
 #include <ModelAPI_AttributeDouble.h>
+
 #include <GeomDataAPI_Point.h>
 #include <GeomDataAPI_Dir.h>
+
 #include <GeomAPI_Dir.h>
 #include <GeomAPI_XYZ.h>
+
 #include <SketchPlugin_Sketch.h>
 
+#include <V3d_View.hxx>
+#include <gp_Pln.hxx>
+#include <ProjLib.hxx>
+#include <ElSLib.hxx>
+#include <Geom_Line.hxx>
+#include <GeomAPI_ProjectPointOnCurve.hxx>
+
 #ifdef _DEBUG
 #include <QDebug>
 #endif
@@ -94,8 +99,8 @@ void PartSet_Tools::ConvertTo2D(const gp_Pnt& thePoint, boost::shared_ptr<ModelA
   theY = aVec.X() * anY->x() + aVec.Y() * anY->y() + aVec.Z() * anY->z();
 }
 
-void PartSet_Tools::IntersectLines(double theX0, double theX1, double theX2, double theX3,
-                                   double theY0, double theY1, double theY2, double theY3,
+void PartSet_Tools::IntersectLines(double theX0, double theY0, double theX1, double theY1,
+                                   double theX2, double theY2, double theX3, double theY3,
                                    double& theX, double& theY)
 {
   double aV1 = theX1 - theX0, aV2 = theY1 - theY0;
@@ -114,28 +119,23 @@ void PartSet_Tools::IntersectLines(double theX0, double theX1, double theX2, dou
   //It is not possible to use Precision::Confusion(), because it is e-0.8, but V is sometimes e-6
   Standard_Real aPrec = PRECISION_TOLERANCE;
   if (fabs(theX - theX0) < aPrec && fabs(theY - theY0) < aPrec) {
-    ProjectPointOnLine(theX2, theX3, theY2, theY3, theX1, theY1, theX, theY);    
+    ProjectPointOnLine(theX2, theY2, theX3, theY3, theX1, theY1, theX, theY);    
   }
 }
 
-void PartSet_Tools::ProjectPointOnLine(double theX1, double theX2, double theY1, double theY2,
+void PartSet_Tools::ProjectPointOnLine(double theX1, double theY1, double theX2, double theY2,
                                        double thePointX, double thePointY, double& theX, double& theY)
 {
-  //GEOM_Line aLine(gp_Pnt(theX1, theY1), gp_Dir(gp_Vec(gp_Pnt(theX1, theY1), gp_Pnt(theX2, theY2))));
-  //GeomAPI_ProjectPointOnCurve aProj(gp_Pnt(thePointX, thePointY));
-  /*  
-  Standard_Integer aNbPoint = aProj.NbPoints();
-  if (aNbPoint > 0) {
-    for (Standard_Integer j = 1; j <= aNbPoint && !isFound; j++) {
-      gp_Pnt aNewPoint = aProj.Point( j );
-      theParameter = aProj.Parameter( j );
+  theX = theY = 0;
 
-      int aX, anY;
-      CurveCreator_Utils::ConvertPointToClick( aNewPoint, theView, aX, anY );
+  Handle(Geom_Line) aLine = new Geom_Line(gp_Pnt(theX1, theY1, 0),
+                                     gp_Dir(gp_Vec(gp_Pnt(theX1, theY1, 0), gp_Pnt(theX2, theY2, 0))));
+  GeomAPI_ProjectPointOnCurve aProj(gp_Pnt(thePointX, thePointY, 0), aLine);
 
-      isFound = isEqualPixels( aX, anY, theX, theY, SCENE_PIXEL_PROJECTION_TOLERANCE, theDelta );
-    }
+  Standard_Integer aNbPoint = aProj.NbPoints();
+  if (aNbPoint > 0) {
+    gp_Pnt aPoint = aProj.Point(1);
+    theX = aPoint.X();
+    theY = aPoint.Y();
   }
-  return isFound;
-  */
-}
\ No newline at end of file
+}
index 419ef45500ff7acd4ad3edbfe4bee2fbac025135..ecb28b7444f022ad8b7ed99404832f981295e9e4 100644 (file)
@@ -39,27 +39,27 @@ public:
   /// Returns the point of intersection of the two lines, the first is (v0, v1), the second is (v2, v3),
   /// where vi - {xi,yi}. If the v0 is on the second line, the result is a projection of the v1 to this line
   /// \param theX0 the horizontal coordinate of 0 point
-  /// \param theX1 the horizontal coordinate of 1 point
-  /// \param theX2 the horizontal coordinate of 2 point
-  /// \param theX3 the horizontal coordinate of 3 point
   /// \param theY0 the vertical coordinate of 0 point
+  /// \param theX1 the horizontal coordinate of 1 point
   /// \param theY1 the vertical coordinate of 1 point
+  /// \param theX2 the horizontal coordinate of 2 point
   /// \param theY2 the vertical coordinate of 2 point
+  /// \param theX3 the horizontal coordinate of 3 point
   /// \param theY3 the vertical coordinate of 3 point
   /// \param theX the output horizontal coordinate of the intersection point
   /// \param theY the outpup vertical coordinate of the intersection point
-  static void IntersectLines(double theX0, double theX1, double theX2, double theX3,
-                             double theY0, double theY1, double theY2, double theY3,
+  static void IntersectLines(double theX0, double theY0, double theX1, double theY1,
+                             double theX2, double theY2, double theX3, double theY3,
                              double& theX, double& theY);
 
   /// Returns the coordinates of projection of the point to the line
   /// \param thePointX the projected point horizontal coordinate
   /// \param thePointY the projected point vertictal coordinate
   /// \param theX1 the horizontal coordinate of the first line point
-  /// \param theX2 the horizontal coordinate of the second line point
   /// \param theY1 the vertical coordinate of the first line point
+  /// \param theX2 the horizontal coordinate of the second line point
   /// \param theY2 the vertical coordinate of the second line point
-  static void ProjectPointOnLine(double theX1, double theX2, double theY1, double theY2,
+  static void ProjectPointOnLine(double theX1, double theY1, double theX2, double theY2,
                                  double thePointX, double thePointY, double& theX, double& theY);
 };