]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Refactor the transformation algorithms
authorazv <azv@opencascade.com>
Fri, 14 Feb 2020 08:30:27 +0000 (11:30 +0300)
committerazv <azv@opencascade.com>
Fri, 14 Feb 2020 08:30:27 +0000 (11:30 +0300)
19 files changed:
src/ConstructionPlugin/ConstructionPlugin_Plane.cpp
src/FeaturesPlugin/FeaturesPlugin_MultiRotation.cpp
src/FeaturesPlugin/FeaturesPlugin_MultiTranslation.cpp
src/FeaturesPlugin/FeaturesPlugin_Rotation.cpp
src/FeaturesPlugin/FeaturesPlugin_Scale.cpp
src/FeaturesPlugin/FeaturesPlugin_Symmetry.cpp
src/FeaturesPlugin/FeaturesPlugin_Translation.cpp
src/GeomAPI/GeomAPI_Trsf.cpp
src/GeomAPI/GeomAPI_Trsf.h
src/GeomAlgoAPI/GeomAlgoAPI_Rotation.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Rotation.h
src/GeomAlgoAPI/GeomAlgoAPI_Scale.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Scale.h
src/GeomAlgoAPI/GeomAlgoAPI_Symmetry.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Symmetry.h
src/GeomAlgoAPI/GeomAlgoAPI_Transform.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Transform.h
src/GeomAlgoAPI/GeomAlgoAPI_Translation.cpp
src/GeomAlgoAPI/GeomAlgoAPI_Translation.h

index 5b4338a983bf1eef77a9a72d69247038d2bad767..d1dbb1924b9f6b4a804728c2d8ccc692e13fb805 100644 (file)
@@ -24,6 +24,7 @@
 #include <GeomAlgoAPI_FaceBuilder.h>
 #include <GeomAlgoAPI_Rotation.h>
 #include <GeomAlgoAPI_ShapeTools.h>
+#include <GeomAlgoAPI_Tools.h>
 
 #include <GeomAPI_Ax1.h>
 #include <GeomAPI_Edge.h>
@@ -399,18 +400,16 @@ std::shared_ptr<GeomAPI_Shape> ConstructionPlugin_Plane::createByRotation()
   // Getting angle.
   double anAngle = real(ANGLE())->value();
 
-  GeomAlgoAPI_Rotation aRotationAlgo(aFace, anAxis, anAngle);
-  if (!aRotationAlgo.check()) {
-    setError(aRotationAlgo.getError());
-    return GeomShapePtr();
-  }
-  aRotationAlgo.build();
-  if (!aRotationAlgo.isDone()) {
+  std::shared_ptr<GeomAlgoAPI_Rotation> aRotationAlgo(
+      new GeomAlgoAPI_Rotation(aFace, anAxis, anAngle));
+  // Checking that the algorithm worked properly.
+  std::string anError;
+  if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aRotationAlgo, getKind(), anError)) {
     setError("Error: Failed to rotate plane");
     return GeomShapePtr();
   }
 
-  std::shared_ptr<GeomAPI_Face> aRes(new GeomAPI_Face(aRotationAlgo.shape()));
+  std::shared_ptr<GeomAPI_Face> aRes(new GeomAPI_Face(aRotationAlgo->shape()));
   return aRes;
 }
 
index a11fc4af13b7a7265c2f9e195948c93c0eca4f6e..68151d9c6af07e6328f6e6a75b1b9b9cfa1d7763 100644 (file)
@@ -202,13 +202,6 @@ void FeaturesPlugin_MultiRotation::performRotation1D()
         std::shared_ptr<GeomAlgoAPI_Rotation> aRotationnAlgo(
           new GeomAlgoAPI_Rotation(aBaseShape, anAxis, i*anAngle));
 
-        if (!aRotationnAlgo->check()) {
-          setError(aRotationnAlgo->getError());
-          break;
-        }
-
-        aRotationnAlgo->build();
-
         // Checking that the algorithm worked properly.
         if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aRotationnAlgo, getKind(), anError)) {
           setError(anError);
index 9f311df137ea6909fa03c345b30f955ab1617064..51e96cd4a5aea9b1150d85ef45ca806d01719ba2 100644 (file)
@@ -179,13 +179,6 @@ void FeaturesPlugin_MultiTranslation::performOneDirection()
         std::shared_ptr<GeomAlgoAPI_Translation> aTranslationAlgo(
           new GeomAlgoAPI_Translation(aBaseShape, anAxis, i*aStep));
 
-        if (!aTranslationAlgo->check()) {
-          setError(aTranslationAlgo->getError());
-          break;
-        }
-
-        aTranslationAlgo->build();
-
         // Checking that the algorithm worked properly.
         if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(
             aTranslationAlgo, getKind(), anError)) {
@@ -379,13 +372,6 @@ void FeaturesPlugin_MultiTranslation::performTwoDirection()
           std::shared_ptr<GeomAlgoAPI_Translation> aTranslationAlgo(
             new GeomAlgoAPI_Translation(aBaseShape, dx, dy, dz));
 
-          if (!aTranslationAlgo->check()) {
-            setError(aTranslationAlgo->getError());
-            break;
-          }
-
-          aTranslationAlgo->build();
-
           // Checking that the algorithm worked properly.
           if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(
               aTranslationAlgo, getKind(), anError)) {
index 7ef1d86b8827fb58468b62ca83b4628ffa0e2124..eee97cad3282e1064139ba09324f28babdba8012 100644 (file)
@@ -28,6 +28,7 @@
 #include <GeomAlgoAPI_PointBuilder.h>
 #include <GeomAlgoAPI_Tools.h>
 
+#include <GeomAPI_Ax1.h>
 #include <GeomAPI_Edge.h>
 #include <GeomAPI_Lin.h>
 #include <GeomAPI_ShapeIterator.h>
@@ -157,14 +158,6 @@ void FeaturesPlugin_Rotation::performTranslationByAxisAndAngle()
       std::shared_ptr<GeomAlgoAPI_Rotation> aRotationAlgo(new GeomAlgoAPI_Rotation(aBaseShape,
                                                                                    anAxis,
                                                                                    anAngle));
-
-      if (!aRotationAlgo->check()) {
-        setError(aRotationAlgo->getError());
-        return;
-      }
-
-      aRotationAlgo->build();
-
       // Checking that the algorithm worked properly.
       if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aRotationAlgo, getKind(), anError)) {
         setError(anError);
@@ -263,14 +256,6 @@ void FeaturesPlugin_Rotation::performTranslationByThreePoints()
                                                                                    aCenterPoint,
                                                                                    aStartPoint,
                                                                                    anEndPoint));
