Salome HOME
Enable multithread in boolean operations and partition
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_Translation.cpp
index c9bfeacf9b6b3151d500572a168cf9c73befd1a0..b73713a8b52c6b1bf70f4edc435b6238a33ef7a5 100644 (file)
@@ -1,10 +1,21 @@
-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File:        GeomAlgoAPI_Translation.cpp
-// Created:     8 June 2015
-// Author:      Dmitry Bobylev
+// Copyright (C) 2014-2019  CEA/DEN, EDF R&D
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
-// Modified by Clarisse Genrault (CEA) : 17 Nov 2016
 
 #include "GeomAlgoAPI_Translation.h"
 
@@ -36,33 +47,56 @@ GeomAlgoAPI_Translation::GeomAlgoAPI_Translation(std::shared_ptr<GeomAPI_Shape>
   myDz = theDz;
 }
 
+//=================================================================================================
+GeomAlgoAPI_Translation::GeomAlgoAPI_Translation(std::shared_ptr<GeomAPI_Shape> theSourceShape,
+                                                 std::shared_ptr<GeomAPI_Pnt>   theStartPoint,
+                                                 std::shared_ptr<GeomAPI_Pnt>   theEndPoint)
+{
+  myMethodType = BY_POINTS;
+  mySourceShape = theSourceShape;
+  myStartPoint = theStartPoint;
+  myEndPoint = theEndPoint;
+}
+
 //=================================================================================================
 bool GeomAlgoAPI_Translation::check()
 {
   switch (myMethodType) {
     case BY_DISTANCE: {
       if (!myAxis) {
-        myError = "Translation builder :: axis is invalid.";
+        myError = "Translation builder :: axis is not valid.";
         return false;
       }
-      // TODO : verification de la distance
       if (!mySourceShape) {
-        myError = "Translation builder :: source shape is invalid.";
+        myError = "Translation builder :: source shape is not valid.";
         return false;
       }
       return true;
     }
     case BY_DIM: {
-      if ((fabs(myDx) < Precision::Confusion()) && 
-          (fabs(myDy) < Precision::Confusion()) && 
-          (fabs(myDz) < Precision::Confusion())) {
-        myError = "Translation builder :: Dx, Dy and Dz are null.";
+      if (!mySourceShape) {
+        myError = "Translation builder :: source shape is not valid.";
+        return false;
+      }
+      return true;
+    }
+    case BY_POINTS: {
+      if (!myStartPoint) {
+        myError = "Translation builder :: start point is not valid.";
+        return false;
+      }
+      if (!myEndPoint) {
+        myError = "Translation builder :: end point is not valid.";
         return false;
       }
       if (!mySourceShape) {
         myError = "Translation builder :: source shape is invalid.";
         return false;
       }
+      if(myStartPoint->distance(myEndPoint) < Precision::Confusion()) {
+        myError = "Translation builder :: start point and end point coincide.";
+        return false;
+      }
       return true;
     }
     default: {
@@ -76,7 +110,7 @@ bool GeomAlgoAPI_Translation::check()
 void GeomAlgoAPI_Translation::build()
 {
   gp_Trsf* aTrsf = new gp_Trsf();
-  
+
   switch (myMethodType) {
     case BY_DISTANCE: {
       const gp_Ax1& anAxis = myAxis->impl<gp_Ax1>();
@@ -87,6 +121,12 @@ void GeomAlgoAPI_Translation::build()
       aTrsf->SetTranslation(gp_Vec(myDx, myDy, myDz));
       break;
     }
+    case BY_POINTS: {
+      const gp_Pnt& aStartPoint = myStartPoint->impl<gp_Pnt>();
+      const gp_Pnt& aEndPoint = myEndPoint->impl<gp_Pnt>();
+      aTrsf->SetTranslation(aStartPoint, aEndPoint);
+      break;
+    }
     default: {
       myError = "Translation builder :: method not supported";
       return;
@@ -99,11 +139,11 @@ void GeomAlgoAPI_Translation::build()
     myError = "Translation builder :: source shape does not contain any actual shape.";
     return;
   }
-  
+
   // Transform the shape while copying it.
   BRepBuilderAPI_Transform* aBuilder = new BRepBuilderAPI_Transform(aSourceShape, *aTrsf, true);
   if(!aBuilder) {
-    myError = "Translation builder :: source shape does not contain any actual shape.";
+    myError = "Translation builder :: transform initialization failed.";
     return;
   }
 
@@ -111,7 +151,7 @@ void GeomAlgoAPI_Translation::build()
   setBuilderType(OCCT_BRepBuilderAPI_MakeShape);
 
   if(!aBuilder->IsDone()) {
-    myError = "Translation builder :: source shape does not contain any actual shape.";
+    myError = "Translation builder :: algorithm failed.";
     return;
   }
 
@@ -121,4 +161,4 @@ void GeomAlgoAPI_Translation::build()
   aShape->setImpl(new TopoDS_Shape(aResult));
   setShape(aShape);
   setDone(true);
-}
\ No newline at end of file
+}