X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Placement.cpp;h=4c297247b9b1751f89eaed80ed89046488b59b5f;hb=06e7f5859095193fc7f498bd89a7d28009794f53;hp=63b33d9d99b3cef4867432a5c2488eab1d934bc9;hpb=2532fb2df83ee1ddd9ff3e8b381d3788eaa15b69;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp index 63b33d9d9..4c297247b 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2014-2017 CEA/DEN, EDF R&D +// Copyright (C) 2014-2023 CEA, EDF // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -12,14 +12,15 @@ // // 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_Placement.h" #include +#include #include #include @@ -27,6 +28,7 @@ #include #include #include +#include #include #include @@ -69,29 +71,48 @@ void GeomAlgoAPI_Placement::build(const std::shared_ptr& theSourc GProp_GProps aProps; static const double aPropEps = 1.e-4; + GeomShapePtr aShape; + bool isCompound = false; for (int i = 0; i < aNbObjects; i++) { - if (aShapes[i]->isFace()) { - std::shared_ptr aFace(new GeomAPI_Face(aShapes[i])); + aShape = aShapes[i]; + isCompound = false; + if (aShapes[i]->isCompound()) { + isCompound = true; + GeomAPI_ShapeIterator anIt(aShapes[i]); + aShape = anIt.current(); + + GeomPointPtr aPnt = GeomAlgoAPI_ShapeTools::centreOfMass(aShapes[i]); + aSrcDstPoints[i].SetCoord(aPnt->x(), aPnt->y(), aPnt->z()); + } + + if (aShape->isFace()) { + std::shared_ptr aFace(new GeomAPI_Face(aShape)); std::shared_ptr aPlane = aFace->getPlane(); std::shared_ptr aDir = aPlane->direction(); aSrcDstNormals[i].SetCoord(aDir->x(), aDir->y(), aDir->z()); - BRepGProp::SurfaceProperties(aFace->impl(), aProps, aPropEps); - gp_Pnt aLoc = aProps.CentreOfMass(); - aSrcDstPoints[i].SetCoord(aLoc.X(), aLoc.Y(), aLoc.Z()); + if (!isCompound) { + BRepGProp::SurfaceProperties(aFace->impl(), aProps, aPropEps); + gp_Pnt aLoc = aProps.CentreOfMass(); + aSrcDstPoints[i].SetCoord(aLoc.X(), aLoc.Y(), aLoc.Z()); + } } - else if (aShapes[i]->isEdge()) { - std::shared_ptr anEdge(new GeomAPI_Edge(aShapes[i])); + else if (aShape->isEdge()) { + std::shared_ptr anEdge(new GeomAPI_Edge(aShape)); std::shared_ptr aLine = anEdge->line(); std::shared_ptr aDir = aLine->direction(); - std::shared_ptr aFirstPnt = anEdge->firstPoint(); - std::shared_ptr aLastPnt = anEdge->lastPoint(); - std::shared_ptr aLoc = aFirstPnt->xyz()->added(aLastPnt->xyz())->multiplied(0.5); - aSrcDstPoints[i].SetCoord(aLoc->x(), aLoc->y(), aLoc->z()); aSrcDstDirections[i].SetCoord(aDir->x(), aDir->y(), aDir->z()); + + if (!isCompound) { + std::shared_ptr aFirstPnt = anEdge->firstPoint(); + std::shared_ptr aLastPnt = anEdge->lastPoint(); + std::shared_ptr aLoc = aFirstPnt->xyz()->added(aLastPnt->xyz()) + ->multiplied(0.5); + aSrcDstPoints[i].SetCoord(aLoc->x(), aLoc->y(), aLoc->z()); + } } - else if (aShapes[i]->isVertex()) { - std::shared_ptr aVertex(new GeomAPI_Vertex(aShapes[i])); + else if (aShape->isVertex()) { + std::shared_ptr aVertex(new GeomAPI_Vertex(aShape)); std::shared_ptr aPnt = aVertex->point(); aSrcDstPoints[i].SetCoord(aPnt->x(), aPnt->y(), aPnt->z()); } else // something goes wrong @@ -155,7 +176,7 @@ void GeomAlgoAPI_Placement::build(const std::shared_ptr& theSourc aVec = aSrcDstDirections[0].Crossed(gp_Vec(aSrcDstPoints[0], aSrcDstPoints[1])); if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // lines are equal if (Abs(aSrcDstDirections[0].Y()) >= Precision::Confusion() || - Abs(aSrcDstDirections[0].Z()) >= Precision::Confusion()) + Abs(aSrcDstDirections[0].Z()) >= Precision::Confusion()) aVec = gp::DX(); else aVec = gp::DY(); @@ -176,8 +197,8 @@ void GeomAlgoAPI_Placement::build(const std::shared_ptr& theSourc gp_Vec aVec(aSrcDstPoints[anInd], aSrcDstPoints[1 - anInd]); aVec.Cross(aSrcDstDirections[anInd]); if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // point is on line - if (Abs(aSrcDstDirections[1 - anInd].Y()) >= Precision::Confusion() || - Abs(aSrcDstDirections[1 - anInd].Z()) >= Precision::Confusion()) + if (Abs(aSrcDstDirections[anInd].Y()) >= Precision::Confusion() || + Abs(aSrcDstDirections[anInd].Z()) >= Precision::Confusion()) aVec = gp::DX(); else aVec = gp::DY(); @@ -213,7 +234,7 @@ void GeomAlgoAPI_Placement::build(const std::shared_ptr& theSourc // store the accumulated information about the result and this delta myTrsf.reset(new GeomAPI_Trsf(new gp_Trsf(aTrsf))); TopoDS_Shape aResult = aSourceShape.Moved(aDelta); - std::shared_ptr aShape(new GeomAPI_Shape()); + aShape.reset(new GeomAPI_Shape()); aShape->setImpl(new TopoDS_Shape(aResult)); this->setShape(aShape); this->setDone(true); // it is allways true for simple transformation generation @@ -230,7 +251,7 @@ void GeomAlgoAPI_Placement::build(const std::shared_ptr& theSourc } TopoDS_Shape aResult = aBuilder->Shape(); - std::shared_ptr aShape(new GeomAPI_Shape()); + aShape.reset(new GeomAPI_Shape()); aShape->setImpl(new TopoDS_Shape(aResult)); this->setShape(aShape); this->setDone(true);