Salome HOME
Task 2.7. Horizontal and Vertical Distance constraint
[modules/shaper.git] / src / SketchPlugin / Test / TestConstraintDistanceHorizontal.py
1 """
2     TestConstraintDistanceHorizontal.py
3     Unit test of SketchPlugin_ConstraintDistanceHorizontal class
4
5     SketchPlugin_ConstraintDistanceHorizontal
6         static const std::string MY_CONSTRAINT_DISTANCE_ID("SketchConstraintDistance");
7         data()->addAttribute(SketchPlugin_Constraint::VALUE(),    ModelAPI_AttributeDouble::typeId());
8         data()->addAttribute(SketchPlugin_Constraint::FLYOUT_VALUE_PNT(), GeomDataAPI_Point2D::typeId());
9         data()->addAttribute(SketchPlugin_Constraint::ENTITY_A(), ModelAPI_AttributeRefAttr::typeId());
10         data()->addAttribute(SketchPlugin_Constraint::ENTITY_B(), ModelAPI_AttributeRefAttr::typeId());
11 """
12
13 from GeomDataAPI import *
14 from ModelAPI import *
15 import math
16 from salome.shaper import model
17
18 #=========================================================================
19 # Initialization of the test
20 #=========================================================================
21
22 __updated__ = "2017-05-10"
23
24
25 def horizontalDistance(point1, point2):
26     """
27     subroutine to calculate signed distance between two points
28     """
29     return point2.x() - point1.x()
30
31 aSession = ModelAPI_Session.get()
32 aDocument = aSession.moduleDocument()
33 #=========================================================================
34 # Creation of a sketch
35 #=========================================================================
36 aSession.startOperation()
37 aSketchCommonFeature = aDocument.addFeature("Sketch")
38 aSketchFeature = featureToCompositeFeature(aSketchCommonFeature)
39 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
40 origin.setValue(0, 0, 0)
41 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
42 dirx.setValue(1, 0, 0)
43 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
44 norm.setValue(0, 0, 1)
45 aSession.finishOperation()
46 #=========================================================================
47 # Create two movable and one fixed point
48 #=========================================================================
49 aSession.startOperation()
50 aPoint1 = aSketchFeature.addFeature("SketchPoint")
51 aPoint1Coords = geomDataAPI_Point2D(aPoint1.attribute("PointCoordinates"))
52 aPoint1Coords.setValue(50., 50.)
53 aSession.finishOperation()
54 aSession.startOperation()
55 aPoint2 = aSketchFeature.addFeature("SketchPoint")
56 aPoint2Coords = geomDataAPI_Point2D(aPoint2.attribute("PointCoordinates"))
57 aPoint2Coords.setValue(70., 70.)
58 aSession.finishOperation()
59 aSession.startOperation()
60 anOriginResult = modelAPI_Result(aDocument.objectByName("Construction", "Origin"))
61 anOriginShape = anOriginResult.shape()
62 anExtPoint = aSketchFeature.addFeature("SketchPoint")
63 anExtCoords = geomDataAPI_Point2D(anExtPoint.attribute("PointCoordinates"))
64 anExtCoords.setValue(0., 0.)
65 anExtPoint.selection("External").setValue(anOriginResult, anOriginShape)
66 aSession.finishOperation()
67 assert (model.dof(aSketchFeature) == 4)
68
69 #=========================================================================
70 # Create a constraint to keep horizontal distance between movable points
71 #=========================================================================
72 DISTANCE1 = 25.
73 aSession.startOperation()
74 aHDist1 = aSketchFeature.addFeature("SketchConstraintDistanceHorizontal")
75 aDistance = aHDist1.real("ConstraintValue")
76 refattrA = aHDist1.refattr("ConstraintEntityA")
77 refattrB = aHDist1.refattr("ConstraintEntityB")
78 assert (not aDistance.isInitialized())
79 assert (not refattrA.isInitialized())
80 assert (not refattrB.isInitialized())
81 refattrA.setObject(aPoint1.lastResult())
82 refattrB.setObject(aPoint2.lastResult())
83 aSession.finishOperation()
84 assert (model.dof(aSketchFeature) == 3)
85 # set flyout point then abort operation, after that check the Distance is correct
86 aSession.startOperation()
87 aFlyoutPoint = geomDataAPI_Point2D(aHDist1.attribute("ConstraintFlyoutValuePnt"))
88 aFlyoutPoint.setValue(50.0, 100.0)
89 aSession.abortOperation()
90 assert (refattrA.isInitialized())
91 assert (refattrB.isInitialized())
92 assert (aDistance.isInitialized())
93 aSession.startOperation()
94 aDistance.setValue(DISTANCE1)
95 aSession.finishOperation()
96 assert math.fabs(horizontalDistance(aPoint1Coords, aPoint2Coords) - DISTANCE1) < 1.e-5, "Distance values are different: {0} != {1}".format(horizontalDistance(aPoint1Coords, aPoint2Coords), DISTANCE1)
97 assert (model.dof(aSketchFeature) == 3)
98 #=========================================================================
99 # Change a distance value
100 #=========================================================================
101 d = DISTANCE1 + 20.
102 dStep = -5.
103 while d >= -30.:
104     aSession.startOperation()
105     DISTANCE1 = d
106     aDistance.setValue(DISTANCE1)
107     aSession.finishOperation()
108     assert math.fabs(horizontalDistance(aPoint1Coords, aPoint2Coords) - DISTANCE1) < 1.e-5, "Distance values are different: {0} != {1}".format(horizontalDistance(aPoint1Coords, aPoint2Coords), DISTANCE1)
109     d += dStep
110 assert (model.dof(aSketchFeature) == 3)
111
112 #=========================================================================
113 # Create a constraint to keep horizontal distance between fixed and movable points
114 #=========================================================================
115 DISTANCE2 = 50.
116 aSession.startOperation()
117 aHDist2 = aSketchFeature.addFeature("SketchConstraintDistanceHorizontal")
118 aDistance = aHDist2.real("ConstraintValue")
119 refattrA = aHDist2.refattr("ConstraintEntityA")
120 refattrB = aHDist2.refattr("ConstraintEntityB")
121 assert (not aDistance.isInitialized())
122 assert (not refattrA.isInitialized())
123 assert (not refattrB.isInitialized())
124 refattrA.setObject(anExtPoint.lastResult())
125 refattrB.setAttr(aPoint1Coords)
126 aDistance.setValue(DISTANCE2)
127 aSession.finishOperation()
128 assert math.fabs(horizontalDistance(anExtCoords, aPoint1Coords) - DISTANCE2) < 1.e-5, "Distance values are different: {0} != {1}".format(horizontalDistance(anExtCoords, aPoint1Coords), DISTANCE2)
129 assert math.fabs(aPoint1Coords.x() - DISTANCE2) < 1.e-5, "Wrong point coordinates ({}, {}), expected x = {}".format(aPoint1Coords.x(), aPoint1Coords.y(), DISTANCE2)
130 assert (model.dof(aSketchFeature) == 2)
131 #=========================================================================
132 # Change a distance value (check previous constraint is applied too)
133 #=========================================================================
134 d = DISTANCE2
135 dStep = -5.
136 while d >= -50.:
137     aSession.startOperation()
138     DISTANCE2 = d
139     aDistance.setValue(DISTANCE2)
140     aSession.finishOperation()
141     assert math.fabs(horizontalDistance(anExtCoords, aPoint1Coords) - DISTANCE2) < 1.e-5, "Distance values are different: {0} != {1}".format(horizontalDistance(anExtCoords, aPoint1Coords), DISTANCE2)
142     assert math.fabs(aPoint1Coords.x() - DISTANCE2) < 1.e-5, "Wrong point coordinates ({}, {}), expected x = {}".format(aPoint1Coords.x(), aPoint1Coords.y(), DISTANCE2)
143     assert math.fabs(horizontalDistance(aPoint1Coords, aPoint2Coords) - DISTANCE1) < 1.e-5, "Distance values are different: {0} != {1}".format(horizontalDistance(aPoint1Coords, aPoint2Coords), DISTANCE1)
144     d += dStep
145 assert (model.dof(aSketchFeature) == 2)
146
147 #=========================================================================
148 # Remove first distance
149 #=========================================================================
150 aStoredCoords = [aPoint2Coords.x(), aPoint2Coords.y()]
151 aSession.startOperation()
152 aDocument.removeFeature(aHDist1)
153 aSession.finishOperation()
154 assert (model.dof(aSketchFeature) == 3)
155 aSession.startOperation()
156 DISTANCE2 = 20.
157 aDistance.setValue(DISTANCE2)
158 aSession.finishOperation()
159 assert math.fabs(horizontalDistance(anExtCoords, aPoint1Coords) - DISTANCE2) < 1.e-5, "Distance values are different: {0} != {1}".format(horizontalDistance(anExtCoords, aPoint1Coords), DISTANCE2)
160 assert math.fabs(aPoint1Coords.x() - DISTANCE2) < 1.e-5, "Wrong point coordinates ({}, {}), expected x = {}".format(aPoint1Coords.x(), aPoint1Coords.y(), DISTANCE2)
161 assert aPoint2Coords.x() == aStoredCoords[0] and aPoint2Coords.y() == aStoredCoords[1]
162
163 #=========================================================================
164 # Create line and set horizontal distance between line boundaries
165 #=========================================================================
166 aSession.startOperation()
167 aLine = aSketchFeature.addFeature("SketchLine")
168 aStartPoint = geomDataAPI_Point2D(aLine.attribute("StartPoint"))
169 aEndPoint = geomDataAPI_Point2D(aLine.attribute("EndPoint"))
170 aStartPoint.setValue(50., 0.)
171 aEndPoint.setValue(100., 20.)
172 aSession.finishOperation()
173 assert (model.dof(aSketchFeature) == 7)
174
175 DISTANCE3 = 50.
176 aSession.startOperation()
177 aHDist3 = aSketchFeature.addFeature("SketchConstraintDistanceHorizontal")
178 aDistance = aHDist3.real("ConstraintValue")
179 refattrA = aHDist3.refattr("ConstraintEntityA")
180 refattrB = aHDist3.refattr("ConstraintEntityB")
181 assert (not aDistance.isInitialized())
182 assert (not refattrA.isInitialized())
183 assert (not refattrB.isInitialized())
184 refattrA.setAttr(aStartPoint)
185 refattrB.setAttr(aEndPoint)
186 aDistance.setValue(DISTANCE3)
187 aSession.finishOperation()
188 assert math.fabs(horizontalDistance(aStartPoint, aEndPoint) - DISTANCE3) < 1.e-5, "Distance values are different: {0} != {1}".format(horizontalDistance(aStartPoint, aEndPoint), DISTANCE3)
189 assert (model.dof(aSketchFeature) == 6)
190 #=========================================================================
191 # Change a distance value
192 #=========================================================================
193 d = DISTANCE3
194 dStep = -5.
195 while d >= -50.:
196     aSession.startOperation()
197     DISTANCE3 = d
198     aDistance.setValue(DISTANCE3)
199     aSession.finishOperation()
200     assert math.fabs(horizontalDistance(aStartPoint, aEndPoint) - DISTANCE3) < 1.e-5, "Distance values are different: {0} != {1}".format(horizontalDistance(aStartPoint, aEndPoint), DISTANCE3)
201     d += dStep
202 assert (model.dof(aSketchFeature) == 6)
203
204 #=========================================================================
205 # End of test
206 #=========================================================================
207
208 assert(model.checkPythonDump())