]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/GeomAPI/GeomAPI_Shape.cpp
Salome HOME
Several improvement of the filters functionality, correct work with shapes types...
[modules/shaper.git] / src / GeomAPI / GeomAPI_Shape.cpp
index d7840b16832d8cb297b4b9a024d0098ef953a5c7..98bfdcf9ea22993bd7d5555c395f9ed1334b1078 100644 (file)
@@ -1,4 +1,4 @@
-// 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"
@@ -391,12 +390,29 @@ GeomAPI_Shape::subShapes(ShapeType theSubShapeType) const
   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;
 }
 
@@ -444,21 +460,21 @@ GeomAPI_Shape::ShapeType GeomAPI_Shape::shapeType() const
 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
 }
@@ -689,3 +705,9 @@ bool GeomAPI_Shape::isSelfIntersected(const int theLevelOfCheck) 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();
+}