From 6db7737547036ea129c6172ff18ab8426e2493de Mon Sep 17 00:00:00 2001 From: j <77419450+emmanuelobrien@users.noreply.github.com> Date: Wed, 3 Feb 2021 15:30:39 +0100 Subject: [PATCH] Sketcher: Group tests in different directories --- src/Mod/Sketcher/CMakeLists.txt | 16 +- .../SketcherTests/TestSketchFillet.py | 292 ++++++++++++++++++ .../SketcherTests/TestSketcherSolver.py | 216 +++++++++++++ src/Mod/Sketcher/SketcherTests/__init__.py | 0 src/Mod/Sketcher/TestSketcherApp.py | 203 +----------- 5 files changed, 532 insertions(+), 195 deletions(-) create mode 100644 src/Mod/Sketcher/SketcherTests/TestSketchFillet.py create mode 100644 src/Mod/Sketcher/SketcherTests/TestSketcherSolver.py create mode 100644 src/Mod/Sketcher/SketcherTests/__init__.py diff --git a/src/Mod/Sketcher/CMakeLists.txt b/src/Mod/Sketcher/CMakeLists.txt index 4be9472e0613..740b3ff9ec6f 100644 --- a/src/Mod/Sketcher/CMakeLists.txt +++ b/src/Mod/Sketcher/CMakeLists.txt @@ -11,6 +11,12 @@ set(Sketcher_Scripts Profiles.py ) +set(Sketcher_TestScripts + SketcherTests/__init__.py + SketcherTests/TestSketchFillet.py + SketcherTests/TestSketcherSolver.py +) + if(BUILD_GUI) list (APPEND Sketcher_Scripts InitGui.py @@ -25,7 +31,7 @@ set(Sketcher_Profiles ) add_custom_target(SketcherScripts ALL - SOURCES ${Sketcher_Scripts} ${Sketcher_Profiles} + SOURCES ${Sketcher_Scripts} ${Sketcher_Profiles} ${Sketcher_TestScripts} ) fc_target_copy_resource(SketcherScripts @@ -33,6 +39,7 @@ fc_target_copy_resource(SketcherScripts ${CMAKE_BINARY_DIR}/Mod/Sketcher ${Sketcher_Scripts} ${Sketcher_Profiles} + ${Sketcher_TestScripts} ) INSTALL( @@ -48,3 +55,10 @@ INSTALL( DESTINATION Mod/Sketcher/ProfileLib ) + +INSTALL( + FILES + ${Sketcher_TestScripts} + DESTINATION + Mod/Sketcher/SketcherTests + ) diff --git a/src/Mod/Sketcher/SketcherTests/TestSketchFillet.py b/src/Mod/Sketcher/SketcherTests/TestSketchFillet.py new file mode 100644 index 000000000000..2c076613dc4a --- /dev/null +++ b/src/Mod/Sketcher/SketcherTests/TestSketchFillet.py @@ -0,0 +1,292 @@ +# (c) Emmanuel O'Brien 2021 LGPL * +# * +# This file is part of the FreeCAD CAx development system. * +# * +# This program is free software; you can redistribute it and/or modify * +# it under the terms of the GNU Lesser General Public License (LGPL) * +# as published by the Free Software Foundation; either version 2 of * +# the License, or (at your option) any later version. * +# for detail see the LICENCE text file. * +# * +# FreeCAD 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 Library General Public License for more details. * +# * +# You should have received a copy of the GNU Library General Public * +# License along with FreeCAD; if not, write to the Free Software * +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# USA * +#************************************************************************** + + +import FreeCAD, math, os, sys, unittest, Part, Sketcher +from .TestSketcherSolver import CreateRectangleSketch +App = FreeCAD + +def VShape(SketchFeature): + # Simple inverted V shape + SketchFeature.addGeometry(Part.LineSegment(App.Vector(0,0,0),App.Vector(1,1,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,1,-1,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,1,0,2,1)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(1,1,0),App.Vector(2,0,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',1,1,0,2)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',1,1,1,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',1,1,1,2,-1)) + SketchFeature.fillet(0, 2, 0.25, True, True) + +def BoxCircle(SketchFeature): + # Square with a circle centered at the upper right corner + top_edge = int(SketchFeature.GeometryCount) + right_edge = top_edge + 1 + CreateRectangleSketch(SketchFeature, [0, 0], [2, 2]) + top_midpoint = App.Vector(1, 2, 0) + right_midpoint = App.Vector(2, 1, 0) + circle = int(SketchFeature.GeometryCount) + SketchFeature.addGeometry(Part.Circle(App.Vector(0,0,0), App.Vector(0,0,1), 1),False) + SketchFeature.addConstraint(Sketcher.Constraint('Radius',circle,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',top_edge,2,circle,3)) + # Since the circle center is coincident with the corner, there are three coincident points + # and thus the simpler fillet() call would get confused. Instead we'll need to point at the two + # lines and their midpoints + SketchFeature.fillet(top_edge, right_edge, top_midpoint, right_midpoint, 0.25, True, True) + +def PointOnObject(SketchFeature): + # Square with the upper right corner touching the edge of a circle + top_edge = int(SketchFeature.GeometryCount) + right_edge = top_edge + 1 + CreateRectangleSketch(SketchFeature, [0, 0], [2, 2]) + circle = int(SketchFeature.GeometryCount) + SketchFeature.addGeometry(Part.Circle(App.Vector(12,3,0), App.Vector(0,0,1), 1),False) + SketchFeature.addConstraint(Sketcher.Constraint('Radius',circle,1)) + SketchFeature.addConstraint(Sketcher.Constraint('PointOnObject',top_edge,2,circle)) + SketchFeature.fillet(top_edge, 2, 0.25, True, True) + +class TestSketchFillet(unittest.TestCase): + def setUp(self): + self.Doc = FreeCAD.newDocument("TestSketchFillet") + + def testBasicFillet(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'BasicFillet') + CreateRectangleSketch(SketchFeature, [0, 0], [2, 2]) + SketchFeature.fillet(0,2, 0.25, True, True) + self.assertAlmostEqual(SketchFeature.Geometry[4].Radius, 0.25) + + # Fillets can be made even between unconnected lines + def testUnconnected(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'Unconnected') + # Inverted open V + SketchFeature.addGeometry(Part.LineSegment(App.Vector(0,0,0),App.Vector(1,1,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,1,-1,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,1,0,2,1)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(2.1,1,0),App.Vector(3,0,0))) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',1,1, 1,2, 0.9)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',1,1, 1,2, -1)) + + SketchFeature.addGeometry(Part.LineSegment(App.Vector(3,3,0),App.Vector(5,3,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Equal',0,2)) + self.Doc.recompute() + self.assertAlmostEqual(SketchFeature.Geometry[2].length(), math.sqrt(2)) + + SketchFeature.fillet(0,1, App.Vector(0.5,0.5,0), App.Vector(2.55,0.5,0), 0.25, True, True) + # Make sure a fillet was created + self.assertAlmostEqual(SketchFeature.Geometry[3].Radius, 0.25) + + self.Doc.recompute() + # Third line's length shouldn't have changed + self.assertAlmostEqual(SketchFeature.Geometry[2].length(), math.sqrt(2)) + # First line should be shorter + self.assertNotAlmostEqual(SketchFeature.Geometry[0].length(), math.sqrt(2)) + + # Curved lines can also be filleted + def testCurve(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'Curve') + SketchFeature.addGeometry(Part.LineSegment(App.Vector(0,0,0),App.Vector(1,1,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,1,-1,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,1,0,2,1)) + arc = Part.ArcOfCircle(Part.Circle(App.Vector(3,0,0),App.Vector(0,0,1),3),0,-1) + SketchFeature.addGeometry(arc) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',1,3, -1,1, -3)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',1,3, -1,1, 0)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',1,1, 0,2)) + self.Doc.recompute() + + SketchFeature.fillet(0,1, App.Vector(0.5,0.5,0), App.Vector(0.8,0.3,0), 0.25, True, True) + self.assertAlmostEqual(SketchFeature.Geometry[2].Radius, 0.25) + + def testUnconnectedCurve(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'UnconnectedCurve') + SketchFeature.addGeometry(Part.LineSegment(App.Vector(0,0,0),App.Vector(1,1,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,1,-1,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,1,0,2,1)) + arc = Part.ArcOfCircle(Part.Circle(App.Vector(3,1,0),App.Vector(0,0,1), 1.75), -3.14, -2.17) + SketchFeature.addGeometry(arc) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',-1,1, 1,3, 3.0)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',-1,1, 1,3, 1.0)) + SketchFeature.addConstraint(Sketcher.Constraint('Distance',0,2, 1,1, 0.25)) + self.Doc.recompute() + + #SketchFeature.fillet(0,1, App.Vector(0.75,0.75,0), App.Vector(1.22,0.66,0), 0.25, True, True) + # Make sure the fillet happened + #self.Doc.recompute() + #self.assertAlmostEqual(SketchFeature.Geometry[2].Radius, 0.25) + + # The following tests are mostly about verifying that transferFilletConstraints + # does the right thing with pre-existing constraints when a fillet is created. + + # Make sure the original corner is preserved when filleting + def testOriginalCorner(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'OriginalCorner') + VShape(SketchFeature) + self.Doc.recompute() + # If fillet() ever gets refactored such that the corner gets added after + # the arc, then getPoint(3,1) might break. A more general approach would + # be to iterate over the geometry list and find the bare vertex. + self.assertAlmostEqual(App.Vector(1,1,0), SketchFeature.getPoint(3,1)) + + # Make sure coincident constraints get moved to the old corner location + def testCoincident(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'Coincident') + BoxCircle(SketchFeature) + self.Doc.recompute() + # Make sure the circle center is still at the old corner + self.assertAlmostEqual(App.Vector(2,2,0).distanceToPoint(SketchFeature.getPoint(4,3)), 0.0) + + # Point-to-point horizontal and vertical constraints should also move to the old corner + def testHorizontalVertical(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'HorizontalVertical') + # Inverted V + SketchFeature.addGeometry(Part.LineSegment(App.Vector(0,0,0),App.Vector(1,1,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,1,-1,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,1,0,2,1)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(1,1,0),App.Vector(2,0,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',1,1,0,2)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',1,1,1,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',1,1,1,2,-1)) + + SketchFeature.addGeometry(Part.Point(App.Vector(2,1))) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',0,2, 2,1)) + SketchFeature.addGeometry(Part.Point(App.Vector(1,2))) + SketchFeature.addConstraint(Sketcher.Constraint('Vertical',1,1, 3,1)) + + SketchFeature.fillet(0, 2, 0.25, True, True) + + # Verify the constraint moved to the original corner + found_horizontal = False + found_vertical = False + for c in SketchFeature.Constraints: + if c.Type == 'Horizontal' and c.First == 5 and c.FirstPos == 1 and \ + c.Second == 2 and c.SecondPos == 1: + found_horizontal = True + elif c.Type == 'Vertical' and c.First == 5 and c.FirstPos == 1 and \ + c.Second == 3 and c.SecondPos == 1: + found_vertical = True + + self.assertTrue(found_horizontal) + self.assertTrue(found_vertical) + + # Distance constraints to the old corner point should be preserved + def testDistance(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'Distance') + # We'll end up implicitly testing line length constraints as well since that's + # what CreateRectangleSketch uses to enforce side length. If the side length doesn't + # switch to a point-to-point distance constraint with the original corner as expected, + # the point won't end up at its expected destination. + CreateRectangleSketch(SketchFeature, [0, 0], [2, 2]) + + point = int(SketchFeature.GeometryCount) + SketchFeature.addGeometry(Part.Point(App.Vector(3,2,0))) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,2, point,1, 1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,2, point,1, 0)) + + self.Doc.recompute() + self.assertTrue(SketchFeature.FullyConstrained) + SketchFeature.fillet(0, 2, 0.25, True, True) + SketchFeature.addConstraint(Sketcher.Constraint('Radius',5,0.25)) + self.Doc.recompute() + # If any constraints disappeared then we won't be fully constrained + self.assertTrue(SketchFeature.FullyConstrained) + # Make sure the point is to the right of the original corner as expected + self.assertAlmostEqual(SketchFeature.getPoint(point,1), App.Vector(3, 2, 0)) + + # Make sure point on object constraints get moved to the old corner location + def testPointOnObject(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'PointOnObject') + PointOnObject(SketchFeature) + self.Doc.recompute() + # Make sure the circle center is one radius away from the old corner + self.assertAlmostEqual(App.Vector(2,2,0).distanceToPoint(SketchFeature.getPoint(4,3)), 1.0) + + # Make sure colinearity doesn't get dropped + def testTangent(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'Tangent') + + # Setup the geometry + first_line = int(SketchFeature.GeometryCount) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(0,0,0),App.Vector(1,1,0))) + # Anchor at the origin + SketchFeature.addConstraint(Sketcher.Constraint('Coincident', 0, 1, -1, 1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',first_line,2,-1,1,-1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',first_line,2,-1,1,-1)) + + second_line = int(SketchFeature.GeometryCount) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(1,1,0),App.Vector(2,0,0))) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',second_line,2,-1,1,-2)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',first_line,2,second_line,1)) + tangent_line = int(SketchFeature.GeometryCount) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(2,2,0), App.Vector(3,3,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Tangent', tangent_line, first_line)) + SketchFeature.addConstraint(Sketcher.Constraint('Distance', tangent_line, 1.41421356237)) + SketchFeature.fillet(first_line, 2, 0.25, True, True) + + self.Doc.recompute() + # Move the tangent line and see if it's aimed right + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',tangent_line,1,-1,1,-4)) + self.Doc.recompute() + + # The first endpoint should now be at 4,4 + self.assertAlmostEqual(App.Vector(4,4,0).distanceToPoint(SketchFeature.getPoint(tangent_line, 1)), 0.0) + + # We expect the other end of the tangent line to be at 5,5, but I think 3,3 also satisfies + # the colinearity constraint + try: + self.assertAlmostEqual(App.Vector(3,3,0).distanceToPoint(SketchFeature.getPoint(tangent_line, 2)), 0.0) + except AssertionError: + self.assertAlmostEqual(App.Vector(5,5,0).distanceToPoint(SketchFeature.getPoint(tangent_line, 2)), 0.0) + + def testSymmetric(self): + SketchFeature = self.Doc.addObject('Sketcher::SketchObject', 'Symmetric') + # Inverted V + SketchFeature.addGeometry(Part.LineSegment(App.Vector(0,0,0),App.Vector(1,1,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,1,-1,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,1,0,2,1)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(1,1,0),App.Vector(2,0,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',1,1,0,2)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',1,1,1,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',1,1,1,2,-1)) + + # Mirror point + SketchFeature.addGeometry(Part.Point(App.Vector(3,2,0))) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',-1,1, 2,1, 3)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',-1,1, 2,1, 2)) + + # Point that will mirror the apex of the V + SketchFeature.addGeometry(Part.Point(App.Vector(4,2,0))) + + SketchFeature.addConstraint(Sketcher.Constraint('Symmetric',0,2, 3,1, 2,1)) + self.Doc.recompute() + + SketchFeature.fillet(0, 2, 0.25, True, True) + self.Doc.recompute() + self.assertAlmostEqual(App.Vector(5,3,0).distanceToPoint(SketchFeature.getPoint(3, 1)), 0.0) + + def tearDown(self): + # comment out to omit closing document for debugging + FreeCAD.closeDocument("TestSketchFillet") + pass diff --git a/src/Mod/Sketcher/SketcherTests/TestSketcherSolver.py b/src/Mod/Sketcher/SketcherTests/TestSketcherSolver.py new file mode 100644 index 000000000000..90a0e42cf0c4 --- /dev/null +++ b/src/Mod/Sketcher/SketcherTests/TestSketcherSolver.py @@ -0,0 +1,216 @@ +# (c) Juergen Riegel (FreeCAD@juergen-riegel.net) 2011 LGPL * +# * +# This file is part of the FreeCAD CAx development system. * +# * +# This program is free software; you can redistribute it and/or modify * +# it under the terms of the GNU Lesser General Public License (LGPL) * +# as published by the Free Software Foundation; either version 2 of * +# the License, or (at your option) any later version. * +# for detail see the LICENCE text file. * +# * +# FreeCAD 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 Library General Public License for more details. * +# * +# You should have received a copy of the GNU Library General Public * +# License along with FreeCAD; if not, write to the Free Software * +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# USA * +#************************************************************************** + + +import FreeCAD, os, sys, unittest, Part, Sketcher +App = FreeCAD + +def CreateRectangleSketch(SketchFeature, corner, lengths): + hmin, hmax = corner[0], corner[0] + lengths[0] + vmin, vmax = corner[1], corner[1] + lengths[1] + + # add the geometry and grab the count offset + i = int(SketchFeature.GeometryCount) + SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(hmin,vmax),FreeCAD.Vector(hmax,vmax,0))) + SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(hmax,vmax,0),FreeCAD.Vector(hmax,vmin,0))) + SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(hmax,vmin,0),FreeCAD.Vector(hmin,vmin,0))) + SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(hmin,vmin,0),FreeCAD.Vector(hmin,vmax,0))) + + # add the rectangular constraints + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',i+0,2,i+1,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',i+1,2,i+2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',i+2,2,i+3,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',i+3,2,i+0,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',i+0)) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',i+2)) + SketchFeature.addConstraint(Sketcher.Constraint('Vertical',i+1)) + SketchFeature.addConstraint(Sketcher.Constraint('Vertical',i+3)) + + # Fix the bottom left corner of the rectangle + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',i+2,2,corner[0])) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',i+2,2,corner[1])) + + # add dimensions + if lengths[0] == lengths[1]: + SketchFeature.addConstraint(Sketcher.Constraint('Equal',i+2,i+3)) + SketchFeature.addConstraint(Sketcher.Constraint('Distance',i+0,hmax-hmin)) + else: + SketchFeature.addConstraint(Sketcher.Constraint('Distance',i+1,vmax-vmin)) + SketchFeature.addConstraint(Sketcher.Constraint('Distance',i+0,hmax-hmin)) + +def CreateCircleSketch(SketchFeature, center, radius): + i = int(SketchFeature.GeometryCount) + SketchFeature.addGeometry(Part.Circle(App.Vector(*center), App.Vector(0,0,1), radius),False) + SketchFeature.addConstraint(Sketcher.Constraint('Radius',i,radius)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',i,3,center[0])) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',i,3,center[1])) + +def CreateBoxSketchSet(SketchFeature): + SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(-99.230339,36.960674,0),FreeCAD.Vector(69.432587,36.960674,0))) + SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(69.432587,36.960674,0),FreeCAD.Vector(69.432587,-53.196629,0))) + SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(69.432587,-53.196629,0),FreeCAD.Vector(-99.230339,-53.196629,0))) + SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(-99.230339,-53.196629,0),FreeCAD.Vector(-99.230339,36.960674,0))) + # add the constraints + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,2,1,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',1,2,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',2,2,3,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',3,2,0,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',0)) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',2)) + SketchFeature.addConstraint(Sketcher.Constraint('Vertical',1)) + SketchFeature.addConstraint(Sketcher.Constraint('Vertical',3)) + # add dimensions + SketchFeature.addConstraint(Sketcher.Constraint('Distance',1,81.370787)) + SketchFeature.addConstraint(Sketcher.Constraint('Distance',0,187.573036)) + +def CreateSlotPlateSet(SketchFeature): + SketchFeature.addGeometry(Part.LineSegment(App.Vector(60.029362,-30.279360,0),App.Vector(-120.376335,-30.279360,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',0)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(-120.376335,-30.279360,0),App.Vector(-70.193062,38.113884,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,2,1,1)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(-70.193062,38.113884,0),App.Vector(60.241116,37.478645,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',1,2,2,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',2)) + SketchFeature.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(60.039921,3.811391,0),App.Vector(0,0,1),35.127132),-1.403763,1.419522)) + SketchFeature.addConstraint(Sketcher.Constraint('Tangent',2,2,3,2)) + SketchFeature.addConstraint(Sketcher.Constraint('Tangent',0,1,3,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Angle',0,2,1,1,0.947837)) + SketchFeature.addConstraint(Sketcher.Constraint('Distance',0,184.127425)) + SketchFeature.setDatum(7,200.000000) + SketchFeature.addConstraint(Sketcher.Constraint('Radius',3,38.424808)) + SketchFeature.setDatum(8,40.000000) + SketchFeature.setDatum(6,0.872665) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,2,0.0)) + SketchFeature.setDatum(9,0.000000) + SketchFeature.movePoint(0,2,App.Vector(-0.007829,-33.376450,0)) + SketchFeature.movePoint(0,2,App.Vector(-0.738149,-10.493386,0)) + SketchFeature.movePoint(0,2,App.Vector(-0.007829,2.165328,0)) + SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,2,2.165328)) + SketchFeature.setDatum(10,0.000000) + +def CreateSlotPlateInnerSet(SketchFeature): + SketchFeature.addGeometry(Part.Circle(App.Vector(195.055893,39.562252,0),App.Vector(0,0,1),29.846098)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(150.319031,13.449363,0),App.Vector(36.700474,13.139774,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',5)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(36.700474,13.139774,0),App.Vector(77.566010,63.292927,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',5,2,6,1)) + SketchFeature.addGeometry(Part.LineSegment(App.Vector(77.566010,63.292927,0),App.Vector(148.151917,63.602505,0))) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',6,2,7,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',7)) + SketchFeature.addConstraint(Sketcher.Constraint('Parallel',1,6)) + SketchFeature.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(192.422913,38.216347,0),App.Vector(0,0,1),45.315174),2.635158,3.602228)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',7,2,8,1)) + SketchFeature.addConstraint(Sketcher.Constraint('Coincident',8,2,5,1)) + + + +#--------------------------------------------------------------------------- +# define the test cases to test the FreeCAD Sketcher module +#--------------------------------------------------------------------------- + + +class TestSketcherSolver(unittest.TestCase): + def setUp(self): + self.Doc = FreeCAD.newDocument("SketchSolverTest") + + def testBoxCase(self): + self.Box = self.Doc.addObject('Sketcher::SketchObject','SketchBox') + CreateBoxSketchSet(self.Box) + self.Doc.recompute() + # moving a point of the sketch + self.Box.movePoint(0,2,App.Vector(88.342697,28.174158,0)) + # fully constrain + self.Box.addConstraint(Sketcher.Constraint('DistanceX',1,2,90.0)) + self.Box.addConstraint(Sketcher.Constraint('DistanceY',1,2,-50.0)) + self.Doc.recompute() + + def testSlotCase(self): + self.Slot = self.Doc.addObject('Sketcher::SketchObject','SketchSlot') + CreateSlotPlateSet(self.Slot) + self.Doc.recompute() + # test if all edges created + self.failUnless(len(self.Slot.Shape.Edges) == 4) + CreateSlotPlateInnerSet(self.Slot) + self.Doc.recompute() + self.failUnless(len(self.Slot.Shape.Edges) == 9) + + def testIssue3245(self): + self.Doc2 = FreeCAD.newDocument("Issue3245") + self.Doc2.addObject('Sketcher::SketchObject','Sketch') + self.Doc2.Sketch.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(0.000000,0.000000,0.000000,1.000000)) + self.Doc2.Sketch.MapMode = "Deactivated" + self.Doc2.Sketch.addGeometry(Part.LineSegment(App.Vector(-1.195999,56.041161,0),App.Vector(60.654316,56.382877,0)),False) + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('PointOnObject',0,1,-2)) + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('Horizontal',0)) + self.Doc2.Sketch.addGeometry(Part.LineSegment(App.Vector(0.512583,32.121155,0),App.Vector(60.654316,31.779440,0)),False) + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('Horizontal',1)) + self.Doc2.Sketch.addGeometry(Part.LineSegment(App.Vector(0.170867,13.326859,0),App.Vector(61.679455,13.326859,0)),False) + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('PointOnObject',2,1,-2)) + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('Horizontal',2)) + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('PointOnObject',1,1,-2)) + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,60.654316)) + self.Doc2.Sketch.setExpression('Constraints[6]', u'60') + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('DistanceX',1,1,1,2,60.654316)) + self.Doc2.Sketch.setExpression('Constraints[7]', u'65') + self.Doc2.Sketch.addConstraint(Sketcher.Constraint('DistanceX',2,1,2,2,61.679455)) + self.Doc2.Sketch.setExpression('Constraints[8]', u'70') + self.Doc2.recompute() + self.Doc2.Sketch.delGeometry(2) + values = d = {key: value for (key, value) in self.Doc2.Sketch.ExpressionEngine} + self.failUnless(values['Constraints[4]'] == u'60') + self.failUnless(values['Constraints[5]'] == u'65') + FreeCAD.closeDocument("Issue3245") + + def testIssue3245_2(self): + self.Doc2 = FreeCAD.newDocument("Issue3245") + ActiveSketch = self.Doc2.addObject('Sketcher::SketchObject','Sketch') + ActiveSketch.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(0.000000,0.000000,0.000000,1.000000)) + ActiveSketch.MapMode = "Deactivated" + geoList = [] + geoList.append(Part.LineSegment(App.Vector(-23.574591,42.399727,0),App.Vector(81.949776,42.399727,0))) + geoList.append(Part.LineSegment(App.Vector(81.949776,42.399727,0),App.Vector(81.949776,-19.256901,0))) + geoList.append(Part.LineSegment(App.Vector(81.949776,-19.256901,0),App.Vector(-23.574591,-19.256901,0))) + geoList.append(Part.LineSegment(App.Vector(-23.574591,-19.256901,0),App.Vector(-23.574591,42.399727,0))) + ActiveSketch.addGeometry(geoList,False) + conList = [] + conList.append(Sketcher.Constraint('Coincident',0,2,1,1)) + conList.append(Sketcher.Constraint('Coincident',1,2,2,1)) + conList.append(Sketcher.Constraint('Coincident',2,2,3,1)) + conList.append(Sketcher.Constraint('Coincident',3,2,0,1)) + conList.append(Sketcher.Constraint('Horizontal',0)) + conList.append(Sketcher.Constraint('Horizontal',2)) + conList.append(Sketcher.Constraint('Vertical',1)) + conList.append(Sketcher.Constraint('Vertical',3)) + ActiveSketch.addConstraint(conList) + ActiveSketch.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,105.524367)) + ActiveSketch.setExpression('Constraints[8]', u'10 + 10') + ActiveSketch.addConstraint(Sketcher.Constraint('DistanceY',3,1,3,2,61.656628)) + ActiveSketch.setDatum(9,App.Units.Quantity('5.000000 mm')) + ActiveSketch.delConstraint(8) + values = d = {key: value for (key, value) in self.Doc2.Sketch.ExpressionEngine} + self.Doc2.recompute() + self.failUnless(len(values) == 0) + FreeCAD.closeDocument("Issue3245") + + def tearDown(self): + #closing doc + FreeCAD.closeDocument("SketchSolverTest") + #print ("omit closing document for debugging") diff --git a/src/Mod/Sketcher/SketcherTests/__init__.py b/src/Mod/Sketcher/SketcherTests/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/src/Mod/Sketcher/TestSketcherApp.py b/src/Mod/Sketcher/TestSketcherApp.py index d822aa45146c..6a06b1520db9 100644 --- a/src/Mod/Sketcher/TestSketcherApp.py +++ b/src/Mod/Sketcher/TestSketcherApp.py @@ -1,4 +1,5 @@ # (c) Juergen Riegel (FreeCAD@juergen-riegel.net) 2011 LGPL * +# (c) Emmanuel O'Brien 2021 LGPL * # * # This file is part of the FreeCAD CAx development system. * # * @@ -19,198 +20,12 @@ # USA * #************************************************************************** +# Broken-out test modules +from SketcherTests.TestSketcherSolver import TestSketcherSolver +from SketcherTests.TestSketchFillet import TestSketchFillet -import FreeCAD, os, sys, unittest, Part, Sketcher -App = FreeCAD - -def CreateRectangleSketch(SketchFeature, corner, lengths): - hmin, hmax = corner[0], corner[0] + lengths[0] - vmin, vmax = corner[1], corner[1] + lengths[1] - - # add the geometry and grab the count offset - i = int(SketchFeature.GeometryCount) - SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(hmin,vmax),FreeCAD.Vector(hmax,vmax,0))) - SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(hmax,vmax,0),FreeCAD.Vector(hmax,vmin,0))) - SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(hmax,vmin,0),FreeCAD.Vector(hmin,vmin,0))) - SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(hmin,vmin,0),FreeCAD.Vector(hmin,vmax,0))) - - # add the rectangular constraints - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',i+0,2,i+1,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',i+1,2,i+2,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',i+2,2,i+3,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',i+3,2,i+0,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',i+0)) - SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',i+2)) - SketchFeature.addConstraint(Sketcher.Constraint('Vertical',i+1)) - SketchFeature.addConstraint(Sketcher.Constraint('Vertical',i+3)) - - # Fix the bottom left corner of the rectangle - SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',i+2,2,corner[0])) - SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',i+2,2,corner[1])) - - # add dimensions - if lengths[0] == lengths[1]: - SketchFeature.addConstraint(Sketcher.Constraint('Equal',i+2,i+3)) - SketchFeature.addConstraint(Sketcher.Constraint('Distance',i+0,hmax-hmin)) - else: - SketchFeature.addConstraint(Sketcher.Constraint('Distance',i+1,vmax-vmin)) - SketchFeature.addConstraint(Sketcher.Constraint('Distance',i+0,hmax-hmin)) - -def CreateCircleSketch(SketchFeature, center, radius): - i = int(SketchFeature.GeometryCount) - SketchFeature.addGeometry(Part.Circle(App.Vector(*center), App.Vector(0,0,1), radius),False) - SketchFeature.addConstraint(Sketcher.Constraint('Radius',i,radius)) - SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',i,3,center[0])) - SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',i,3,center[1])) - -def CreateBoxSketchSet(SketchFeature): - SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(-99.230339,36.960674,0),FreeCAD.Vector(69.432587,36.960674,0))) - SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(69.432587,36.960674,0),FreeCAD.Vector(69.432587,-53.196629,0))) - SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(69.432587,-53.196629,0),FreeCAD.Vector(-99.230339,-53.196629,0))) - SketchFeature.addGeometry(Part.LineSegment(FreeCAD.Vector(-99.230339,-53.196629,0),FreeCAD.Vector(-99.230339,36.960674,0))) - # add the constraints - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,2,1,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',1,2,2,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',2,2,3,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',3,2,0,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',0)) - SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',2)) - SketchFeature.addConstraint(Sketcher.Constraint('Vertical',1)) - SketchFeature.addConstraint(Sketcher.Constraint('Vertical',3)) - # add dimensions - SketchFeature.addConstraint(Sketcher.Constraint('Distance',1,81.370787)) - SketchFeature.addConstraint(Sketcher.Constraint('Distance',0,187.573036)) - -def CreateSlotPlateSet(SketchFeature): - SketchFeature.addGeometry(Part.LineSegment(App.Vector(60.029362,-30.279360,0),App.Vector(-120.376335,-30.279360,0))) - SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',0)) - SketchFeature.addGeometry(Part.LineSegment(App.Vector(-120.376335,-30.279360,0),App.Vector(-70.193062,38.113884,0))) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',0,2,1,1)) - SketchFeature.addGeometry(Part.LineSegment(App.Vector(-70.193062,38.113884,0),App.Vector(60.241116,37.478645,0))) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',1,2,2,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',2)) - SketchFeature.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(60.039921,3.811391,0),App.Vector(0,0,1),35.127132),-1.403763,1.419522)) - SketchFeature.addConstraint(Sketcher.Constraint('Tangent',2,2,3,2)) - SketchFeature.addConstraint(Sketcher.Constraint('Tangent',0,1,3,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Angle',0,2,1,1,0.947837)) - SketchFeature.addConstraint(Sketcher.Constraint('Distance',0,184.127425)) - SketchFeature.setDatum(7,200.000000) - SketchFeature.addConstraint(Sketcher.Constraint('Radius',3,38.424808)) - SketchFeature.setDatum(8,40.000000) - SketchFeature.setDatum(6,0.872665) - SketchFeature.addConstraint(Sketcher.Constraint('DistanceX',0,2,0.0)) - SketchFeature.setDatum(9,0.000000) - SketchFeature.movePoint(0,2,App.Vector(-0.007829,-33.376450,0)) - SketchFeature.movePoint(0,2,App.Vector(-0.738149,-10.493386,0)) - SketchFeature.movePoint(0,2,App.Vector(-0.007829,2.165328,0)) - SketchFeature.addConstraint(Sketcher.Constraint('DistanceY',0,2,2.165328)) - SketchFeature.setDatum(10,0.000000) - -def CreateSlotPlateInnerSet(SketchFeature): - SketchFeature.addGeometry(Part.Circle(App.Vector(195.055893,39.562252,0),App.Vector(0,0,1),29.846098)) - SketchFeature.addGeometry(Part.LineSegment(App.Vector(150.319031,13.449363,0),App.Vector(36.700474,13.139774,0))) - SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',5)) - SketchFeature.addGeometry(Part.LineSegment(App.Vector(36.700474,13.139774,0),App.Vector(77.566010,63.292927,0))) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',5,2,6,1)) - SketchFeature.addGeometry(Part.LineSegment(App.Vector(77.566010,63.292927,0),App.Vector(148.151917,63.602505,0))) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',6,2,7,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Horizontal',7)) - SketchFeature.addConstraint(Sketcher.Constraint('Parallel',1,6)) - SketchFeature.addGeometry(Part.ArcOfCircle(Part.Circle(App.Vector(192.422913,38.216347,0),App.Vector(0,0,1),45.315174),2.635158,3.602228)) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',7,2,8,1)) - SketchFeature.addConstraint(Sketcher.Constraint('Coincident',8,2,5,1)) - - - -#--------------------------------------------------------------------------- -# define the test cases to test the FreeCAD Sketcher module -#--------------------------------------------------------------------------- - - -class SketcherSolverTestCases(unittest.TestCase): - def setUp(self): - self.Doc = FreeCAD.newDocument("SketchSolverTest") - - def testBoxCase(self): - self.Box = self.Doc.addObject('Sketcher::SketchObject','SketchBox') - CreateBoxSketchSet(self.Box) - self.Doc.recompute() - # moving a point of the sketch - self.Box.movePoint(0,2,App.Vector(88.342697,28.174158,0)) - # fully constrain - self.Box.addConstraint(Sketcher.Constraint('DistanceX',1,2,90.0)) - self.Box.addConstraint(Sketcher.Constraint('DistanceY',1,2,-50.0)) - self.Doc.recompute() - - def testSlotCase(self): - self.Slot = self.Doc.addObject('Sketcher::SketchObject','SketchSlot') - CreateSlotPlateSet(self.Slot) - self.Doc.recompute() - # test if all edges created - self.failUnless(len(self.Slot.Shape.Edges) == 4) - CreateSlotPlateInnerSet(self.Slot) - self.Doc.recompute() - self.failUnless(len(self.Slot.Shape.Edges) == 9) - - def testIssue3245(self): - self.Doc2 = FreeCAD.newDocument("Issue3245") - self.Doc2.addObject('Sketcher::SketchObject','Sketch') - self.Doc2.Sketch.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(0.000000,0.000000,0.000000,1.000000)) - self.Doc2.Sketch.MapMode = "Deactivated" - self.Doc2.Sketch.addGeometry(Part.LineSegment(App.Vector(-1.195999,56.041161,0),App.Vector(60.654316,56.382877,0)),False) - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('PointOnObject',0,1,-2)) - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('Horizontal',0)) - self.Doc2.Sketch.addGeometry(Part.LineSegment(App.Vector(0.512583,32.121155,0),App.Vector(60.654316,31.779440,0)),False) - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('Horizontal',1)) - self.Doc2.Sketch.addGeometry(Part.LineSegment(App.Vector(0.170867,13.326859,0),App.Vector(61.679455,13.326859,0)),False) - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('PointOnObject',2,1,-2)) - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('Horizontal',2)) - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('PointOnObject',1,1,-2)) - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,60.654316)) - self.Doc2.Sketch.setExpression('Constraints[6]', u'60') - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('DistanceX',1,1,1,2,60.654316)) - self.Doc2.Sketch.setExpression('Constraints[7]', u'65') - self.Doc2.Sketch.addConstraint(Sketcher.Constraint('DistanceX',2,1,2,2,61.679455)) - self.Doc2.Sketch.setExpression('Constraints[8]', u'70') - self.Doc2.recompute() - self.Doc2.Sketch.delGeometry(2) - values = d = {key: value for (key, value) in self.Doc2.Sketch.ExpressionEngine} - self.failUnless(values['Constraints[4]'] == u'60') - self.failUnless(values['Constraints[5]'] == u'65') - FreeCAD.closeDocument("Issue3245") - - def testIssue3245_2(self): - self.Doc2 = FreeCAD.newDocument("Issue3245") - ActiveSketch = self.Doc2.addObject('Sketcher::SketchObject','Sketch') - ActiveSketch.Placement = App.Placement(App.Vector(0.000000,0.000000,0.000000),App.Rotation(0.000000,0.000000,0.000000,1.000000)) - ActiveSketch.MapMode = "Deactivated" - geoList = [] - geoList.append(Part.LineSegment(App.Vector(-23.574591,42.399727,0),App.Vector(81.949776,42.399727,0))) - geoList.append(Part.LineSegment(App.Vector(81.949776,42.399727,0),App.Vector(81.949776,-19.256901,0))) - geoList.append(Part.LineSegment(App.Vector(81.949776,-19.256901,0),App.Vector(-23.574591,-19.256901,0))) - geoList.append(Part.LineSegment(App.Vector(-23.574591,-19.256901,0),App.Vector(-23.574591,42.399727,0))) - ActiveSketch.addGeometry(geoList,False) - conList = [] - conList.append(Sketcher.Constraint('Coincident',0,2,1,1)) - conList.append(Sketcher.Constraint('Coincident',1,2,2,1)) - conList.append(Sketcher.Constraint('Coincident',2,2,3,1)) - conList.append(Sketcher.Constraint('Coincident',3,2,0,1)) - conList.append(Sketcher.Constraint('Horizontal',0)) - conList.append(Sketcher.Constraint('Horizontal',2)) - conList.append(Sketcher.Constraint('Vertical',1)) - conList.append(Sketcher.Constraint('Vertical',3)) - ActiveSketch.addConstraint(conList) - ActiveSketch.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,105.524367)) - ActiveSketch.setExpression('Constraints[8]', u'10 + 10') - ActiveSketch.addConstraint(Sketcher.Constraint('DistanceY',3,1,3,2,61.656628)) - ActiveSketch.setDatum(9,App.Units.Quantity('5.000000 mm')) - ActiveSketch.delConstraint(8) - values = d = {key: value for (key, value) in self.Doc2.Sketch.ExpressionEngine} - self.Doc2.recompute() - self.failUnless(len(values) == 0) - FreeCAD.closeDocument("Issue3245") - - def tearDown(self): - #closing doc - FreeCAD.closeDocument("SketchSolverTest") - #print ("omit closing document for debugging") +# Path and PartDesign tests use these functions that used to live here +# but moved to SketcherTests/TestSketcherSolver.py +from SketcherTests.TestSketcherSolver import CreateCircleSketch +from SketcherTests.TestSketcherSolver import CreateRectangleSketch +from SketcherTests.TestSketcherSolver import CreateSlotPlateSet