Salome HOME
Issue #904 - Fatal error aftre delete sketch from dataset used in extrusion in part
[modules/shaper.git] / src / GeomAlgoAPI / GeomAlgoAPI_MakeShape.cpp
index 70cfad9f831744218604d9b6ffd778533a6f042e..140a0a5831a9ab7b95c3acb8b9e063f3622a6b02 100644 (file)
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
 // File:        GeomAlgoAPI_MakeShape.cpp
 // Created:     20 Oct 2014
 // Author:      Sergey ZARITCHNY
 
 #include <GeomAlgoAPI_MakeShape.h>
+
+#include <BOPAlgo_Builder.hxx>
 #include <BRepBuilderAPI_MakeShape.hxx>
+#include <BRepOffsetAPI_MakePipe.hxx>
+#include <TopExp_Explorer.hxx>
 #include <TopTools_ListOfShape.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
-GeomAlgoAPI_MakeShape::GeomAlgoAPI_MakeShape(void* theMkShape)
-  : GeomAPI_Interface(theMkShape),myShape(new GeomAPI_Shape())
+
+//=================================================================================================
+GeomAlgoAPI_MakeShape::GeomAlgoAPI_MakeShape(void* theMkShape, const AlgoType theAlgoType)
+: GeomAPI_Interface(theMkShape),
+  myAlgoType(theAlgoType),
+  myShape(new GeomAPI_Shape())
 {
-  myShape->setImpl((void *)&implPtr<BRepBuilderAPI_MakeShape>()->Shape());
+  switch (myAlgoType) {
+    case MakeShape:
+    case MakePipe: {
+      myShape->setImpl(new TopoDS_Shape(implPtr<BRepBuilderAPI_MakeShape>()->Shape()));
+      break;
+    }
+    case BOPAlgoBuilder: {
+      myShape->setImpl(new TopoDS_Shape(implPtr<BOPAlgo_Builder>()->Shape()));
+      break;
+    }
+  }
 }
 
-GeomAlgoAPI_MakeShape::GeomAlgoAPI_MakeShape()
-  : GeomAPI_Interface(),myShape(new GeomAPI_Shape())
-{}
-void GeomAlgoAPI_MakeShape::init(void* theMkShape)
+//=================================================================================================
+GeomAlgoAPI_MakeShape::GeomAlgoAPI_MakeShape(void* theMkShape,
+                                             const std::shared_ptr<GeomAPI_Shape> theWire,
+                                             const std::shared_ptr<GeomAPI_Shape> theBaseShape)
+: GeomAPI_Interface(theMkShape),
+  myAlgoType(MakePipe),
+  myShape(new GeomAPI_Shape()),
+  myWire(theWire),
+  myBaseShape(theBaseShape)
 {
-  setImpl((void *)implPtr<BRepBuilderAPI_MakeShape>());
+  myShape->setImpl(new TopoDS_Shape(implPtr<BRepOffsetAPI_MakePipe>()->Shape()));
 }
 
-const boost::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_MakeShape::shape() const
+//=================================================================================================
+const std::shared_ptr<GeomAPI_Shape> GeomAlgoAPI_MakeShape::shape() const
 {
   return myShape;
 }
 
