-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2019 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
//
// 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
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
#include "GeomAPI_Shape.h"
+#include <GeomAPI_Pnt.h>
#include <GeomAPI_Vertex.h>
#include <GeomAPI_Edge.h>
#include <GeomAPI_Wire.h>
return isAtLeastOne;
}
+// LCOV_EXCL_START
GeomAPI_Shape::ShapeType GeomAPI_Shape::typeOfCompoundShapes() const
{
const TopoDS_Shape& aShape = const_cast<GeomAPI_Shape*>(this)->impl<TopoDS_Shape>();
}
return (GeomAPI_Shape::ShapeType) aType;
}
+// LCOV_EXCL_STOP
// adds the nopt-compound elements recursively to the list
static void addSimpleToList(const TopoDS_Shape& theShape, NCollection_List<TopoDS_Shape>& theList)
if (aShape.IsNull())
return aSubs;
- for (TopExp_Explorer anExp(aShape, (TopAbs_ShapeEnum)theSubShapeType);
- anExp.More(); anExp.Next()) {
+ // process multi-level compounds
+ if (shapeType() == COMPOUND && theSubShapeType == COMPOUND) {
+ for (TopoDS_Iterator anIt(aShape); anIt.More(); anIt.Next()) {
+ const TopoDS_Shape& aCurrent = anIt.Value();
+ if (aCurrent.ShapeType() == TopAbs_COMPOUND) {
+ GeomShapePtr aSub(new GeomAPI_Shape);
+ aSub->setImpl(new TopoDS_Shape(aCurrent));
+ aSubs.push_back(aSub);
+ }
+ }
+ // add self
GeomShapePtr aSub(new GeomAPI_Shape);
- aSub->setImpl(new TopoDS_Shape(anExp.Current()));
+ aSub->setImpl(new TopoDS_Shape(aShape));
aSubs.push_back(aSub);
}
+ else {
+ for (TopExp_Explorer anExp(aShape, (TopAbs_ShapeEnum)theSubShapeType);
+ anExp.More(); anExp.Next()) {
+ GeomShapePtr aSub(new GeomAPI_Shape);
+ aSub->setImpl(new TopoDS_Shape(anExp.Current()));
+ aSubs.push_back(aSub);
+ }
+ }
return aSubs;
}
GeomAPI_Shape::ShapeType GeomAPI_Shape::shapeTypeByStr(std::string theType)
{
std::transform(theType.begin(), theType.end(), theType.begin(), ::toupper);
- if (theType == "COMPOUND")
+ if (theType == "COMPOUND" || theType == "COMPOUNDS")
return COMPOUND;
- if (theType == "COMPSOLID")
+ if (theType == "COMPSOLID" || theType == "COMPSOLIDS")
return COMPSOLID;
- if (theType == "SOLID")
+ if (theType == "SOLID" || theType == "SOLIDS")
return SOLID;
- if (theType == "SHELL")
+ if (theType == "SHELL" || theType == "SHELLS")
return SHELL;
- if (theType == "FACE")
+ if (theType == "FACE" || theType == "FACES")
return FACE;
- if (theType == "WIRE")
+ if (theType == "WIRE" || theType == "WIRES")
return WIRE;
- if (theType == "EDGE")
+ if (theType == "EDGE" || theType == "EDGES")
return EDGE;
- if (theType == "VERTEX")
+ if (theType == "VERTEX" || theType == "VERTICES")
return VERTEX;
return SHAPE; // default
}
if (aShape.IsNull())
return false;
Bnd_Box aBndBox;
- BRepBndLib::Add(aShape, aBndBox);
+ BRepBndLib::Add(aShape, aBndBox, false);
+ if (aBndBox.IsVoid())
+ return false;
aBndBox.Get(theXmin, theYmin, theZmin, theXmax, theYmax, theZmax);
return true;
}
+GeomPointPtr GeomAPI_Shape::middlePoint() const
+{
+ GeomPointPtr aMiddlePoint;
+
+ switch (shapeType()) {
+ case VERTEX:
+ aMiddlePoint = vertex()->point();
+ break;
+ case EDGE:
+ aMiddlePoint = edge()->middlePoint();
+ break;
+ case WIRE:
+ aMiddlePoint = wire()->middlePoint();
+ break;
+ case FACE:
+ aMiddlePoint = face()->middlePoint();
+ break;
+ case SHELL:
+ aMiddlePoint = shell()->middlePoint();
+ break;
+ case SOLID:
+ aMiddlePoint = solid()->middlePoint();
+ break;
+ default: {
+ // get middle point as center of the bounding box
+ double aMinX, aMinY, aMinZ, aMaxX, aMaxY, aMaxZ;
+ computeSize(aMinX, aMinY, aMinZ, aMaxX, aMaxY, aMaxZ);
+ aMiddlePoint = GeomPointPtr(new GeomAPI_Pnt(
+ (aMinX + aMaxX) * 0.5, (aMinY + aMaxY) * 0.5, (aMinZ + aMaxZ) * 0.5));
+ }
+ }
+
+ return aMiddlePoint;
+}
+
+// LCOV_EXCL_START
std::string GeomAPI_Shape::getShapeStream() const
{
std::ostringstream aStream;
BRepTools::Write(aShape, aStream);
return aStream.str();
}
+// LCOV_EXCL_STOP
GeomShapePtr GeomAPI_Shape::intersect(const GeomShapePtr theShape) const
{
return false;
}
+
+bool GeomAPI_Shape::Comparator::operator()(const std::shared_ptr<GeomAPI_Shape>& theShape1,
+ const std::shared_ptr<GeomAPI_Shape>& theShape2) const
+{
+ return theShape1->impl<TopoDS_Shape>().TShape() < theShape2->impl<TopoDS_Shape>().TShape();
+}