Salome HOME
0ee20f691de2f3413b968b203730bce1f35706be
[modules/shaper.git] / src / SketchPlugin / Test / TestConstraintCoincidence.py
1 """
2     TestConstraintCoincidence.py
3     Unit test of SketchPlugin_ConstraintCoincidence class
4
5     SketchPlugin_Constraint
6         static const std::string MY_CONSTRAINT_VALUE("ConstraintValue");
7         static const std::string MY_FLYOUT_VALUE_PNT("ConstraintFlyoutValuePnt");
8         static const std::string MY_ENTITY_A("ConstraintEntityA");
9         static const std::string MY_ENTITY_B("ConstraintEntityB");
10         static const std::string MY_ENTITY_C("ConstraintEntityC");
11         static const std::string MY_ENTITY_D("ConstraintEntityD");
12
13     SketchPlugin_ConstraintCoincidence
14         static const std::string MY_CONSTRAINT_COINCIDENCE_ID("SketchConstraintCoincidence");
15         data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
16         data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
17
18 """
19 from GeomDataAPI import *
20 from ModelAPI import *
21 import math
22 from salome.shaper import model
23
24 #=========================================================================
25 # Initialization of the test
26 #=========================================================================
27
28 __updated__ = "2014-10-28"
29 TOLERANCE = 1.e-7
30
31
32 #=========================================================================
33 # Auxiliary functions
34 #=========================================================================
35 def checkPointOnLine(point, line):
36     aStart = geomDataAPI_Point2D(line.attribute("StartPoint"))
37     aEnd   = geomDataAPI_Point2D(line.attribute("EndPoint"))
38     aDirX = aEnd.x() - aStart.x()
39     aDirY = aEnd.y() - aStart.y()
40     aVecX = point.x() - aStart.x()
41     aVecY = point.y() - aStart.y()
42     assert (math.fabs(aDirX * aVecY - aDirY * aVecX) <= TOLERANCE)
43
44 def checkPointOnCircle(point, circle):
45     aCenter = geomDataAPI_Point2D(circle.attribute("CircleCenter"))
46     aRadius = circle.real("CircleRadius").value()
47     aDist = math.hypot(point.x() - aCenter.x(), point.y() - aCenter.y())
48     assert (math.fabs(aDist - aRadius) <= TOLERANCE)
49
50 def checkPointOnArc(point, arc):
51     aStart  = geomDataAPI_Point2D(arc.attribute("ArcStartPoint"))
52     aCenter = geomDataAPI_Point2D(arc.attribute("ArcCenter"))
53     aRadius = math.hypot(aStart.x() - aCenter.x(), aStart.y() - aCenter.y())
54     aDist = math.hypot(point.x() - aCenter.x(), point.y() - aCenter.y())
55     assert (math.fabs(aDist - aRadius) <= TOLERANCE)
56
57
58 #=========================================================================
59 # Start of test
60 #=========================================================================
61 aSession = ModelAPI_Session.get()
62 aDocument = aSession.moduleDocument()
63 # add an origin
64 aSession.startOperation()
65 aFeature = aDocument.addFeature("Point")
66 # aFeature.string("creation_method").setValue("by_xyz")
67 aFeature.real("x").setValue(0.)
68 aFeature.real("y").setValue(0.)
69 aFeature.real("z").setValue(0.)
70 anOriginName = aFeature.name()
71 aSession.finishOperation()
72 #=========================================================================
73 # Creation of a sketch
74 #=========================================================================
75 aSession.startOperation()
76 aSketchFeature = featureToCompositeFeature(aDocument.addFeature("Sketch"))
77 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
78 origin.setValue(0, 0, 0)
79 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
80 dirx.setValue(1, 0, 0)
81 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
82 norm.setValue(0, 0, 1)
83 aSession.finishOperation()
84 #=========================================================================
85 # Create a line and an arc
86 #=========================================================================
87 aSession.startOperation()
88 aSketchArc = aSketchFeature.addFeature("SketchArc")
89 anArcCentr = geomDataAPI_Point2D(aSketchArc.attribute("ArcCenter"))
90 anArcStartPoint = geomDataAPI_Point2D(aSketchArc.attribute("ArcStartPoint"))
91 anArcEndPoint = geomDataAPI_Point2D(aSketchArc.attribute("ArcEndPoint"))
92 anArcCentr.setValue(10., 10.)
93 anArcStartPoint.setValue(0., 50.)
94 anArcEndPoint.setValue(50., 0.)
95 aSketchLine = aSketchFeature.addFeature("SketchLine")
96 aLineStartPoint = geomDataAPI_Point2D(aSketchLine.attribute("StartPoint"))
97 aLineEndPoint = geomDataAPI_Point2D(aSketchLine.attribute("EndPoint"))
98 # Lets initialize line start at circle's end:
99 aLineStartPoint.setValue(50., 0.)
100 aLineEndPoint.setValue(100., 25.)
101 aSession.finishOperation()
102 assert (model.dof(aSketchFeature) == 9)
103 #=========================================================================
104 # Link arc's end and line's start points with concidence constraint
105 #=========================================================================
106 aSession.startOperation()
107 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
108 reflistA = aConstraint.refattr("ConstraintEntityA")
109 reflistB = aConstraint.refattr("ConstraintEntityB")
110 reflistA.setAttr(anArcEndPoint)
111 reflistB.setAttr(aLineStartPoint)
112 aConstraint.execute()
113 aSession.finishOperation()
114 assert (model.dof(aSketchFeature) == 7)
115 #=========================================================================
116 # Check values and move one constrainted object
117 #=========================================================================
118 assert (anArcEndPoint.x() == aLineStartPoint.x())
119 assert (anArcEndPoint.y() == aLineStartPoint.y())
120 deltaX = deltaY = 40.
121 #  move line
122 aSession.startOperation()
123 aLineStartPoint.setValue(aLineStartPoint.x() + deltaX,
124                          aLineStartPoint.y() + deltaY)
125 aLineEndPoint.setValue(aLineEndPoint.x() + deltaX,
126                        aLineEndPoint.y() + deltaY)
127 aSession.finishOperation()
128 # check that arc's points are moved also
129 assert (anArcEndPoint.x() == aLineStartPoint.x())
130 assert (anArcEndPoint.y() == aLineStartPoint.y())
131 assert (model.dof(aSketchFeature) == 7)
132 #=========================================================================
133 # Remove coincidence and move the line
134 #=========================================================================
135 aSession.startOperation()
136 aDocument.removeFeature(aConstraint)
137 aSession.finishOperation()
138 aSession.startOperation()
139 aLineStartPoint.setValue(70., 0.)
140 aSession.finishOperation()
141 assert (anArcEndPoint.x() != aLineStartPoint.x() or anArcEndPoint.y() != aLineStartPoint.y())
142 assert (model.dof(aSketchFeature) == 9)
143
144 #=========================================================================
145 # Add constraint point-on-line
146 #=========================================================================
147 aSession.startOperation()
148 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
149 reflistA = aConstraint.refattr("ConstraintEntityA")
150 reflistB = aConstraint.refattr("ConstraintEntityB")
151 reflistA.setAttr(anArcStartPoint)
152 reflistB.setObject(aSketchLine.lastResult())
153 aConstraint.execute()
154 aSession.finishOperation()
155 checkPointOnLine(anArcStartPoint, aSketchLine)
156 assert (model.dof(aSketchFeature) == 8)
157 #=========================================================================
158 # Add constraint point-on-circle
159 #=========================================================================
160 aSession.startOperation()
161 # create circle with center coincident with origin
162 aSketchCircle = aSketchFeature.addFeature("SketchCircle")
163 aCircleCenter = geomDataAPI_Point2D(aSketchCircle.attribute("CircleCenter"))
164 aCircleRadius = aSketchCircle.real("CircleRadius")
165 aCircleCenter.setValue(10., 10.)
166 aCircleRadius.setValue(25.)
167 aSession.finishOperation()
168 assert (model.dof(aSketchFeature) == 11)
169 # create origin
170 aSession.startOperation()
171 anOrigRes = modelAPI_Result(aDocument.objectByName("Construction", anOriginName))
172 assert (anOrigRes)
173 anOrigShape = anOrigRes.shape()
174 assert (anOrigShape)
175 anOrigin = aSketchFeature.addFeature("SketchPoint")
176 anOriginCoord = geomDataAPI_Point2D(anOrigin.attribute("PointCoordindates"))
177 anOriginCoord.setValue(0., 0.)
178 anOrigin.selection("External").setValue(anOrigRes, anOrigShape)
179 aSession.finishOperation()
180 assert (model.dof(aSketchFeature) == 11)
181 # coincidence between center of circle and the origin
182 aSession.startOperation()
183 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
184 reflistA = aConstraint.refattr("ConstraintEntityA")
185 reflistB = aConstraint.refattr("ConstraintEntityB")
186 reflistA.setAttr(aCircleCenter)
187 reflistB.setObject(anOrigin.lastResult())
188 aSession.finishOperation()
189 assert (model.dof(aSketchFeature) == 9)
190 # point-on-circle
191 aSession.startOperation()
192 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
193 reflistA = aConstraint.refattr("ConstraintEntityA")
194 reflistB = aConstraint.refattr("ConstraintEntityB")
195 reflistA.setObject(aSketchCircle.lastResult())
196 reflistB.setAttr(aLineEndPoint)
197 aConstraint.execute()
198 aSession.finishOperation()
199 checkPointOnCircle(aLineEndPoint, aSketchCircle)
200 assert (model.dof(aSketchFeature) == 8)
201 #=========================================================================
202 # Add constraint point-on-arc
203 #=========================================================================
204 aSession.startOperation("constraint point-on-arc")
205 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
206 reflistA = aConstraint.refattr("ConstraintEntityA")
207 reflistB = aConstraint.refattr("ConstraintEntityB")
208 reflistA.setAttr(aCircleCenter)
209 reflistB.setObject(aSketchArc.lastResult())
210 aConstraint.execute()
211 aSession.finishOperation()
212 checkPointOnArc(aCircleCenter, aSketchArc)
213 # check center of circle is still in origin
214 assert (aCircleCenter.x() == 0. and aCircleCenter.y() == 0.)
215 assert (model.dof(aSketchFeature) == 7)
216
217 #=========================================================================
218 # Create two more lines and set multi-coincidence between their extremities
219 #=========================================================================
220 aSession.startOperation()
221 # line 2
222 aLine2 = aSketchFeature.addFeature("SketchLine")
223 aLine2StartPoint = geomDataAPI_Point2D(aLine2.attribute("StartPoint"))
224 aLine2EndPoint = geomDataAPI_Point2D(aLine2.attribute("EndPoint"))
225 aLine2StartPoint.setValue(50., 0.)
226 aLine2EndPoint.setValue(100., 0.)
227 # line 3
228 aLine3 = aSketchFeature.addFeature("SketchLine")
229 aLine3StartPoint = geomDataAPI_Point2D(aLine3.attribute("StartPoint"))
230 aLine3EndPoint = geomDataAPI_Point2D(aLine3.attribute("EndPoint"))
231 aLine3StartPoint.setValue(50., 0.)
232 aLine3EndPoint.setValue(0., 100.)
233 aSession.finishOperation()
234 assert (model.dof(aSketchFeature) == 15)
235 # coincidences between extremities of lines
236 aSession.startOperation()
237 aConstraint12 = aSketchFeature.addFeature("SketchConstraintCoincidence")
238 refAttrA = aConstraint12.refattr("ConstraintEntityA")
239 refAttrB = aConstraint12.refattr("ConstraintEntityB")
240 refAttrA.setAttr(aLineStartPoint)
241 refAttrB.setAttr(aLine2StartPoint)
242 aConstraint23 = aSketchFeature.addFeature("SketchConstraintCoincidence")
243 refAttrA = aConstraint23.refattr("ConstraintEntityA")
244 refAttrB = aConstraint23.refattr("ConstraintEntityB")
245 refAttrA.setAttr(aLine2StartPoint)
246 refAttrB.setAttr(aLine3StartPoint)
247 aConstraint31 = aSketchFeature.addFeature("SketchConstraintCoincidence")
248 refAttrA = aConstraint31.refattr("ConstraintEntityA")
249 refAttrB = aConstraint31.refattr("ConstraintEntityB")
250 refAttrA.setAttr(aLine3StartPoint)
251 refAttrB.setAttr(aLineStartPoint)
252 aSession.finishOperation()
253 # check the points have same coordinates
254 assert (aLineStartPoint.x() == aLine2StartPoint.x() and aLineStartPoint.y() == aLine2StartPoint.y())
255 assert (aLineStartPoint.x() == aLine3StartPoint.x() and aLineStartPoint.y() == aLine3StartPoint.y())
256 assert (model.dof(aSketchFeature) == 11)
257 #=========================================================================
258 # Move one line and check other have been updated too
259 #=========================================================================
260 aSession.startOperation()
261 aLine3StartPoint.setValue(aLine3StartPoint.x() + deltaX,
262                           aLine3StartPoint.y() + deltaY)
263 aLine3EndPoint.setValue(aLine3EndPoint.x() + deltaX,
264                         aLine3EndPoint.y() + deltaY)
265 aSession.finishOperation()
266 assert (aLineStartPoint.x() == aLine2StartPoint.x() and aLineStartPoint.y() == aLine2StartPoint.y())
267 assert (aLineStartPoint.x() == aLine3StartPoint.x() and aLineStartPoint.y() == aLine3StartPoint.y())
268 assert (model.dof(aSketchFeature) == 11)
269 #=========================================================================
270 # Fix a line and move another connected segment
271 #=========================================================================
272 coordX = aLineStartPoint.x()
273 coordY = aLineStartPoint.y()
274 aSession.startOperation()
275 aFixed = aSketchFeature.addFeature("SketchConstraintRigid")
276 refAttrA = aFixed.refattr("ConstraintEntityA")
277 refAttrA.setObject(aLine2.lastResult())
278 aSession.finishOperation()
279 # move another line
280 aSession.startOperation()
281 aLine3StartPoint.setValue(aLine3StartPoint.x() + deltaX,
282                           aLine3StartPoint.y() + deltaY)
283 aLine3EndPoint.setValue(aLine3EndPoint.x() + deltaX,
284                         aLine3EndPoint.y() + deltaY)
285 aSession.finishOperation()
286 assert (aLineStartPoint.x() == coordX and aLineStartPoint.y() == coordY)
287 assert (aLine2StartPoint.x() == coordX and aLine2StartPoint.y() == coordY)
288 assert (aLine3StartPoint.x() == coordX and aLine3StartPoint.y() == coordY)
289 assert (model.dof(aSketchFeature) == 7)
290 #=========================================================================
291 # Detach fixed line and move one of remaining
292 #=========================================================================
293 aSession.startOperation()
294 aDocument.removeFeature(aConstraint12)
295 aDocument.removeFeature(aConstraint23)
296 aSession.finishOperation()
297 # move line
298 deltaX = 1.
299 deltaY = 0.
300 aSession.startOperation()
301 aLineStartPoint.setValue(aLineStartPoint.x() + deltaX,
302                           aLineStartPoint.y() + deltaY)
303 aLineEndPoint.setValue(aLineEndPoint.x() + deltaX,
304                         aLineEndPoint.y() + deltaY)
305 aSession.finishOperation()
306 assert (aLineStartPoint.x() != aLine2StartPoint.x() or aLineStartPoint.y() != aLine2StartPoint.y())
307 assert (aLineStartPoint.x() == aLine3StartPoint.x() and aLineStartPoint.y() == aLine3StartPoint.y())
308 assert (model.dof(aSketchFeature) == 9)
309
310 #=========================================================================
311 # End of test
312 #=========================================================================
313
314 assert(model.checkPythonDump())