1 // Copyright (C) 2014-2019 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "FiltersAPI_Feature.h"
22 #include <ModelAPI_Feature.h>
24 #include <ModelHighAPI_Dumper.h>
25 #include <ModelHighAPI_Tools.h>
27 FiltersAPI_Feature::FiltersAPI_Feature(
28 const std::shared_ptr<ModelAPI_Feature> & theFeature)
29 : ModelHighAPI_Interface(theFeature)
32 std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(theFeature)->initAttributes();
35 FiltersAPI_Feature::~FiltersAPI_Feature()
39 static void separateArguments(const std::list<FiltersAPI_Argument>& theArguments,
40 std::list<ModelHighAPI_Selection>& theSelections,
41 std::list<std::string>& theTextArgs,
42 std::list<bool>& theBoolArgs)
44 std::list<FiltersAPI_Argument>::const_iterator anIt = theArguments.begin();
45 for (; anIt != theArguments.end(); ++anIt) {
46 if (anIt->selection().variantType() != ModelHighAPI_Selection::VT_Empty)
47 theSelections.push_back(anIt->selection());
48 else if (anIt->string().empty())
49 theBoolArgs.push_back(anIt->boolean());
51 theTextArgs.push_back(anIt->string());
55 void FiltersAPI_Feature::setFilters(const std::list<FilterAPIPtr>& theFilters)
57 FiltersFeaturePtr aBase = std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(feature());
58 for (std::list<FilterAPIPtr>::const_iterator anIt = theFilters.begin();
59 anIt != theFilters.end(); ++anIt) {
60 aBase->addFilter((*anIt)->name());
61 aBase->setReversed((*anIt)->name(), (*anIt)->isReversed());
63 const std::list<FiltersAPI_Argument>& anArgs = (*anIt)->arguments();
64 if (!anArgs.empty()) {
65 // separate selection arguments and strings
66 std::list<ModelHighAPI_Selection> aSelections;
67 std::list<std::string> aTexts;
68 std::list<bool> aBools;
69 separateArguments(anArgs, aSelections, aTexts, aBools);
71 std::list<AttributePtr> aFilterArgs = aBase->filterArgs((*anIt)->name());
72 std::list<AttributePtr>::iterator aFIt = aFilterArgs.begin();
73 // first boolean argument is always "Reversed" flag
74 AttributeBooleanPtr aReversedFlag =
75 std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(*aFIt);
78 // fill arguments of the filter
79 for (; aFIt != aFilterArgs.end(); ++aFIt) {
80 AttributeSelectionListPtr aSelList =
81 std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(*aFIt);
83 fillAttribute(aSelections, aSelList);
85 AttributeSelectionPtr aSelection =
86 std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(*aFIt);
87 if (aSelection && aSelections.size() == 1)
88 fillAttribute(aSelections.front(), aSelection);
90 AttributeStringPtr aString =
91 std::dynamic_pointer_cast<ModelAPI_AttributeString>(*aFIt);
93 if (aTexts.size() == 1)
94 fillAttribute(aTexts.front(), aString);
97 AttributeBooleanPtr aBoolean =
98 std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(*aFIt);
99 if (aBoolean && aBools.size() == 1)
100 fillAttribute(aBools.front(), aBoolean);
109 void FiltersAPI_Feature::dump(ModelHighAPI_Dumper& theDumper) const
111 FiltersFeaturePtr aBase = std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(feature());
115 const std::string& aDocName = theDumper.name(aBase->document());
116 theDumper << "model.filters(" << aDocName << ", [";
118 std::list<std::string> aFilters = aBase->filters();
119 for (std::list<std::string>::iterator aFIt = aFilters.begin(); aFIt != aFilters.end(); ++aFIt) {
120 FiltersAPI_Filter aFilter(*aFIt, aBase->filterArgs(*aFIt));
121 if (aFIt != aFilters.begin())
123 aFilter.dump(theDumper);