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