-// Copyright (C) 2014-2022 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2024 CEA, EDF
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
#include "GeomAPI_Shape.h"
+#include <Basics_OCCTVersion.hxx>
+
#include <GeomAPI_Pnt.h>
#include <GeomAPI_Vertex.h>
#include <GeomAPI_Edge.h>
#include <sstream>
#include <algorithm> // for std::transform
-#include <BRepTools.hxx>
-
#define MY_SHAPE implPtr<TopoDS_Shape>()
GeomAPI_Shape::GeomAPI_Shape()
BRepBuilderAPI_FindPlane aFindPlane(aShape);
bool isFound = aFindPlane.Found() == Standard_True;
- if(!isFound && aShapeType == TopAbs_EDGE) {
- Standard_Real aFirst, aLast;
- Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(aShape), aFirst, aLast);
- Handle(Standard_Type) aType = aCurve->DynamicType();
+ if(!isFound) {
- if(aType == STANDARD_TYPE(Geom_TrimmedCurve)) {
- Handle(Geom_TrimmedCurve) aTrimCurve = Handle(Geom_TrimmedCurve)::DownCast(aCurve);
- aType = aTrimCurve->BasisCurve()->DynamicType();
- }
+ auto checkEdge = [](const TopoDS_Shape& theShape){
+ if(theShape.ShapeType()!= TopAbs_EDGE)
+ return false;
+
+ Standard_Real aFirst, aLast;
+ Handle(Geom_Curve) aCurve = BRep_Tool::Curve(TopoDS::Edge(theShape), aFirst, aLast);
+ Handle(Standard_Type) aType = aCurve->DynamicType();
+ if(aType == STANDARD_TYPE(Geom_TrimmedCurve)) {
+ Handle(Geom_TrimmedCurve) aTrimCurve = Handle(Geom_TrimmedCurve)::DownCast(aCurve);
+ aType = aTrimCurve->BasisCurve()->DynamicType();
+ }
- if(aType == STANDARD_TYPE(Geom_Line)
- || aType == STANDARD_TYPE(Geom_Conic)
- || aType == STANDARD_TYPE(Geom_Circle)
- || aType == STANDARD_TYPE(Geom_Ellipse)
- || aType == STANDARD_TYPE(Geom_Hyperbola)
- || aType == STANDARD_TYPE(Geom_Parabola)) {
- isFound = true;
+ if(aType == STANDARD_TYPE(Geom_Line)
+ || aType == STANDARD_TYPE(Geom_Conic)
+ || aType == STANDARD_TYPE(Geom_Circle)
+ || aType == STANDARD_TYPE(Geom_Ellipse)
+ || aType == STANDARD_TYPE(Geom_Hyperbola)
+ || aType == STANDARD_TYPE(Geom_Parabola)) {
+ return true;
+ }
+ return false;
+ };
+
+ if(aShapeType == TopAbs_WIRE){
+ //check if wire consist of only one edge
+ int aNbEdges = 0;
+ TopExp_Explorer anExp(aShape, TopAbs_EDGE);
+ for (TopExp_Explorer anExp(aShape, TopAbs_EDGE); anExp.More(); anExp.Next()) {
+ aNbEdges++;
+ if(aNbEdges == 1){
+ const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current());
+ isFound = checkEdge(anEdge);
+ }
+ else{
+ //if more than one edge, check is not valid
+ isFound = false;
+ break;
+ }
+ }
+ }
+ else if(aShapeType == TopAbs_EDGE){
+ isFound = checkEdge(aShape);
}
}
const TopoDS_Shape& aShape2 = theShape2->impl<TopoDS_Shape>();
bool isLess = aShape1.TShape() < aShape2.TShape();
if (aShape1.TShape() == aShape2.TShape()) {
+#if OCC_VERSION_LARGE < 0x07080000
Standard_Integer aHash1 = aShape1.Location().HashCode(IntegerLast());
Standard_Integer aHash2 = aShape2.Location().HashCode(IntegerLast());
+#else
+ Standard_Integer aHash1 = aShape1.Location().HashCode();
+ Standard_Integer aHash2 = aShape2.Location().HashCode();
+#endif
isLess = aHash1 < aHash2;
}
return isLess;
const TopoDS_Shape& aShape2 = theShape2->impl<TopoDS_Shape>();
bool isLess = aShape1.TShape() < aShape2.TShape();
if (aShape1.TShape() == aShape2.TShape()) {
+#if OCC_VERSION_LARGE < 0x07080000
Standard_Integer aHash1 = aShape1.Location().HashCode(IntegerLast());
Standard_Integer aHash2 = aShape2.Location().HashCode(IntegerLast());
+#else
+ Standard_Integer aHash1 = aShape1.Location().HashCode();
+ Standard_Integer aHash2 = aShape2.Location().HashCode();
+#endif
isLess = (aHash1 < aHash2) ||
(aHash1 == aHash2 && aShape1.Orientation() < aShape2.Orientation());
}
int GeomAPI_Shape::Hash::operator()(const std::shared_ptr<GeomAPI_Shape>& theShape) const
{
const TopoDS_Shape& aShape = theShape->impl<TopoDS_Shape>();
+#if OCC_VERSION_LARGE < 0x07080000
return aShape.HashCode(IntegerLast());
+#else
+ return std::hash<TopoDS_Shape>{}(aShape);
+#endif
}
bool GeomAPI_Shape::Equal::operator()(const std::shared_ptr<GeomAPI_Shape>& theShape1,
const TopoDS_Shape& aShape1 = theShape1->impl<TopoDS_Shape>();
const TopoDS_Shape& aShape2 = theShape2->impl<TopoDS_Shape>();
+#if OCC_VERSION_LARGE < 0x07080000
Standard_Integer aHash1 = aShape1.Location().HashCode(IntegerLast());
Standard_Integer aHash2 = aShape2.Location().HashCode(IntegerLast());
+#else
+ Standard_Integer aHash1 = aShape1.Location().HashCode();
+ Standard_Integer aHash2 = aShape2.Location().HashCode();
+#endif
return aShape1.TShape() == aShape2.TShape() && aHash1 == aHash2;
}