]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/GeomAlgoAPI/GeomAlgoAPI_Sewing.cpp
Salome HOME
support legacy code when building a shell
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_Sewing.cpp
index 18236bd52f37719217d74eb13a39880414269d9d..cde8184494bb5a4c8451c20c05e2c7e6184342d1 100644 (file)
 //==================================================================================================
 GeomAlgoAPI_Sewing::GeomAlgoAPI_Sewing(const ListOfShape& theShapes)
 {
+  myBuildShell = true;
   build(theShapes);
 }
 
 GeomAlgoAPI_Sewing::GeomAlgoAPI_Sewing(const ListOfShape& theShapes, const bool theAllowNonManifold, const double theTolerance)
 {
+  myBuildShell = false;
   build(theShapes, theAllowNonManifold, theTolerance);
 }
 
@@ -46,10 +48,13 @@ void GeomAlgoAPI_Sewing::build(const ListOfShape& theShapes, const bool theAllow
   BRepBuilderAPI_Sewing* aSewingBuilder = new BRepBuilderAPI_Sewing();
   this->setImpl(aSewingBuilder);
 
-  aSewingBuilder->SetTolerance(theTolerance);
-  aSewingBuilder->SetFaceMode(Standard_True);
-  aSewingBuilder->SetFloatingEdgesMode(Standard_False);
-  aSewingBuilder->SetNonManifoldMode(theAllowNonManifold);
+  if (!myBuildShell)
+  {
+    aSewingBuilder->SetTolerance(theTolerance);
+    aSewingBuilder->SetFaceMode(Standard_True);
+    aSewingBuilder->SetFloatingEdgesMode(Standard_False);
+    aSewingBuilder->SetNonManifoldMode(theAllowNonManifold);
+  }
 
   for(ListOfShape::const_iterator anIt = theShapes.cbegin(); anIt != theShapes.cend(); ++anIt) {
     const TopoDS_Shape& aShape = (*anIt)->impl<TopoDS_Shape>();
@@ -59,6 +64,31 @@ void GeomAlgoAPI_Sewing::build(const ListOfShape& theShapes, const bool theAllow
   aSewingBuilder->Perform();
 
   TopoDS_Shape aResult = aSewingBuilder->SewedShape();
+  if (myBuildShell)
+  {
+    BRep_Builder aBuilder;
+    if(aResult.ShapeType() == TopAbs_COMPOUND) {
+      TopoDS_Compound aResultCompound;
+      aBuilder.MakeCompound(aResultCompound);
+      for(TopoDS_Iterator anIt(aResult); anIt.More(); anIt.Next()) {
+        const TopoDS_Shape aSubShape = anIt.Value();
+        if(aSubShape.ShapeType() == TopAbs_SHELL) {
+          aBuilder.Add(aResultCompound, aSubShape);
+        } else if (aSubShape.ShapeType() == TopAbs_FACE) {
+          TopoDS_Shell aShell;
+          aBuilder.MakeShell(aShell);
+          aBuilder.Add(aShell, aSubShape);
+          aBuilder.Add(aResultCompound, aShell);
+        }
+      }
+      aResult = aResultCompound;
+    } else if(aResult.ShapeType() == TopAbs_FACE) {
+      TopoDS_Shell aShell;
+      aBuilder.MakeShell(aShell);
+      aBuilder.Add(aShell, aResult);
+      aResult = aShell;
+    }
+  }
 
   std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
   aShape->setImpl(new TopoDS_Shape(aResult));