]> SALOME platform Git repositories - modules/shaper.git/blob - src/SketchPlugin/Test/TestCreateCircleByThreePoints.py
Salome HOME
bos#35152 [EDF] (2023-T1) Sketch Circle should allow user to position construction...
[modules/shaper.git] / src / SketchPlugin / Test / TestCreateCircleByThreePoints.py
1 # Copyright (C) 2014-2023  CEA, EDF
2 #
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License, or (at your option) any later version.
7 #
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 # Lesser General Public License for more details.
12 #
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 #
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 #
19
20 """
21     TestCreateCircleByThreePoints.py
22
23     Test creation methods of a circle built by three points
24 """
25
26 #=========================================================================
27 # Initialization of the test
28 #=========================================================================
29 from GeomDataAPI import *
30 from GeomAPI import *
31 from ModelAPI import *
32 from SketchAPI import SketchAPI_Sketch
33 from salome.shaper import model
34 import math
35
36 __updated__ = "2023-06-28"
37
38
39 #=========================================================================
40 # Auxiliary functions
41 #=========================================================================
42 TOLERANCE = 1.e-7
43
44 def verifyLastCircle(theSketch, theX, theY, theR):
45     """
46     subroutine to verify position of last circle in the sketch
47     """
48     aLastCircle = model.lastSubFeature(theSketch, "SketchCircle")
49     model.assertCircle(aLastCircle, [theX, theY], theR)
50
51 def verifyPointOnCircle(thePoint, theCircle):
52     aCircleCenter = geomDataAPI_Point2D(theCircle.attribute("circle_center"))
53     aDistCP = model.distancePointPoint(aCircleCenter, thePoint)
54     aCircleRadius = theCircle.real("circle_radius").value()
55     assert math.fabs(aDistCP - aCircleRadius) < TOLERANCE, "Point is not on circle, distance: {0}, radius of circle: {1}".format(aDistCP, aCircleRadius)
56
57 def verifyTangentCircles(theCircle1, theCircle2):
58     aCenter1 = geomDataAPI_Point2D(theCircle1.attribute("circle_center"))
59     aCenter2 = geomDataAPI_Point2D(theCircle2.attribute("circle_center"))
60     aDistCC = model.distancePointPoint(aCenter1, aCenter2)
61     aRadius1 = theCircle1.real("circle_radius").value()
62     aRadius2 = theCircle2.real("circle_radius").value()
63     verifyTangentCircular(aDistCC, aRadius1, aRadius2)
64
65 def verifyTangentCircleArc(theCircle, theArc):
66     aCircleCenter = geomDataAPI_Point2D(theCircle.attribute("circle_center"))
67     anArcCenter = geomDataAPI_Point2D(theArc.attribute("center_point"))
68     anArcStart = geomDataAPI_Point2D(theArc.attribute("start_point"))
69     aDistCC = model.distancePointPoint(aCircleCenter, anArcCenter)
70     aCircleRadius = theCircle.real("circle_radius").value()
71     anArcRadius = model.distancePointPoint(anArcCenter, anArcStart)
72     verifyTangentCircular(aDistCC, aCircleRadius, anArcRadius)
73
74 def verifyTangentCircular(theDistBetweenCenters, theRadius1, theRadius2):
75     aRSum = theRadius1 + theRadius2
76     aRDiff = math.fabs(theRadius1 - theRadius2)
77     assert math.fabs(aRSum - theDistBetweenCenters) < TOLERANCE or math.fabs(aRDiff - theDistBetweenCenters) < TOLERANCE, "Two circulars are not tangent"
78
79 def verifyTangentCircleLine(theCircle, theLine):
80     aCenter = geomDataAPI_Point2D(theCircle.attribute("circle_center"))
81     aRadius = theCircle.real("circle_radius").value()
82     aDistCL = model.distancePointLine(aCenter, theLine)
83     assert math.fabs(aDistCL - aRadius) < TOLERANCE, "Circle and line are not tangent"
84
85 #=========================================================================
86 # Set old version of Circle for avoid create point.
87 #=========================================================================
88 def setOldVersionOfCircleFeature(theCircle):
89     aCircleVersion = theCircle.integer("version")
90     assert (type(aCircleVersion) == ModelAPI_AttributeInteger)
91     aCircleVersion.setValue(0)
92
93 #=========================================================================
94 # Start of test
95 #=========================================================================
96
97 aSession = ModelAPI_Session.get()
98 aDocument = aSession.moduleDocument()
99 #=========================================================================
100 # Creation of a sketch
101 #=========================================================================
102 aSession.startOperation()
103 aSketchCommonFeature = aDocument.addFeature("Sketch")
104 aSketchFeature = featureToCompositeFeature(aSketchCommonFeature)
105 origin = geomDataAPI_Point(aSketchFeature.attribute("Origin"))
106 origin.setValue(0, 0, 0)
107 dirx = geomDataAPI_Dir(aSketchFeature.attribute("DirX"))
108 dirx.setValue(1, 0, 0)
109 norm = geomDataAPI_Dir(aSketchFeature.attribute("Norm"))
110 norm.setValue(0, 0, 1)
111 aSession.finishOperation()
112 aSketch = SketchAPI_Sketch(aSketchFeature)
113
114 #=========================================================================
115 # Test 1. Create a circle by three points
116 #=========================================================================
117 expectedCenter = [0., 0.]
118 expectedRadius = 10.
119 aSession.startOperation()
120 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
121 assert (aCircle.getKind() == "SketchMacroCircle")
122 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
123 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
124 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
125 assert (not aCirclePnt1.isInitialized())
126 assert (not aCirclePnt2.isInitialized())
127 assert (not aCirclePnt3.isInitialized())
128 aCircleType = aCircle.string("circle_type")
129 assert (not aCircleType.isInitialized())
130 aCircleType.setValue("circle_type_by_three_points")
131 setOldVersionOfCircleFeature(aCircle)
132 aCirclePnt1.setValue(expectedCenter[0] - expectedRadius, expectedCenter[1])
133 aCirclePnt2.setValue(expectedCenter[0] + expectedRadius, expectedCenter[1])
134 aCirclePnt3.setValue(expectedCenter[0], expectedCenter[1] + expectedRadius)
135 aSession.finishOperation()
136 assert (aSketchFeature.numberOfSubs() == 1)
137 verifyLastCircle(aSketchFeature, expectedCenter[0], expectedCenter[1], expectedRadius)
138
139 #=========================================================================
140 # Test 2. Create a circle by three points coincident to other points
141 #=========================================================================
142 # get previous circle
143 aPrevCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
144 aPrevCenter = geomDataAPI_Point2D(aPrevCircle.attribute("circle_center"))
145 aPrevCenterXY = [aPrevCenter.x(), aPrevCenter.y()]
146 aPrevCircleRadius = aPrevCircle.real("circle_radius").value()
147 # create additional point and line
148 aPointCoordinates = [5., 20.]
149 aLineStart = [10., 0.]
150 aLineEnd = [10., 50.]
151 aSession.startOperation()
152 aPoint = aSketchFeature.addFeature("SketchPoint")
153 aPointCoord = geomDataAPI_Point2D(aPoint.attribute("PointCoordinates"))
154 aPointCoord.setValue(aPointCoordinates[0], aPointCoordinates[1])
155 aLine = aSketchFeature.addFeature("SketchLine")
156 aStartPnt = geomDataAPI_Point2D(aLine.attribute("StartPoint"))
157 aStartPnt.setValue(aLineStart[0], aLineStart[1])
158 aEndPnt = geomDataAPI_Point2D(aLine.attribute("EndPoint"))
159 aEndPnt.setValue(aLineEnd[0], aLineEnd[1])
160 aSession.finishOperation()
161 # create new circle
162 aSession.startOperation()
163 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
164 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
165 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
166 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
167 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
168 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
169 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
170 aCircleType = aCircle.string("circle_type")
171 # initialize attributes
172 aCircleType.setValue("circle_type_by_three_points")
173 setOldVersionOfCircleFeature(aCircle)
174 aCirclePnt1Ref.setAttr(aPrevCenter)
175 aCirclePnt1.setValue(aPrevCenter.pnt())
176 aCirclePnt2Ref.setObject(aPoint.lastResult())
177 aCirclePnt2.setValue(aPointCoord.pnt())
178 aCirclePnt3Ref.setAttr(aStartPnt)
179 aCirclePnt3.setValue(aLineStart[0], aLineStart[1])
180 aSession.finishOperation()
181 assert (aSketchFeature.numberOfSubs() == 7)
182 # check the points do not change their positions
183 model.assertPoint(aPrevCenter, aPrevCenterXY)
184 model.assertPoint(aPointCoord, aPointCoordinates)
185 model.assertPoint(aStartPnt, aLineStart)
186 # check newly created circle passes through the points
187 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
188 verifyPointOnCircle(aPrevCenter, aCircle)
189 verifyPointOnCircle(aPointCoord, aCircle)
190 verifyPointOnCircle(aStartPnt, aCircle)
191 model.testNbSubFeatures(aSketch, "SketchConstraintCoincidence", 3)
192 model.testNbSubFeatures(aSketch, "SketchConstraintTangent", 0)
193
194 #=========================================================================
195 # Test 3. Create a circle by three points and tangent to line, circle and arc
196 #=========================================================================
197 # create additional arc
198 anArcRadius = 5.
199 anArcCenter = [-10., 10.]
200 anArcStart = [anArcCenter[0], anArcCenter[1] - anArcRadius]
201 anArcEnd = [anArcCenter[0], anArcCenter[1] + anArcRadius]
202 aSession.startOperation()
203 anArc = aSketchFeature.addFeature("SketchArc")
204 anArcCenterPnt = geomDataAPI_Point2D(anArc.attribute("center_point"))
205 anArcCenterPnt.setValue(anArcCenter[0], anArcCenter[1])
206 anArcStartPnt = geomDataAPI_Point2D(anArc.attribute("start_point"))
207 anArcStartPnt.setValue(anArcStart[0], anArcStart[1])
208 anArcEndPnt = geomDataAPI_Point2D(anArc.attribute("end_point"))
209 anArcEndPnt.setValue(anArcEnd[0], anArcEnd[1])
210 aSession.finishOperation()
211 # create new circle
212 aSession.startOperation()
213 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
214 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
215 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
216 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
217 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
218 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
219 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
220 aCircleType = aCircle.string("circle_type")
221 setOldVersionOfCircleFeature(aCircle)
222 # initialize attributes
223 aCircleType.setValue("circle_type_by_three_points")
224 aCirclePnt1Ref.setObject(aPrevCircle.lastResult())
225 aCirclePnt1.setValue(aPrevCenter.x(), aPrevCenter.y() + aPrevCircleRadius)
226 aCirclePnt2Ref.setObject(aLine.lastResult())
227 aCirclePnt2.setValue(aLineEnd[0], aLineEnd[1])
228 aCirclePnt3Ref.setObject(anArc.lastResult())
229 aCirclePnt3.setValue(anArcCenter[0] + anArcRadius, anArcCenter[1])
230 aSession.finishOperation()
231 assert (aSketchFeature.numberOfSubs() == 12)
232 # check the tangent entities do not change their positions
233 model.assertPoint(aPrevCenter, aPrevCenterXY)
234 assert (aPrevCircle.real("circle_radius").value() == aPrevCircleRadius)
235 model.assertLine(aLine, aLineStart, aLineEnd)
236 model.assertArc(anArc, anArcCenter, anArcStart, anArcEnd)
237 # check newly created circle passes through the points
238 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
239 verifyTangentCircles(aCircle, aPrevCircle)
240 verifyTangentCircleArc(aCircle, anArc)
241 verifyTangentCircleLine(aCircle, aLine)
242 model.testNbSubFeatures(aSketch, "SketchConstraintCoincidence", 3)
243 model.testNbSubFeatures(aSketch, "SketchConstraintTangent", 3)
244
245 #=========================================================================
246 # Test 4. Create a circle by three points:
247 #         a. first two points are coincident to extremities of the line
248 #         b. check that this line is not selectable by third point
249 #=========================================================================
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 setOldVersionOfCircleFeature(aCircle)
262 aCirclePnt1Ref.setAttr(aStartPnt)
263 aCirclePnt1.setValue(aStartPnt.pnt())
264 aCirclePnt2Ref.setAttr(aEndPnt)
265 aCirclePnt2.setValue(aEndPnt.pnt())
266 aCirclePnt3Ref.setObject(aLine.lastResult())
267 aCirclePnt3.setValue(aLineEnd[0], aLineEnd[1])
268 aSession.finishOperation()
269 aLastFeature = aSketchFeature.subFeature(aSketchFeature.numberOfSubs() - 1)
270 assert aLastFeature.getKind() == "SketchMacroCircle", "ERROR: SketchMacroCircle has NOT expected to be valid"
271 aSession.startOperation()
272 aDocument.removeFeature(aCircle)
273 aSession.finishOperation()
274 assert (aSketchFeature.numberOfSubs() == 12)
275
276 #=========================================================================
277 # Test 5. Create a circle by three points:
278 #         a. first two points are placed on both sides from line
279 #         b. check that this line is not selectable by third point
280 #=========================================================================
281 aDistanceFromLine = 20.
282 aSession.startOperation()
283 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
284 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
285 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
286 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
287 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
288 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
289 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
290 aCircleType = aCircle.string("circle_type")
291 # initialize attributes
292 aCircleType.setValue("circle_type_by_three_points")
293 setOldVersionOfCircleFeature(aCircle)
294 aCirclePnt1.setValue(aLineStart[0] + aDistanceFromLine, aLineStart[1])
295 aCirclePnt2.setValue(aLineStart[0] - aDistanceFromLine, aLineStart[1])
296 aCirclePnt3Ref.setObject(aLine.lastResult())
297 aCirclePnt3.setValue(aLineEnd[0], aLineEnd[1])
298 aSession.finishOperation()
299 aLastFeature = aSketchFeature.subFeature(aSketchFeature.numberOfSubs() - 1)
300 assert aLastFeature.getKind() == "SketchMacroCircle", "ERROR: SketchMacroCircle has NOT expected to be valid"
301 aSession.startOperation()
302 aDocument.removeFeature(aCircle)
303 aSession.finishOperation()
304 assert (aSketchFeature.numberOfSubs() == 12)
305
306
307 #=========================================================================
308 # Auxiliary objects for the following tests
309 #=========================================================================
310 from salome.shaper import model
311
312 model.begin()
313 Sketch_1 = model.addSketch(aDocument, model.defaultPlane("XOY"))
314 SketchLine_1 = Sketch_1.addLine(20, -10, 20, 10)
315 SketchLine_2 = Sketch_1.addLine(20, 10, 40, 10)
316 SketchLine_3 = Sketch_1.addLine(40, 10, 40, -10)
317 SketchCircle_1 = Sketch_1.addCircle(-10, 0, 20)
318 SketchCircle_2 = Sketch_1.addCircle(30, 25, 5)
319 SketchCircle_3 = Sketch_1.addCircle(50, 0, 10)
320 model.do()
321 model.end()
322 aSketchFeature = featureToCompositeFeature(Sketch_1.feature())
323
324 #=========================================================================
325 # Test 6. Create a circle passing through a point and tangent to 2 lines
326 #=========================================================================
327 # create new circle
328 aSession.startOperation()
329 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
330 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
331 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
332 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
333 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
334 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
335 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
336 aCircleType = aCircle.string("circle_type")
337 # initialize attributes
338 aCircleType.setValue("circle_type_by_three_points")
339 setOldVersionOfCircleFeature(aCircle)
340 aCirclePnt1.setValue(0, 0)
341 aCirclePnt2Ref.setObject(SketchLine_1.feature().lastResult())
342 aCirclePnt2.setValue(SketchLine_1.startPoint().x(), SketchLine_1.startPoint().y())
343 aCirclePnt3Ref.setObject(SketchLine_2.feature().lastResult())
344 aCirclePnt3.setValue(SketchLine_2.startPoint().x(), SketchLine_2.startPoint().y())
345 aSession.finishOperation()
346 assert (aSketchFeature.numberOfSubs() == 9)
347 # check newly created circle tangent to objects
348 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
349 verifyTangentCircleLine(aCircle, SketchLine_1.feature())
350 verifyTangentCircleLine(aCircle, SketchLine_2.feature())
351 model.testNbSubFeatures(Sketch_1, "SketchConstraintCoincidence", 0)
352 model.testNbSubFeatures(Sketch_1, "SketchConstraintTangent", 2)
353
354 #=========================================================================
355 # Test 7. Create a circle passing through a point and tangent to 2 circles
356 #=========================================================================
357 # create new circle
358 aSession.startOperation()
359 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
360 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
361 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
362 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
363 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
364 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
365 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
366 aCircleType = aCircle.string("circle_type")
367 # initialize attributes
368 aCircleType.setValue("circle_type_by_three_points")
369 setOldVersionOfCircleFeature(aCircle)
370 aCirclePnt1.setValue(0, 0)
371 aCirclePnt2Ref.setObject(SketchCircle_3.feature().lastResult())
372 aCirclePnt2.setValue(40, 0)
373 aCirclePnt3Ref.setObject(SketchCircle_2.feature().lastResult())
374 aCirclePnt3.setValue(30, 20)
375 aSession.finishOperation()
376 assert (aSketchFeature.numberOfSubs() == 12)
377 # check newly created circle tangent to objects
378 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
379 verifyTangentCircles(aCircle, SketchCircle_3.feature())
380 verifyTangentCircles(aCircle, SketchCircle_2.feature())
381 model.testNbSubFeatures(Sketch_1, "SketchConstraintCoincidence", 0)
382 model.testNbSubFeatures(Sketch_1, "SketchConstraintTangent", 4)
383
384 #=========================================================================
385 # Test 8. Create a circle passing through a point and tangent to line and circle
386 #=========================================================================
387 # create new circle
388 aSession.startOperation()
389 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
390 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
391 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
392 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
393 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
394 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
395 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
396 aCircleType = aCircle.string("circle_type")
397 # initialize attributes
398 aCircleType.setValue("circle_type_by_three_points")
399 setOldVersionOfCircleFeature(aCircle)
400 aCirclePnt1.setValue(0, 0)
401 aCirclePnt2Ref.setObject(SketchLine_3.feature().lastResult())
402 aCirclePnt2.setValue(30, 0)
403 aCirclePnt3Ref.setObject(SketchCircle_2.feature().lastResult())
404 aCirclePnt3.setValue(30, 20)
405 aSession.finishOperation()
406 assert (aSketchFeature.numberOfSubs() == 15)
407 # check newly created circle tangent to objects
408 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
409 verifyTangentCircles(aCircle, SketchCircle_2.feature())
410 verifyTangentCircleLine(aCircle, SketchLine_3.feature())
411 model.testNbSubFeatures(Sketch_1, "SketchConstraintCoincidence", 0)
412 model.testNbSubFeatures(Sketch_1, "SketchConstraintTangent", 6)
413
414 #=========================================================================
415 # Test 9. Create a circle tangent to 3 lines
416 #=========================================================================
417 # create new circle
418 aSession.startOperation()
419 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
420 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
421 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
422 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
423 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
424 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
425 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
426 aCircleType = aCircle.string("circle_type")
427 # initialize attributes
428 aCircleType.setValue("circle_type_by_three_points")
429 setOldVersionOfCircleFeature(aCircle)
430 aCirclePnt1Ref.setObject(SketchLine_1.feature().lastResult())
431 aCirclePnt1.setValue(20, 0)
432 aCirclePnt2Ref.setObject(SketchLine_2.feature().lastResult())
433 aCirclePnt2.setValue(30, 10)
434 aCirclePnt3Ref.setObject(SketchLine_3.feature().lastResult())
435 aCirclePnt3.setValue(40, 0)
436 aSession.finishOperation()
437 assert (aSketchFeature.numberOfSubs() == 19)
438 # check newly created circle tangent to objects
439 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
440 verifyTangentCircleLine(aCircle, SketchLine_1.feature())
441 verifyTangentCircleLine(aCircle, SketchLine_2.feature())
442 verifyTangentCircleLine(aCircle, SketchLine_3.feature())
443 model.testNbSubFeatures(Sketch_1, "SketchConstraintCoincidence", 0)
444 model.testNbSubFeatures(Sketch_1, "SketchConstraintTangent", 9)
445
446 #=========================================================================
447 # Test 10. Create a circle tangent to a circle and 2 lines
448 #=========================================================================
449 # create new circle
450 aSession.startOperation()
451 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
452 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
453 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
454 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
455 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
456 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
457 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
458 aCircleType = aCircle.string("circle_type")
459 # initialize attributes
460 aCircleType.setValue("circle_type_by_three_points")
461 setOldVersionOfCircleFeature(aCircle)
462 aCirclePnt1Ref.setObject(SketchLine_1.feature().lastResult())
463 aCirclePnt1.setValue(20, 0)
464 aCirclePnt2Ref.setObject(SketchLine_2.feature().lastResult())
465 aCirclePnt2.setValue(30, 10)
466 aCirclePnt3Ref.setObject(SketchCircle_3.feature().lastResult())
467 aCirclePnt3.setValue(40, 0)
468 aSession.finishOperation()
469 assert (aSketchFeature.numberOfSubs() == 23)
470 # check newly created circle tangent to objects
471 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
472 verifyTangentCircleLine(aCircle, SketchLine_1.feature())
473 verifyTangentCircleLine(aCircle, SketchLine_2.feature())
474 verifyTangentCircles(aCircle, SketchCircle_3.feature())
475 model.testNbSubFeatures(Sketch_1, "SketchConstraintCoincidence", 0)
476 model.testNbSubFeatures(Sketch_1, "SketchConstraintTangent", 12)
477
478 #=========================================================================
479 # Test 11. Create a circle tangent to 3 circles
480 #=========================================================================
481 # create new circle
482 aSession.startOperation()
483 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
484 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
485 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
486 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
487 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
488 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
489 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
490 aCircleType = aCircle.string("circle_type")
491 # initialize attributes
492 aCircleType.setValue("circle_type_by_three_points")
493 setOldVersionOfCircleFeature(aCircle)
494 aCirclePnt1Ref.setObject(SketchCircle_1.feature().lastResult())
495 aCirclePnt1.setValue(10, 0)
496 aCirclePnt2Ref.setObject(SketchCircle_2.feature().lastResult())
497 aCirclePnt2.setValue(30, 20)
498 aCirclePnt3Ref.setObject(SketchCircle_3.feature().lastResult())
499 aCirclePnt3.setValue(40, 0)
500 aSession.finishOperation()
501 assert (aSketchFeature.numberOfSubs() == 27)
502 # check newly created circle tangent to objects
503 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
504 verifyTangentCircles(aCircle, SketchCircle_1.feature())
505 verifyTangentCircles(aCircle, SketchCircle_2.feature())
506 verifyTangentCircles(aCircle, SketchCircle_3.feature())
507 model.testNbSubFeatures(Sketch_1, "SketchConstraintCoincidence", 0)
508 model.testNbSubFeatures(Sketch_1, "SketchConstraintTangent", 15)
509
510 #=========================================================================
511 # Test 12. Create a circle with point on circle line (addCircleWithPoint)
512 #=========================================================================
513 # create new circle
514 aSession.startOperation()
515 aCircle = aSketchFeature.addFeature("SketchMacroCircle")
516 aCirclePnt1 = geomDataAPI_Point2D(aCircle.attribute("first_point"))
517 aCirclePnt2 = geomDataAPI_Point2D(aCircle.attribute("second_point"))
518 aCirclePnt3 = geomDataAPI_Point2D(aCircle.attribute("third_point"))
519 aCirclePnt1Ref = aCircle.refattr("first_point_ref")
520 aCirclePnt2Ref = aCircle.refattr("second_point_ref")
521 aCirclePnt3Ref = aCircle.refattr("third_point_ref")
522 aCircleType = aCircle.string("circle_type")
523 aCircleAngle = aCircle.real("circle_angle")
524 # initialize attributes
525 aCircleType.setValue("circle_type_by_three_points")
526 aCirclePnt1Ref.setObject(SketchCircle_1.feature().lastResult())
527 aCirclePnt1.setValue(20, 0)
528 aCirclePnt2Ref.setObject(SketchCircle_2.feature().lastResult())
529 aCirclePnt2.setValue(40, 20)
530 aCirclePnt3Ref.setObject(SketchCircle_3.feature().lastResult())
531 aCirclePnt3.setValue(50, 0)
532 aCircleAngle.setValue(180.)
533 anExpectedRot = [60.853417638885404, 4.3837725517883515]
534 aSession.finishOperation()
535 assert (aSketchFeature.numberOfSubs() == 33)
536 # verify newly created circle
537 aCircle = model.lastSubFeature(aSketchFeature, "SketchCircle")
538 aCenter = geomDataAPI_Point2D(aCircle.attribute("circle_center"))
539 aRotPoint = geomDataAPI_Point2D(aCircle.attribute("circle_rotate"))
540 model.assertPoint(aCenter, [35.2879593663427, 5.1151837465370855])
541 model.assertPoint(aCirclePnt1, [20, 0])
542 model.assertPoint(aCirclePnt2, [40, 20])
543 model.assertPoint(aCirclePnt3, [50., 0.])
544 model.assertPoint(aRotPoint, anExpectedRot)
545 model.testNbSubFeatures(aSketch, "SketchConstraintCoincidence", 3)
546 model.testNbSubFeatures(aSketch, "SketchConstraintTangent", 3)
547
548 #=========================================================================
549 # End of test
550 #=========================================================================
551
552 assert(model.checkPythonDump())