1 # Copyright (C) 2019 CEA/DEN, EDF R&D
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.
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.
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
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 Test constraint "Tangent" applied to elliptic arc and another entity
27 from salome.shaper import model
30 from SketchAPI import *
32 __updated__ = "2019-10-04"
34 class TestTangentEllipticArc(unittest.TestCase):
36 center = GeomAPI_Pnt2d(30., 20.)
37 axisEnd = GeomAPI_Pnt2d(50., 30.)
38 startPoint = GeomAPI_Pnt2d(45, 40)
39 endPoint = GeomAPI_Pnt2d(5, 6.11485435)
42 self.myDocument = model.moduleDocument()
43 self.mySketch = model.addSketch(self.myDocument, model.defaultPlane("XOY"))
44 macroEllipticArc = self.mySketch.addEllipticArc(center, axisEnd, startPoint, endPoint, False)
46 self.myEllipticArc = SketchAPI_EllipticArc(model.lastSubFeature(self.mySketch, "SketchEllipticArc"))
47 self.myCenter = macroEllipticArc.center()
48 self.myFocus1 = macroEllipticArc.focus1()
49 self.myFocus2 = macroEllipticArc.focus2()
50 self.myMajorAxis = macroEllipticArc.majorAxis()
51 self.myMajorStart = macroEllipticArc.majorAxisStart()
52 self.myMajorEnd = macroEllipticArc.majorAxisEnd()
53 self.myMinorAxis = macroEllipticArc.minorAxis()
54 self.myMinorStart = macroEllipticArc.minorAxisStart()
55 self.myMinorEnd = macroEllipticArc.minorAxisEnd()
63 self.myNbEllipticArcs = 1
64 self.myNbInternals = 11
65 self.myNbCoincidence = 0
71 self.assertPoints(self.myCenter.coordinates(), self.myEllipticArc.center())
72 self.assertPoints(self.myFocus1.coordinates(), self.myEllipticArc.firstFocus())
73 self.assertPoints(self.myFocus2.coordinates(), self.myEllipticArc.secondFocus())
74 self.assertPoints(self.myMajorStart.coordinates(), self.myEllipticArc.majorAxisNegative())
75 self.assertPoints(self.myMajorEnd.coordinates(), self.myEllipticArc.majorAxisPositive())
76 self.assertPoints(self.myMajorAxis.startPoint(), self.myEllipticArc.majorAxisNegative())
77 self.assertPoints(self.myMajorAxis.endPoint(), self.myEllipticArc.majorAxisPositive())
78 self.assertPoints(self.myMinorStart.coordinates(), self.myEllipticArc.minorAxisNegative())
79 self.assertPoints(self.myMinorEnd.coordinates(), self.myEllipticArc.minorAxisPositive())
80 self.assertPoints(self.myMinorAxis.startPoint(), self.myEllipticArc.minorAxisNegative())
81 self.assertPoints(self.myMinorAxis.endPoint(), self.myEllipticArc.minorAxisPositive())
82 model.testNbSubFeatures(self.mySketch, "SketchPoint", self.myNbPoints)
83 model.testNbSubFeatures(self.mySketch, "SketchLine", self.myNbLines)
84 model.testNbSubFeatures(self.mySketch, "SketchArc", self.myNbArcs)
85 model.testNbSubFeatures(self.mySketch, "SketchCircle", self.myNbCircles)
86 model.testNbSubFeatures(self.mySketch, "SketchEllipse", self.myNbEllipses)
87 model.testNbSubFeatures(self.mySketch, "SketchEllipticArc", self.myNbEllipticArcs)
88 model.testNbSubFeatures(self.mySketch, "SketchConstraintCoincidenceInternal", self.myNbInternals)
89 model.testNbSubFeatures(self.mySketch, "SketchConstraintCoincidence", self.myNbCoincidence)
90 model.testNbSubFeatures(self.mySketch, "SketchConstraintTangent", self.myNbTangency)
94 self.assertEqual(model.dof(self.mySketch), self.myDOF)
96 def assertTangentLineEllipse(self, theLine, theEllipticArc):
97 aLine = GeomAPI_Lin2d(theLine.startPoint().pnt(), theLine.endPoint().pnt())
98 projF1 = aLine.project(theEllipticArc.firstFocus().pnt())
99 projF2 = aLine.project(theEllipticArc.secondFocus().pnt())
101 distF1P1 = model.distancePointPoint(theEllipticArc.firstFocus(), projF1)
102 distF2P2 = model.distancePointPoint(theEllipticArc.secondFocus(), projF2)
104 tgPoint = GeomAPI_Pnt2d((projF1.x() * distF2P2 + projF2.x() * distF1P1) / (distF1P1 + distF2P2), (projF1.y() * distF2P2 + projF2.y() * distF1P1) / (distF1P1 + distF2P2))
105 distF1T = model.distancePointPoint(theEllipticArc.firstFocus(), tgPoint)
106 distF2T = model.distancePointPoint(theEllipticArc.secondFocus(), tgPoint)
107 NB_DIGITS = 7 - math.floor(math.log10(theEllipticArc.majorRadius().value()))
108 self.assertAlmostEqual(distF1T + distF2T, 2 * theEllipticArc.majorRadius().value(), NB_DIGITS)
110 def assertTangentCircleEllipse(self, theCircle, theEllipticArc):
111 axis = GeomAPI_Dir2d(theEllipticArc.firstFocus().x() - theEllipticArc.center().x(), theEllipticArc.firstFocus().y() - theEllipticArc.center().y())
112 anEllipticArc = GeomAPI_Ellipse2d(theEllipticArc.center().pnt(), axis, theEllipticArc.majorRadius().value(), theEllipticArc.minorRadius().value())
113 aCircle = GeomAPI_Circ2d(theCircle.center().pnt(), GeomAPI_Dir2d(1, 0), theCircle.radius().value())
115 pOnE = GeomAPI_Pnt2d(0, 0)
116 pOnC = GeomAPI_Pnt2d(0, 0)
117 anEllipticArc.distance(aCircle, pOnE, pOnC)
118 self.assertAlmostEqual(model.distancePointPoint(pOnE, theCircle.center()), theCircle.radius().value())
120 dist1 = model.distancePointPoint(pOnC, theEllipticArc.firstFocus())
121 dist2 = model.distancePointPoint(pOnC, theEllipticArc.secondFocus())
122 NB_DIGITS = 7 - math.floor(math.log10(theEllipticArc.majorRadius().value()))
123 self.assertAlmostEqual(dist1 + dist2, 2 * theEllipticArc.majorRadius().value(), NB_DIGITS)
125 def assertTangentEllipses(self, theEllipticArc1, theEllipticArc2):
126 axis1 = GeomAPI_Dir2d(theEllipticArc1.firstFocus().x() - theEllipticArc1.center().x(), theEllipticArc1.firstFocus().y() - theEllipticArc1.center().y())
127 anEllipticArc1 = GeomAPI_Ellipse2d(theEllipticArc1.center().pnt(), axis1, theEllipticArc1.majorRadius().value(), theEllipticArc1.minorRadius().value())
128 axis2 = GeomAPI_Dir2d(theEllipticArc2.firstFocus().x() - theEllipticArc2.center().x(), theEllipticArc2.firstFocus().y() - theEllipticArc2.center().y())
129 anEllipticArc2 = GeomAPI_Ellipse2d(theEllipticArc2.center().pnt(), axis2, theEllipticArc2.majorRadius().value(), theEllipticArc2.minorRadius().value())
131 p1 = GeomAPI_Pnt2d(0, 0)
132 p2 = GeomAPI_Pnt2d(0, 0)
133 anEllipticArc1.distance(anEllipticArc2, p1, p2)
135 dist1 = model.distancePointPoint(p2, theEllipticArc1.firstFocus())
136 dist2 = model.distancePointPoint(p2, theEllipticArc1.secondFocus())
137 NB_DIGITS = 7 - math.floor(math.log10(theEllipticArc1.majorRadius().value()))
138 self.assertAlmostEqual(dist1 + dist2, 2 * theEllipticArc1.majorRadius().value())
140 dist1 = model.distancePointPoint(p1, theEllipticArc2.firstFocus())
141 dist2 = model.distancePointPoint(p1, theEllipticArc2.secondFocus())
142 NB_DIGITS = 7 - math.floor(math.log10(theEllipticArc2.majorRadius().value()))
143 self.assertAlmostEqual(dist1 + dist2, 2 * theEllipticArc2.majorRadius().value(), NB_DIGITS)
145 def assertPoints(self, thePoint1, thePoint2):
146 self.assertAlmostEqual(thePoint1.x(), thePoint2.x(), 6)
147 self.assertAlmostEqual(thePoint1.y(), thePoint2.y(), 6)
150 def test_line_tangent(self):
151 """ Test 1. Set tangency between elliptic arc and a line
153 aLine = self.mySketch.addLine(10, -10, 90, 40)
158 self.mySketch.setTangent(self.myEllipticArc.result(), aLine.result())
159 self.myNbTangency += 1
163 self.assertTangentLineEllipse(aLine, self.myEllipticArc)
166 def test_line_coincident_then_tangent(self):
167 """ Test 2. Set tangency between elliptic arc and a line, if the extremity of the line is coincident with the elliptic arc
169 aLine = self.mySketch.addLine(10, -10, 90, 40)
170 self.mySketch.setCoincident(aLine.endPoint(), self.myEllipticArc.result())
172 self.myNbCoincidence += 1
176 self.mySketch.setTangent(self.myEllipticArc.result(), aLine.result())
177 self.myNbTangency += 1
181 self.assertTangentLineEllipse(aLine, self.myEllipticArc)
184 def test_line_tangent_then_coincident(self):
185 """ Test 3. Set tangency between elliptic arc and a line, after that apply coincidence of extremity of the line and the elliptic arc's curve
187 aLine = self.mySketch.addLine(10, -10, 90, 40)
192 self.mySketch.setTangent(self.myEllipticArc.result(), aLine.result())
193 self.myNbTangency += 1
197 self.mySketch.setCoincident(aLine.startPoint(), self.myEllipticArc.result())
198 self.myNbCoincidence += 1
202 self.assertTangentLineEllipse(aLine, self.myEllipticArc)
205 def test_line_tangent_then_remove_coincidence(self):
206 """ Test 4. Set tangency between elliptic arc and a line, which have a coincident point, then remove this coincidence
208 aLine = self.mySketch.addLine(10, -10, 90, 40)
209 aCoincidence = self.mySketch.setCoincident(aLine.endPoint(), self.myEllipticArc.result())
211 self.myNbCoincidence += 1
215 self.mySketch.setTangent(self.myEllipticArc.result(), aLine.result())
216 self.myNbTangency += 1
220 self.myDocument.removeFeature(aCoincidence.feature())
221 self.myNbCoincidence -= 1
225 self.assertTangentLineEllipse(aLine, self.myEllipticArc)
228 def test_line_coincident_point_then_tangent(self):
229 """ Test 5. Set tangency between elliptic arc and a line, if the extremity of the line is coincident with the start point of elliptic arc
231 aLine = self.mySketch.addLine(10, -10, 90, 40)
232 self.mySketch.setCoincident(aLine.endPoint(), self.myEllipticArc.startPoint())
234 self.myNbCoincidence += 1
238 self.mySketch.setTangent(self.myEllipticArc.result(), aLine.result())
239 self.myNbTangency += 1
243 self.assertTangentLineEllipse(aLine, self.myEllipticArc)
246 def test_line_tangent_then_coincident_point(self):
247 """ Test 6. Set tangency between elliptic arc and a line, after that apply coincidence of extremities of the line and the elliptic arc
249 aLine = self.mySketch.addLine(10, -10, 90, 40)
254 self.mySketch.setTangent(self.myEllipticArc.result(), aLine.result())
255 self.myNbTangency += 1
259 self.assertTangentLineEllipse(aLine, self.myEllipticArc)
261 self.mySketch.setCoincident(aLine.startPoint(), self.myEllipticArc.startPoint())
262 self.myNbCoincidence += 1
266 self.assertTangentLineEllipse(aLine, self.myEllipticArc)
269 def test_line_tangent_then_remove_coincidence_on_extremity(self):
270 """ Test 7. Set tangency between elliptic arc and a line, which have a coincident boundary point, then remove this coincidence
272 aLine = self.mySketch.addLine(10, -10, 90, 40)
273 aCoincidence = self.mySketch.setCoincident(aLine.endPoint(), self.myEllipticArc.endPoint())
275 self.myNbCoincidence += 1
279 self.mySketch.setTangent(self.myEllipticArc.result(), aLine.result())
280 self.myNbTangency += 1
284 self.myDocument.removeFeature(aCoincidence.feature())
285 self.myNbCoincidence -= 1
289 self.assertTangentLineEllipse(aLine, self.myEllipticArc)
292 def test_circle_tangent(self):
293 """ Test 8. Set tangency between elliptic arc and a circle
295 aCircle = self.mySketch.addCircle(30, 10, 20)
296 self.myNbCircles += 1
300 self.mySketch.setTangent(self.myEllipticArc.result(), aCircle.defaultResult())
301 self.myNbTangency += 1
305 self.assertTangentCircleEllipse(aCircle, self.myEllipticArc)
308 def test_circle_coincident_then_tangent(self):
309 """ Test 9. Set tangency between elliptic arc and a circle, if the circle is coincident with start point of elliptic arc's minor axis
311 aCircle = self.mySketch.addCircle(30, 10, 20)
312 self.mySketch.setCoincident(self.myEllipticArc.startPoint(), aCircle.defaultResult())
313 self.myNbCircles += 1
314 self.myNbCoincidence += 1
318 self.mySketch.setTangent(self.myEllipticArc.result(), aCircle.defaultResult())
319 self.myNbTangency += 1
323 self.assertTangentCircleEllipse(aCircle, self.myEllipticArc)
324 self.assertAlmostEqual(model.distancePointPoint(aCircle.center(), self.myEllipticArc.startPoint()), aCircle.radius().value())
327 def test_arc_tangent(self):
328 """ Test 10. Set tangency between elliptic arc and a circular arc
330 anArc = self.mySketch.addArc(30, -10, 40, -10, 20, -10, False)
335 self.mySketch.setTangent(self.myEllipticArc.result(), anArc.results()[-1])
336 self.myNbTangency += 1
340 self.assertTangentCircleEllipse(anArc, self.myEllipticArc)
343 def test_arc_coincident_then_tangent(self):
344 """ Test 11. Set tangency between elliptic arc and an arc, if the extremities of the arcs are coincident
346 anArc = self.mySketch.addArc(30, -10, 40, -10, 20, -10, False)
347 self.mySketch.setCoincident(anArc.endPoint(), self.myEllipticArc.startPoint())
349 self.myNbCoincidence += 1
353 self.mySketch.setTangent(self.myEllipticArc.result(), anArc.results()[-1])
354 self.myNbTangency += 1
358 self.assertTangentCircleEllipse(anArc, self.myEllipticArc)
361 def test_arc_tangent_then_coincident(self):
362 """ Test 12. Set tangency between elliptic arc and an arc, after that apply coincidence of extremities of the arcs
364 anArc = self.mySketch.addArc(30, -10, 40, -10, 20, -10, False)
369 self.mySketch.setTangent(self.myEllipticArc.result(), anArc.results()[-1])
370 self.myNbTangency += 1
374 self.mySketch.setCoincident(anArc.startPoint(), self.myEllipticArc.startPoint())
375 self.myNbCoincidence += 1
379 self.assertTangentCircleEllipse(anArc, self.myEllipticArc)
382 def test_arc_tangent_then_remove_coincidence(self):
383 """ Test 13. Set tangency between elliptic arc and an arc, which have a coincident point, then remove this coincidence
385 anArc = self.mySketch.addArc(30, -10, 40, -10, 20, -10, False)
386 aCoincidence = self.mySketch.setCoincident(anArc.endPoint(), self.myEllipticArc.endPoint())
388 self.myNbCoincidence += 1
392 self.mySketch.setTangent(self.myEllipticArc.result(), anArc.results()[-1])
393 self.myNbTangency += 1
397 self.myDocument.removeFeature(aCoincidence.feature())
398 self.myNbCoincidence -= 1
402 self.assertTangentCircleEllipse(anArc, self.myEllipticArc)
405 def test_ellipse_tangent(self):
406 """ Test 14. Set tangency between ellipse and elliptic arc
408 anEllipse = self.mySketch.addEllipse(-30, 10, -10, 0, 20)
409 self.myNbEllipses += 1
413 self.mySketch.setTangent(self.myEllipticArc.result(), anEllipse.result())
414 self.myNbTangency += 1
418 self.assertTangentEllipses(anEllipse, self.myEllipticArc)
421 def test_elliptic_arcs_tangent(self):
422 """ Test 15. Set tangency between two elliptic arcs
424 anEllipticArc = self.mySketch.addEllipticArc(35, 20, 60, 30, 40, 40, 20, -0.4890968089561491, True)
425 self.myNbEllipticArcs += 1
429 self.mySketch.setTangent(self.myEllipticArc.result(), anEllipticArc.result())
430 self.myNbTangency += 1
434 self.assertTangentEllipses(anEllipticArc, self.myEllipticArc)
437 def test_elliptic_arcs_coincident_then_tangent(self):
438 """ Test 16. Set tangency between two elliptic arcs, if their extremities are coincident
440 anEllipticArc = self.mySketch.addEllipticArc(35, 20, 60, 30, 40, 40, 20, -0.4890968089561491, True)
441 self.mySketch.setCoincident(anEllipticArc.startPoint(), self.myEllipticArc.endPoint())
442 self.myNbEllipticArcs += 1
443 self.myNbCoincidence += 1
447 self.mySketch.setTangent(self.myEllipticArc.result(), anEllipticArc.result())
448 self.myNbTangency += 1
452 self.assertTangentEllipses(anEllipticArc, self.myEllipticArc)
456 if __name__ == "__main__":
457 test_program = unittest.main(exit=False)
458 assert test_program.result.wasSuccessful(), "Test failed"