]> SALOME platform Git repositories - modules/shaper.git/blob - src/SketchPlugin/Test/TestCreateCircleByThreePoints.py
Salome HOME
Simplification and refactoring of unit tests for SketchPlugin
[modules/shaper.git] / src / SketchPlugin / Test / TestCreateCircleByThreePoints.py
1 """
2     TestCreateCircleByThreePoints.py
3
4     Test creation methods of a circle built by three points
5 """
6
7 #=========================================================================
8 # Initialization of the test
9 #=========================================================================
10 from GeomDataAPI import *
11 from GeomAPI import *
12 from ModelAPI import *
13 from SketchAPI import SketchAPI_Sketch
14 from salome.shaper import model
15 import math
16
17 __updated__ = "2017-03-22"
18
19
20 #=========================================================================
21 # Auxiliary functions
22 #=========================================================================
23 TOLERANCE = 1.e-7
24
25 def verifyLastCircle(theSketch, theX, theY, theR):
26     """
27     subroutine to verify position of last circle in the sketch
28     """
29     aLastCircle = model.lastSubFeature(theSketch, "SketchCircle")
30     model.assertCircle(aLastCircle, [theX, theY], theR)
31
32 def verifyPointOnCircle(thePoint, theCircle):
33     aCircleCenter = geomDataAPI_Point2D(theCircle.attribute("circle_center"))
34     aDistCP = model.distancePointPoint(aCircleCenter, thePoint)
35     aCircleRadius = theCircle.real("circle_radius").value()
36     assert math.fabs(aDistCP - aCircleRadius) < TOLERANCE, "Point is not on circle, distance: {0}, radius of circle: {1}".format(aDistCP, aCircleRadius)
37
38 def verifyTangentCircles(theCircle1, theCircle2):
39     aCenter1 = geomDataAPI_Point2D(theCircle1.attribute("circle_center"))
40     aCenter2 = geomDataAPI_Point2D(theCircle2.attribute("circle_center"))
41     aDistCC = model.distancePointPoint(aCenter1, aCenter2)
42     aRadius1 = theCircle1.real("circle_radius").value()
43     aRadius2 = theCircle2.real("circle_radius").value()
44     verifyTangentCircular(aDistCC, aRadius1, aRadius2)
45
46 def verifyTangentCircleArc(theCircle, theArc):
47     aCircleCenter = geomDataAPI_Point2D(theCircle.attribute("circle_center"))
48     anArcCenter = geomDataAPI_Point2D(theArc.attribute("center_point"))
49     anArcStart = geomDataAPI_Point2D(theArc.attribute("start_point"))
50     aDistCC = model.distancePointPoint(aCircleCenter, anArcCenter)
51     aCircleRadius = theCircle.real("circle_radius").value()
52     anArcRadius = model.distancePointPoint(anArcCenter, anArcStart)
53     verifyTangentCircular(aDistCC, aCircleRadius, anArcRadius)
54
55 def verifyTangentCircular(theDistBetweenCenters, theRadius1, theRadius2):
56     aRSum = theRadius1 + theRadius2
57     aRDiff = math.fabs(theRadius1 - theRadius2)
58     assert math.fabs(aRSum - theDistBetweenCenters) < TOLERANCE or math.fabs(aRDiff - theDistBetweenCenters) < TOLERANCE, "Two circulars are not tangent"
59
60 def verifyTangentCircleLine(theCircle, theLine):
61     aCenter = geomDataAPI_Point2D(theCircle.attribute("circle_center"))
62     aRadius = theCircle.real("circle_radius").value()
63     aDistCL = model.distancePointLine(aCenter, theLine)
64     assert math.fabs(aDistCL - aRadius) < TOLERANCE, "Circle and line are not tangent"
65
66
67 #=========================================================================
68 # Start of test
69 #=========================================================================
70
71 aSession = ModelAPI_Session.get()
72 aDocument = aSession.moduleDocument()
73 #=========================================================================
74 # Creation of a sketch
75 #=========================================================================
76 aSession.startOperation()
77 aSketchCommonFeature = aDocument.addFeature("Sketch")
78 aSketchFeature = featureToCompositeFeature(aSketchCommonFeature)
79 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
80 origin.setValue(0, 0, 0)
81 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
82 dirx.setValue(1, 0, 0)
83 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
84 norm.setValue(0, 0, 1)
85 aSession.finishOperation()
86 aSketch = SketchAPI_Sketch(aSketchFeature)
87
88 #=========================================================================
89 # Test 1. Create a circle by three points
90 #=========================================================================
91 expectedCenter = [0., 0.]
92 expectedRadius = 10.
93 aSession.startOperation()
94 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
95 assert (aCircle.getKind() == "SketchMacroCircle")
96 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
97 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
98 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
99 assert (not aCirclePnt1.isInitialized())
100 assert (not aCirclePnt2.isInitialized())
101 assert (not aCirclePnt3.isInitialized())
102 aCircleType = aCircle.string("circle_type")
103 assert (not aCircleType.isInitialized())
104 aCircleType.setValue("circle_type_by_three_points")
105 aCirclePnt1.setValue(expectedCenter[0] - expectedRadius, expectedCenter[1])
106 aCirclePnt2.setValue(expectedCenter[0] + expectedRadius, expectedCenter[1])
107 aCirclePnt3.setValue(expectedCenter[0], expectedCenter[1] + expectedRadius)
108 aSession.finishOperation()
109 assert (aSketchFeature.numberOfSubs() == 1)
110 verifyLastCircle(aSketchFeature, expectedCenter[0], expectedCenter[1], expectedRadius)
111
112 #=========================================================================
113 # Test 2. Create a circle by three points coincident to other points
114 #=========================================================================
115 # get previous circle
116 aPrevCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
117 aPrevCenter = geomDataAPI_Point2D(aPrevCircle.attribute("circle_center"))
118 aPrevCenterXY = [aPrevCenter.x(), aPrevCenter.y()]
119 aPrevCircleRadius = aPrevCircle.real("circle_radius").value()
120 # create additional point and line
121 aPointCoordinates = [5., 20.]
122 aLineStart = [10., 0.]
123 aLineEnd = [10., 50.]
124 aSession.startOperation()
125 aPoint = aSketchFeature.addFeature("SketchPoint")
126 aPointCoord = geomDataAPI_Point2D(aPoint.attribute("PointCoordinates"))
127 aPointCoord.setValue(aPointCoordinates[0], aPointCoordinates[1])
128 aLine = aSketchFeature.addFeature("SketchLine")
129 aStartPnt = geomDataAPI_Point2D(aLine.attribute("StartPoint"))
130 aStartPnt.setValue(aLineStart[0], aLineStart[1])
131 aEndPnt = geomDataAPI_Point2D(aLine.attribute("EndPoint"))
132 aEndPnt.setValue(aLineEnd[0], aLineEnd[1])
133 aSession.finishOperation()
134 # create new circle
135 aSession.startOperation()
136 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
137 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
138 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
139 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
140 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
141 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
142 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
143 aCircleType = aCircle.string("circle_type")
144 # initialize attributes
145 aCircleType.setValue("circle_type_by_three_points")
146 aCirclePnt1Ref.setAttr(aPrevCenter)
147 aCirclePnt1.setValue(aPrevCenter.pnt())
148 aCirclePnt2Ref.setObject(aPoint.lastResult())
149 aCirclePnt2.setValue(aPointCoord.pnt())
150 aCirclePnt3Ref.setAttr(aStartPnt)
151 aCirclePnt3.setValue(aLineStart[0], aLineStart[1])
152 aSession.finishOperation()
153 assert (aSketchFeature.numberOfSubs() == 7)
154 # check the points do not change their positions
155 model.assertPoint(aPrevCenter, aPrevCenterXY)
156 model.assertPoint(aPointCoord, aPointCoordinates)
157 model.assertPoint(aStartPnt, aLineStart)
158 # check newly created circle passes through the points
159 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
160 verifyPointOnCircle(aPrevCenter, aCircle)
161 verifyPointOnCircle(aPointCoord, aCircle)
162 verifyPointOnCircle(aStartPnt, aCircle)
163 model.testNbSubFeatures(aSketch, "SketchConstraintCoincidence", 3)
164 model.testNbSubFeatures(aSketch, "SketchConstraintTangent", 0)
165
166 #=========================================================================
167 # Test 3. Create a circle by three points and tangent to line, circle and arc
168 #=========================================================================
169 # create additional arc
170 anArcRadius = 5.
171 anArcCenter = [-10., 10.]
172 anArcStart = [anArcCenter[0], anArcCenter[1] - anArcRadius]
173 anArcEnd = [anArcCenter[0], anArcCenter[1] + anArcRadius]
174 aSession.startOperation()
175 anArc = aSketchFeature.addFeature("SketchArc")
176 anArcCenterPnt = geomDataAPI_Point2D(anArc.attribute("center_point"))
177 anArcCenterPnt.setValue(anArcCenter[0], anArcCenter[1])
178 anArcStartPnt = geomDataAPI_Point2D(anArc.attribute("start_point"))
179 anArcStartPnt.setValue(anArcStart[0], anArcStart[1])
180 anArcEndPnt = geomDataAPI_Point2D(anArc.attribute("end_point"))
181 anArcEndPnt.setValue(anArcEnd[0], anArcEnd[1])
182 aSession.finishOperation()
183 # create new circle
184 aSession.startOperation()
185 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
186 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
187 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
188 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
189 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
190 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
191 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
192 aCircleType = aCircle.string("circle_type")
193 # initialize attributes
194 aCircleType.setValue("circle_type_by_three_points")
195 aCirclePnt1Ref.setObject(aPrevCircle.lastResult())
196 aCirclePnt1.setValue(aPrevCenter.x(), aPrevCenter.y() + aPrevCircleRadius)
197 aCirclePnt2Ref.setObject(aLine.lastResult())
198 aCirclePnt2.setValue(aLineEnd[0], aLineEnd[1])
199 aCirclePnt3Ref.setObject(anArc.lastResult())
200 aCirclePnt3.setValue(anArcCenter[0] + anArcRadius, anArcCenter[1])
201 aSession.finishOperation()
202 assert (aSketchFeature.numberOfSubs() == 12)
203 # check the tangent entities do not change their positions
204 model.assertPoint(aPrevCenter, aPrevCenterXY)
205 assert (aPrevCircle.real("circle_radius").value() == aPrevCircleRadius)
206 model.assertLine(aLine, aLineStart, aLineEnd)
207 model.assertArc(anArc, anArcCenter, anArcStart, anArcEnd)
208 # check newly created circle passes through the points
209 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
210 verifyTangentCircles(aCircle, aPrevCircle)
211 verifyTangentCircleArc(aCircle, anArc)
212 verifyTangentCircleLine(aCircle, aLine)
213 model.testNbSubFeatures(aSketch, "SketchConstraintCoincidence", 3)
214 model.testNbSubFeatures(aSketch, "SketchConstraintTangent", 3)
215
216 #=========================================================================
217 # Test 4. Create a circle by three points:
218 #         a. first two points are coincident to extremities of the line
219 #         b. check that this line is not selectable by third point
220 #=========================================================================
221 aSession.startOperation()
222 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
223 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
224 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
225 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
226 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
227 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
228 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
229 aCircleType = aCircle.string("circle_type")
230 # initialize attributes
231 aCircleType.setValue("circle_type_by_three_points")
232 aCirclePnt1Ref.setAttr(aStartPnt)
233 aCirclePnt1.setValue(aStartPnt.pnt())
234 aCirclePnt2Ref.setAttr(aEndPnt)
235 aCirclePnt2.setValue(aEndPnt.pnt())
236 aCirclePnt3Ref.setObject(aLine.lastResult())
237 aCirclePnt3.setValue(aLineEnd[0], aLineEnd[1])
238 aSession.finishOperation()
239 aLastFeature = aSketchFeature.subFeature(aSketchFeature.numberOfSubs() - 1)
240 assert aLastFeature.getKind() == "SketchMacroCircle", "ERROR: SketchMacroCircle has NOT expected to be valid"
241 aDocument.removeFeature(aCircle)
242 assert (aSketchFeature.numberOfSubs() == 12)
243
244 #=========================================================================
245 # Test 5. Create a circle by three points:
246 #         a. first two points are placed on both sides from line
247 #         b. check that this line is not selectable by third point
248 #=========================================================================
249 aDistanceFromLine = 20.
250 aSession.startOperation()
251 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
252 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
253 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
254 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
255 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
256 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
257 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
258 aCircleType = aCircle.string("circle_type")
259 # initialize attributes
260 aCircleType.setValue("circle_type_by_three_points")
261 aCirclePnt1.setValue(aLineStart[0] + aDistanceFromLine, aLineStart[1])
262 aCirclePnt2.setValue(aLineStart[0] - aDistanceFromLine, aLineStart[1])
263 aCirclePnt3Ref.setObject(aLine.lastResult())
264 aCirclePnt3.setValue(aLineEnd[0], aLineEnd[1])
265 aSession.finishOperation()
266 aLastFeature = aSketchFeature.subFeature(aSketchFeature.numberOfSubs() - 1)
267 assert aLastFeature.getKind() == "SketchMacroCircle", "ERROR: SketchMacroCircle has NOT expected to be valid"
268 aDocument.removeFeature(aCircle)
269 assert (aSketchFeature.numberOfSubs() == 12)
270
271 #=========================================================================
272 # End of test
273 #=========================================================================
274
275 from salome.shaper import model
276 assert(model.checkPythonDump())