X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAPI%2FGeomAPI_Wire.cpp;h=65729cbf7bed5f9d49b16703852d3c74f73a366e;hb=f60dc9dd94d5d4b0ea07e3e3cbfd5b3028f0942d;hp=039be40a873ffb450f9b7ad609a0b1bffd9c2453;hpb=87b6a30a3afb8fb32e7e43ade8d9c947d9eb1684;p=modules%2Fshaper.git diff --git a/src/GeomAPI/GeomAPI_Wire.cpp b/src/GeomAPI/GeomAPI_Wire.cpp index 039be40a8..65729cbf7 100644 --- a/src/GeomAPI/GeomAPI_Wire.cpp +++ b/src/GeomAPI/GeomAPI_Wire.cpp @@ -19,8 +19,14 @@ // #include "GeomAPI_Wire.h" +#include "GeomAPI_Pnt.h" #include +#include +#include +#include +#include +#include #include //================================================================================================== @@ -33,3 +39,96 @@ GeomAPI_Wire::GeomAPI_Wire() this->setImpl(aWire); } + +//================================================================================================== +GeomAPI_Wire::GeomAPI_Wire(const std::shared_ptr& theShape) +{ + 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; +} + +//================================================================================================== +bool GeomAPI_Wire::isRectangle(std::list& thePoints) const +{ + 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 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(); +}