1 # Copyright (C) 2014-2020 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 email : webmaster.salome@opencascade.com
21 TestParameterCreation.py
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");
28 data()->addAttribute(ParametersPlugin_Parameter::VARIABLE_ID(),
29 ModelAPI_AttributeString::typeId());
30 data()->addAttribute(ParametersPlugin_Parameter::EXPRESSION_ID(),
31 ModelAPI_AttributeString::typeId());
33 class ModelAPI_ResultParameter
34 static const std::string MY_VALUE_ID("Value");
35 static const std::string MY_VALUE_ID("State");
38 #=========================================================================
39 # Initialization of the test
40 #=========================================================================
41 from GeomDataAPI import *
42 from ModelAPI import *
45 from salome.shaper import model
47 __updated__ = "2015-04-27"
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
59 # 4. Check renaming to not unique name
61 #=========================================================================
62 class TestParameterRename(unittest.TestCase):
64 self.aSession = ModelAPI_Session.get()
66 partSet = self.aSession.moduleDocument()
67 Part = model.addPart(partSet)
69 self.aDocument = Part.document()
70 self.createParameters()
74 #assert(model.checkPythonDump())
75 #self.aSession.closeAll()
78 def createParameters(self):
79 ltNames = ["x1", "y1", "x2", "n", "px"]
80 ltExpressions = ["150.", "200.", "x1 + y1 + 100.0", "5", "50"]
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))
93 aParam = self.dtParams["x2"]
94 aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
95 self.assertEqual(aResultAttr.data().real("Value").value(), 450.)
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()
114 self.anCircleCentr = anCircleCentr
115 self.aRadiusAttr = aRadiusAttr
117 # constraints to fix circle position and radius
118 self.aSession.startOperation()
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")
131 refattrB.setObject(modelAPI_ResultConstruction(anOY.firstResult()))
132 valueX = aDistanceConstraint1.real("ConstraintValue")
133 valueX.setText("x1 + 10.0")
134 aDistanceConstraint1.execute();
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")
147 refattrB.setObject(modelAPI_ResultConstruction(anOX.firstResult()))
148 valueY = aDistanceConstraint2.real("ConstraintValue")
149 valueY.setText("x1 + 20.0")
150 aDistanceConstraint2.execute();
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()
160 self.aCircleCenterX = valueX
161 self.aCircleCenterY = valueY
162 self.aCircleRadius = aRadiusConstrAttr
164 self.assertEqual(self.anCircleCentr.x(), 160.)
165 self.assertEqual(self.anCircleCentr.y(), 170.)
166 self.assertEqual(aRadiusAttr.value(), 150.)
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()
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()
190 self.aMultiRotCopies = aMultiRotation.integer("MultiRotationObjects")
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()
200 self.aPoint2D = aStartPoint
201 self.aPoint3D = aCoords
203 def test_rename(self):
205 aParam = self.dtParams["x1"]
206 aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
207 self.aSession.startOperation()
208 aResultAttr.data().setName("a1")
209 self.aSession.finishOperation()
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")
223 self.assertEqual(self.anCircleCentr.x(), 160.)
224 self.assertEqual(self.anCircleCentr.y(), 170.)
225 self.assertEqual(self.aRadiusAttr.value(), 150.)
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()
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")
240 # Check rename in feature
241 self.assertEqual(self.aMultiRotCopies.text(), "m")
242 # Check corresponding value
243 self.assertEqual(self.aMultiRotCopies.value(), 5)
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()
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")
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.)
265 def test_rename_not_unique(self):
266 # Rename to not unique name
267 aParam = self.dtParams["x1"]
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")
284 self.assertEqual(self.anCircleCentr.x(), 160.)
285 self.assertEqual(self.anCircleCentr.y(), 170.)
286 self.assertEqual(self.aRadiusAttr.value(), 150.)
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")
303 self.assertEqual(self.anCircleCentr.x(), 160.)
304 self.assertEqual(self.anCircleCentr.y(), 170.)
305 self.assertEqual(self.aRadiusAttr.value(), 150.)
308 if __name__ == "__main__":
309 test_program = unittest.main(exit=False)
310 assert test_program.result.wasSuccessful(), "Test failed"
311 #=========================================================================
313 #=========================================================================