X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAPI%2FGeomAPI_Wire.cpp;h=65729cbf7bed5f9d49b16703852d3c74f73a366e;hb=f60dc9dd94d5d4b0ea07e3e3cbfd5b3028f0942d;hp=6932444bf75af2be55d57c4d5afe616e47caa31b;hpb=703a9a0cd860fae14969ce510ed06ae13979298c;p=modules%2Fshaper.git diff --git a/src/GeomAPI/GeomAPI_Wire.cpp b/src/GeomAPI/GeomAPI_Wire.cpp index 6932444bf..65729cbf7 100644 --- a/src/GeomAPI/GeomAPI_Wire.cpp +++ b/src/GeomAPI/GeomAPI_Wire.cpp @@ -1,48 +1,134 @@ -// File: GeomAPI_Wire.cpp -// Created: 06 Oct 2014 -// Author: Sergey BELASH +// Copyright (C) 2014-2017 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 +// 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 +#include "GeomAPI_Wire.h" +#include "GeomAPI_Pnt.h" -#include -#include - -#include -#include -#include #include #include +#include +#include +#include +#include +#include -#include - -GeomAPI_Wire::GeomAPI_Wire() : GeomAPI_Shape() +//================================================================================================== +GeomAPI_Wire::GeomAPI_Wire() { - TopoDS_Compound aBigWireImpl; + TopoDS_Wire* aWire = new TopoDS_Wire(); + BRep_Builder aBuilder; - aBuilder.MakeCompound(aBigWireImpl); - this->setImpl(new TopoDS_Shape(aBigWireImpl)); + aBuilder.MakeWire(*aWire); + + this->setImpl(aWire); } -void GeomAPI_Wire::addEdge(boost::shared_ptr theEdge) +//================================================================================================== +GeomAPI_Wire::GeomAPI_Wire(const std::shared_ptr& theShape) { - const TopoDS_Edge& anEdge = theEdge->impl(); - if (anEdge.ShapeType() != TopAbs_EDGE) - return; - TopoDS_Shape& aWire = const_cast(impl()); - BRep_Builder aBuilder; - aBuilder.Add(aWire, anEdge); + if (!theShape->isNull() && theShape->isWire()) { + setImpl(new TopoDS_Shape(theShape->impl())); + } +} + +//================================================================================================== +bool GeomAPI_Wire::isClosed() const +{ + return BRep_Tool::IsClosed(impl()); +} + +//================================================================================================== +bool GeomAPI_Wire::isPolygon(std::list& thePoints) const +{ + const TopoDS_Wire& aWire = TopoDS::Wire(impl()); + + bool isPolygon = true; + const Handle(Standard_Type)& aLineType = STANDARD_TYPE(Geom_Line); + for (BRepTools_WireExplorer anExp(aWire); anExp.More() && isPolygon; anExp.Next()) { + const TopoDS_Edge& anEdge = anExp.Current(); + double aT1, aT2; + Handle(Geom_Curve) aC3D = BRep_Tool::Curve(anEdge, aT1, aT2); + if (!aC3D.IsNull() && aC3D->IsKind(aLineType)) { + gp_Pnt aCorner = BRep_Tool::Pnt(anExp.CurrentVertex()); + thePoints.push_back(GeomPointPtr(new GeomAPI_Pnt(aCorner.X(), aCorner.Y(), aCorner.Z()))); + } + else + isPolygon = false; + } + + if (!isPolygon) + thePoints.clear(); + return isPolygon; } -std::list > GeomAPI_Wire::getEdges() +//================================================================================================== +bool GeomAPI_Wire::isRectangle(std::list& thePoints) const { - TopoDS_Shape& aShape = const_cast(impl()); - BRepTools_WireExplorer aWireExp(TopoDS::Wire(aShape)); - std::list > aResult; - for (; aWireExp.More(); aWireExp.Next()) { - boost::shared_ptr anEdge(new GeomAPI_Shape); - anEdge->setImpl(new TopoDS_Shape(aWireExp.Current())); - aResult.push_back(anEdge); + thePoints.clear(); + + const TopoDS_Wire& aWire = TopoDS::Wire(impl()); + const Handle(Standard_Type)& aLineType = STANDARD_TYPE(Geom_Line); + + gp_XYZ aPrevDir(0, 0, 0); + + for (BRepTools_WireExplorer anExp(aWire); anExp.More(); anExp.Next()) { + const TopoDS_Edge& anEdge = anExp.Current(); + double aT1, aT2; + Handle(Geom_Curve) aC3D = BRep_Tool::Curve(anEdge, aT1, aT2); + if (!aC3D.IsNull() && aC3D->IsKind(aLineType)) { + gp_Pnt aCorner = BRep_Tool::Pnt(anExp.CurrentVertex()); + thePoints.push_back(GeomPointPtr(new GeomAPI_Pnt(aCorner.X(), aCorner.Y(), aCorner.Z()))); + } + else + return false; + + if (thePoints.size() > 4) + return false; + + // collect length of the edge + gp_Pnt aStart = aC3D->Value(aT1); + gp_Pnt aEnd = aC3D->Value(aT2); + + // check the edge is orthogonal to the previous + gp_XYZ aCurDir = (aEnd.XYZ() - aStart.XYZ()).Normalized(); + if (aPrevDir.Dot(aCurDir) < Precision::Confusion()) + aPrevDir = aCurDir; + else + return false; } - return aResult; + return true; +} + +//================================================================================================== +GeomPointPtr GeomAPI_Wire::middlePoint() const +{ + // find middle edge in the wire + std::list aSubs = subShapes(EDGE); + size_t aNbSubs = aSubs.size(); + if (aNbSubs == 0) + return GeomPointPtr(); + + aNbSubs /= 2; + for (; aNbSubs > 0; --aNbSubs) + aSubs.pop_front(); + + // compute middle point on the middle edge + return aSubs.front()->middlePoint(); }