X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAPI%2FGeomAPI_PlanarEdges.cpp;h=be124f5266b0626e843d0b093e2bf96ba8f21ab0;hb=ae92361e7d1375e324cc19e7b6a2962750e1d7ce;hp=53470fb5e55d09aa3c21ee1fc2baa012a0f3b625;hpb=f1cd93fd02a54259f72e3191d037323a496b2bef;p=modules%2Fshaper.git diff --git a/src/GeomAPI/GeomAPI_PlanarEdges.cpp b/src/GeomAPI/GeomAPI_PlanarEdges.cpp index 53470fb5e..be124f526 100644 --- a/src/GeomAPI/GeomAPI_PlanarEdges.cpp +++ b/src/GeomAPI/GeomAPI_PlanarEdges.cpp @@ -1,8 +1,21 @@ -// Copyright (C) 2014-20xx CEA/DEN, EDF R&D - -// File: GeomAPI_PlanarEdges.cpp -// Created: 06 Oct 2014 -// Author: Sergey BELASH +// 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 #include @@ -40,7 +53,6 @@ void GeomAPI_PlanarEdges::addEdge(std::shared_ptr theEdge) std::list > GeomAPI_PlanarEdges::getEdges() { TopoDS_Shape& aShape = const_cast(impl()); - //BRepTools_WireExplorer aWireExp(TopoDS::Wire(aShape)); TopExp_Explorer aWireExp(aShape, TopAbs_EDGE); std::list > aResult; for (; aWireExp.More(); aWireExp.Next()) { @@ -52,7 +64,7 @@ std::list > GeomAPI_PlanarEdges::getEdges() } bool GeomAPI_PlanarEdges::hasPlane() const { - return myOrigin && myNorm && myDirX && myDirY; + return myPlane.get() != NULL; } bool GeomAPI_PlanarEdges::isVertex() const { @@ -63,28 +75,64 @@ bool GeomAPI_PlanarEdges::isEdge() const { return false; } -void GeomAPI_PlanarEdges::setOrigin(const std::shared_ptr& theOrigin) +std::shared_ptr GeomAPI_PlanarEdges::origin() const { - myOrigin = theOrigin; -} -std::shared_ptr GeomAPI_PlanarEdges::origin() const { - return myOrigin; + if (hasPlane()) + return myPlane->origin(); + return std::shared_ptr(); } -void GeomAPI_PlanarEdges::setDirX(const std::shared_ptr& theDirX) { - myDirX = theDirX; + +std::shared_ptr GeomAPI_PlanarEdges::dirX() const +{ + if (hasPlane()) + return myPlane->dirX(); + return std::shared_ptr(); } -std::shared_ptr GeomAPI_PlanarEdges::dirX() const { - return myDirX; + +std::shared_ptr GeomAPI_PlanarEdges::dirY() const +{ + if (hasPlane()) + return myPlane->dirY(); + return std::shared_ptr(); } -void GeomAPI_PlanarEdges::setDirY(const std::shared_ptr& theDirY) { - myDirY = theDirY; + +std::shared_ptr GeomAPI_PlanarEdges::norm() const +{ + if (hasPlane()) + return myPlane->normal(); + return std::shared_ptr(); } -std::shared_ptr GeomAPI_PlanarEdges::dirY() const { - return myDirY; + +bool GeomAPI_PlanarEdges::isPlanar() const +{ + return true; } -void GeomAPI_PlanarEdges::setNorm(const std::shared_ptr& theNorm) { - myNorm = theNorm; + +void GeomAPI_PlanarEdges::setPlane(const std::shared_ptr& theOrigin, + const std::shared_ptr& theDirX, + const std::shared_ptr& theNorm) +{ + myPlane = std::shared_ptr(new GeomAPI_Ax3(theOrigin, theDirX, theNorm)); } -std::shared_ptr GeomAPI_PlanarEdges::norm() const { - return myNorm; + +bool GeomAPI_PlanarEdges::isEqual(const std::shared_ptr theShape) const +{ + if (!theShape.get()) + return false; + TopoDS_Shape& aMyShape = const_cast(impl()); + TopoDS_Shape aTheShape = theShape->impl(); + if (aMyShape.ShapeType() != aTheShape.ShapeType()) // to don't confuse by the face of same edges + return false; + TopExp_Explorer aMyExp(aMyShape, TopAbs_EDGE); + TopExp_Explorer aTheExp(aTheShape, TopAbs_EDGE); + for (; aMyExp.More() && aTheExp.More(); aMyExp.Next(), aTheExp.Next()) { + // check that edge by edge all geometrically matches + std::shared_ptr aMyEdge(new GeomAPI_Edge); + aMyEdge->setImpl(new TopoDS_Shape(aMyExp.Current())); + std::shared_ptr aTheEdge(new GeomAPI_Edge); + aTheEdge->setImpl(new TopoDS_Shape(aTheExp.Current())); + if (!aMyEdge->isEqual(aTheEdge)) + return false; + } + return !(aMyExp.More() || aTheExp.More()); }