2 TestFilletInteracting.py
3 Unit test of SketchPlugin_Fillet feature.
4 In scope of interaction with another constraints applied to filleted features.
8 from GeomDataAPI import *
12 from salome.shaper import model
14 __updated__ = "2017-03-06"
16 def isArcLineSmooth(theArc, theLine, theTolerance):
17 aCenter = geomDataAPI_Point2D(theArc.attribute("ArcCenter"))
18 aDistance = distancePointLine(aCenter, theLine)
19 aRadius = arcRadius(theArc)
20 return math.fabs(aRadius - aDistance) < theTolerance
22 def isArcArcSmooth(theArc1, theArc2, theTolerance):
23 aCenter1 = geomDataAPI_Point2D(theArc1.attribute("ArcCenter"))
24 aCenter2 = geomDataAPI_Point2D(theArc2.attribute("ArcCenter"))
25 aDistance = distancePointPoint(aCenter1, aCenter2)
26 aRadius1 = arcRadius(theArc1)
27 aRadius2 = arcRadius(theArc2)
28 aRadSum = aRadius1 + aRadius2
29 aRadDiff = math.fabs(aRadius1 - aRadius2)
30 return math.fabs(aDistance - aRadSum) < theTolerance or math.fabs(aDistance - aRadDiff) < theTolerance
32 def arcRadius(theArc):
33 aCenter = geomDataAPI_Point2D(theArc.attribute("ArcCenter"))
34 aStart = geomDataAPI_Point2D(theArc.attribute("ArcStartPoint"))
35 return distancePointPoint(aCenter, aStart)
37 def distancePointPoint(thePoint1, thePoint2):
38 return math.hypot(thePoint1.x() - thePoint2.x(), thePoint1.y() - thePoint2.y())
40 def distancePointLine(thePoint, theLine):
41 aLineStart = geomDataAPI_Point2D(theLine.attribute("StartPoint"))
42 aLineEnd = geomDataAPI_Point2D(theLine.attribute("EndPoint"))
43 aLength = distancePointPoint(aLineStart, aLineEnd)
44 aDir1x, aDir1y = aLineEnd.x() - aLineStart.x(), aLineEnd.y() - aLineStart.y()
45 aDir2x, aDir2y = thePoint.x() - aLineStart.x(), thePoint.y() - aLineStart.y()
46 aCross = aDir1x * aDir2y - aDir1y * aDir2x
47 return math.fabs(aCross) / aLength
51 class TestFilletInteracting(unittest.TestCase):
54 self.myDocument = model.moduleDocument()
55 self.mySketch = model.addSketch(self.myDocument, model.defaultPlane("XOY"))
56 self.myTolerance = 1.e-6
61 self.assertTrue(model.checkPythonDump())
66 self.assertEqual(model.dof(self.mySketch), self.myDOF)
68 def collectFeatures(self):
70 for aSubObj in self.mySketch.features().list():
71 aFeature = ModelAPI.ModelAPI_Feature.feature(aSubObj)
72 if aFeature is not None:
73 if self.myFeatures.get(aFeature.getKind()) == None:
74 self.myFeatures[aFeature.getKind()] = 1
76 self.myFeatures[aFeature.getKind()] += 1
78 def checkNbFeatures(self, theFeatureKind, theFeatureCount):
79 if theFeatureCount == 0:
80 self.assertIsNone(self.myFeatures.get(theFeatureKind))
82 self.assertIsNotNone(self.myFeatures.get(theFeatureKind), "No features of kind {0} but expected {1}".format(theFeatureKind, theFeatureCount))
83 self.assertEqual(self.myFeatures[theFeatureKind], theFeatureCount, "Observed number of {0} is {1} but expected {2}".format(theFeatureKind, self.myFeatures[theFeatureKind], theFeatureCount))
85 def checkFillet(self):
86 aPtPtCoincidences = self.getCoincidences()
87 for coinc in aPtPtCoincidences:
88 aConnectedFeatures = self.connectedFeatures(coinc)
89 self.assertEqual(len(aConnectedFeatures), 2)
90 if aConnectedFeatures[0].getKind() == "SketchArc":
91 if aConnectedFeatures[1].getKind() == "SketchArc":
92 self.assertTrue(isArcArcSmooth(aConnectedFeatures[0], aConnectedFeatures[1], self.myTolerance))
93 elif aConnectedFeatures[1].getKind() == "SketchLine":
94 self.assertTrue(isArcLineSmooth(aConnectedFeatures[0], aConnectedFeatures[1], self.myTolerance))
95 elif aConnectedFeatures[0].getKind() == "SketchLine" and aConnectedFeatures[1].getKind() == "SketchArc":
96 self.assertTrue(isArcLineSmooth(aConnectedFeatures[1], aConnectedFeatures[0], self.myTolerance))
98 def getCoincidences(self):
100 for aSubObj in self.mySketch.features().list():
101 aSubFeature = ModelAPI.ModelAPI_Feature.feature(aSubObj)
102 if aSubFeature is not None and aSubFeature.getKind() == "SketchConstraintCoincidence":
103 anEntityA = aSubFeature.refattr("ConstraintEntityA")
104 anEntityB = aSubFeature.refattr("ConstraintEntityB")
105 if not anEntityA.isObject() and not anEntityB.isObject():
106 aCoincidences.append(aSubFeature)
109 def connectedFeatures(self, theCoincidence):
110 anEntityA = theCoincidence.refattr("ConstraintEntityA")
111 anEntityB = theCoincidence.refattr("ConstraintEntityB")
112 aFeatureA = ModelAPI.ModelAPI_Feature.feature(anEntityA.attr().owner())
113 aFeatureB = ModelAPI.ModelAPI_Feature.feature(anEntityB.attr().owner())
114 return [aFeatureA, aFeatureB]
117 def test_fillet_two_lines(self):
118 """ Test 1. Fillet on two connected lines
120 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
121 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
124 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
128 self.mySketch.setFillet(aSketchLineA.startPoint())
134 self.collectFeatures()
135 self.checkNbFeatures("SketchLine", 2)
136 self.checkNbFeatures("SketchArc", 1)
137 self.checkNbFeatures("SketchConstraintCoincidence", 2)
138 self.checkNbFeatures("SketchConstraintTangent", 2)
139 self.checkNbFeatures("SketchFillet", 0)
141 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
142 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
143 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
145 def test_wrong_fillet_two_lines(self):
146 """ Test 2. Check the fillet is wrong on two connected lines when selecting incorrect point
148 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
149 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
152 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
156 aFillet = self.mySketch.setFillet(aSketchLineA.endPoint())
160 self.collectFeatures()
161 self.checkNbFeatures("SketchLine", 2)
162 self.checkNbFeatures("SketchArc", 0) # no arcs should be created
163 self.checkNbFeatures("SketchConstraintCoincidence", 1) # number of coincidences should not change
164 self.checkNbFeatures("SketchConstraintTangent", 0) # no tangencies should not be created
165 self.checkNbFeatures("SketchFillet", 1) # fillet feature should still exist. it should be wrong
167 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
168 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [2])
169 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [4])
171 # remove fillet for correct python dump
172 self.myDocument.removeFeature(aFillet.feature())
174 def test_fillet_arc_line(self):
175 """ Test 3. Fillet on connected arc and line
177 aSketchLine = self.mySketch.addLine(10., 10., 20., 10.)
178 aSketchArc = self.mySketch.addArc(20., 10., 20., 20., 10., 10., False)
181 self.mySketch.setCoincident(aSketchLine.startPoint(), aSketchArc.endPoint())
185 self.mySketch.setFillet(aSketchLine.startPoint())
191 self.collectFeatures()
192 self.checkNbFeatures("SketchLine", 1)
193 self.checkNbFeatures("SketchArc", 2)
194 self.checkNbFeatures("SketchConstraintCoincidence", 2)
195 self.checkNbFeatures("SketchConstraintTangent", 2)
196 self.checkNbFeatures("SketchFillet", 0)
198 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
199 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
200 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
202 def test_fillet_two_arcs(self):
203 """ Test 4. Fillet on two connected arcs
205 aSketchArc1 = self.mySketch.addArc(20., 0., 20., 20., 10., 17.32050807568877293, False)
206 aSketchArc2 = self.mySketch.addArc(20., 34.64101615137754586, 20., 14.64101615137754586, 10., 17.32050807568877293, True)
209 self.mySketch.setCoincident(aSketchArc1.endPoint(), aSketchArc2.endPoint())
213 self.mySketch.setFillet(aSketchArc1.endPoint())
219 self.collectFeatures()
220 self.checkNbFeatures("SketchLine", 0)
221 self.checkNbFeatures("SketchArc", 3)
222 self.checkNbFeatures("SketchConstraintCoincidence", 2)
223 self.checkNbFeatures("SketchConstraintTangent", 2)
224 self.checkNbFeatures("SketchFillet", 0)
226 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
227 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
228 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
230 def test_fillet_with_horizontal_vertical(self):
231 """ Test 5. Fillet on two connected lines in case of Horizontal or Vertical constraints applied
233 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
234 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
237 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
241 self.mySketch.setHorizontal(aSketchLineA.result())
242 self.mySketch.setVertical(aSketchLineB.result())
246 self.mySketch.setFillet(aSketchLineA.startPoint())
252 self.collectFeatures()
253 self.checkNbFeatures("SketchLine", 2)
254 self.checkNbFeatures("SketchArc", 1)
255 self.checkNbFeatures("SketchConstraintCoincidence", 2)
256 self.checkNbFeatures("SketchConstraintTangent", 2)
257 self.checkNbFeatures("SketchConstraintHorizontal", 1)
258 self.checkNbFeatures("SketchConstraintVertical", 1)
259 self.checkNbFeatures("SketchFillet", 0)
261 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
262 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
263 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
265 def test_fillet_with_orthogonal(self):
266 """ Test 6. Fillet on two connected lines in case of Perpendicular constraint applied
268 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
269 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
272 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
276 self.mySketch.setPerpendicular(aSketchLineA.result(), aSketchLineB.result())
280 self.mySketch.setFillet(aSketchLineA.startPoint())
286 self.collectFeatures()
287 self.checkNbFeatures("SketchLine", 2)
288 self.checkNbFeatures("SketchArc", 1)
289 self.checkNbFeatures("SketchConstraintCoincidence", 2)
290 self.checkNbFeatures("SketchConstraintTangent", 2)
291 self.checkNbFeatures("SketchConstraintPerpendicular", 1)
292 self.checkNbFeatures("SketchFillet", 0)
294 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
295 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
296 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
298 def test_fillet_with_parallel(self):
299 """ Test 7. Fillet on two connected lines in case of Parallel constraint applied
301 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
302 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
305 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
309 # third line to apply parallel constraint
310 aSketchLineC = self.mySketch.addLine(10., 0., 20., 5.)
312 self.mySketch.setParallel(aSketchLineB.result(), aSketchLineC.result())
316 self.mySketch.setFillet(aSketchLineA.startPoint())
322 self.collectFeatures()
323 self.checkNbFeatures("SketchLine", 3)
324 self.checkNbFeatures("SketchArc", 1)
325 self.checkNbFeatures("SketchConstraintCoincidence", 2)
326 self.checkNbFeatures("SketchConstraintTangent", 2)
327 self.checkNbFeatures("SketchConstraintParallel", 1)
328 self.checkNbFeatures("SketchFillet", 0)
330 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
331 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [4])
332 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [8])
334 def test_fillet_with_equal_lines(self):
335 """ Test 8. Fillet on two connected lines in case of Equal constraint applied
337 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
338 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
341 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
345 self.mySketch.setEqual(aSketchLineA.result(), aSketchLineB.result())
349 self.mySketch.setFillet(aSketchLineA.startPoint())
350 self.myDOF += 2 # Equal has been removed
355 self.collectFeatures()
356 self.checkNbFeatures("SketchLine", 2)
357 self.checkNbFeatures("SketchArc", 1)
358 self.checkNbFeatures("SketchConstraintCoincidence", 2)
359 self.checkNbFeatures("SketchConstraintTangent", 2)
360 self.checkNbFeatures("SketchConstraintEqual", 0) # Equal constraint expected to be removed
361 self.checkNbFeatures("SketchFillet", 0)
363 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
364 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
365 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
367 def test_fillet_with_equal_arcs(self):
368 """ Test 9. Fillet on two connected arcs in case of Equal constraint applied
370 aSketchArc1 = self.mySketch.addArc(20., 0., 20., 20., 10., 17.32050807568877293, False)
371 aSketchArc2 = self.mySketch.addArc(20., 34.64101615137754586, 20., 14.64101615137754586, 10., 17.32050807568877293, True)
374 self.mySketch.setCoincident(aSketchArc1.endPoint(), aSketchArc2.endPoint())
378 self.mySketch.setEqual(aSketchArc1.results()[1], aSketchArc2.results()[1])
382 self.mySketch.setFillet(aSketchArc1.endPoint())
383 self.myDOF += 2 # Equal has been removed
388 self.collectFeatures()
389 self.checkNbFeatures("SketchLine", 0)
390 self.checkNbFeatures("SketchArc", 3)
391 self.checkNbFeatures("SketchConstraintCoincidence", 2)
392 self.checkNbFeatures("SketchConstraintTangent", 2)
393 self.checkNbFeatures("SketchConstraintEqual", 0) # Equal constraint expected to be removed
394 self.checkNbFeatures("SketchFillet", 0)
396 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
397 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
398 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
400 def test_fillet_with_length(self):
401 """ Test 10. Fillet on two connected lines in case of Length constraint applied
403 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
404 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
407 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
411 self.mySketch.setLength(aSketchLineA.result(), 15.)
415 self.mySketch.setFillet(aSketchLineA.startPoint())
421 self.collectFeatures()
422 self.checkNbFeatures("SketchLine", 2)
423 self.checkNbFeatures("SketchArc", 1)
424 self.checkNbFeatures("SketchConstraintCoincidence", 2)
425 self.checkNbFeatures("SketchConstraintTangent", 2)
426 self.checkNbFeatures("SketchConstraintLength", 0) # Length constraint expected to be removed
427 self.checkNbFeatures("SketchFillet", 0)
429 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
430 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
431 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
433 def test_fillet_with_radius(self):
434 """ Test 11. Fillet on connected arc and line in case of Radius constraint is applied to arc
436 aSketchLine = self.mySketch.addLine(10., 10., 20., 10.)
437 aSketchArc = self.mySketch.addArc(0., 10., 0., 20., 10., 10., True)
440 self.mySketch.setCoincident(aSketchLine.startPoint(), aSketchArc.endPoint())
444 self.mySketch.setRadius(aSketchArc.results()[1], 12.)
448 self.mySketch.setFillet(aSketchLine.startPoint())
454 self.collectFeatures()
455 self.checkNbFeatures("SketchLine", 1)
456 self.checkNbFeatures("SketchArc", 2)
457 self.checkNbFeatures("SketchConstraintCoincidence", 2)
458 self.checkNbFeatures("SketchConstraintTangent", 2)
459 self.checkNbFeatures("SketchConstraintRadius", 1)
460 self.checkNbFeatures("SketchFillet", 0)
462 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
463 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
464 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
466 def test_fillet_with_distance(self):
467 """ Test 12. Fillet on two connected lines in case of Distance constraint applied
469 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
470 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
473 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
477 # third line to apply Distance constraints
478 aSketchLineC = self.mySketch.addLine(10., 0., 20., 5.)
480 self.mySketch.setDistance(aSketchLineB.startPoint(), aSketchLineC.result(), 10.)
481 self.mySketch.setDistance(aSketchLineB.endPoint(), aSketchLineC.result(), 5.)
485 self.mySketch.setFillet(aSketchLineA.startPoint())
486 self.myDOF += 2 # Distance has been removed
491 self.collectFeatures()
492 self.checkNbFeatures("SketchLine", 3)
493 self.checkNbFeatures("SketchArc", 1)
494 self.checkNbFeatures("SketchConstraintCoincidence", 2)
495 self.checkNbFeatures("SketchConstraintTangent", 2)
496 self.checkNbFeatures("SketchConstraintDistance", 1) # only one Distance should be left
497 self.checkNbFeatures("SketchFillet", 0)
499 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
500 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [4])
501 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [8])
503 def test_fillet_with_fixed_point(self):
504 """ Test 13. Fillet on two connected lines in case of Fixed constraint applied to the fillet point
506 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
507 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
510 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
514 self.mySketch.setFixed(aSketchLineA.startPoint())
518 self.mySketch.setFillet(aSketchLineA.startPoint())
519 self.myDOF += 3 # Fixed constraint has been removed
524 self.collectFeatures()
525 self.checkNbFeatures("SketchLine", 2)
526 self.checkNbFeatures("SketchArc", 1)
527 self.checkNbFeatures("SketchConstraintCoincidence", 2)
528 self.checkNbFeatures("SketchConstraintTangent", 2)
529 self.checkNbFeatures("SketchConstraintFixed", 0) # Fixed constraint expected to be removed
530 self.checkNbFeatures("SketchFillet", 0)
532 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
533 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
534 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
536 def test_fillet_with_fixed_line(self):
537 """ Test 14. Fillet on two connected lines in case of Fixed constraint applied to one of lines
539 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
540 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
543 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
547 self.mySketch.setFixed(aSketchLineA.result())
551 self.mySketch.setFillet(aSketchLineA.startPoint())
557 self.collectFeatures()
558 self.checkNbFeatures("SketchLine", 2)
559 self.checkNbFeatures("SketchArc", 1)
560 self.checkNbFeatures("SketchConstraintCoincidence", 2)
561 self.checkNbFeatures("SketchConstraintTangent", 2)
562 self.checkNbFeatures("SketchConstraintLength", 0) # Fixed constraint expected to be kept
563 self.checkNbFeatures("SketchFillet", 0)
565 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
566 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
567 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
569 def test_fillet_with_angle(self):
570 """ Test 15. Fillet on two connected lines in case of Perpendicular constraint applied
572 aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
573 aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
576 self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
580 self.mySketch.setAngle(aSketchLineA.result(), aSketchLineB.result(), 60.)
584 self.mySketch.setFillet(aSketchLineA.startPoint())
590 self.collectFeatures()
591 self.checkNbFeatures("SketchLine", 2)
592 self.checkNbFeatures("SketchArc", 1)
593 self.checkNbFeatures("SketchConstraintCoincidence", 2)
594 self.checkNbFeatures("SketchConstraintTangent", 2)
595 self.checkNbFeatures("SketchConstraintAngle", 1)
596 self.checkNbFeatures("SketchFillet", 0)
598 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
599 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [3])
600 model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
603 if __name__ == '__main__':