+
+ ListOfShape anOriginalShapes = aSolidsToFuse;
+ anOriginalShapes.insert(anOriginalShapes.end(), aShapesToAdd.begin(), aShapesToAdd.end());
+
+ // Cut edges and faces(if we have any) with solids.
+ GeomAlgoAPI_MakeShapeList aMakeShapeList;
+ GeomAPI_DataMapOfShapeShape aMapOfShapes;
+ std::shared_ptr<GeomAPI_Shape> aCuttedEdgesAndFaces;
+ if(!anEdgesAndFaces.empty()) {
+ std::shared_ptr<GeomAlgoAPI_Boolean> aCutAlgo(new GeomAlgoAPI_Boolean(anEdgesAndFaces, anOriginalShapes, GeomAlgoAPI_Boolean::BOOL_CUT));
+ if(aCutAlgo->isDone()) {
+ aCuttedEdgesAndFaces = aCutAlgo->shape();
+ aMakeShapeList.appendAlgo(aCutAlgo);
+ aMapOfShapes.merge(aCutAlgo->mapOfSubShapes());
+ }
+ }
+ anOriginalShapes.insert(anOriginalShapes.end(), anEdgesAndFaces.begin(), anEdgesAndFaces.end());
+
+ // If we have compsolids then cut with not used solids all others.
+ if(!aShapesToAdd.empty()) {
+ aSolidsToFuse.clear();
+ for(ListOfShape::iterator anIt = anOriginalShapes.begin(); anIt != anOriginalShapes.end(); anIt++) {
+ ListOfShape aOneObjectList;
+ aOneObjectList.push_back(*anIt);
+ std::shared_ptr<GeomAlgoAPI_Boolean> aCutAlgo(new GeomAlgoAPI_Boolean(aOneObjectList, aShapesToAdd, GeomAlgoAPI_Boolean::BOOL_CUT));
+
+ if(GeomAlgoAPI_ShapeTools::volume(aCutAlgo->shape()) > 1.e-7) {
+ aSolidsToFuse.push_back(aCutAlgo->shape());
+ aMakeShapeList.appendAlgo(aCutAlgo);
+ aMapOfShapes.merge(aCutAlgo->mapOfSubShapes());
+ }
+ }
+ }
+
+ if(!aSolidsToFuse.empty()) {
+ anObjects.clear();
+ anObjects.push_back(aSolidsToFuse.back());
+ aSolidsToFuse.pop_back();
+ aTools = aSolidsToFuse;
+ }
+
+ // Fuse all objects and all tools.
+ std::shared_ptr<GeomAPI_Shape> aShape;
+ if(anObjects.size() == 1 && aTools.empty()) {
+ aShape = anObjects.front();
+ } else if(anObjects.empty() && aTools.size() == 1) {
+ aShape = aTools.front();
+ } else if((anObjects.size() + aTools.size()) > 1){
+ std::shared_ptr<GeomAlgoAPI_Boolean> aFuseAlgo(new GeomAlgoAPI_Boolean(anObjects, aTools, aType));
+
+ // Checking that the algorithm worked properly.
+ if(!aFuseAlgo->isDone()) {
+ static const std::string aFeatureError = "Boolean algorithm failed";
+ setError(aFeatureError);
+ return;
+ }
+ if(aFuseAlgo->shape()->isNull()) {
+ static const std::string aShapeError = "Resulting shape is Null";
+ setError(aShapeError);
+ return;
+ }
+ if(!aFuseAlgo->isValid()) {
+ std::string aFeatureError = "Warning: resulting shape is not valid";
+ setError(aFeatureError);
+ return;
+ }
+
+ aShape = aFuseAlgo->shape();
+ aMakeShapeList.appendAlgo(aFuseAlgo);
+ aMapOfShapes.merge(aFuseAlgo->mapOfSubShapes());