+ // 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 = "Error: Boolean algorithm failed.";
+ setError(aFeatureError);
+ return;
+ }
+ if(aFuseAlgo->shape()->isNull()) {
+ static const std::string aShapeError = "Error: Resulting shape is Null.";
+ setError(aShapeError);
+ return;
+ }
+ if(!aFuseAlgo->isValid()) {
+ std::string aFeatureError = "Error: Resulting shape is not valid.";
+ setError(aFeatureError);
+ return;
+ }