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