]> SALOME platform Git repositories - modules/shaper.git/blobdiff - src/FiltersPlugin/FiltersPlugin_Selection.cpp
Salome HOME
Issue #3141 implementation : Allow usage of the same filters many times
[modules/shaper.git] / src / FiltersPlugin / FiltersPlugin_Selection.cpp
index 7fe056aba5aee9fadbf2b5d2f65023ac9b21a4e8..23343cf617bd5ce7bda89e65c0769dfe518233c8 100644 (file)
 #include <ModelAPI_AttributeSelectionList.h>
 #include <ModelAPI_FiltersFactory.h>
 #include <ModelAPI_Session.h>
+#include <sstream>
 
 // identifier of the reverse flag of a filter
 static const std::string kReverseAttrID("");
 
-void FiltersPlugin_Selection::addFilter(const std::string theFilterID)
+std::string FiltersPlugin_Selection::addFilter(const std::string theFilterID)
 {
   ModelAPI_FiltersFactory* aFactory = ModelAPI_Session::get()->filters();
   FilterPtr aFilter = aFactory->filter(theFilterID);
+
+  std::string aFilterID = theFilterID;
+  if (aFilter->isMultiple()) { // check that there is already such filter, so, increment ID
+    std::list<std::string> aFilters;
+    data()->allGroups(aFilters);
+    for(int anID = 0; true; anID++) {
+      if (anID != 0) {
+        std::ostringstream aStream;
+        aStream<<"_"<<anID<<"_"<<theFilterID;
+        aFilterID = aStream.str();
+      }
+      std::list<std::string>::iterator aFiltersIDs = aFilters.begin();
+      for(; aFiltersIDs != aFilters.end(); aFiltersIDs++) {
+        if (*aFiltersIDs == aFilterID)
+          break;
+      }
+      if (aFiltersIDs == aFilters.end())
+        break;
+    }
+  }
+
   if (aFilter.get()) {
     std::shared_ptr<ModelAPI_AttributeBoolean> aBool =
       std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(data()->addFloatingAttribute(
-        kReverseAttrID, ModelAPI_AttributeBoolean::typeId(), theFilterID));
+        kReverseAttrID, ModelAPI_AttributeBoolean::typeId(), aFilterID));
     aBool->setValue(false); // not reversed by default
     // to add attributes related to the filter
     ModelAPI_FiltersArgs anArgs;
     anArgs.setFeature(std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(data()->owner()));
-    anArgs.setFilter(theFilterID);
+    anArgs.setFilter(aFilterID);
     aFilter->initAttributes(anArgs);
   }
+  return aFilterID;
 }
 
 void FiltersPlugin_Selection::removeFilter(const std::string theFilterID)