Added full unit test to make sure tool chain works correctly.

This commit is contained in:
Markus Lampert
2017-08-22 11:12:02 -07:00
parent fbc8db743f
commit 504e4b7109
5 changed files with 100 additions and 26 deletions

View File

@@ -37,7 +37,9 @@ from PySide import QtCore, QtGui
"""Dogbone Dressup object and FreeCAD command"""
LOG_MODULE = PathLog.thisModule()
PathLog.setLevel(PathLog.Level.DEBUG, LOG_MODULE)
if False:
PathLog.setLevel(PathLog.Level.DEBUG, LOG_MODULE)
# Qt tanslation handling
def translate(context, text, disambig=None):
@@ -1000,8 +1002,9 @@ def Create(base, name = 'DogboneDressup'):
ViewProviderDressup(obj.ViewObject)
obj.Base.ViewObject.Visibility = False
dbo.setup(obj, True)
obj.ToolController = base.ToolController
dbo.setup(obj, True)
return obj
class CommandDressupDogbone:

View File

@@ -236,7 +236,7 @@ class CommandPathToolController:
obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "Default Tool")
PathScripts.PathToolController.ToolController(obj)
if assignViewProvider:
if FreeCAD.GuiUp and assignViewProvider:
PathScripts.PathToolController._ViewProviderToolController(obj.ViewObject)
if tool is None:

View File

@@ -376,13 +376,14 @@ def findToolController(obj, name=None):
PathLog.track('name: {}'.format(name))
c = None
# First check if a user has selected a tool controller in the tree. Return the first one and remove all from selection
for sel in FreeCADGui.Selection.getSelectionEx():
if hasattr(sel.Object, 'Proxy'):
if isinstance(sel.Object.Proxy, PathScripts.PathToolController.ToolController):
if c is None:
c = sel.Object
FreeCADGui.Selection.removeSelection(sel.Object)
if FreeCAD.GuiUp:
# First check if a user has selected a tool controller in the tree. Return the first one and remove all from selection
for sel in FreeCADGui.Selection.getSelectionEx():
if hasattr(sel.Object, 'Proxy'):
if isinstance(sel.Object.Proxy, PathScripts.PathToolController.ToolController):
if c is None:
c = sel.Object
FreeCADGui.Selection.removeSelection(sel.Object)
if c is not None:
return c

View File