-
-      if (!aRotationAlgo->check()) {
-        setError(aRotationAlgo->getError());
-        return;
-      }
-
-      aRotationAlgo->build();
-
       // Checking that the algorithm worked properly.
       if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aRotationAlgo, getKind(), anError)) {
         setError(anError);
index bdb4cdd52fde517cc999053ac555b78368b7d3f9..cb7a856864270cc40f2b01bde52bb92afe360000 100644 (file)
@@ -123,13 +123,6 @@ void FeaturesPlugin_Scale::performScaleByFactor()
     std::shared_ptr<GeomAlgoAPI_Scale> aScaleAlgo(
       new GeomAlgoAPI_Scale(aBaseShape, aCenterPoint, aScaleFactor));
 
-    if (!aScaleAlgo->check()) {
-      setError(aScaleAlgo->getError());
-      return;
-    }
-
-    aScaleAlgo->build();
-
     // Checking that the algorithm worked properly.
     if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aScaleAlgo, getKind(), anError)) {
       setError(anError);
@@ -208,13 +201,6 @@ void FeaturesPlugin_Scale::performScaleByDimensions()
                                                                         aScaleFactorY,
                                                                         aScaleFactorZ));
 
-    if (!aScaleAlgo->check()) {
-      setError(aScaleAlgo->getError());
-      return;
-    }
-
-    aScaleAlgo->build();
-
     // Checking that the algorithm worked properly.
     if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aScaleAlgo, getKind(), anError)) {
       setError(anError);
index 38b50f39391e0d19cd01cf266d4ef525c52f57e2..74acd252a548ed7b39e4aad51f423dc99630dd00 100644 (file)
@@ -26,6 +26,8 @@
 #include <GeomAlgoAPI_MakeShapeList.h>
 #include <GeomAlgoAPI_Tools.h>
 
+#include <GeomAPI_Ax1.h>
+#include <GeomAPI_Ax2.h>
 #include <GeomAPI_Edge.h>
 #include <GeomAPI_Face.h>
 #include <GeomAPI_Lin.h>
@@ -153,13 +155,6 @@ void FeaturesPlugin_Symmetry::performSymmetryByPoint()
       std::shared_ptr<GeomAlgoAPI_Symmetry> aSymmetryAlgo(
         new GeomAlgoAPI_Symmetry(aBaseShape, aPoint));
 
-      if (!aSymmetryAlgo->check()) {
-        setError(aSymmetryAlgo->getError());
-        return;
-      }
-
-      aSymmetryAlgo->build();
-
       // Checking that the algorithm worked properly.
       if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aSymmetryAlgo, getKind(), anError)) {
         setError(anError);
@@ -239,13 +234,6 @@ void FeaturesPlugin_Symmetry::performSymmetryByAxis()
       std::shared_ptr<GeomAlgoAPI_Symmetry> aSymmetryAlgo(
         new GeomAlgoAPI_Symmetry(aBaseShape, anAxis));
 
-      if (!aSymmetryAlgo->check()) {
-        setError(aSymmetryAlgo->getError());
-        return;
-      }
-
-      aSymmetryAlgo->build();
-
       // Checking that the algorithm worked properly.
       if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aSymmetryAlgo, getKind(), anError)) {
         setError(anError);
@@ -324,13 +312,6 @@ void FeaturesPlugin_Symmetry::performSymmetryByPlane()
       std::shared_ptr<GeomAlgoAPI_Symmetry> aSymmetryAlgo(
         new GeomAlgoAPI_Symmetry(aBaseShape, aPlane));
 
-      if (!aSymmetryAlgo->check()) {
-        setError(aSymmetryAlgo->getError());
-        return;
-      }
-
-      aSymmetryAlgo->build();
-
       // Checking that the algorithm worked properly.
       if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aSymmetryAlgo, getKind(), anError)) {
         setError(anError);
index eff54dc689f759480f280cca2cc47ef3a11f5a39..9894901e45bbc0c556989579a722c7adcdb7db41 100644 (file)
@@ -27,6 +27,7 @@
 #include <ModelAPI_ResultPart.h>
 #include <ModelAPI_Session.h>
 
+#include <GeomAPI_Ax1.h>
 #include <GeomAPI_Edge.h>
 #include <GeomAPI_Lin.h>
 #include <GeomAPI_ShapeIterator.h>
@@ -169,14 +170,6 @@ void FeaturesPlugin_Translation::performTranslationByAxisAndDistance()
     } else {
       std::shared_ptr<GeomAlgoAPI_Translation> aTranslationAlgo(
         new GeomAlgoAPI_Translation(aBaseShape, anAxis, aDistance));
-
-      if (!aTranslationAlgo->check()) {
-        setError(aTranslationAlgo->getError());
-        return;
-      }
-
-      aTranslationAlgo->build();
-
       // Checking that the algorithm worked properly.
       if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aTranslationAlgo, getKind(), anError)) {
         setError(anError);
@@ -250,13 +243,6 @@ void FeaturesPlugin_Translation::performTranslationByDimensions()
       std::shared_ptr<GeomAlgoAPI_Translation> aTranslationAlgo(
         new GeomAlgoAPI_Translation(aBaseShape, aDX, aDY, aDZ));
 
-      if (!aTranslationAlgo->check()) {
-        setError(aTranslationAlgo->getError());
-        return;
-      }
-
-      aTranslationAlgo->build();
-
       // Checking that the algorithm worked properly.
       if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aTranslationAlgo, getKind(), anError)) {
         setError(anError);
@@ -343,13 +329,6 @@ void FeaturesPlugin_Translation::performTranslationByTwoPoints()
       std::shared_ptr<GeomAlgoAPI_Translation> aTranslationAlgo(
         new GeomAlgoAPI_Translation(aBaseShape, aFirstPoint, aSecondPoint));
 
-      if (!aTranslationAlgo->check()) {
-        setError(aTranslationAlgo->getError());
-        return;
-      }
-
-      aTranslationAlgo->build();
-
       // Checking that the algorithm worked properly.
       if (GeomAlgoAPI_Tools::AlgoError::isAlgorithmFailed(aTranslationAlgo, getKind(), anError)) {
         setError(anError);
index b2df2368d23654278ca988a470f47d7dec6286a7..2a9d8fdd94c60005b843fba5f7dc16a240c5a076 100644 (file)
@@ -106,3 +106,10 @@ void GeomAPI_Trsf::setSymmetry(const std::shared_ptr<GeomAPI_Ax2> thePlane)
 {
   MY_TRSF->SetMirror(thePlane->impl<gp_Ax2>());
 }
+
+//=================================================================================================
+void GeomAPI_Trsf::setScale(const std::shared_ptr<GeomAPI_Pnt>& theCenter,
+                            const double theScale)
+{
+  MY_TRSF->SetScale(theCenter->impl<gp_Pnt>(), theScale);
+}
index 84539eca682595d640b9a0f9f40370df5e3ac2bb..f00a09a80472eedf4363e7ebe31f7469d5f96829 100644 (file)
@@ -93,6 +93,13 @@ class GeomAPI_Trsf : public GeomAPI_Interface
    *  \param[in] thePlane symmetry plane.
    */
   GEOMAPI_EXPORT void setSymmetry(const std::shared_ptr<GeomAPI_Ax2> thePlane);
+
+  /** \brief Sets the scaling transformation.
+   *  \param[in] theCenter scaling origin.
+   *  \param[in] theScale  scaling factor.
+   */
+  GEOMAPI_EXPORT void setScale(const std::shared_ptr<GeomAPI_Pnt>& theCenter,
+                               const double theScale);
 };
 
 //! Pointer on the object
index cea4cc57ecd5426c34dbc3534f70c3d1da3f99ca..35411e405d9b54e6f9b77f5f44675637fa3a72f8 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
-#include "GeomAlgoAPI_Rotation.h"
+#include <GeomAlgoAPI_Rotation.h>
 
+#include <GeomAPI_Ax1.h>
+#include <GeomAPI_Pnt.h>
 #include <GeomAPI_XYZ.h>
 
-#include <BRepBuilderAPI_Transform.hxx>
-
-#include <gp_Ax1.hxx>
-#include <gp_Dir.hxx>
-#include <gp_Vec.hxx>
-
 #include <Precision.hxx>
 
+// Verify points are applicable to build the rotation transformation
+static bool checkPoints(GeomPointPtr theCenterPoint,
+                        GeomPointPtr theStartPoint,
+                        GeomPointPtr theEndPoint,
+                        std::string& theError);
+
 //=================================================================================================
 GeomAlgoAPI_Rotation::GeomAlgoAPI_Rotation(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                            std::shared_ptr<GeomAPI_Ax1>   theAxis,
                                            double                         theAngle)
 {
-  myMethodType = BY_ANGLE;
-  mySourceShape = theSourceShape;
-  myAxis = theAxis;
-  myAngle = theAngle;
+  if (!theAxis) {
+    myError = "Rotation builder :: axis is not valid.";
+    return;
+  }
+
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setRotation(theAxis, theAngle / 180.0 * M_PI);
+
+  build(theSourceShape, aTrsf);
 }
 
 
@@ -47,139 +54,58 @@ GeomAlgoAPI_Rotation::GeomAlgoAPI_Rotation(std::shared_ptr<GeomAPI_Shape> theSou
                                            std::shared_ptr<GeomAPI_Pnt>   theStartPoint,
                                            std::shared_ptr<GeomAPI_Pnt>   theEndPoint)
 {
-  myMethodType = BY_POINTS;
-  mySourceShape = theSourceShape;
-  myCenterPoint = theCenterPoint;
-  myStartPoint = theStartPoint;
-  myEndPoint = theEndPoint;
-}
+  if (!checkPoints(theCenterPoint, theStartPoint, theEndPoint, myError))
+    return;
 
-//=================================================================================================
-bool GeomAlgoAPI_Rotation::check()
-{
-  switch (myMethodType) {
-    case BY_ANGLE: {
-      if (!myAxis) {
-        myError = "Rotation builder :: axis is not valid.";
-        return false;
-      }
-      if (!mySourceShape) {
-        myError = "Rotation builder :: source shape is not valid.";
-        return false;
-      }
-      return true;
-    }
-    case BY_POINTS: {
-      if (!myCenterPoint) {
-        myError = "Rotation builder :: center point is not valid.";
-        return false;
-      }
-      if (!myStartPoint) {
-        myError = "Rotation builder :: start point is not valid.";
-        return false;
-      }
-      if (!myEndPoint) {
-        myError = "Rotation builder :: end point is not valid.";
-        return false;
-      }
-      if (!mySourceShape) {
-        myError = "Rotation builder :: source shape is not valid.";
-        return false;
-      }
-      if(myCenterPoint->distance(myStartPoint) < Precision::Confusion()) {
-        myError = "Rotation builder :: center point and start point coincide.";
-        return false;
-      }
-      if(myCenterPoint->distance(myEndPoint) < Precision::Confusion()) {
-        myError = "Rotation builder :: center point and end point coincide.";
-        return false;
-      }
-      if(myStartPoint->distance(myEndPoint) < Precision::Confusion()) {
-        myError = "Rotation builder :: start point and end point coincide.";
-        return false;
-      }
-      std::shared_ptr<GeomAPI_XYZ> aCenterPointXYZ = myCenterPoint->xyz();
-      std::shared_ptr<GeomAPI_XYZ> aStartPointXYZ = myStartPoint->xyz();
-      std::shared_ptr<GeomAPI_XYZ> aEndPointXYZ = myEndPoint->xyz();
-      std::shared_ptr<GeomAPI_XYZ> vectCenterPointStartPoint =
-        aStartPointXYZ->decreased(aCenterPointXYZ);
-      std::shared_ptr<GeomAPI_XYZ> vectCenterPointEndPoint =
-        aEndPointXYZ->decreased(aCenterPointXYZ);
-      std::shared_ptr<GeomAPI_XYZ> crossProduct =
-        vectCenterPointStartPoint->cross(vectCenterPointEndPoint);
-      std::shared_ptr<GeomAPI_Pnt> aOriginPnt =
-        std::shared_ptr<GeomAPI_Pnt>(new GeomAPI_Pnt(0.,0.,0.));
-      std::shared_ptr<GeomAPI_XYZ> aOriginXYZ = aOriginPnt->xyz();
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setRotation(theCenterPoint, theStartPoint, theEndPoint);
 
-      if (crossProduct->distance(aOriginXYZ) < Precision::Confusion()) {
-        myError = "Rotation builder :: center point, start point and end point are on a line.";
-        return false;
-      }
-      return true;
-    }
-    default: {
-      myError = "Rotation builder :: method not implemented.";
-      return false;
-    }
-  }
+  build(theSourceShape, aTrsf);
 }
 
 //=================================================================================================
-void GeomAlgoAPI_Rotation::build()
+bool checkPoints(GeomPointPtr theCenterPoint,
+                 GeomPointPtr theStartPoint,
+                 GeomPointPtr theEndPoint,
+                 std::string& theError)
 {
-  gp_Trsf* aTrsf = new gp_Trsf();
-
-  switch (myMethodType) {
-    case BY_ANGLE: {
-      const gp_Ax1& anAxis = myAxis->impl<gp_Ax1>();
-      aTrsf->SetRotation(anAxis, myAngle/180.0*M_PI);
-      break;
-    }
-    case BY_POINTS: {
-      const gp_Pnt& aCenterPoint = myCenterPoint->impl<gp_Pnt>();
-      const gp_Pnt& aStartPoint = myStartPoint->impl<gp_Pnt>();
-      const gp_Pnt& aEndPoint = myEndPoint->impl<gp_Pnt>();
-      gp_Vec aVec1(aCenterPoint, aStartPoint);
-      gp_Vec aVec2(aCenterPoint, aEndPoint);
-      gp_Dir aDir(aVec1^aVec2);
-      gp_Ax1 anAxis(aCenterPoint, aDir);
-      double anAngle = aVec1.Angle(aVec2);
-      if (fabs(anAngle) < Precision::Angular()) anAngle += 2.*M_PI;
-      aTrsf->SetRotation(anAxis, anAngle);
-      break;
-    }
-    default: {
-      myError = "Rotation builder :: method not supported";
-      return;
-    }
+  if (!theCenterPoint) {
+    theError = "Rotation builder :: center point is not valid.";
+    return false;
   }
-
-  const TopoDS_Shape& aSourceShape = mySourceShape->impl<TopoDS_Shape>();
-
-  if(aSourceShape.IsNull()) {
-    myError = "Rotation builder :: source shape does not contain any actual shape.";
-    return;
+  if (!theStartPoint) {
+    theError = "Rotation builder :: start point is not valid.";
+    return false;
   }
-
-  // Transform the shape while copying it.
-  BRepBuilderAPI_Transform* aBuilder = new BRepBuilderAPI_Transform(aSourceShape, *aTrsf, true);
-  if(!aBuilder) {
-    myError = "Rotation builder :: transform initialization failed.";
-    return;
+  if (!theEndPoint) {
+    theError = "Rotation builder :: end point is not valid.";
+    return false;
   }
-
-  setImpl(aBuilder);
-  setBuilderType(OCCT_BRepBuilderAPI_MakeShape);
-
-  if(!aBuilder->IsDone()) {
-    myError = "Rotation builder :: algorithm failed.";
-    return;
+  if (theCenterPoint->distance(theStartPoint) < Precision::Confusion()) {
+    theError = "Rotation builder :: center point and start point coincide.";
+    return false;
   }
-
-  TopoDS_Shape aResult = aBuilder->Shape();
-
-  std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
-  aShape->setImpl(new TopoDS_Shape(aResult));
-  setShape(aShape);
-  setDone(true);
+  if (theCenterPoint->distance(theEndPoint) < Precision::Confusion()) {
+    theError = "Rotation builder :: center point and end point coincide.";
+    return false;
+  }
+  if (theStartPoint->distance(theEndPoint) < Precision::Confusion()) {
+    theError = "Rotation builder :: start point and end point coincide.";
+    return false;
+  }
+  std::shared_ptr<GeomAPI_XYZ> aCenterPointXYZ = theCenterPoint->xyz();
+  std::shared_ptr<GeomAPI_XYZ> aStartPointXYZ = theStartPoint->xyz();
+  std::shared_ptr<GeomAPI_XYZ> aEndPointXYZ = theEndPoint->xyz();
+  std::shared_ptr<GeomAPI_XYZ> vectCenterPointStartPoint =
+      aStartPointXYZ->decreased(aCenterPointXYZ);
+  std::shared_ptr<GeomAPI_XYZ> vectCenterPointEndPoint =
+      aEndPointXYZ->decreased(aCenterPointXYZ);
+  std::shared_ptr<GeomAPI_XYZ> crossProduct =
+      vectCenterPointStartPoint->cross(vectCenterPointEndPoint);
+
+  if (crossProduct->squareModulus() < Precision::SquareConfusion()) {
+    theError = "Rotation builder :: center point, start point and end point are on a line.";
+    return false;
+  }
+  return true;
 }
index 4a884451d0f73aa3591b08605d6f11ed7c489bb4..cc18518aa9aa5d8a2e4c28a2ed5d8c59f02b71be 100644 (file)
 #define GeomAlgoAPI_Rotation_H_
 
 #include <GeomAlgoAPI.h>
-#include <GeomAlgoAPI_MakeShape.h>
+#include <GeomAlgoAPI_Transform.h>
 
-#include <GeomAPI_Ax1.h>
-#include <GeomAPI_Shape.h>
+class GeomAPI_Ax1;
+class GeomAPI_Pnt;
 
 /// \class GeomAlgoAPI_Rotation
 /// \ingroup DataAlgo
 /// \brief Creates a copy of the object by rotating it around the axis.
-class GeomAlgoAPI_Rotation : public GeomAlgoAPI_MakeShape
+class GeomAlgoAPI_Rotation : public GeomAlgoAPI_Transform
 {
 public:
-  /// Type of rotation operation
-  enum MethodType {
-    BY_ANGLE, ///< Rotation by axis and an angle
-    BY_POINTS ///< Rotation by a center and two points
-  };
-
   /// \brief Creates an object which is obtained from current object by rotating it around the axis
   ///        with the angle.
   /// \param[in] theSourceShape  a shape to be rotated.
@@ -57,21 +51,6 @@ public:
                                           std::shared_ptr<GeomAPI_Pnt>   theCenterPoint,
                                           std::shared_ptr<GeomAPI_Pnt>   theStartPoint,
                                           std::shared_ptr<GeomAPI_Pnt>   theEndPoint);
-
-  /// Checks if data for the translation execution is OK.
-  GEOMALGOAPI_EXPORT bool check();
-
-  /// Execute the translation.
-  GEOMALGOAPI_EXPORT void build();
-
-private:
-  MethodType myMethodType; /// Type of method used.
-  std::shared_ptr<GeomAPI_Shape> mySourceShape; /// Shape to be rotated.
-  std::shared_ptr<GeomAPI_Ax1> myAxis; /// Rotation axis.
-  double myAngle; /// Rotation angle.
-  std::shared_ptr<GeomAPI_Pnt> myCenterPoint; /// Rotation center point.
-  std::shared_ptr<GeomAPI_Pnt> myStartPoint; /// Rotation start point.
-  std::shared_ptr<GeomAPI_Pnt> myEndPoint; /// Rotation end point.
 };
 
 #endif
index 3165c022716b2f49a13e8a4399cb51316106585d..bde61cc26e94a1f596d93eae37f6dbc30c1c001c 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
-#include "GeomAlgoAPI_Scale.h"
+#include <GeomAlgoAPI_Scale.h>
+
+#include <GeomAPI_Pnt.h>
 
-#include <BRepBuilderAPI_Transform.hxx>
 #include <BRepBuilderAPI_GTransform.hxx>
 
 //=================================================================================================
@@ -27,10 +28,15 @@ GeomAlgoAPI_Scale::GeomAlgoAPI_Scale(std::shared_ptr<GeomAPI_Shape> theSourceSha
                                      std::shared_ptr<GeomAPI_Pnt>   theCenterPoint,
                                      double theScaleFactor)
 {
-  myMethodType = BY_FACTOR;
-  mySourceShape = theSourceShape;
-  myCenterPoint = theCenterPoint;
-  myScaleFactor = theScaleFactor;
+  if (fabs(theScaleFactor) < Precision::Confusion()) {
+    myError = "Scale builder :: the scale factor is null.";
+    return;
+  }
+
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setScale(theCenterPoint, theScaleFactor);
+
+  build(theSourceShape, aTrsf);
 }
 
 //=================================================================================================
@@ -40,133 +46,48 @@ GeomAlgoAPI_Scale::GeomAlgoAPI_Scale(std::shared_ptr<GeomAPI_Shape> theSourceSha
                                      double theScaleFactorY,
                                      double theScaleFactorZ)
 {
-  myMethodType = BY_DIMENSIONS;
-  mySourceShape = theSourceShape;
-  myCenterPoint = theCenterPoint;
-  myScaleFactorX = theScaleFactorX;
-  myScaleFactorY = theScaleFactorY;
-  myScaleFactorZ = theScaleFactorZ;
-}
-
-//=================================================================================================
-bool GeomAlgoAPI_Scale::check()
-{
-  if (!mySourceShape) {
-    myError = "Scale builder :: source shape is not valid.";
-    return false;
-  }
-  if (!myCenterPoint) {
-    myError = "Scale builder :: center point is not valid.";
-    return false;
-  }
-  switch (myMethodType) {
-    case BY_FACTOR: {
-      if (fabs(myScaleFactor) < Precision::Confusion()) {
-        myError = "Scale builder :: the scale factor is null.";
-        return false;
-      }
-      return true;
-    }
-    case BY_DIMENSIONS: {
-      if (fabs(myScaleFactorX) < Precision::Confusion()) {
-        myError = "Scale builder :: the scale factor in X is null.";
-        return false;
-      }
-      if (fabs(myScaleFactorY) < Precision::Confusion()) {
-        myError = "Scale builder :: the scale factor in Y is null.";
-        return false;
-      }
-      if (fabs(myScaleFactorZ) < Precision::Confusion()) {
-        myError = "Scale builder :: the scale factor in Z is null.";
-        return false;
-      }
-      return true;
-    }
-    default: {
-      myError = "Scale builder :: method not implemented.";
-      return false;
-    }
-  }
-}
-
-//=================================================================================================
-void GeomAlgoAPI_Scale::build()
-{
-  switch (myMethodType) {
-   case BY_FACTOR : {
-     buildByFactor();
-     break;
-   }
-   case BY_DIMENSIONS : {
-     buildByDimensions();
-     break;
-   }
-   default : {
-     myError = "Scale builder :: method not yet implemented";
-     return;
-   }
-  }
-}
-
-//=================================================================================================
-void GeomAlgoAPI_Scale::buildByFactor()
-{
-  const gp_Pnt& aCenterPoint = myCenterPoint->impl<gp_Pnt>();
-  gp_Trsf* aTrsf = new gp_Trsf();
-  aTrsf->SetScale(aCenterPoint, myScaleFactor);
-
-  const TopoDS_Shape& aSourceShape = mySourceShape->impl<TopoDS_Shape>();
-
-  if(aSourceShape.IsNull()) {
-    myError = "Scale builder :: source shape does not contain any actual shape.";
+  if (fabs(theScaleFactorX) < Precision::Confusion()) {
+    myError = "Scale builder :: the scale factor in X is null.";
     return;
   }
-
-  // Transform the shape while copying it.
-  BRepBuilderAPI_Transform* aBuilder = new BRepBuilderAPI_Transform(aSourceShape, *aTrsf, true);
-  if(!aBuilder) {
-    myError = "Scale builder :: transform initialization failed.";
+  if (fabs(theScaleFactorY) < Precision::Confusion()) {
+    myError = "Scale builder :: the scale factor in Y is null.";
     return;
   }
-
-  setImpl(aBuilder);
-  setBuilderType(OCCT_BRepBuilderAPI_MakeShape);
-
-  if(!aBuilder->IsDone()) {
-    myError = "Scale builder :: algorithm failed.";
+  if (fabs(theScaleFactorZ) < Precision::Confusion()) {
+    myError = "Scale builder :: the scale factor in Z is null.";
     return;
   }
 
-  TopoDS_Shape aResult = aBuilder->Shape();
-
-  std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
-  aShape->setImpl(new TopoDS_Shape(aResult));
-  setShape(aShape);
-  setDone(true);
+  buildByDimensions(theSourceShape, theCenterPoint,
+                    theScaleFactorX, theScaleFactorY, theScaleFactorZ);
 }
 
 //=================================================================================================
-void GeomAlgoAPI_Scale::buildByDimensions()
+void GeomAlgoAPI_Scale::buildByDimensions(std::shared_ptr<GeomAPI_Shape> theSourceShape,
+                                          std::shared_ptr<GeomAPI_Pnt>   theCenterPoint,
+                                          double                         theScaleFactorX,
+                                          double                         theScaleFactorY,
+                                          double                         theScaleFactorZ)
 {
-  const gp_Pnt& aCenterPoint = myCenterPoint->impl<gp_Pnt>();
+  const gp_Pnt& aCenterPoint = theCenterPoint->impl<gp_Pnt>();
 
   // Perform the rotation matrix
-  gp_Mat aMatRot(myScaleFactorX, 0., 0.,
-                 0., myScaleFactorY, 0.,
-                 0., 0., myScaleFactorZ);
+  gp_Mat aMatRot(theScaleFactorX, 0., 0.,
+                 0., theScaleFactorY, 0.,
+                 0., 0., theScaleFactorZ);
 
   // Perform the tranformation
-  gp_Pnt anOriginPnt(0., 0., 0.);
   gp_GTrsf aGTrsf;
   gp_GTrsf aGTrsfP0;
   gp_GTrsf aGTrsf0P;
-  aGTrsfP0.SetTranslationPart(anOriginPnt.XYZ() - aCenterPoint.XYZ());
+  aGTrsfP0.SetTranslationPart(gp::Origin().XYZ() - aCenterPoint.XYZ());
   aGTrsf0P.SetTranslationPart(aCenterPoint.XYZ());
   aGTrsf.SetVectorialPart(aMatRot);
   aGTrsf = aGTrsf0P.Multiplied(aGTrsf);
   aGTrsf = aGTrsf.Multiplied(aGTrsfP0);
 
-  const TopoDS_Shape& aSourceShape = mySourceShape->impl<TopoDS_Shape>();
+  const TopoDS_Shape& aSourceShape = theSourceShape->impl<TopoDS_Shape>();
 
   if(aSourceShape.IsNull()) {
     myError = "Scale builder :: source shape does not contain any actual shape.";
index 583fd7501579ba5928f0e4ae03ca8b1238b98f52..158e0c5ab04ee35f0e470df887d77b355485f1b0 100644 (file)
 #ifndef GEOMALGOAPI_SCALE_H_
 #define GEOMALGOAPI_SCALE_H_
 
-#include <GeomAlgoAPI_MakeShape.h>
+#include <GeomAlgoAPI.h>
+#include <GeomAlgoAPI_Transform.h>
 
-#include <GeomAPI_Pnt.h>
+class GeomAPI_Pnt;
 
 /// \class GeomAlgoAPI_Scale
 /// \ingroup DataAlgo
 /// \brief Creates a copy of the object by performing a scale operation by a factor or
 ///        by dimensions.
-class GeomAlgoAPI_Scale : public GeomAlgoAPI_MakeShape
+class GeomAlgoAPI_Scale : public GeomAlgoAPI_Transform
 {
 public:
-  /// Type of scale operation
-  enum MethodType {
-    BY_FACTOR,     ///< Scale by factor.
-    BY_DIMENSIONS, ///< Scale by dimensions.
-  };
-
   /// \brief Creates an object which is obtained from current object by performing
   ///        a scale operation by a factor.
   /// \param[in] theSourceShape  the shape to be moved.
@@ -59,23 +54,12 @@ public:
                                        double                         theScaleFactorY,
                                        double                         theScaleFactorZ);
 
-  /// Checks if data for the scale transform is OK.
-  GEOMALGOAPI_EXPORT bool check();
-
-  /// Execute the scale transform.
-  GEOMALGOAPI_EXPORT void build();
-
 private:
-  MethodType myMethodType; /// Type of method used.
-  std::shared_ptr<GeomAPI_Shape> mySourceShape; /// Shape to be moved.
-  std::shared_ptr<GeomAPI_Pnt> myCenterPoint; /// Center point.
-  double myScaleFactor; /// Scale factor.
-  double myScaleFactorX; /// Scale factor in X.
-  double myScaleFactorY; /// Scale factor in Y.
-  double myScaleFactorZ; /// Scale factor in Z.
-
-  void buildByFactor();
-  void buildByDimensions();
+  void buildByDimensions(std::shared_ptr<GeomAPI_Shape> theSourceShape,
+                         std::shared_ptr<GeomAPI_Pnt>   theCenterPoint,
+                         double                         theScaleFactorX,
+                         double                         theScaleFactorY,
+                         double                         theScaleFactorZ);
 };
 
 #endif // GEOMALGOAPI_SCALE_H_
\ No newline at end of file
index 3497664ff7ca189fd5301149a9a2807c619eac0f..3f47db999624133838b9384798106c8c10481123 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
-#include "GeomAlgoAPI_Symmetry.h"
+#include <GeomAlgoAPI_Symmetry.h>
 
-#include <BRepBuilderAPI_Transform.hxx>
+#include <GeomAPI_Pnt.h>
+#include <GeomAPI_Ax1.h>
+#include <GeomAPI_Ax2.h>
 
 //=================================================================================================
 GeomAlgoAPI_Symmetry::GeomAlgoAPI_Symmetry(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                            std::shared_ptr<GeomAPI_Pnt>   thePoint)
 {
-  myMethodType = BY_POINT;
-  mySourceShape = theSourceShape;
-  myPoint = thePoint;
+  if (!thePoint) {
+    myError = "Symmetry builder :: point is not valid.";
+    return;
+  }
+
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setSymmetry(thePoint);
+
+  build(theSourceShape, aTrsf);
 }
 
 //=================================================================================================
 GeomAlgoAPI_Symmetry::GeomAlgoAPI_Symmetry(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                            std::shared_ptr<GeomAPI_Ax1>   theAxis)
 {
-  myMethodType = BY_AXIS;
-  mySourceShape = theSourceShape;
-  myAxis = theAxis;
-}
+  if (!theAxis) {
+    myError = "Symmetry builder :: axis is not valid.";
+    return;
+  }
 
-//=================================================================================================
-GeomAlgoAPI_Symmetry::GeomAlgoAPI_Symmetry(std::shared_ptr<GeomAPI_Shape> theSourceShape,
-                                           std::shared_ptr<GeomAPI_Ax2>   thePlane)
-{
-  myMethodType = BY_PLANE;
-  mySourceShape = theSourceShape;
-  myPlane = thePlane;
-}
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setSymmetry(theAxis);
 
-//=================================================================================================
-bool GeomAlgoAPI_Symmetry::check()
-{
-  switch (myMethodType) {
-    case BY_POINT: {
-      if (!myPoint) {
-        myError = "Symmetry builder :: point is not valid.";
-        return false;
-      }
-      if (!mySourceShape) {
-        myError = "Symmetry builder :: source shape is not valid.";
-        return false;
-      }
-      return true;
-    }
-    case BY_AXIS: {
-      if (!myAxis) {
-        myError = "Symmetry builder :: axis is not valid.";
-        return false;
-      }
-      if (!mySourceShape) {
-        myError = "Symmetry builder :: source shape is not valid.";
-        return false;
-      }
-      return true;
-    }
-    case BY_PLANE: {
-      if (!myPlane) {
-        myError = "Symmetry builder :: plane is not valid.";
-        return false;
-      }
-      if (!mySourceShape) {
-        myError = "Symmetry builder :: source shape is not valid.";
-        return false;
-      }
-      return true;
-    }
-    default: {
-      myError = "Symmetry builder :: method not implemented.";
-      return false;
-    }
-  }
+  build(theSourceShape, aTrsf);
 }
 
 //=================================================================================================
-void GeomAlgoAPI_Symmetry::build()
+GeomAlgoAPI_Symmetry::GeomAlgoAPI_Symmetry(std::shared_ptr<GeomAPI_Shape> theSourceShape,
+                                           std::shared_ptr<GeomAPI_Ax2>   thePlane)
 {
-  gp_Trsf* aTrsf = new gp_Trsf();
-
-  switch (myMethodType) {
-    case BY_POINT: {
-      const gp_Pnt& aPoint = myPoint->impl<gp_Pnt>();
-      aTrsf->SetMirror(aPoint);
-      break;
-    }
-    case BY_AXIS: {
-      const gp_Ax1& anAxis = myAxis->impl<gp_Ax1>();
-      aTrsf->SetMirror(anAxis);
-      break;
-    }
-    case BY_PLANE: {
-      const gp_Ax2& aPlane = myPlane->impl<gp_Ax2>();
-      aTrsf->SetMirror(aPlane);
-      break;
-    }
-    default: {
-      myError = "Symmetry builder :: method not supported";
-      return;
-    }
-  }
-
-  const TopoDS_Shape& aSourceShape = mySourceShape->impl<TopoDS_Shape>();
-
-  if(aSourceShape.IsNull()) {
-    myError = "Symmetry 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 = "Symmetry builder :: transform initialization failed.";
-    return;
-  }
-
-  setImpl(aBuilder);
-  setBuilderType(OCCT_BRepBuilderAPI_MakeShape);
-
-  if(!aBuilder->IsDone()) {
-    myError = "Symmetry builder :: algorithm failed.";
+  if (!thePlane) {
+    myError = "Symmetry builder :: plane is not valid.";
     return;
   }
 
-  TopoDS_Shape aResult = aBuilder->Shape();
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setSymmetry(thePlane);
 
-  std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
-  aShape->setImpl(new TopoDS_Shape(aResult));
-  setShape(aShape);
-  setDone(true);
+  build(theSourceShape, aTrsf);
 }
index f0f33aa90bc16722d7e8fba4fbd0b77c206c523a..884261a2d85f38843d6c38f187da40f89f9acbff 100644 (file)
 #define GEOMALGOAPI_SYMMETRY_H_
 
 #include <GeomAlgoAPI.h>
-#include <GeomAlgoAPI_MakeShape.h>
+#include <GeomAlgoAPI_Transform.h>
 
-#include <GeomAPI_Pnt.h>
-#include <GeomAPI_Ax1.h>
-#include <GeomAPI_Ax2.h>
+class GeomAPI_Ax1;
+class GeomAPI_Ax2;
+class GeomAPI_Pnt;
 
 /// \class GeomAlgoAPI_Symmetry
 /// \ingroup DataAlgo
 /// \brief Creates a copy of the object by performing a symmetry operation by a point,
 ///        by an axis or by a plane.
-class GeomAlgoAPI_Symmetry : public GeomAlgoAPI_MakeShape
+class GeomAlgoAPI_Symmetry : public GeomAlgoAPI_Transform
 {
 public:
-  /// Type of symmetry operation
-  enum MethodType {
-    BY_POINT, ///< Symmetry by point.
-    BY_AXIS,  ///< Symmetry by axis.
-    BY_PLANE  ///< Symmetry by plane.
-  };
-
   /// \brief Creates an object which is obtained from current object by performing
   ///        a symmetry operation by a point.
   /// \param[in] theSourceShape  the shape to be moved.
@@ -61,19 +54,6 @@ public:
   /// \param[in] thePlane        the symmetry plane.
   GEOMALGOAPI_EXPORT GeomAlgoAPI_Symmetry(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                           std::shared_ptr<GeomAPI_Ax2>   thePlane);
-
-  /// Checks if data for the symmetry execution is OK.
-  GEOMALGOAPI_EXPORT bool check();
-
-  /// Execute the symmetry.
-  GEOMALGOAPI_EXPORT void build();
-
-private:
-  MethodType myMethodType; /// Type of method used.
-  std::shared_ptr<GeomAPI_Shape> mySourceShape; /// Shape to be moved.
-  std::shared_ptr<GeomAPI_Pnt> myPoint; /// Reflection point.
-  std::shared_ptr<GeomAPI_Ax1> myAxis; /// Reflection axis.
-  std::shared_ptr<GeomAPI_Ax2> myPlane; /// Reflection plane.
 };
 
 #endif // GEOMALGOAPI_SYMMETRY_H_
index 8ef306ef658b072f49ade9a72ae390f2a0603024..389f87e05c170878c9944b99969a94d484761be8 100644 (file)
@@ -29,7 +29,6 @@
 //=================================================================================================
 GeomAlgoAPI_Transform::GeomAlgoAPI_Transform(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                              std::shared_ptr<GeomAPI_Trsf>  theTrsf)
-: myTrsf(theTrsf)
 {
   build(theSourceShape, theTrsf);
 }
@@ -38,37 +37,33 @@ GeomAlgoAPI_Transform::GeomAlgoAPI_Transform(std::shared_ptr<GeomAPI_Shape> theS
 void GeomAlgoAPI_Transform::build(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                   std::shared_ptr<GeomAPI_Trsf>  theTrsf)
 {
-  if(!theSourceShape || !theTrsf) {
+  if (!theSourceShape || !theTrsf) {
+    myError = "Transformation :: incorrect input data";
     return;
   }
 
   const TopoDS_Shape& aSourceShape = theSourceShape->impl<TopoDS_Shape>();
   const gp_Trsf& aTrsf = theTrsf->impl<gp_Trsf>();
 
-  if(aSourceShape.IsNull()) {
+  if (aSourceShape.IsNull()) {
+    myError = "Transformation :: source shape does not contain any actual shape.";
     return;
   }
 
   BRepBuilderAPI_Transform* aBuilder = new BRepBuilderAPI_Transform(aSourceShape, aTrsf, true);
-  if(!aBuilder) {
+  if (!aBuilder)
     return;
-  }
-  this->setImpl(aBuilder);
-  this->setBuilderType(OCCT_BRepBuilderAPI_MakeShape);
 
-  if(aBuilder->IsDone() != Standard_True) {
+  setImpl(aBuilder);
+  setBuilderType(OCCT_BRepBuilderAPI_MakeShape);
+
+  if (aBuilder->IsDone() != Standard_True)
     return;
-  }
+
   TopoDS_Shape aResult = aBuilder->Shape();
 
   std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
   aShape->setImpl(new TopoDS_Shape(aResult));
-  this->setShape(aShape);
-  this->setDone(true);
-}
-
-//=================================================================================================
-std::shared_ptr<GeomAPI_Trsf> GeomAlgoAPI_Transform::transformation() const
-{
-  return myTrsf;
+  setShape(aShape);
+  setDone(true);
 }
index cb5382d48a54e4157f5bd147e68d19313e58fab1..bb7983b2b3e816729bd13a44c99e2547c2ca6efc 100644 (file)
@@ -38,16 +38,13 @@ public:
   GEOMALGOAPI_EXPORT GeomAlgoAPI_Transform(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                            std::shared_ptr<GeomAPI_Trsf>  theTrsf);
 
-  /// \return the transformation.
-  GEOMALGOAPI_EXPORT std::shared_ptr<GeomAPI_Trsf> transformation() const;
+protected:
+  /// \brief Default constructor (to be used in the derived classes)
+  GeomAlgoAPI_Transform() {}
 
-private:
   /// Builds resulting shape.
   void build(std::shared_ptr<GeomAPI_Shape> theSourceShape,
              std::shared_ptr<GeomAPI_Trsf>  theTrsf);
-
-private:
-  std::shared_ptr<GeomAPI_Trsf> myTrsf;
 };
 
 #endif
index b73713a8b52c6b1bf70f4edc435b6238a33ef7a5..591c191f4097d56e791bbcc921805d710377179b 100644 (file)
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
 
-#include "GeomAlgoAPI_Translation.h"
+#include <GeomAlgoAPI_Translation.h>
+
+#include <GeomAPI_Ax1.h>
+#include <GeomAPI_Shape.h>
 
-#include <BRepBuilderAPI_Transform.hxx>
 #include <Precision.hxx>
-#include <gp_Ax1.hxx>
 
 //=================================================================================================
 GeomAlgoAPI_Translation::GeomAlgoAPI_Translation(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                                  std::shared_ptr<GeomAPI_Ax1>   theAxis,
                                                  double                         theDistance)
 {
-  myMethodType = BY_DISTANCE;
-  mySourceShape = theSourceShape;
-  myAxis = theAxis;
-  myDistance = theDistance;
+  if (!theAxis) {
+    myError = "Translation builder :: axis is not valid.";
+    return;
+  }
+
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setTranslation(theAxis, theDistance);
+
+  build(theSourceShape, aTrsf);
 }
 
 //=================================================================================================
@@ -40,11 +46,10 @@ GeomAlgoAPI_Translation::GeomAlgoAPI_Translation(std::shared_ptr<GeomAPI_Shape>
                                                  double                         theDy,
                                                  double                         theDz)
 {
-  myMethodType = BY_DIM;
-  mySourceShape = theSourceShape;
-  myDx = theDx;
-  myDy = theDy;
-  myDz = theDz;
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setTranslation(theDx, theDy, theDz);
+
+  build(theSourceShape, aTrsf);
 }
 
 //=================================================================================================
@@ -52,113 +57,21 @@ GeomAlgoAPI_Translation::GeomAlgoAPI_Translation(std::shared_ptr<GeomAPI_Shape>
                                                  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 not valid.";
-        return false;
-      }
-      if (!mySourceShape) {
-        myError = "Translation builder :: source shape is not valid.";
-        return false;
-      }
-      return true;
-    }
-    case BY_DIM: {
-      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: {
-      myError = "Translation builder :: method not implemented.";
-      return false;
-    }
-  }
-}
-
-//=================================================================================================
-void GeomAlgoAPI_Translation::build()
-{
-  gp_Trsf* aTrsf = new gp_Trsf();
-
-  switch (myMethodType) {
-    case BY_DISTANCE: {
-      const gp_Ax1& anAxis = myAxis->impl<gp_Ax1>();
-      aTrsf->SetTranslation(gp_Vec(anAxis.Direction()) * myDistance);
-      break;
-    }
-    case BY_DIM: {
-      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;
-    }
-  }
-
-  const TopoDS_Shape& aSourceShape = mySourceShape->impl<TopoDS_Shape>();
-
-  if(aSourceShape.IsNull()) {
-    myError = "Translation builder :: source shape does not contain any actual shape.";
+  if (!theStartPoint) {
+    myError = "Translation builder :: start point is not valid.";
     return;
   }
-
-  // Transform the shape while copying it.
-  BRepBuilderAPI_Transform* aBuilder = new BRepBuilderAPI_Transform(aSourceShape, *aTrsf, true);
-  if(!aBuilder) {
-    myError = "Translation builder :: transform initialization failed.";
+  if (!theEndPoint) {
+    myError = "Translation builder :: end point is not valid.";
     return;
   }
-
-  setImpl(aBuilder);
-  setBuilderType(OCCT_BRepBuilderAPI_MakeShape);
-
-  if(!aBuilder->IsDone()) {
-    myError = "Translation builder :: algorithm failed.";
+  if (theStartPoint->distance(theEndPoint) < Precision::Confusion()) {
+    myError = "Translation builder :: start point and end point coincide.";
     return;
   }
 
-  TopoDS_Shape aResult = aBuilder->Shape();
+  GeomTrsfPtr aTrsf(new GeomAPI_Trsf);
+  aTrsf->setTranslation(theStartPoint, theEndPoint);
 
-  std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
-  aShape->setImpl(new TopoDS_Shape(aResult));
-  setShape(aShape);
-  setDone(true);
+  build(theSourceShape, aTrsf);
 }
index f7b3be95e627a2dcbe0eb621d9550a2075829c90..7f9ea21dd8624cd43e02eb9227ef83b569c131e1 100644 (file)
 #define GeomAlgoAPI_Translation_H_
 
 #include <GeomAlgoAPI.h>
-#include <GeomAlgoAPI_MakeShape.h>
+#include <GeomAlgoAPI_Transform.h>
 
-#include <GeomAPI_Ax1.h>
-#include <GeomAPI_Shape.h>
+class GeomAPI_Ax1;
+class GeomAPI_Pnt;
 
 /// \class GeomAlgoAPI_Translation
 /// \ingroup DataAlgo
 /// \brief Creates a copy of the object by moving it along the axis.
-class GeomAlgoAPI_Translation : public GeomAlgoAPI_MakeShape
+class GeomAlgoAPI_Translation : public GeomAlgoAPI_Transform
 {
 public:
-  /// Type of translation operation
-  enum MethodType {
-    BY_DISTANCE, ///< Translation by axis and distance
-    BY_DIM,      ///< Translation by dimensions in X, Y and Z
-    BY_POINTS    ///< Translation by two points
-  };
-
   /// \brief Creates an object which is obtained from current object by moving it along the axis.
   /// \param[in] theSourceShape  a shape to be moved.
   /// \param[in] theAxis         movement axis.
@@ -66,23 +59,6 @@ public:
   GEOMALGOAPI_EXPORT GeomAlgoAPI_Translation(std::shared_ptr<GeomAPI_Shape> theSourceShape,
                                              std::shared_ptr<GeomAPI_Pnt>   theStartPoint,
                                              std::shared_ptr<GeomAPI_Pnt>   theEndPoint);
-
-  /// Checks if data for the translation execution is OK.
-  GEOMALGOAPI_EXPORT bool check();
-
-  /// Execute the translation.
-  GEOMALGOAPI_EXPORT void build();
-
-private:
-  MethodType myMethodType; /// Type of method used.
-  std::shared_ptr<GeomAPI_Shape> mySourceShape; /// Shape to be moved.
-  std::shared_ptr<GeomAPI_Ax1> myAxis; /// Movement axis.
-  double myDistance; /// Movement distance.
-  double myDx; /// Movement dimension on X.
-  double myDy; /// Movement dimension on Y.
-  double myDz; /// Movement dimension on Z.
-  std::shared_ptr<GeomAPI_Pnt> myStartPoint; /// Movement start point.
-  std::shared_ptr<GeomAPI_Pnt> myEndPoint; /// Movement end point.
 };
 
 #endif