Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix PartDesign::Mirrored #816

Closed
wants to merge 7 commits into from
107 changes: 67 additions & 40 deletions src/Mod/PartDesign/TestPartDesignApp.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@

class PartDesignPadTestCases(unittest.TestCase):
def setUp(self):
self.Doc = FreeCAD.newDocument("PartDesignTest")
self.Doc = FreeCAD.newDocument("PartDesignTestPad")

def testBoxCase(self):
self.PadSketch = self.Doc.addObject('Sketcher::SketchObject','SketchPad')
Expand All @@ -49,12 +49,12 @@ def testBoxCase(self):

def tearDown(self):
#closing doc
FreeCAD.closeDocument("PartDesignTest")
FreeCAD.closeDocument("PartDesignTestPad")
# print ("omit closing document for debugging")

class PartDesignRevolveTestCases(unittest.TestCase):
def setUp(self):
self.Doc = FreeCAD.newDocument("PartDesignTest")
self.Doc = FreeCAD.newDocument("PartDesignTestRevolve")

def testRevolveFace(self):
self.Body = self.Doc.addObject('PartDesign::Body','Body')
Expand Down Expand Up @@ -92,39 +92,32 @@ def testGrooveFace(self):

def tearDown(self):
#closing doc
FreeCAD.closeDocument("PartDesignTest")
FreeCAD.closeDocument("PartDesignTestRevolve")
# print ("omit closing document for debugging")

class PartDesignMirroredTestCases(unittest.TestCase):
def setUp(self):
self.Doc = FreeCAD.newDocument("PartDesignTest")
self.Doc = FreeCAD.newDocument("PartDesignTestMirrored")

def testMirroredCase(self):
def testMirroredSketchCase(self):
"""
Creates a unit cube at the origin and mirrors it about the Y axis.
This operation should create a rectangular prism with volume 2.
Creates a unit cube cornered at the origin and mirrors it about the Y axis.
This operation should create a rectangular prism with volume 2.0.

The operation is currently broken; this test is inverted:
self.failUnless(self.Mirrored.Shape.Volume < 2.0)
Change the final line to " .. > 1.0" and remove this notice.
The precision is currently broken and the volume created
is 1.9999999999999993. so this test will fail if code is
introduced to change it. If you've submitted code which fixes
the precision and causes this bug to fail, please remove this
message and update this test as well as testMirroredPrimitiveCase.
"""
self.Body = self.Doc.addObject('PartDesign::Body','Body')
self.Rect = self.Doc.addObject('Sketcher::SketchObject','Rect')
try:
self.Body.addObject(self.Rect)
except AttributeError:
pass
self.Body.addObject(self.Rect)
geoList = []
try:
geoList.append(Part.LineSegment(App.Vector(0, 0, 0), App.Vector(1, 0, 0)))
geoList.append(Part.LineSegment(App.Vector(1, 0, 0), App.Vector(1, 1, 0)))
geoList.append(Part.LineSegment(App.Vector(1, 1, 0), App.Vector(0, 1, 0)))
geoList.append(Part.LineSegment(App.Vector(0, 1, 0), App.Vector(0, 0, 0)))
except AttributeError:
geoList.append(Part.Line(App.Vector(0, 0, 0), App.Vector(1, 0, 0)))
geoList.append(Part.Line(App.Vector(1, 0, 0), App.Vector(1, 1, 0)))
geoList.append(Part.Line(App.Vector(1, 1, 0), App.Vector(0, 1, 0)))
geoList.append(Part.Line(App.Vector(0, 1, 0), App.Vector(0, 0, 0)))
geoList.append(Part.LineSegment(App.Vector(0, 0, 0), App.Vector(1, 0, 0)))
geoList.append(Part.LineSegment(App.Vector(1, 0, 0), App.Vector(1, 1, 0)))
geoList.append(Part.LineSegment(App.Vector(1, 1, 0), App.Vector(0, 1, 0)))
geoList.append(Part.LineSegment(App.Vector(0, 1, 0), App.Vector(0, 0, 0)))
self.Rect.addGeometry(geoList,False)
conList = []
conList.append(Sketcher.Constraint('Coincident',0,2,1,1))
Expand All @@ -143,27 +136,61 @@ def testMirroredCase(self):
self.Rect.setDatum(10,App.Units.Quantity('1.0 mm'))
self.Doc.recompute()
self.Pad = self.Doc.addObject("PartDesign::Pad","Pad")
try:
self.Pad.Profile = self.Rect
except AttributeError:
self.Pad.Sketch = self.Rect
self.Pad.Profile = self.Rect
self.Pad.Length = 1
try:
self.Body.addObject(self.Pad)
except AttributeError:
pass
self.Body.addObject(self.Pad)
self.Doc.recompute()
self.Mirrored = self.Doc.addObject("PartDesign::Mirrored","Mirrored")
self.Mirrored.Originals = [self.Pad]
self.Mirrored.MirrorPlane = (self.Rect, ["V_Axis"])
try:
self.Body.addObject(self.Mirrored)
except AttributeError:
pass
self.Body.addObject(self.Mirrored)
self.Doc.recompute()
self.failUnless(self.Mirrored.Shape.Volume < 2.0)
self.failUnless(self.Mirrored.Shape.Volume == 1.9999999999999993)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exact comparison with floating numbers is a bad thing because it's simply too fragile. On my local system this unit test fails now. Also note that functions like failUnless are deprecated and should be replaced with their assert* equivalents.
In this case you should use assertAlmostEqual as described here https://docs.python.org/2/library/unittest.html


def testMirroredOffsetFailureCase(self):
self.Body = self.Doc.addObject('PartDesign::Body','Body')
self.Rect = self.Doc.addObject('Sketcher::SketchObject','Rect')
self.Body.addObject(self.Rect)
geoList = []
geoList.append(Part.LineSegment(App.Vector(0, 0, 0), App.Vector(1, 0, 0)))
geoList.append(Part.LineSegment(App.Vector(1, 0, 0), App.Vector(1, 1, 0)))
geoList.append(Part.LineSegment(App.Vector(1, 1, 0), App.Vector(0, 1, 0)))
geoList.append(Part.LineSegment(App.Vector(0, 1, 0), App.Vector(0, 0, 0)))
self.Rect.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))
self.Rect.addConstraint(conList)

self.Rect.addConstraint(Sketcher.Constraint('PointOnObject',0,1,-2))
self.Rect.addConstraint(Sketcher.Constraint('Equal',3,0))
self.Rect.addConstraint(Sketcher.Constraint('DistanceX',0,1,0,2,1))
self.Rect.setDatum(10,App.Units.Quantity('1.0 mm'))
self.Rect.addConstraint(Sketcher.Constraint('DistanceY',-1,1,0,1,1))
self.Rect.setDatum(11,App.Units.Quantity('1.0 mm'))
self.Doc.recompute()

self.Pad = self.Doc.addObject("PartDesign::Pad","Pad")
self.Pad.Profile = self.Rect
self.Pad.Length = 1
self.Body.addObject(self.Pad)
self.Doc.recompute()

self.Mirrored = self.Doc.addObject("PartDesign::Mirrored","Mirrored")
self.Mirrored.Originals = [self.Pad]
self.Mirrored.MirrorPlane = (self.Rect, ["H_Axis"])
self.Body.addObject(self.Mirrored)
self.Doc.recompute()
self.failUnless(self.Mirrored.State == ["Invalid"])

def tearDown(self):
#closing doc
FreeCAD.closeDocument("PartDesignTest")
# print ("omit closing document for debugging")
FreeCAD.closeDocument("PartDesignTestMirrored")
#print ("omit closing document for debugging")