]> SALOME platform Git repositories - modules/shaper.git/blob - src/ModelHighAPI/ModelHighAPI_Selection.cpp
Salome HOME
Merge remote-tracking branch 'origin/Custom_Fitter' into CEA_2019
[modules/shaper.git] / src / ModelHighAPI / ModelHighAPI_Selection.cpp
1 // Copyright (C) 2014-2019  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 "ModelHighAPI_Selection.h"
21
22 #include <ModelAPI_AttributeDouble.h>
23 #include <ModelAPI_AttributeIntArray.h>
24 #include <ModelAPI_AttributeSelection.h>
25 #include <ModelAPI_AttributeSelectionList.h>
26 #include <ModelAPI_Feature.h>
27 #include <ModelAPI_ResultBody.h>
28
29
30 #include <GeomAPI_Pnt.h>
31 //--------------------------------------------------------------------------------------
32
33 //--------------------------------------------------------------------------------------
34 ModelHighAPI_Selection::ModelHighAPI_Selection()
35 : myVariantType(VT_Empty)
36 {
37 }
38
39 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::shared_ptr<ModelAPI_Result>& theContext,
40                                                const std::shared_ptr<GeomAPI_Shape>& theSubShape)
41 : myVariantType(VT_ResultSubShapePair)
42 , myResultSubShapePair(theContext, theSubShape)
43 {
44 }
45
46 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
47                                                const std::string& theSubShapeName)
48 : myVariantType(VT_TypeSubShapeNamePair)
49 , myTypeSubShapeNamePair(theType, theSubShapeName)
50 {
51 }
52
53 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
54                                                const GeomPointPtr& theSubShapeInnerPoint)
55 : myVariantType(VT_TypeInnerPointPair)
56 , myTypeInnerPointPair(theType, theSubShapeInnerPoint)
57 {
58 }
59
60 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
61                                                const std::list<double>& theSubShapeInnerPoint)
62 : myVariantType(VT_TypeInnerPointPair)
63 {
64   double aCoordinates[3] = { 0.0, 0.0, 0.0 };
65   double* aCIt = aCoordinates;
66   std::list<double>::const_iterator aPIt = theSubShapeInnerPoint.begin();
67   for (; aPIt != theSubShapeInnerPoint.end(); ++aPIt, ++aCIt)
68     *aCIt = *aPIt;
69
70   GeomPointPtr anInnerPoint(new GeomAPI_Pnt(aCoordinates[0], aCoordinates[1], aCoordinates[2]));
71   myTypeInnerPointPair = std::pair<std::string, GeomPointPtr>(theType, anInnerPoint);
72 }
73
74 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
75   const std::string& theContextName, const int theIndex)
76   : myVariantType(VT_WeakNamingPair)
77   , myWeakNamingPair(theType, std::pair<std::string, int>(theContextName, theIndex))
78 {
79 }
80
81
82 ModelHighAPI_Selection::~ModelHighAPI_Selection()
83 {
84 }
85
86 //--------------------------------------------------------------------------------------
87 void ModelHighAPI_Selection::fillAttribute(
88     const std::shared_ptr<ModelAPI_AttributeSelection> & theAttribute) const
89 {
90   switch(myVariantType) {
91     case VT_Empty: return;
92     case VT_ResultSubShapePair:
93       theAttribute->setValue(myResultSubShapePair.first, myResultSubShapePair.second);
94       return;
95     case VT_TypeSubShapeNamePair:
96       theAttribute->selectSubShape(myTypeSubShapeNamePair.first, myTypeSubShapeNamePair.second);
97       break;
98     case VT_TypeInnerPointPair:
99       theAttribute->selectSubShape(myTypeInnerPointPair.first, myTypeInnerPointPair.second);
100       return;
101     case VT_WeakNamingPair:
102       theAttribute->selectSubShape(
103         myWeakNamingPair.first, myWeakNamingPair.second.first, myWeakNamingPair.second.second);
104       break;
105   }
106
107   if (theAttribute->isInvalid()) {
108     FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner());
109     aFeature->setError(
110       std::string("Error: attribute \"") + theAttribute->id() + std::string("\" is invalid."));
111   }
112 }
113
114 //--------------------------------------------------------------------------------------
115 void ModelHighAPI_Selection::appendToList(
116     const std::shared_ptr<ModelAPI_AttributeSelectionList> & theAttribute) const
117 {
118   switch(myVariantType) {
119     case VT_Empty: return;
120     case VT_ResultSubShapePair:
121       theAttribute->append(myResultSubShapePair.first, myResultSubShapePair.second);
122       return;
123     case VT_TypeSubShapeNamePair:
124       // Note: the reverse order (first - type, second - sub-shape name)
125       theAttribute->append(myTypeSubShapeNamePair.second, myTypeSubShapeNamePair.first);
126       return;
127     case VT_TypeInnerPointPair:
128       // Note: the reverse order (first - type, second - selected point)
129       theAttribute->append(myTypeInnerPointPair.second, myTypeInnerPointPair.first);
130       return;
131     case VT_WeakNamingPair:
132       // Note: the reverse order (first - type, second - selected point)
133       theAttribute->append(
134         myWeakNamingPair.first, myWeakNamingPair.second.first, myWeakNamingPair.second.second);
135       return;
136     case VT_Filtering:
137       theAttribute->setFilters(myFilterFeature);
138       return;
139   }
140 }
141
142 //==================================================================================================
143 ModelHighAPI_Selection::VariantType ModelHighAPI_Selection::variantType() const
144 {
145   return myVariantType;
146 }
147
148 //==================================================================================================
149 ResultSubShapePair ModelHighAPI_Selection::resultSubShapePair() const
150 {
151   return myResultSubShapePair;
152 }
153
154 //==================================================================================================
155 TypeSubShapeNamePair ModelHighAPI_Selection::typeSubShapeNamePair() const
156 {
157   return myTypeSubShapeNamePair;
158 }
159
160 //==================================================================================================
161 TypeInnerPointPair ModelHighAPI_Selection::typeInnerPointPair() const
162 {
163   return myTypeInnerPointPair;
164 }
165
166 //==================================================================================================
167 TypeWeakNamingPair ModelHighAPI_Selection::typeWeakNamingPair() const
168 {
169   return myWeakNamingPair;
170 }
171
172 //==================================================================================================
173 std::string ModelHighAPI_Selection::shapeType() const
174 {
175   switch(myVariantType) {
176   case VT_ResultSubShapePair:
177     return myResultSubShapePair.second.get() ? myResultSubShapePair.second->shapeTypeStr() :
178                                                myResultSubShapePair.first->shape()->shapeTypeStr();
179   case VT_TypeSubShapeNamePair: return myTypeSubShapeNamePair.first;
180   case VT_TypeInnerPointPair: return myTypeInnerPointPair.first;
181   }
182
183   return "SHAPE";
184 }
185
186 //==================================================================================================
187 void ModelHighAPI_Selection::setName(const std::string& theName)
188 {
189   if (myVariantType == VT_ResultSubShapePair) {
190     std::shared_ptr<ModelAPI_Result> aResult = myResultSubShapePair.first;
191     if(!aResult.get()) {
192       return;
193     }
194     aResult->data()->setName(theName);
195   }
196 }
197
198 std::string ModelHighAPI_Selection::name() const
199 {
200   if (myVariantType == VT_ResultSubShapePair) {
201     std::shared_ptr<ModelAPI_Result> aResult = myResultSubShapePair.first;
202     if (aResult.get())
203       return aResult->data()->name();
204   }
205   return std::string();
206 }
207
208 void ModelHighAPI_Selection::setColor(int theRed, int theGreen, int theBlue)
209 {
210   if (myVariantType != VT_ResultSubShapePair || !myResultSubShapePair.first.get())
211     return;
212
213   AttributeIntArrayPtr aColor =
214       myResultSubShapePair.first->data()->intArray(ModelAPI_Result::COLOR_ID());
215   aColor->setSize(3);
216   aColor->setValue(0, theRed);
217   aColor->setValue(1, theGreen);
218   aColor->setValue(2, theBlue);
219 }
220
221 void ModelHighAPI_Selection::setDeflection(double theValue)
222 {
223   if (myVariantType != VT_ResultSubShapePair)
224     return;
225
226   AttributeDoublePtr aDeflectionAttr =
227     myResultSubShapePair.first->data()->real(ModelAPI_Result::DEFLECTION_ID());
228
229   aDeflectionAttr->setValue(theValue);
230 }
231
232 // LCOV_EXCL_START
233 void ModelHighAPI_Selection::setTransparency(double theValue)
234 {
235   if (myVariantType != VT_ResultSubShapePair)
236     return;
237
238   AttributeDoublePtr aTransparencyAttr =
239     myResultSubShapePair.first->data()->real(ModelAPI_Result::TRANSPARENCY_ID());
240
241   aTransparencyAttr->setValue(theValue);
242 }
243 // LCOV_EXCL_STOP
244
245 int ModelHighAPI_Selection::numberOfSubs() const
246 {
247   if (myVariantType != VT_ResultSubShapePair)
248     return 0;
249
250   ResultBodyPtr aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(myResultSubShapePair.first);
251   if (!aBody.get())
252     return 0;
253
254   return aBody->numberOfSubs();
255 }
256
257 ModelHighAPI_Selection ModelHighAPI_Selection::subResult(int theIndex) const
258 {
259   if (myVariantType != VT_ResultSubShapePair)
260     return ModelHighAPI_Selection();
261
262   ResultBodyPtr aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(myResultSubShapePair.first);
263   if (!aBody)
264     return ModelHighAPI_Selection();
265   if (theIndex >= aBody->numberOfSubs())
266     return ModelHighAPI_Selection();
267
268   ResultBodyPtr aResult = aBody->subResult(theIndex);
269   return ModelHighAPI_Selection(aResult, aResult->shape());
270 }