Salome HOME
updated copyright message
[modules/shaper.git] / src / SketchPlugin / Test / TestFilletInteracting.py
index 9653c3cf006837da06f346f863ca51e4382e6800..60585162ad111b55201e5cfe9d7afe8e61c00ff2 100644 (file)
@@ -1,3 +1,22 @@
+# Copyright (C) 2014-2023  CEA, EDF
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
 """
     TestFilletInteracting.py
     Unit test of SketchPlugin_Fillet feature.
@@ -7,6 +26,7 @@
 from GeomAPI import *
 from GeomDataAPI import *
 from ModelAPI import *
+from SketchAPI import *
 import math
 import unittest
 from salome.shaper import model
@@ -15,7 +35,7 @@ __updated__ = "2017-03-06"
 
 def isArcLineSmooth(theArc, theLine, theTolerance):
   aCenter = geomDataAPI_Point2D(theArc.attribute("center_point"))
-  aDistance = distancePointLine(aCenter, theLine)
+  aDistance = model.distancePointLine(aCenter, theLine)
   aRadius = arcRadius(theArc)
   return math.fabs(aRadius - aDistance) < theTolerance
 
@@ -34,15 +54,6 @@ def arcRadius(theArc):
   aStart = geomDataAPI_Point2D(theArc.attribute("start_point"))
   return model.distancePointPoint(aCenter, aStart)
 
-def distancePointLine(thePoint, theLine):
-  aLineStart = geomDataAPI_Point2D(theLine.attribute("StartPoint"))
-  aLineEnd = geomDataAPI_Point2D(theLine.attribute("EndPoint"))
-  aLength = model.distancePointPoint(aLineStart, aLineEnd)
-  aDir1x, aDir1y = aLineEnd.x() - aLineStart.x(), aLineEnd.y() - aLineStart.y()
-  aDir2x, aDir2y = thePoint.x() - aLineStart.x(), thePoint.y() - aLineStart.y()
-  aCross = aDir1x * aDir2y - aDir1y * aDir2x
-  return math.fabs(aCross) / aLength
-
 
 
 class TestFilletInteracting(unittest.TestCase):
@@ -161,9 +172,10 @@ class TestFilletInteracting(unittest.TestCase):
     self.checkNbFeatures("SketchConstraintTangent", 0) # no tangencies should not be created
     self.checkNbFeatures("SketchFillet", 1) # fillet feature should still exist. it should be wrong
 
-    model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
-    model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [2])
-    model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [4])
+    # sketch is invalid, so, no results at all
+    model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [])
+    model.testNbSubShapes(self.mySketch, GeomAPI_Shape.EDGE, [])
+    model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [])
 
     # remove fillet for correct python dump
     self.myDocument.removeFeature(aFillet.feature())
@@ -410,7 +422,7 @@ class TestFilletInteracting(unittest.TestCase):
     model.do()
     self.checkDOF()
     self.mySketch.setFillet(aSketchLineA.startPoint())
-    self.myDOF += 2
+    self.myDOF += 1
     model.do()
     self.checkFillet()
     self.checkDOF()
@@ -418,9 +430,10 @@ class TestFilletInteracting(unittest.TestCase):
     self.collectFeatures()
     self.checkNbFeatures("SketchLine", 2)
     self.checkNbFeatures("SketchArc", 1)
-    self.checkNbFeatures("SketchConstraintCoincidence", 2)
+    self.checkNbFeatures("SketchConstraintCoincidence", 4) # Additionally 2 coincidences for apex with fillet objects
     self.checkNbFeatures("SketchConstraintTangent", 2)
     self.checkNbFeatures("SketchConstraintLength", 0) # Length constraint expected to be removed
+    self.checkNbFeatures("SketchConstraintDistance", 1) # Distance constraint should appear instead of Length
     self.checkNbFeatures("SketchFillet", 0)
 
     model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
@@ -463,24 +476,40 @@ class TestFilletInteracting(unittest.TestCase):
   def test_fillet_with_distance(self):
     """ Test 12. Fillet on two connected lines in case of Distance constraint applied
     """
-    aSketchLineA = self.mySketch.addLine(10., 10., 20., 10.)
-    aSketchLineB = self.mySketch.addLine(10., 10., 10., 20.)
-    self.myDOF += 8
+    aSketchLineA = self.mySketch.addLine(20, 20, 70, 20)
+    aSketchLineB = self.mySketch.addLine(70, 20, 70, 53.16624790355412)
+    aSketchLineC = self.mySketch.addLine(70, 53.16624790355412, 20, 20)
+    self.myDOF += 12
+    model.do()
     self.checkDOF()
-    self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineB.startPoint())
-    self.myDOF -= 2
+    # coincidences
+    self.mySketch.setCoincident(aSketchLineA.endPoint(), aSketchLineB.startPoint())
+    self.mySketch.setCoincident(aSketchLineB.endPoint(), aSketchLineC.startPoint())
+    self.mySketch.setCoincident(aSketchLineA.startPoint(), aSketchLineC.endPoint())
+    self.myDOF -= 6
     model.do()
     self.checkDOF()
-    # third line to apply Distance constraints
-    aSketchLineC = self.mySketch.addLine(10., 0., 20., 5.)
-    self.myDOF += 4
-    self.mySketch.setDistance(aSketchLineB.startPoint(), aSketchLineC.result(), 10.)
-    self.mySketch.setDistance(aSketchLineB.endPoint(), aSketchLineC.result(), 5.)
+    # other constraints
+    self.mySketch.setHorizontal(aSketchLineA.result())
+    self.mySketch.setVertical(aSketchLineB.result())
     self.myDOF -= 2
     model.do()
     self.checkDOF()
+    # construction point
+    aProjection = self.mySketch.addProjection(model.selection("VERTEX", "Origin"), False)
+    aSketchPoint = SketchAPI_Point(aProjection.createdFeature())
+    model.do()
+    # distances
+    self.mySketch.setLength(aSketchLineA.result(), 50)
+    self.mySketch.setDistance(aSketchLineA.startPoint(), aSketchLineC.startPoint(), 60, True)
+    self.mySketch.setHorizontalDistance(aSketchPoint.coordinates(), aSketchLineA.startPoint(), 20)
+    self.mySketch.setVerticalDistance(aSketchPoint.coordinates(), aSketchLineC.endPoint(), 20)
+    self.myDOF -= 4
+    model.do()
+    self.checkDOF()
+
     self.mySketch.setFillet(aSketchLineA.startPoint())
-    self.myDOF += 2 # Distance has been removed
+    self.myDOF += 1
     model.do()
     self.checkFillet()
     self.checkDOF()
@@ -488,9 +517,14 @@ class TestFilletInteracting(unittest.TestCase):
     self.collectFeatures()
     self.checkNbFeatures("SketchLine", 3)
     self.checkNbFeatures("SketchArc", 1)
-    self.checkNbFeatures("SketchConstraintCoincidence", 2)
+    self.checkNbFeatures("SketchConstraintCoincidence", 6) # Additionally 2 coincidences for apex with fillet objects
+    self.checkNbFeatures("SketchConstraintHorizontal", 1)
+    self.checkNbFeatures("SketchConstraintVertical", 1)
     self.checkNbFeatures("SketchConstraintTangent", 2)
-    self.checkNbFeatures("SketchConstraintDistance", 1) # only one Distance should be left
+    self.checkNbFeatures("SketchConstraintLength", 0) # Length translated to Distance
+    self.checkNbFeatures("SketchConstraintDistance", 2) # Length translated to Distance
+    self.checkNbFeatures("SketchConstraintDistanceHorizontal", 1)
+    self.checkNbFeatures("SketchConstraintDistanceVertical", 1)
     self.checkNbFeatures("SketchFillet", 0)
 
     model.testNbSubShapes(self.mySketch, GeomAPI_Shape.FACE, [0])
@@ -597,5 +631,6 @@ class TestFilletInteracting(unittest.TestCase):
     model.testNbSubShapes(self.mySketch, GeomAPI_Shape.VERTEX, [6])
 
 
-if __name__ == '__main__':
-  unittest.main()
+if __name__ == "__main__":
+    test_program = unittest.main(exit=False)
+    assert test_program.result.wasSuccessful(), "Test failed"