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>
22 TestParameterCreation.py
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");
29 data()->addAttribute(ParametersPlugin_Parameter::VARIABLE_ID(),
30 ModelAPI_AttributeString::typeId());
31 data()->addAttribute(ParametersPlugin_Parameter::EXPRESSION_ID(),
32 ModelAPI_AttributeString::typeId());
34 class ModelAPI_ResultParameter
35 static const std::string MY_VALUE_ID("Value");
36 static const std::string MY_VALUE_ID("State");
39 #=========================================================================
40 # Initialization of the test
41 #=========================================================================
42 from GeomDataAPI import *
43 from ModelAPI import *
46 from salome.shaper import model
48 __updated__ = "2015-04-27"
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
60 # 4. Check renaming to not unique name
62 #=========================================================================
63 class TestParameterRename(unittest.TestCase):
65 self.aSession = ModelAPI_Session.get()
67 partSet = self.aSession.moduleDocument()
68 Part = model.addPart(partSet)
70 self.aDocument = Part.document()
71 self.createParameters()
75 #assert(model.checkPythonDump())
76 #self.aSession.closeAll()
79 def createParameters(self):
80 ltNames = ["x1", "y1", "x2", "n", "px"]
81 ltExpressions = ["150.", "200.", "x1 + y1 + 100.0", "5", "50"]
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))
94 aParam = self.dtParams["x2"]
95 aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
96 self.assertEqual(aResultAttr.data().real("Value").value(), 450.)
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()
115 self.anCircleCentr = anCircleCentr
116 self.aRadiusAttr = aRadiusAttr
118 # constraints to fix circle position and radius
119 self.aSession.startOperation()
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")
132 refattrB.setObject(modelAPI_ResultConstruction(anOY.firstResult()))
133 valueX = aDistanceConstraint1.real("ConstraintValue")
134 valueX.setText("x1 + 10.0")
135 aDistanceConstraint1.execute();
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")
148 refattrB.setObject(modelAPI_ResultConstruction(anOX.firstResult()))
149 valueY = aDistanceConstraint2.real("ConstraintValue")
150 valueY.setText("x1 + 20.0")
151 aDistanceConstraint2.execute();
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()
161 self.aCircleCenterX = valueX
162 self.aCircleCenterY = valueY
163 self.aCircleRadius = aRadiusConstrAttr
165 self.assertEqual(self.anCircleCentr.x(), 160.)
166 self.assertEqual(self.anCircleCentr.y(), 170.)
167 self.assertEqual(aRadiusAttr.value(), 150.)
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()
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()
191 self.aMultiRotCopies = aMultiRotation.integer("MultiRotationObjects")
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()
201 self.aPoint2D = aStartPoint
202 self.aPoint3D = aCoords
204 def test_rename(self):
206 aParam = self.dtParams["x1"]
207 aResultAttr = modelAPI_ResultParameter(aParam.firstResult())
208 self.aSession.startOperation()
209 aResultAttr.data().setName("a1")
210 self.aSession.finishOperation()
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")
224 self.assertEqual(self.anCircleCentr.x(), 160.)
225 self.assertEqual(self.anCircleCentr.y(), 170.)
226 self.assertEqual(self.aRadiusAttr.value(), 150.)
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()
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")
241 # Check rename in feature
242 self.assertEqual(self.aMultiRotCopies.text(), "m")
243 # Check corresponding value
244 self.assertEqual(self.aMultiRotCopies.value(), 5)
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()
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")
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.)
266 def test_rename_not_unique(self):
267 # Rename to not unique name
268 aParam = self.dtParams["x1"]
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")
285 self.assertEqual(self.anCircleCentr.x(), 160.)
286 self.assertEqual(self.anCircleCentr.y(), 170.)
287 self.assertEqual(self.aRadiusAttr.value(), 150.)
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")
304 self.assertEqual(self.anCircleCentr.x(), 160.)
305 self.assertEqual(self.anCircleCentr.y(), 170.)
306 self.assertEqual(self.aRadiusAttr.value(), 150.)
309 if __name__ == "__main__":
310 test_program = unittest.main(exit=False)
311 assert test_program.result.wasSuccessful(), "Test failed"
312 #=========================================================================
314 #=========================================================================