Salome HOME
Update sketcher unit tests for code coverage
[modules/shaper.git] / src / SketchPlugin / Test / TestConstraintConcidence.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.real("x").setValue(0.)
65 aFeature.real("y").setValue(0.)
66 aFeature.real("z").setValue(0.)
67 anOriginName = aFeature.name()
68 aSession.finishOperation()
69 #=========================================================================
70 # Creation of a sketch
71 #=========================================================================
72 aSession.startOperation()
73 aSketchFeature = featureToCompositeFeature(aDocument.addFeature("Sketch"))
74 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
75 origin.setValue(0, 0, 0)
76 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
77 dirx.setValue(1, 0, 0)
78 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
79 norm.setValue(0, 0, 1)
80 aSession.finishOperation()
81 #=========================================================================
82 # Create a line and an arc
83 #=========================================================================
84 aSession.startOperation()
85 aSketchArc = aSketchFeature.addFeature("SketchArc")
86 anArcCentr = geomDataAPI_Point2D(aSketchArc.attribute("ArcCenter"))
87 anArcStartPoint = geomDataAPI_Point2D(
88     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() == 50)
115 assert (anArcEndPoint.y() == 0)
116 assert (aLineStartPoint.x() == 50)
117 assert (aLineStartPoint.y() == 0)
118 deltaX = deltaY = 40.
119 #  move line
120 aSession.startOperation()
121 aLineStartPoint.setValue(aLineStartPoint.x() + deltaX,
122                          aLineStartPoint.y() + deltaY)
123 aLineEndPoint.setValue(aLineEndPoint.x() + deltaX,
124                        aLineEndPoint.y() + deltaY)
125 aSession.finishOperation()
126 # check that arc's points are moved also
127 assert (anArcEndPoint.x() == aLineStartPoint.x())
128 assert (anArcEndPoint.y() == aLineStartPoint.y())
129 #=========================================================================
130 # Remove coincidence and move the line
131 #=========================================================================
132 aSession.startOperation()
133 aDocument.removeFeature(aConstraint)
134 aSession.finishOperation()
135 aSession.startOperation()
136 aLineStartPoint.setValue(50., 0.)
137 aSession.finishOperation()
138 assert (anArcEndPoint.x() != aLineStartPoint.x() or anArcEndPoint.y() != aLineStartPoint.y())
139
140 #=========================================================================
141 # Add constraint point-on-line
142 #=========================================================================
143 aSession.startOperation()
144 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
145 reflistA = aConstraint.refattr("ConstraintEntityA")
146 reflistB = aConstraint.refattr("ConstraintEntityB")
147 reflistA.setAttr(anArcStartPoint)
148 reflistB.setObject(aSketchLine.lastResult())
149 aConstraint.execute()
150 aSession.finishOperation()
151 checkPointOnLine(anArcStartPoint, aSketchLine)
152 #=========================================================================
153 # Add constraint point-on-circle
154 #=========================================================================
155 aSession.startOperation()
156 # create circle with center coincident with origin
157 aSketchCircle = aSketchFeature.addFeature("SketchCircle")
158 aCircleCenter = geomDataAPI_Point2D(aSketchCircle.attribute("CircleCenter"))
159 aCircleRadius = aSketchCircle.real("CircleRadius")
160 aCircleCenter.setValue(10., 10.)
161 aCircleRadius.setValue(25.)
162 aSession.finishOperation()
163 # create origin
164 aSession.startOperation()
165 anOrigRes = modelAPI_Result(aDocument.objectByName("Construction", anOriginName))
166 assert (anOrigRes)
167 anOrigShape = anOrigRes.shape()
168 assert (anOrigShape)
169 anOrigin = aSketchFeature.addFeature("SketchPoint")
170 anOriginCoord = geomDataAPI_Point2D(anOrigin.attribute("PointCoordindates"))
171 anOriginCoord.setValue(0., 0.)
172 anOrigin.selection("External").setValue(anOrigRes, anOrigShape)
173 aSession.finishOperation()
174 # coincidence between center of circle and the origin
175 aSession.startOperation()
176 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
177 reflistA = aConstraint.refattr("ConstraintEntityA")
178 reflistB = aConstraint.refattr("ConstraintEntityB")
179 reflistA.setAttr(aCircleCenter)
180 reflistB.setObject(anOrigin.lastResult())
181 aSession.finishOperation()
182 # point-on-circle
183 aSession.startOperation()
184 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
185 reflistA = aConstraint.refattr("ConstraintEntityA")
186 reflistB = aConstraint.refattr("ConstraintEntityB")
187 reflistA.setObject(aSketchCircle.lastResult())
188 reflistB.setAttr(aLineEndPoint)
189 aConstraint.execute()
190 aSession.finishOperation()
191 checkPointOnCircle(aLineEndPoint, aSketchCircle)
192 #=========================================================================
193 # Add constraint point-on-arc
194 #=========================================================================
195 aSession.startOperation()
196 aConstraint = aSketchFeature.addFeature("SketchConstraintCoincidence")
197 reflistA = aConstraint.refattr("ConstraintEntityA")
198 reflistB = aConstraint.refattr("ConstraintEntityB")
199 reflistA.setAttr(aCircleCenter)
200 reflistB.setObject(aSketchArc.lastResult())
201 aConstraint.execute()
202 aSession.finishOperation()
203 checkPointOnArc(aCircleCenter, aSketchArc)
204 #=========================================================================
205 # Check center of circle is still in origin
206 #=========================================================================
207 assert (aCircleCenter.x() == 0. and aCircleCenter.y() == 0.)
208 #=========================================================================
209 # End of test
210 #=========================================================================