-// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
-
-// File: GeomAPI_Shape.cpp
-// Created: 23 Apr 2014
-// Author: Mikhail PONIKAROV
+// 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<mailto:webmaster.salome@opencascade.com>
+//
#include "GeomAPI_Shape.h"
#include <BRep_Tool.hxx>
+#include <BRepAlgoAPI_Section.hxx>
#include <BRepBndLib.hxx>
#include <BRepBuilderAPI_FindPlane.hxx>
+#include <BRepExtrema_DistShapeShape.hxx>
#include <BRepTools.hxx>
#include <Bnd_Box.hxx>
#include <Geom_Circle.hxx>
#include <NCollection_List.hxx>
#include <sstream>
+#include <algorithm> // for std::transform
+
+#include <BRepTools.hxx>
#define MY_SHAPE implPtr<TopoDS_Shape>()
return MY_SHAPE->IsEqual(theShape->impl<TopoDS_Shape>()) == Standard_True;
}
+bool GeomAPI_Shape::isSame(const std::shared_ptr<GeomAPI_Shape> theShape) const
+{
+ if (!theShape.get())
+ return false;
+ if (isNull())
+ return theShape->isNull();
+ if (theShape->isNull())
+ return false;
+
+ return MY_SHAPE->IsSame(theShape->impl<TopoDS_Shape>()) == Standard_True;
+}
+
bool GeomAPI_Shape::isVertex() const
{
const TopoDS_Shape& aShape = const_cast<GeomAPI_Shape*>(this)->impl<TopoDS_Shape>();
return !aShape.IsNull() && aShape.ShapeType() == TopAbs_EDGE;
}
+bool GeomAPI_Shape::isWire() const
+{
+ const TopoDS_Shape& aShape = const_cast<GeomAPI_Shape*>(this)->impl<TopoDS_Shape>();
+ return !aShape.IsNull() && aShape.ShapeType() == TopAbs_WIRE;
+}
+
bool GeomAPI_Shape::isFace() const
{
const TopoDS_Shape& aShape = const_cast<GeomAPI_Shape*>(this)->impl<TopoDS_Shape>();
if (aShape.IsNull() || aShape.ShapeType() != TopAbs_COMPOUND)
return false;
// list of simple elements that are not detected in connection to others
- NCollection_List<TopoDS_Shape> aNotConnected;
+ NCollection_List<TopoDS_Shape> aNotConnected;
addSimpleToList(aShape, aNotConnected);
if (aNotConnected.IsEmpty()) // an empty compound
return false;
bool aConnected = false;
NCollection_List<TopoDS_Shape>::Iterator aNewIter(aNewConnected);
for(; !aConnected && aNewIter.More(); aNewIter.Next()) {
- // checking topological connecion of aNotIter and aNewIter
+ // checking topological connecion of aNotIter and aNewIter
// (if shapes are connected, vertices are connected for sure)
TopExp_Explorer anExp2(aNewIter.Value(), TopAbs_VERTEX);
for(; !aConnected && anExp2.More(); anExp2.Next()) {
return aST;
}
+GeomAPI_Shape::ShapeType GeomAPI_Shape::shapeTypeByStr(std::string theType)
+{
+ std::transform(theType.begin(), theType.end(), theType.begin(), ::toupper);
+ if (theType == "COMPOUND")
+ return COMPOUND;
+ if (theType == "COMPSOLID")
+ return COMPSOLID;
+ if (theType == "SOLID")
+ return SOLID;
+ if (theType == "SHELL")
+ return SHELL;
+ if (theType == "FACE")
+ return FACE;
+ if (theType == "WIRE")
+ return WIRE;
+ if (theType == "EDGE")
+ return EDGE;
+ if (theType == "VERTEX")
+ return VERTEX;
+ return SHAPE; // default
+}
+
std::string GeomAPI_Shape::shapeTypeStr() const
{
ShapeType aShapeType = shapeType();
}
}
-bool GeomAPI_Shape::isSubShape(const std::shared_ptr<GeomAPI_Shape> theShape) const
+void GeomAPI_Shape::reverse()
+{
+ MY_SHAPE->Reverse();
+}
+
+bool GeomAPI_Shape::isSubShape(const std::shared_ptr<GeomAPI_Shape> theShape,
+ const bool theCheckOrientation) const
{
if(!theShape.get()) {
return false;
}
for(TopExp_Explorer anExp(*MY_SHAPE, aShapeToSearch.ShapeType()); anExp.More(); anExp.Next()) {
- if(aShapeToSearch.IsEqual(anExp.Current())) {
+ if(theCheckOrientation ?
+ aShapeToSearch.IsEqual(anExp.Current()) : aShapeToSearch.IsSame(anExp.Current())) {
return true;
}
}
BRepTools::Write(aShape, aStream);
return aStream.str();
}
+
+GeomShapePtr GeomAPI_Shape::intersect(const GeomShapePtr theShape) const
+{
+ const TopoDS_Shape& aShape1 = const_cast<GeomAPI_Shape*>(this)->impl<TopoDS_Shape>();
+ const TopoDS_Shape& aShape2 = theShape->impl<TopoDS_Shape>();
+
+ BRepAlgoAPI_Section aCommon(aShape1, aShape2);
+ if (!aCommon.IsDone())
+ return GeomShapePtr();
+
+ TopoDS_Shape aResult = aCommon.Shape();
+ if (aResult.ShapeType() == TopAbs_COMPOUND) {
+ NCollection_List<TopoDS_Shape> aSubs;
+ addSimpleToList(aResult, aSubs);
+ if(aSubs.Size() == 1) {
+ aResult = aSubs.First();
+ } else if(aSubs.Size() == 0) {
+ return GeomShapePtr();
+ }
+ }
+
+ GeomShapePtr aResShape(new GeomAPI_Shape);
+ aResShape->setImpl(new TopoDS_Shape(aResult));
+ return aResShape;
+}
+
+bool GeomAPI_Shape::isIntersect(const GeomShapePtr theShape) const
+{
+ if(!theShape.get()) {
+ return false;
+ }
+
+ const TopoDS_Shape& aShape1 = const_cast<GeomAPI_Shape*>(this)->impl<TopoDS_Shape>();
+ const TopoDS_Shape& aShape2 = theShape->impl<TopoDS_Shape>();
+
+ BRepExtrema_DistShapeShape aDist(aShape1, aShape2);
+ aDist.Perform();
+ if(aDist.IsDone() && aDist.Value() < Precision::Confusion()) {
+ return true;
+ }
+
+ return false;
+}
+
+void GeomAPI_Shape::translate(const std::shared_ptr<GeomAPI_Dir> theDir, const double theOffset)
+{
+ gp_Dir aDir = theDir->impl<gp_Dir>();
+ gp_Vec aTrsfVec(aDir.XYZ() * theOffset);
+ gp_Trsf aTranslation;
+ aTranslation.SetTranslation(aTrsfVec);
+ TopoDS_Shape aResult = MY_SHAPE->Moved(aTranslation);
+ setImpl(new TopoDS_Shape(aResult));
+}