X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAlgoAPI%2FGeomAlgoAPI_Placement.cpp;h=4c297247b9b1751f89eaed80ed89046488b59b5f;hb=06e7f5859095193fc7f498bd89a7d28009794f53;hp=de553626b2b98896807157e28af35e95041ea32c;hpb=fea65cc1c8e35809be630fb1ab2adcd4fd27cc1e;p=modules%2Fshaper.git diff --git a/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp b/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp index de553626b..4c297247b 100644 --- a/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp +++ b/src/GeomAlgoAPI/GeomAlgoAPI_Placement.cpp @@ -1,12 +1,26 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: GeomAlgoAPI_Placement.cpp -// Created: 2 Dec 2014 -// Author: Artem ZHIDKOV +// 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 +// 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 +// #include "GeomAlgoAPI_Placement.h" #include +#include #include #include @@ -14,6 +28,7 @@ #include #include #include +#include #include #include @@ -56,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 @@ -117,11 +151,13 @@ void GeomAlgoAPI_Placement::build(const std::shared_ptr& theSourc if (hasDirection[0] || hasDirection[1]) { // plane - line int anInd = hasDirection[0] ? 0 : 1; gp_Vec aVec = aSrcDstNormals[1 - anInd].Crossed(aSrcDstDirections[anInd]); - if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // normal and direction are collinear + if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { + // normal and direction are collinear aVec = aSrcDstNormals[1 - anInd].Crossed( gp_Vec(aSrcDstPoints[1 - anInd], aSrcDstPoints[anInd])); - if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { // normal and points direction are collinear - if (Abs(aSrcDstNormals[1 - anInd].Y()) >= Precision::Confusion() || + if (aVec.SquareMagnitude() < Precision::SquareConfusion()) { + // normal and points direction are collinear + if (Abs(aSrcDstNormals[1 - anInd].Y()) >= Precision::Confusion() || Abs(aSrcDstNormals[1 - anInd].Z()) >= Precision::Confusion()) aVec = gp::DX(); else @@ -140,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(); @@ -161,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(); @@ -196,10 +232,9 @@ void GeomAlgoAPI_Placement::build(const std::shared_ptr& theSourc if (theSimpleTransform) { // just add transformation TopLoc_Location aDelta(aTrsf); // store the accumulated information about the result and this delta - //myTrsf = std::shared_ptr(new GeomAPI_Trsf(new gp_Trsf(aTrsf * aSourceShape.Location().Transformation()))); 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 @@ -216,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);