@@ -25,7 +25,9 @@
import FreeCAD
import Path
import PathScripts
import PathScripts.PathDressupDogbone as Dogbone
import PathScripts.PathDressupDogbone as PathDressupDogbone
import PathScripts.PathJob as PathJob
import PathScripts.PathProfileFaces as PathProfileFaces
import math
import unittest
@@ -50,26 +52,94 @@ class TestFeature:
def setEditorMode(self, prop, mode):
pass
class TestDogbone(PathTestBase):
class TestDressupDogbone(PathTestBase):
"""Unit tests for the Dogbone dressup."""
def formatBone(self, bone):
return "%d: (%.2f, %.2f)" % (bone[0], bone[1][0], bone[1][1])
def test00(self):
'''Verify bones are inserted for simple moves.'''
path = []
base = TestProfile('Inside', 'CW', 'G0 X10 Y10 Z10\nG1 Z0\nG1 Y100\nG1 X12\nG1 Y10\nG1 X10\nG1 Z10')
obj = TestFeature()
db = Dogbone.ObjectDressup(obj, base)
db = PathDressupDogbone.ObjectDressup(obj, base)
db.setup(obj, True)
db.execute(obj, False)
for bone in db.bones:
print("%d: (%.2f, %.2f)" % (bone[0], bone[1][0], bone[1][1]))
self.assertEquals(len(db.bones), 4)
self.assertEquals("1: (10.00, 100.00)", self.formatBone(db.bones[0]))
self.assertEquals("2: (12.00, 100.00)", self.formatBone(db.bones[1]))
self.assertEquals("3: (12.00, 10.00)", self.formatBone(db.bones[2]))
self.assertEquals("4: (10.00, 10.00)", self.formatBone(db.bones[3]))
def test01(self):
'''Verify bones are inserted if hole ends with rapid move out.'''
path = []
base = TestProfile('Inside', 'CW', 'G0 X10 Y10 Z10\nG1 Z0\nG1 Y100\nG1 X12\nG1 Y10\nG1 X10\nG0 Z10')
obj = TestFeature()
db = Dogbone.ObjectDressup(obj, base)
db = PathDressupDogbone.ObjectDressup(obj, base)
db.setup(obj, True)
db.execute(obj, False)
for bone in db.bones:
print("%d: (%.2f, %.2f)" % (bone[0], bone[1][0], bone[1][1]))
self.assertEquals(len(db.bones), 4)
self.assertEquals("1: (10.00, 100.00)", self.formatBone(db.bones[0]))
self.assertEquals("2: (12.00, 100.00)", self.formatBone(db.bones[1]))
self.assertEquals("3: (12.00, 10.00)", self.formatBone(db.bones[2]))
self.assertEquals("4: (10.00, 10.00)", self.formatBone(db.bones[3]))
def test02(self):
'''Verify bones are correctly generated for a Profile.'''
doc = FreeCAD.newDocument("TestDressupDogbone")
# This is a real world test to make sure none of the tool chain broke
box0 = doc.addObject('Part::Box', 'Box')
box0.Width = 100
box0.Length = 100
box0.Height = 10
box1 = doc.addObject('Part::Box', 'Box')
box1.Width = 50
box1.Length = 50
box1.Height = 20
box1.Placement = FreeCAD.Placement(FreeCAD.Vector(25,25,-5), FreeCAD.Rotation(FreeCAD.Vector(0,0,1), 0))
doc.recompute()
cut = doc.addObject('Part::Cut', 'Cut')
cut.Base = box0
cut.Tool = box1
doc.recompute()
for i in range(11):
face = "Face%d" % (i+1)
f = cut.Shape.getElement(face)
if f.Surface.Axis == FreeCAD.Vector(0,0,1) and f.Orientation == 'Forward':
break
job = doc.addObject("Path::FeatureCompoundPython", "Job")
PathJob.ObjectPathJob(job, cut, None)
profile = PathProfileFaces.Create('Profile Faces')
profile.Base = (cut, face)
profile.StepDown = 5
profile.processHoles = True
profile.processPerimeter = True
doc.recompute()
dogbone = PathDressupDogbone.Create(profile)
doc.recompute()
dog = dogbone.Proxy
locs = sorted([bone[1] for bone in dog.bones], key=lambda (x,y): x * 1000 + y)
def formatBoneLoc((x, y)):
return "(%.2f, %.2f)" % (x, y)
# Make sure we get 8 bones, 2 in each corner (different heights)
self.assertEquals(len(locs), 8)
self.assertEquals("(27.50, 27.50)", formatBoneLoc(locs[0]))
self.assertEquals("(27.50, 27.50)", formatBoneLoc(locs[1]))
self.assertEquals("(27.50, 72.50)", formatBoneLoc(locs[2]))
self.assertEquals("(27.50, 72.50)", formatBoneLoc(locs[3]))
self.assertEquals("(72.50, 27.50)", formatBoneLoc(locs[4]))
self.assertEquals("(72.50, 27.50)", formatBoneLoc(locs[5]))
self.assertEquals("(72.50, 72.50)", formatBoneLoc(locs[6]))
self.assertEquals("(72.50, 72.50)", formatBoneLoc(locs[7]))
FreeCAD.closeDocument("TestDressupDogbone")

View File

@@ -24,12 +24,12 @@
import TestApp
#from PathTests.TestPathLog import TestPathLog
#from PathTests.TestPathCore import TestPathCore
##from PathTests.TestPathPost import PathPostTestCases
#from PathTests.TestPathGeom import TestPathGeom
#from PathTests.TestPathUtil import TestPathUtil
#from PathTests.TestPathDepthParams import depthTestCases
#from PathTests.TestPathDressupHoldingTags import TestHoldingTags
from PathTests.TestPathDressupDogbone import TestDogbone
from PathTests.TestPathLog import TestPathLog
from PathTests.TestPathCore import TestPathCore
#from PathTests.TestPathPost import PathPostTestCases
from PathTests.TestPathGeom import TestPathGeom
from PathTests.TestPathUtil import TestPathUtil
from PathTests.TestPathDepthParams import depthTestCases
from PathTests.TestPathDressupHoldingTags import TestHoldingTags
from PathTests.TestPathDressupDogbone import TestDressupDogbone