]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
0022181: EDF GEOM: Issue with MakeRotation. Fix a regression.
authorjfa <jfa@opencascade.com>
Fri, 29 Mar 2013 09:02:17 +0000 (09:02 +0000)
committerjfa <jfa@opencascade.com>
Fri, 29 Mar 2013 09:02:17 +0000 (09:02 +0000)
src/GEOMImpl/GEOMImpl_CircleDriver.cxx
src/GEOMImpl/GEOMImpl_RotateDriver.cxx
src/GEOMImpl/GEOMImpl_SplineDriver.cxx
src/GEOMUtils/GEOMUtils.cxx
src/GEOMUtils/GEOMUtils.hxx

index d6130be428524ed8d07e7041b5cbb01c60a66d02..0cf7a12c365de51982a3bbdecd9504b878d71a4d 100644 (file)
@@ -98,7 +98,8 @@ Standard_Integer GEOMImpl_CircleDriver::Execute(TFunction_Logbook& log) const
     Handle(GEOM_Function) aRefVector = aCI.GetVector();
     if (!aRefVector.IsNull()) {
       TopoDS_Shape aShapeVec = aRefVector->GetValue();
-      aV = GEOMUtils::GetVector(aShapeVec);
+      // take orientation of edge into account to avoid regressions, as it was implemented so
+      aV = GEOMUtils::GetVector(aShapeVec, Standard_True);
     }
     // Axes
     gp_Ax2 anAxes (aP, aV);
index ac656ca556b0d4e2a5467aa0334cec326b3f6180..fc6c7ebdaa5686ec68c61cd7391c45c0e891f910 100644 (file)
@@ -99,7 +99,8 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
     Handle(GEOM_Function) anAxis = RI.GetAxis();
     if (anAxis.IsNull()) return 0;
     TopoDS_Shape A = anAxis->GetValue();
-    gp_Vec aV = GEOMUtils::GetVector(A);
+    // do not take into account edge orientation (it is correct)
+    gp_Vec aV = GEOMUtils::GetVector(A, Standard_False);
     TopoDS_Edge anEdge = TopoDS::Edge(A);
     gp_Pnt aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
     gp_Dir aDir (aV);
@@ -161,7 +162,8 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
     Handle(GEOM_Function) anAxis = RI.GetAxis();
     if (!anAxis.IsNull()) {
       TopoDS_Shape A = anAxis->GetValue();
-      gp_Vec aV = GEOMUtils::GetVector(A);
+      // do not take into account edge orientation (it is correct)
+      gp_Vec aV = GEOMUtils::GetVector(A, Standard_False);
       TopoDS_Edge anEdge = TopoDS::Edge(A);
       aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
       D = gp_Dir(aV);
@@ -207,7 +209,8 @@ Standard_Integer GEOMImpl_RotateDriver::Execute(TFunction_Logbook& log) const
     Handle(GEOM_Function) anAxis = RI.GetAxis();
     if (!anAxis.IsNull()) {
       TopoDS_Shape A = anAxis->GetValue();
-      gp_Vec aV = GEOMUtils::GetVector(A);
+      // do not take into account edge orientation (it is correct)
+      gp_Vec aV = GEOMUtils::GetVector(A, Standard_False);
       TopoDS_Edge anEdge = TopoDS::Edge(A);
       aP1 = BRep_Tool::Pnt(TopExp::FirstVertex(anEdge));
       D = gp_Dir(aV);
index f54cc4988da361bcc00c3ddbd595c10bf98db201..af164fe7f473b6f24979f0fe35cc06677ede0cb7 100644 (file)
@@ -242,8 +242,9 @@ Standard_Integer GEOMImpl_SplineDriver::Execute(TFunction_Logbook& log) const
         TopoDS_Shape aVec1Sh = aVec1Ref->GetValue();
         TopoDS_Shape aVec2Sh = aVec2Ref->GetValue();
 
-        gp_Vec aV1 = GEOMUtils::GetVector(aVec1Sh);
-        gp_Vec aV2 = GEOMUtils::GetVector(aVec2Sh);
+        // take orientation of edge into account to avoid regressions, as it was implemented so
+        gp_Vec aV1 = GEOMUtils::GetVector(aVec1Sh, Standard_True);
+        gp_Vec aV2 = GEOMUtils::GetVector(aVec2Sh, Standard_True);
 
         GBC.Load(aV1, aV2, /*Scale*/Standard_True);
       }
index d7e2de14198be8ec6148e70e3229d34e0129ddb7..f2c53523f3839601a246df1bd7e6e8cc04d13a23 100644 (file)
@@ -144,7 +144,8 @@ gp_Ax3 GEOMUtils::GetPosition (const TopoDS_Shape& theShape)
 //function : GetVector
 //purpose  :
 //=======================================================================
-gp_Vec GEOMUtils::GetVector (const TopoDS_Shape& theShape)
+gp_Vec GEOMUtils::GetVector (const TopoDS_Shape& theShape,
+                             Standard_Boolean doConsiderOrientation)
 {
   if (theShape.IsNull())
     Standard_NullObject::Raise("Null shape is given for a vector");
@@ -155,7 +156,7 @@ gp_Vec GEOMUtils::GetVector (const TopoDS_Shape& theShape)
   TopoDS_Edge anE = TopoDS::Edge(theShape);
 
   TopoDS_Vertex V1, V2;
-  TopExp::Vertices(anE, V1, V2, Standard_True);
+  TopExp::Vertices(anE, V1, V2, doConsiderOrientation);
 
   if (V1.IsNull() || V2.IsNull())
     Standard_NullObject::Raise("Invalid edge is given, it must have two points");
index 7e888a71b0904695799d8da7f889b893f8c71c02..64c34bd857040dc3b7b1a0bc9feb3d513e1dc4c7 100644 (file)
@@ -56,8 +56,14 @@ class GEOMUtils {
 
   /*!
    * \brief Get vector, defined by the given edge.
+   * \param theShape The edge.
+   * \param doConsiderOrientation If True, take into account the edge orientation.
+   * \note It is recommended to use doConsiderOrientation=Standard_False, because
+   *       the same edge can have different orientation depending on the way it was
+   *       extracted from a shape.
    */
-  Standard_EXPORT static gp_Vec GetVector (const TopoDS_Shape& theShape);
+  Standard_EXPORT static gp_Vec GetVector (const TopoDS_Shape& theShape,
+                                           Standard_Boolean doConsiderOrientation);
 
   /*!
    * \brief Sort shapes in the list by their coordinates.