+ return !aShape.IsNull() && aShape.ShapeType() == TopAbs_SOLID;
+}
+
+bool GeomAPI_Shape::isCompSolid() const
+{
+ const TopoDS_Shape& aShape = const_cast<GeomAPI_Shape*>(this)->impl<TopoDS_Shape>();
+ return !aShape.IsNull() && aShape.ShapeType() == TopAbs_COMPSOLID;
+}
+
+bool GeomAPI_Shape::isPlanar() const
+{
+ TopoDS_Shape aShape = impl<TopoDS_Shape>();
+
+ if(aShape.IsNull()) {
+ return false;
+ }
+
+ TopAbs_ShapeEnum aShapeType = aShape.ShapeType();
+ if(aShapeType == TopAbs_COMPOUND) {
+ TopoDS_Iterator anIt(aShape);
+ int aShNum = 0;
+ for(; anIt.More(); anIt.Next()) {
+ ++aShNum;
+ }
+ if(aShNum == 1) {
+ anIt.Initialize(aShape);
+ aShape = anIt.Value();
+ }
+ }
+
+ aShapeType = aShape.ShapeType();
+ if(aShapeType == TopAbs_VERTEX) {
+ return true;
+ } else if(aShapeType == TopAbs_FACE) {
+ const Handle(Geom_Surface)& aSurface = BRep_Tool::Surface(TopoDS::Face(aShape));
+ Handle(Standard_Type) aType = aSurface->DynamicType();
+
+ if(aType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
+ Handle(Geom_RectangularTrimmedSurface) aTrimSurface = Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface);
+ aType = aTrimSurface->BasisSurface()->DynamicType();
+ }
+ return (aType == STANDARD_TYPE(Geom_Plane)) == Standard_True;
+ } else {
+ 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(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;
+ }
+ }
+
+ return isFound;
+ }
+
+ return false;
+}
+
+GeomAPI_Shape::ShapeType GeomAPI_Shape::shapeType() const
+{
+ const TopoDS_Shape& aShape = impl<TopoDS_Shape>();
+
+ ShapeType aST = GeomAPI_Shape::SHAPE;
+
+ switch(aShape.ShapeType()) {
+ case TopAbs_COMPOUND:
+ aST = GeomAPI_Shape::COMPOUND;
+ break;
+ case TopAbs_COMPSOLID:
+ aST = GeomAPI_Shape::COMPSOLID;
+ break;
+ case TopAbs_SOLID:
+ aST = GeomAPI_Shape::SOLID;
+ break;
+ case TopAbs_SHELL:
+ aST = GeomAPI_Shape::SHELL;
+ break;
+ case TopAbs_FACE:
+ aST = GeomAPI_Shape::FACE;
+ break;
+ case TopAbs_WIRE:
+ aST = GeomAPI_Shape::WIRE;
+ break;
+ case TopAbs_EDGE:
+ aST = GeomAPI_Shape::EDGE;
+ break;
+ case TopAbs_VERTEX:
+ aST = GeomAPI_Shape::VERTEX;
+ break;
+ case TopAbs_SHAPE:
+ aST = GeomAPI_Shape::SHAPE;
+ break;
+ }
+
+ return aST;
+}
+
+std::string GeomAPI_Shape::shapeTypeStr() const
+{
+ ShapeType aShapeType = shapeType();
+ std::string aShapeTypeStr;
+
+ switch(aShapeType) {
+ case COMPOUND: {
+ aShapeTypeStr = "Compound";
+ break;
+ }
+ case COMPSOLID: {
+ aShapeTypeStr = "CompSolid";
+ break;
+ }
+ case SOLID: {
+ aShapeTypeStr = "Solid";
+ break;
+ }
+ case SHELL: {
+ aShapeTypeStr = "Shell";
+ break;
+ }
+ case FACE: {
+ aShapeTypeStr = "Face";
+ break;
+ }
+ case WIRE: {
+ aShapeTypeStr = "Wire";
+ break;
+ }
+ case EDGE: {
+ aShapeTypeStr = "Edge";
+ break;
+ }
+ case VERTEX: {
+ aShapeTypeStr = "Vertex";
+ break;
+ }
+ case SHAPE: {
+ aShapeTypeStr = "Shape";
+ break;
+ }
+ }
+
+ return aShapeTypeStr;
+}
+
+GeomAPI_Shape::Orientation GeomAPI_Shape::orientation() const
+{
+ TopAbs_Orientation anOrientation = MY_SHAPE->Orientation();
+
+ switch(anOrientation) {
+ case TopAbs_FORWARD: return FORWARD;
+ case TopAbs_REVERSED: return REVERSED;
+ case TopAbs_INTERNAL: return INTERNAL;
+ case TopAbs_EXTERNAL: return EXTERNAL;
+ default: return FORWARD;
+ }
+}
+
+void GeomAPI_Shape::setOrientation(const GeomAPI_Shape::Orientation theOrientation)
+{
+ TopAbs_Orientation anOrientation = MY_SHAPE->Orientation();
+
+ switch(theOrientation) {
+ case FORWARD: MY_SHAPE->Orientation(TopAbs_FORWARD); break;
+ case REVERSED: MY_SHAPE->Orientation(TopAbs_REVERSED); break;
+ case INTERNAL: MY_SHAPE->Orientation(TopAbs_INTERNAL); break;
+ case EXTERNAL: MY_SHAPE->Orientation(TopAbs_EXTERNAL); break;
+ }
+}
+
+bool GeomAPI_Shape::isSubShape(const std::shared_ptr<GeomAPI_Shape> theShape) const
+{
+ if(!theShape.get()) {
+ return false;
+ }
+
+ const TopoDS_Shape& aShapeToSearch = theShape->impl<TopoDS_Shape>();
+ if(aShapeToSearch.IsNull()) {
+ return false;
+ }
+
+ for(TopExp_Explorer anExp(*MY_SHAPE, aShapeToSearch.ShapeType()); anExp.More(); anExp.Next()) {
+ if(aShapeToSearch.IsEqual(anExp.Current())) {
+ return true;
+ }
+ }
+
+ return false;