Salome HOME
[Code coverage ParametersPlugin]: Parameter's rename in all possible types of attributes
[modules/shaper.git] / src / ParametersPlugin / Test / TestParameterRename.py
1 ## Copyright (C) 2014-2017  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
18 ## email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
19 ##
20
21 """
22     TestParameterCreation.py
23
24     class ParametersPlugin_Parameter
25     static const std::string MY_PARAMETER_ID("Parameter");
26     static const std::string MY_VARIABLE_ID("variable");
27     static const std::string MY_EXPRESSION_ID("expression");
28
29     data()->addAttribute(ParametersPlugin_Parameter::VARIABLE_ID(),
30                          ModelAPI_AttributeString::typeId());
31     data()->addAttribute(ParametersPlugin_Parameter::EXPRESSION_ID(),
32                          ModelAPI_AttributeString::typeId());
33
34     class ModelAPI_ResultParameter
35     static const std::string MY_VALUE_ID("Value");
36     static const std::string MY_VALUE_ID("State");
37 """
38
39 #=========================================================================
40 # Initialization of the test
41 #=========================================================================
42 from GeomDataAPI import *
43 from ModelAPI import *
44 import math
45 import unittest
46 from salome.shaper import model
47
48 __updated__ = "2015-04-27"
49
50 #=========================================================================
51 # Create several parameters and a feature.
52 # 1. Basic parameter definition:
53 #    x1 = 150.0, y1 = 200.0
54 # 2. Referencing between parameters:
55 #    x2 = x1 + y1 + 100.0
56 # 3. Referencing in feature SketchCircle
57 #    CircleCenter = (x1 + 10.0, x1 + 20.0), CircleRadius = x1
58 # 3. Check renaming
59 #    x1 -> a1
60 # 4. Check renaming to not unique name
61 #    x1 -> y1
62 #=========================================================================
63 class TestParameterRename(unittest.TestCase):
64     def setUp(self):
65         self.aSession = ModelAPI_Session.get()
66         model.begin()
67         partSet = self.aSession.moduleDocument()
68         Part = model.addPart(partSet)
69         model.end()
70         self.aDocument = Part.document()
71         self.createParameters()
72         self.createFeature()
73
74     def tearDown(self):
75         #assert(model.checkPythonDump())
76         #self.aSession.closeAll()
77         pass
78
79     def createParameters(self):
80         ltNames = ["x1", "y1", "x2", "n", "px"]
81         ltExpressions = ["150.", "200.", "x1 + y1 + 100.0", "5", "50"]
82         self.dtParams = {}
83         for name, expr in zip(ltNames, ltExpressions):
84             self.aSession.startOperation()
85             aParam = self.aDocument.addFeature("Parameter")
86             aParamName = aParam.string("variable")
87             aParamName.setValue(name)
88             aParamExpr = aParam.string("expression")
89             aParamExpr.setValue(expr)
90             self.dtParams[name] = aParam
91             self.aSession.finishOperation()
92         self.assertEqual(len(self.dtParams), len(ltNames))
93
94         aParam = self.dtParams["x2"]
95         aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
96         self.assertEqual(aResultAttr.data().real("Value").value(), 450.)
97
98     def createFeature(self):
99         self.aSession.startOperation()
100         aSketchCommonFeature = self.aDocument.addFeature("Sketch")
101         aSketchFeature = featureToCompositeFeature(aSketchCommonFeature)
102         origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
103         origin.setValue(0, 0, 0)
104         dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
105         dirx.setValue(1, 0, 0)
106         norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
107         norm.setValue(0, 0, 1)
108         aSketchCircle = aSketchFeature.addFeature("SketchCircle")
109         anCircleCentr = geomDataAPI_Point2D(aSketchCircle.attribute("circle_center"))
110         aRadiusAttr = aSketchCircle.real("circle_radius")
111         anCircleCentr.setValue(10., 20.)
112         aRadiusAttr.setValue(10.)
113         self.aSession.finishOperation()
114
115         self.anCircleCentr = anCircleCentr
116         self.aRadiusAttr = aRadiusAttr
117
118         # constraints to fix circle position and radius
119         self.aSession.startOperation()
120         # fix X coordinate
121         aDistanceConstraint1 = aSketchFeature.addFeature("SketchConstraintDistance")
122         refattrA = aDistanceConstraint1.refattr("ConstraintEntityA")
123         refattrA.setAttr(anCircleCentr)
124         refattrB = aDistanceConstraint1.refattr("ConstraintEntityB")
125         anOY = aSketchFeature.addFeature("SketchLine")
126         aStartPoint = geomDataAPI_Point2D(anOY.attribute("StartPoint"))
127         anEndPoint = geomDataAPI_Point2D(anOY.attribute("EndPoint"))
128         aStartPoint.setValue(0., 0.)
129         anEndPoint.setValue(0., 100.)
130         anOY.selection("External").selectSubShape("EDGE", "PartSet/OY")
131         anOY.execute()
132         refattrB.setObject(modelAPI_ResultConstruction(anOY.firstResult()))
133         valueX = aDistanceConstraint1.real("ConstraintValue")
134         valueX.setText("x1 + 10.0")
135         aDistanceConstraint1.execute();
136         # fix Y coordinate
137         aDistanceConstraint2 = aSketchFeature.addFeature("SketchConstraintDistance")
138         refattrA = aDistanceConstraint2.refattr("ConstraintEntityA")
139         refattrA.setAttr(anCircleCentr)
140         refattrB = aDistanceConstraint2.refattr("ConstraintEntityB")
141         anOX = aSketchFeature.addFeature("SketchLine")
142         aStartPoint = geomDataAPI_Point2D(anOX.attribute("StartPoint"))
143         anEndPoint = geomDataAPI_Point2D(anOX.attribute("EndPoint"))
144         aStartPoint.setValue(0., 0.)
145         anEndPoint.setValue(100., 0.)
146         anOX.selection("External").selectSubShape("EDGE", "PartSet/OX")
147         anOX.execute()
148         refattrB.setObject(modelAPI_ResultConstruction(anOX.firstResult()))
149         valueY = aDistanceConstraint2.real("ConstraintValue")
150         valueY.setText("x1 + 20.0")
151         aDistanceConstraint2.execute();
152         # fix radius
153         aRadiusConstraint = aSketchFeature.addFeature("SketchConstraintRadius")
154         refattrA = aRadiusConstraint.refattr("ConstraintEntityA")
155         refattrA.setObject(modelAPI_ResultConstruction(aSketchCircle.lastResult()))
156         aRadiusConstrAttr = aRadiusConstraint.real("ConstraintValue")
157         aRadiusConstrAttr.setText("x1")
158         aRadiusConstraint.execute()
159         self.aSession.finishOperation()
160
161         self.aCircleCenterX = valueX
162         self.aCircleCenterY = valueY
163         self.aCircleRadius = aRadiusConstrAttr
164
165         self.assertEqual(self.anCircleCentr.x(), 160.)
166         self.assertEqual(self.anCircleCentr.y(), 170.)
167         self.assertEqual(aRadiusAttr.value(), 150.)
168
169         # add a line and rotate it around origin
170         self.aSession.startOperation()
171         aSketchLine = aSketchFeature.addFeature("SketchLine")
172         aStartPoint = geomDataAPI_Point2D(aSketchLine.attribute("StartPoint"))
173         aEndPoint = geomDataAPI_Point2D(aSketchLine.attribute("EndPoint"))
174         aStartPoint.setText("px", "0")
175         aEndPoint.setValue(0., 0.)
176         self.aSession.finishOperation()
177         self.aSession.startOperation()
178         aEndPoint.move(100., 0.)
179         self.aSession.finishOperation()
180
181         self.aSession.startOperation()
182         aMultiRotation = aSketchFeature.addFeature("SketchMultiRotation")
183         aMultiRotation.reflist("MultiRotationList").append(aSketchLine.lastResult())
184         aMultiRotation.refattr("MultiRotationCenter").setAttr(anCircleCentr)
185         aMultiRotation.real("MultiRotationAngle").setValue(60.0)
186         aMultiRotation.string("AngleType").setValue("SingleAngle")
187         aMultiRotation.boolean("MultiRotationReversed").setValue(False)
188         aMultiRotation.integer("MultiRotationObjects").setText("n")
189         self.aSession.finishOperation()
190
191         self.aMultiRotCopies = aMultiRotation.integer("MultiRotationObjects")
192
193         # create 3D point
194         self.aSession.startOperation()
195         aPoint3D = self.aDocument.addFeature("Point")
196         aPoint3D.string("creation_method").setValue("by_xyz")
197         aCoords = geomDataAPI_Point(aPoint3D.attribute("point3d"))
198         aCoords.setText("px", "0", "0")
199         self.aSession.finishOperation()
200
201         self.aPoint2D = aStartPoint
202         self.aPoint3D = aCoords
203
204     def test_rename(self):
205         # Rename
206         aParam = self.dtParams["x1"]
207         aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
208         self.aSession.startOperation()
209         aResultAttr.data().setName("a1")
210         self.aSession.finishOperation()
211
212         # Check rename in the parameter
213         self.assertEqual(aParam.name(), "a1")
214         self.assertEqual(aParam.string("variable").value(), "a1")
215         self.assertEqual(aResultAttr.data().name(), "a1")
216         # Check rename in references
217         aParam = self.dtParams["x2"]
218         self.assertEqual(aParam.string("expression").value(), "a1 + y1 + 100.0")
219         # Check rename in the feature
220         self.assertEqual(self.aCircleCenterX.text(), "a1 + 10.0")
221         self.assertEqual(self.aCircleCenterY.text(), "a1 + 20.0")
222         self.assertEqual(self.aCircleRadius.text(), "a1")
223         # Check values
224         self.assertEqual(self.anCircleCentr.x(), 160.)
225         self.assertEqual(self.anCircleCentr.y(), 170.)
226         self.assertEqual(self.aRadiusAttr.value(), 150.)
227
228     def test_rename_integer(self):
229         # rename integer parameter
230         aParam = self.dtParams["n"]
231         aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
232         self.aSession.startOperation()
233         aResultAttr.data().setName("m")
234         self.aSession.finishOperation()
235
236         # Check rename in the parameter
237         self.assertEqual(aParam.name(), "m")
238         self.assertEqual(aParam.string("variable").value(), "m")
239         self.assertEqual(aResultAttr.data().name(), "m")
240
241         # Check rename in feature
242         self.assertEqual(self.aMultiRotCopies.text(), "m")
243         # Check corresponding value
244         self.assertEqual(self.aMultiRotCopies.value(), 5)
245
246     def test_rename_point(self):
247         # rename parameter in point coordinates
248         aParam = self.dtParams["px"]
249         aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
250         self.aSession.startOperation()
251         aResultAttr.data().setName("p")
252         self.aSession.finishOperation()
253
254         # Check rename in the parameter
255         self.assertEqual(aParam.name(), "p")
256         self.assertEqual(aParam.string("variable").value(), "p")
257         self.assertEqual(aResultAttr.data().name(), "p")
258
259         # Check rename in feature
260         self.assertEqual(self.aPoint2D.textX(), "p")
261         self.assertEqual(self.aPoint3D.textX(), "p")
262         # Check corresponding value
263         self.assertEqual(self.aPoint2D.x(), 50.)
264         self.assertEqual(self.aPoint3D.x(), 50.)
265
266     def test_rename_not_unique(self):
267         # Rename to not unique name
268         aParam = self.dtParams["x1"]
269         aParamX1 = aParam
270         aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
271         self.aSession.startOperation() # don't finish operation until feature is valid (real case)
272         aResultAttr.data().setName("y1")
273         # Check rename in the parameter (Expected: renamed, but invalid)
274         self.assertEqual(aParam.name(), "y1")
275         validators = ModelAPI_Session.get().validators()
276         self.assertEqual(validators.validate(aParamX1), False)
277         # Check rename in references (Expected: not renamed)
278         aParam = self.dtParams["x2"]
279         self.assertEqual(aParam.string("expression").value(), "x1 + y1 + 100.0")
280         # Check rename in the feature (Expected: not renamed)
281         self.assertEqual(self.aCircleCenterX.text(), "x1 + 10.0")
282         self.assertEqual(self.aCircleCenterY.text(), "x1 + 20.0")
283         self.assertEqual(self.aCircleRadius.text(), "x1")
284         # Check values
285         self.assertEqual(self.anCircleCentr.x(), 160.)
286         self.assertEqual(self.anCircleCentr.y(), 170.)
287         self.assertEqual(self.aRadiusAttr.value(), 150.)
288
289         # rename to the correct one, but new
290         aResultAttr.data().setName("xx1")
291         self.aSession.finishOperation() # feature becomes valid
292         # Check rename in the parameter (Expected: renamed)
293         self.assertEqual(validators.validate(aParamX1), True)
294         self.assertEqual(aParamX1.name(), "xx1")
295         self.assertEqual(aParamX1.error(), "")
296         # Check rename in references (Expected: renamed)
297         aParam = self.dtParams["x2"]
298         self.assertEqual(aParam.string("expression").value(), "xx1 + y1 + 100.0")
299         # Check rename in the feature (Expected: renamed)
300         self.assertEqual(self.aCircleCenterX.text(), "xx1 + 10.0")
301         self.assertEqual(self.aCircleCenterY.text(), "xx1 + 20.0")
302         self.assertEqual(self.aCircleRadius.text(), "xx1")
303         # Check values
304         self.assertEqual(self.anCircleCentr.x(), 160.)
305         self.assertEqual(self.anCircleCentr.y(), 170.)
306         self.assertEqual(self.aRadiusAttr.value(), 150.)
307
308
309 if __name__ == "__main__":
310     test_program = unittest.main(exit=False)
311     assert test_program.result.wasSuccessful(), "Test failed"
312 #=========================================================================
313 # End of test
314 #=========================================================================