1 // Copyright (C) 2014-2017 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
18 // email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
21 #include "ModelHighAPI_Selection.h"
23 #include <ModelAPI_AttributeDouble.h>
24 #include <ModelAPI_AttributeIntArray.h>
25 #include <ModelAPI_AttributeSelection.h>
26 #include <ModelAPI_AttributeSelectionList.h>
27 #include <ModelAPI_Feature.h>
28 #include <ModelAPI_ResultBody.h>
31 #include <GeomAPI_Pnt.h>
32 //--------------------------------------------------------------------------------------
34 //--------------------------------------------------------------------------------------
35 ModelHighAPI_Selection::ModelHighAPI_Selection()
36 : myVariantType(VT_Empty)
40 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::shared_ptr<ModelAPI_Result>& theContext,
41 const std::shared_ptr<GeomAPI_Shape>& theSubShape)
42 : myVariantType(VT_ResultSubShapePair)
43 , myResultSubShapePair(theContext, theSubShape)
47 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
48 const std::string& theSubShapeName)
49 : myVariantType(VT_TypeSubShapeNamePair)
50 , myTypeSubShapeNamePair(theType, theSubShapeName)
54 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
55 const GeomPointPtr& theSubShapeInnerPoint)
56 : myVariantType(VT_TypeInnerPointPair)
57 , myTypeInnerPointPair(theType, theSubShapeInnerPoint)
61 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
62 const std::list<double>& theSubShapeInnerPoint)
63 : myVariantType(VT_TypeInnerPointPair)
65 double aCoordinates[3] = { 0.0, 0.0, 0.0 };
66 double* aCIt = aCoordinates;
67 std::list<double>::const_iterator aPIt = theSubShapeInnerPoint.begin();
68 for (; aPIt != theSubShapeInnerPoint.end(); ++aPIt, ++aCIt)
71 GeomPointPtr anInnerPoint(new GeomAPI_Pnt(aCoordinates[0], aCoordinates[1], aCoordinates[2]));
72 myTypeInnerPointPair = std::pair<std::string, GeomPointPtr>(theType, anInnerPoint);
75 ModelHighAPI_Selection::ModelHighAPI_Selection(const std::string& theType,
76 const std::string& theContextName, const int theIndex)
77 : myVariantType(VT_WeakNamingPair)
78 , myWeakNamingPair(theType, std::pair<std::string, int>(theContextName, theIndex))
83 ModelHighAPI_Selection::~ModelHighAPI_Selection()
87 //--------------------------------------------------------------------------------------
88 void ModelHighAPI_Selection::fillAttribute(
89 const std::shared_ptr<ModelAPI_AttributeSelection> & theAttribute) const
91 switch(myVariantType) {
92 case VT_Empty: return;
93 case VT_ResultSubShapePair:
94 theAttribute->setValue(myResultSubShapePair.first, myResultSubShapePair.second);
96 case VT_TypeSubShapeNamePair:
97 theAttribute->selectSubShape(myTypeSubShapeNamePair.first, myTypeSubShapeNamePair.second);
99 case VT_TypeInnerPointPair:
100 theAttribute->selectSubShape(myTypeInnerPointPair.first, myTypeInnerPointPair.second);
102 case VT_WeakNamingPair:
103 theAttribute->selectSubShape(
104 myWeakNamingPair.first, myWeakNamingPair.second.first, myWeakNamingPair.second.second);
108 if (theAttribute->isInvalid()) {
109 FeaturePtr aFeature = ModelAPI_Feature::feature(theAttribute->owner());
111 std::string("Error: attribute \"") + theAttribute->id() + std::string("\" is invalid."));
115 //--------------------------------------------------------------------------------------
116 void ModelHighAPI_Selection::appendToList(
117 const std::shared_ptr<ModelAPI_AttributeSelectionList> & theAttribute) const
119 switch(myVariantType) {
120 case VT_Empty: return;
121 case VT_ResultSubShapePair:
122 theAttribute->append(myResultSubShapePair.first, myResultSubShapePair.second);
124 case VT_TypeSubShapeNamePair:
125 // Note: the reverse order (first - type, second - sub-shape name)
126 theAttribute->append(myTypeSubShapeNamePair.second, myTypeSubShapeNamePair.first);
128 case VT_TypeInnerPointPair:
129 // Note: the reverse order (first - type, second - selected point)
130 theAttribute->append(myTypeInnerPointPair.second, myTypeInnerPointPair.first);
132 case VT_WeakNamingPair:
133 // Note: the reverse order (first - type, second - selected point)
134 theAttribute->append(
135 myWeakNamingPair.first, myWeakNamingPair.second.first, myWeakNamingPair.second.second);
140 //==================================================================================================
141 ModelHighAPI_Selection::VariantType ModelHighAPI_Selection::variantType() const
143 return myVariantType;
146 //==================================================================================================
147 ResultSubShapePair ModelHighAPI_Selection::resultSubShapePair() const
149 return myResultSubShapePair;
152 //==================================================================================================
153 TypeSubShapeNamePair ModelHighAPI_Selection::typeSubShapeNamePair() const
155 return myTypeSubShapeNamePair;
158 //==================================================================================================
159 TypeInnerPointPair ModelHighAPI_Selection::typeInnerPointPair() const
161 return myTypeInnerPointPair;
164 //==================================================================================================
165 std::string ModelHighAPI_Selection::shapeType() const
167 switch(myVariantType) {
168 case VT_ResultSubShapePair:
169 return myResultSubShapePair.second.get() ? myResultSubShapePair.second->shapeTypeStr() :
170 myResultSubShapePair.first->shape()->shapeTypeStr();
171 case VT_TypeSubShapeNamePair: return myTypeSubShapeNamePair.first;
172 case VT_TypeInnerPointPair: return myTypeInnerPointPair.first;
178 //==================================================================================================
179 void ModelHighAPI_Selection::setName(const std::string& theName)
181 if (myVariantType == VT_ResultSubShapePair) {
182 std::shared_ptr<ModelAPI_Result> aResult = myResultSubShapePair.first;
186 aResult->data()->setName(theName);
190 std::string ModelHighAPI_Selection::name() const
192 if (myVariantType == VT_ResultSubShapePair) {
193 std::shared_ptr<ModelAPI_Result> aResult = myResultSubShapePair.first;
195 return aResult->data()->name();
197 return std::string();
200 void ModelHighAPI_Selection::setColor(int theRed, int theGreen, int theBlue)
202 if (myVariantType != VT_ResultSubShapePair || !myResultSubShapePair.first.get())
205 AttributeIntArrayPtr aColor =
206 myResultSubShapePair.first->data()->intArray(ModelAPI_Result::COLOR_ID());
208 aColor->setValue(0, theRed);
209 aColor->setValue(1, theGreen);
210 aColor->setValue(2, theBlue);
213 void ModelHighAPI_Selection::setDeflection(double theValue)
215 if (myVariantType != VT_ResultSubShapePair)
218 AttributeDoublePtr aDeflectionAttr =
219 myResultSubShapePair.first->data()->real(ModelAPI_Result::DEFLECTION_ID());
221 aDeflectionAttr->setValue(theValue);
225 void ModelHighAPI_Selection::setTransparency(double theValue)
227 if (myVariantType != VT_ResultSubShapePair)
230 AttributeDoublePtr aTransparencyAttr =
231 myResultSubShapePair.first->data()->real(ModelAPI_Result::TRANSPARENCY_ID());
233 aTransparencyAttr->setValue(theValue);
237 int ModelHighAPI_Selection::numberOfSubs() const
239 if (myVariantType != VT_ResultSubShapePair)
242 ResultBodyPtr aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(myResultSubShapePair.first);
246 return aBody->numberOfSubs();
249 ModelHighAPI_Selection ModelHighAPI_Selection::subResult(int theIndex) const
251 if (myVariantType != VT_ResultSubShapePair)
252 return ModelHighAPI_Selection();
254 ResultBodyPtr aBody = std::dynamic_pointer_cast<ModelAPI_ResultBody>(myResultSubShapePair.first);
256 return ModelHighAPI_Selection();
257 if (theIndex >= aBody->numberOfSubs())
258 return ModelHighAPI_Selection();
260 ResultBodyPtr aResult = aBody->subResult(theIndex);
261 return ModelHighAPI_Selection(aResult, aResult->shape());