+# Copyright (C) 2014-2024 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.
from GeomAPI import *
from GeomDataAPI import *
from ModelAPI import *
+from SketchAPI import *
import math
import unittest
from salome.shaper import model
__updated__ = "2017-03-06"
def isArcLineSmooth(theArc, theLine, theTolerance):
- aCenter = geomDataAPI_Point2D(theArc.attribute("ArcCenter"))
- aDistance = distancePointLine(aCenter, theLine)
+ aCenter = geomDataAPI_Point2D(theArc.attribute("center_point"))
+ aDistance = model.distancePointLine(aCenter, theLine)
aRadius = arcRadius(theArc)
return math.fabs(aRadius - aDistance) < theTolerance
def isArcArcSmooth(theArc1, theArc2, theTolerance):
- aCenter1 = geomDataAPI_Point2D(theArc1.attribute("ArcCenter"))
- aCenter2 = geomDataAPI_Point2D(theArc2.attribute("ArcCenter"))
- aDistance = distancePointPoint(aCenter1, aCenter2)
+ aCenter1 = geomDataAPI_Point2D(theArc1.attribute("center_point"))
+ aCenter2 = geomDataAPI_Point2D(theArc2.attribute("center_point"))
+ aDistance = model.distancePointPoint(aCenter1, aCenter2)
aRadius1 = arcRadius(theArc1)
aRadius2 = arcRadius(theArc2)
aRadSum = aRadius1 + aRadius2
return math.fabs(aDistance - aRadSum) < theTolerance or math.fabs(aDistance - aRadDiff) < theTolerance
def arcRadius(theArc):
- aCenter = geomDataAPI_Point2D(theArc.attribute("ArcCenter"))
- aStart = geomDataAPI_Point2D(theArc.attribute("ArcStartPoint"))
- return distancePointPoint(aCenter, aStart)
-
-def distancePointPoint(thePoint1, thePoint2):
- return math.hypot(thePoint1.x() - thePoint2.x(), thePoint1.y() - thePoint2.y())
-
-def distancePointLine(thePoint, theLine):
- aLineStart = geomDataAPI_Point2D(theLine.attribute("StartPoint"))
- aLineEnd = geomDataAPI_Point2D(theLine.attribute("EndPoint"))
- aLength = 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
+ aCenter = geomDataAPI_Point2D(theArc.attribute("center_point"))
+ aStart = geomDataAPI_Point2D(theArc.attribute("start_point"))
+ return model.distancePointPoint(aCenter, aStart)
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())
model.do()
self.checkDOF()
self.mySketch.setFillet(aSketchLineA.startPoint())
- self.myDOF += 2
+ self.myDOF += 1
model.do()
self.checkFillet()
self.checkDOF()
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])
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()
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])
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"