X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FGeomAPI%2FGeomAPI_Wire.cpp;h=65729cbf7bed5f9d49b16703852d3c74f73a366e;hb=f60dc9dd94d5d4b0ea07e3e3cbfd5b3028f0942d;hp=e6fe6e044448f9e94b3b2b5c0d5300134c8d25b8;hpb=2532fb2df83ee1ddd9ff3e8b381d3788eaa15b69;p=modules%2Fshaper.git diff --git a/src/GeomAPI/GeomAPI_Wire.cpp b/src/GeomAPI/GeomAPI_Wire.cpp index e6fe6e044..65729cbf7 100644 --- a/src/GeomAPI/GeomAPI_Wire.cpp +++ b/src/GeomAPI/GeomAPI_Wire.cpp @@ -14,12 +14,19 @@ // 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 +// See http://www.salome-platform.org/ or +// email : webmaster.salome@opencascade.com // #include "GeomAPI_Wire.h" +#include "GeomAPI_Pnt.h" #include +#include +#include +#include +#include +#include #include //================================================================================================== @@ -32,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(); +}