-/// Returns the  list   of shapes generated   from the shape <theShape>
-void GeomAlgoAPI_MakeShape::generated(
-  const boost::shared_ptr<GeomAPI_Shape> theShape, ListOfShape& theHistory)
+//=================================================================================================
+void GeomAlgoAPI_MakeShape::generated(const std::shared_ptr<GeomAPI_Shape> theShape,
+                                      ListOfShape& theHistory)
 {
-  BRepBuilderAPI_MakeShape* aBuilder = implPtr<BRepBuilderAPI_MakeShape>();
-  if(aBuilder) {
-    const TopTools_ListOfShape& aList =  aBuilder->Generated(theShape->impl<TopoDS_Shape>());
-    TopTools_ListIteratorOfListOfShape it(aList);
-    for(;it.More();it.Next()) {
-      boost::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
-      aShape->setImpl(new TopoDS_Shape(it.Value()));
+  if(myAlgoType == MakePipe) {
+    BRepOffsetAPI_MakePipe* aMakePipe = implPtr<BRepOffsetAPI_MakePipe>();
+    TopExp_Explorer aShapeExplorer(myWire->impl<TopoDS_Wire>(), TopAbs_EDGE);
+    for (; aShapeExplorer.More(); aShapeExplorer.Next ()) {
+      const TopoDS_Shape& aSpine = aShapeExplorer.Current();
+      const TopoDS_Shape& aProfile = theShape->impl<TopoDS_Shape>();
+      if(aProfile.ShapeType() != TopAbs_EDGE && aProfile.ShapeType() != TopAbs_VERTEX) {
+          return;
+      }
+      const TopoDS_Shape& aBaseShape = myBaseShape->impl<TopoDS_Shape>();
+      TopExp_Explorer anExp(aBaseShape, aProfile.ShapeType());
+      Standard_Boolean hasShape = Standard_False;
+      for(; anExp.More(); anExp.Next()) {
+        if(anExp.Current().IsSame(aProfile)) {
+          hasShape = Standard_True;
+          break;
+        }
+      }
+      if(!hasShape) {
+        return;
+      }
+      const TopoDS_Shape& aGeneratedShape = aMakePipe->Generated(aSpine, aProfile);
+      std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
+      aShape->setImpl(new TopoDS_Shape(aGeneratedShape));
+      theHistory.push_back(aShape);
+    }
+  } else {
+    TopTools_ListOfShape aList;
+    if(myAlgoType == MakeShape) {
+      BRepBuilderAPI_MakeShape* aMakeShape = implPtr<BRepBuilderAPI_MakeShape>();
+      aList = aMakeShape->Generated(theShape->impl<TopoDS_Shape>());
+    } else if(myAlgoType == BOPAlgoBuilder) {
+      BOPAlgo_Builder* aBOPBuilder = implPtr<BOPAlgo_Builder>();
+      aList = aBOPBuilder->Generated(theShape->impl<TopoDS_Shape>());
+    }
+    for(TopTools_ListIteratorOfListOfShape anIt(aList); anIt.More(); anIt.Next()) {
+      std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
+      aShape->setImpl(new TopoDS_Shape(anIt.Value()));
       theHistory.push_back(aShape);
     }
   }
 }
 
-/// Returns the  list   of shapes modified   from the shape <theShape>
-void GeomAlgoAPI_MakeShape::modified(
-  const boost::shared_ptr<GeomAPI_Shape> theShape, ListOfShape& theHistory)
+//=================================================================================================
+void GeomAlgoAPI_MakeShape::modified(const std::shared_ptr<GeomAPI_Shape> theShape,
+                                     ListOfShape& theHistory)
 {
-  BRepBuilderAPI_MakeShape* aBuilder = implPtr<BRepBuilderAPI_MakeShape>();
-  if(aBuilder) {
-    const TopTools_ListOfShape& aList =  aBuilder->Modified(theShape->impl<TopoDS_Shape>());
-    TopTools_ListIteratorOfListOfShape it(aList);
-    for(;it.More();it.Next()) {
-      boost::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
-      aShape->setImpl(new TopoDS_Shape(it.Value()));
-      theHistory.push_back(aShape);
-    }
+  TopTools_ListOfShape aList;
+  if(myAlgoType == MakeShape) {
+    BRepBuilderAPI_MakeShape* aMakeShape = implPtr<BRepBuilderAPI_MakeShape>();
+    aList = aMakeShape->Modified(theShape->impl<TopoDS_Shape>());
+  } else if(myAlgoType == BOPAlgoBuilder) {
+    BOPAlgo_Builder* aBOPBuilder = implPtr<BOPAlgo_Builder>();
+    aList = aBOPBuilder->Modified(theShape->impl<TopoDS_Shape>());
+  }
+  for(TopTools_ListIteratorOfListOfShape anIt(aList); anIt.More(); anIt.Next()) {
+    std::shared_ptr<GeomAPI_Shape> aShape(new GeomAPI_Shape());
+    aShape->setImpl(new TopoDS_Shape(anIt.Value()));
+    theHistory.push_back(aShape);
   }
 }
 
-/// Returns whether the shape is an edge
-bool GeomAlgoAPI_MakeShape::isDeleted(const boost::shared_ptr<GeomAPI_Shape> theShape)
+//=================================================================================================
+bool GeomAlgoAPI_MakeShape::isDeleted(const std::shared_ptr<GeomAPI_Shape> theShape)
 {
-  bool isDeleted(false);
-  BRepBuilderAPI_MakeShape* aBuilder = implPtr<BRepBuilderAPI_MakeShape>();
-  if(aBuilder) {
-    isDeleted = aBuilder->IsDeleted(theShape->impl<TopoDS_Shape>()) == Standard_True;
+  bool isDeleted = false;
+  if(myAlgoType == MakeShape) {
+    BRepBuilderAPI_MakeShape* aMakeShape = implPtr<BRepBuilderAPI_MakeShape>();
+    isDeleted = aMakeShape->IsDeleted(theShape->impl<TopoDS_Shape>()) == Standard_True;
+  } else if(myAlgoType == BOPAlgoBuilder) {
+    BOPAlgo_Builder* aBOPBuilder = implPtr<BOPAlgo_Builder>();
+    isDeleted = aBOPBuilder->IsDeleted(theShape->impl<TopoDS_Shape>()) == Standard_True;
   }
+
   return isDeleted;
 }