Salome HOME
updated copyright message
[modules/shaper.git] / src / FiltersAPI / FiltersAPI_Feature.cpp
1 // Copyright (C) 2014-2023  CEA/DEN, EDF R&D
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "FiltersAPI_Feature.h"
21
22 #include <ModelAPI_Feature.h>
23 #include <ModelAPI_FiltersFactory.h>
24 #include <ModelAPI_Session.h>
25
26 #include <ModelHighAPI_Dumper.h>
27 #include <ModelHighAPI_Tools.h>
28
29 FiltersAPI_Feature::FiltersAPI_Feature(
30     const std::shared_ptr<ModelAPI_Feature> & theFeature)
31 : ModelHighAPI_Interface(theFeature)
32 {
33   initialize();
34   std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(theFeature)->initAttributes();
35 }
36
37 FiltersAPI_Feature::~FiltersAPI_Feature()
38 {
39 }
40
41 static void separateArguments(const std::list<FiltersAPI_Argument>& theArguments,
42                               std::list<ModelHighAPI_Selection>& theSelections,
43                               std::list<std::string>& theTextArgs,
44                               std::list<bool>& theBoolArgs,
45                               std::list<ModelHighAPI_Double>& theDoubleArgs)
46 {
47   std::list<FiltersAPI_Argument>::const_iterator anIt = theArguments.begin();
48   for (; anIt != theArguments.end(); ++anIt) {
49     if (anIt->selection().variantType() != ModelHighAPI_Selection::VT_Empty)
50       theSelections.push_back(anIt->selection());
51     else if (anIt->dble().value() > std::numeric_limits<double>::lowest()) {
52       theDoubleArgs.push_back(anIt->dble());
53     }
54     else if (anIt->string().empty()) {
55       theBoolArgs.push_back(anIt->boolean());
56     }
57     else
58       theTextArgs.push_back(anIt->string());
59   }
60 }
61
62 void FiltersAPI_Feature::setFilters(const std::list<FilterAPIPtr>& theFilters)
63 {
64   FiltersFeaturePtr aBase = std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(feature());
65   for (std::list<FilterAPIPtr>::const_iterator anIt = theFilters.begin();
66        anIt != theFilters.end(); ++anIt) {
67     std::string aFilterID = aBase->addFilter((*anIt)->name());
68     aBase->setReversed(aFilterID, (*anIt)->isReversed());
69
70     const std::list<FiltersAPI_Argument>& anArgs = (*anIt)->arguments();
71     if (!anArgs.empty()) {
72       // separate selection arguments and strings
73       std::list<ModelHighAPI_Selection> aSelections;
74       std::list<std::string> aTexts;
75       std::list<bool> aBools;
76       std::list<ModelHighAPI_Double> aDoubles;
77       separateArguments(anArgs, aSelections, aTexts, aBools, aDoubles);
78
79       std::list<AttributePtr> aFilterArgs = aBase->filterArgs(aFilterID);
80       std::list<AttributePtr>::iterator aFIt = aFilterArgs.begin();
81       // first boolean argument is always "Reversed" flag
82       AttributeBooleanPtr aReversedFlag =
83           std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(*aFIt);
84       if (aReversedFlag)
85         ++aFIt;
86       // fill arguments of the filter
87       std::list<ModelHighAPI_Double>::const_iterator anItDle = aDoubles.begin();
88       for (; aFIt != aFilterArgs.end(); ++aFIt) {
89         AttributeSelectionListPtr aSelList =
90             std::dynamic_pointer_cast<ModelAPI_AttributeSelectionList>(*aFIt);
91         if (aSelList)
92           fillAttribute(aSelections, aSelList);
93         else {
94           AttributeSelectionPtr aSelection =
95               std::dynamic_pointer_cast<ModelAPI_AttributeSelection>(*aFIt);
96           if (aSelection && aSelections.size() == 1)
97             fillAttribute(aSelections.front(), aSelection);
98           else {
99             AttributeStringPtr aString =
100                 std::dynamic_pointer_cast<ModelAPI_AttributeString>(*aFIt);
101             if (aString) {
102               if (aTexts.size() == 1)
103                 fillAttribute(aTexts.front(), aString);
104             }
105             else {
106               AttributeBooleanPtr aBoolean =
107                   std::dynamic_pointer_cast<ModelAPI_AttributeBoolean>(*aFIt);
108               if (aBoolean) {
109                 if (aBools.size() == 1)
110                   fillAttribute(aBools.front(), aBoolean);
111               } else {
112                 AttributeDoublePtr aDouble =
113                     std::dynamic_pointer_cast<ModelAPI_AttributeDouble>(*aFIt);
114                 if (aDouble) {
115                   fillAttribute((*anItDle).value(), aDouble);
116                   anItDle++;
117                 }
118               }
119             }
120           }
121         }
122       }
123     }
124   }
125 }
126
127 void FiltersAPI_Feature::dump(ModelHighAPI_Dumper& theDumper) const
128 {
129   FiltersFeaturePtr aBase = std::dynamic_pointer_cast<ModelAPI_FiltersFeature>(feature());
130   if (!aBase)
131     return;
132
133   const std::string& aDocName = theDumper.name(aBase->document());
134   theDumper << "model.filters(" << aDocName << ", [";
135
136   ModelAPI_FiltersFactory* aFFactory = ModelAPI_Session::get()->filters();
137   std::list<std::string> aFilters = aBase->filters();
138   for (std::list<std::string>::iterator aFIt = aFilters.begin(); aFIt != aFilters.end(); ++aFIt) {
139     // for multiple filters get original id
140     std::string aFilterKind = aFFactory->id(aFFactory->filter(*aFIt));
141     FiltersAPI_Filter aFilter(aFilterKind, aBase->filterArgs(*aFIt));
142     if (aFIt != aFilters.begin())
143       theDumper << ", ";
144     aFilter.dump(theDumper);
145   }
146
147   theDumper << "])";
148 }