X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Rotation.cpp;h=cbe24c16f6367e56d8b32e81dcf54c35e8836f47;hb=c0861430eadfbc55433269ea813ea798c1540a71;hp=c8a76a01dbeaea3485077a75d65575ea4202b693;hpb=15d511a49a2b8f1fa39496c7abf79ea285d23ce5;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Rotation.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Rotation.cpp index c8a76a01d..cbe24c16f 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Rotation.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Rotation.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2022 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 @@ -12,33 +12,39 @@ // // 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 +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.salome-platform.org/ or -// email : webmaster.salome@opencascade.com +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -#include "GeomAlgoAPI_Rotation.h" +#include +#include +#include #include -#include - -#include -#include -#include - #include +// 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 theSourceShape, std::shared_ptr 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); + + build(theSourceShape, aTrsf); } @@ -48,139 +54,58 @@ GeomAlgoAPI_Rotation::GeomAlgoAPI_Rotation(std::shared_ptr theSou std::shared_ptr theStartPoint, std::shared_ptr 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 aCenterPointXYZ = myCenterPoint->xyz(); - std::shared_ptr aStartPointXYZ = myStartPoint->xyz(); - std::shared_ptr aEndPointXYZ = myEndPoint->xyz(); - std::shared_ptr vectCenterPointStartPoint = - aStartPointXYZ->decreased(aCenterPointXYZ); - std::shared_ptr vectCenterPointEndPoint = - aEndPointXYZ->decreased(aCenterPointXYZ); - std::shared_ptr crossProduct = - vectCenterPointStartPoint->cross(vectCenterPointEndPoint); - std::shared_ptr aOriginPnt = - std::shared_ptr(new GeomAPI_Pnt(0.,0.,0.)); - std::shared_ptr 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(); - aTrsf->SetRotation(anAxis, myAngle/180.0*M_PI); - break; - } - case BY_POINTS: { - const gp_Pnt& aCenterPoint = myCenterPoint->impl(); - const gp_Pnt& aStartPoint = myStartPoint->impl(); - const gp_Pnt& aEndPoint = myEndPoint->impl(); - 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(); - - 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 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 aCenterPointXYZ = theCenterPoint->xyz(); + std::shared_ptr aStartPointXYZ = theStartPoint->xyz(); + std::shared_ptr aEndPointXYZ = theEndPoint->xyz(); + std::shared_ptr vectCenterPointStartPoint = + aStartPointXYZ->decreased(aCenterPointXYZ); + std::shared_ptr vectCenterPointEndPoint = + aEndPointXYZ->decreased(aCenterPointXYZ); + std::shared_ptr 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; }