From 4d37d8bbbedfccd3c02bf63671f0b2ced8192b81 Mon Sep 17 00:00:00 2001 From: Markus Lampert Date: Thu, 14 Sep 2017 12:40:14 -0700 Subject: [PATCH] Fixed up ToolController template arguments and loading for the switch to JSON. --- src/Mod/Path/CMakeLists.txt | 1 + src/Mod/Path/PathScripts/PathJob.py | 6 +- .../Path/PathScripts/PathToolController.py | 35 ++++---- .../Path/PathTests/TestPathToolController.py | 87 +++++++++++++++++++ src/Mod/Path/TestPathApp.py | 23 ++--- 5 files changed, 121 insertions(+), 31 deletions(-) create mode 100644 src/Mod/Path/PathTests/TestPathToolController.py diff --git a/src/Mod/Path/CMakeLists.txt b/src/Mod/Path/CMakeLists.txt index e3183b1f20..e528150c21 100644 --- a/src/Mod/Path/CMakeLists.txt +++ b/src/Mod/Path/CMakeLists.txt @@ -121,6 +121,7 @@ SET(PathTests_SRCS PathTests/TestPathPost.py PathTests/TestPathStock.py PathTests/TestPathTool.py + PathTests/TestPathToolController.py PathTests/TestPathTooltable.py PathTests/TestPathUtil.py ) diff --git a/src/Mod/Path/PathScripts/PathJob.py b/src/Mod/Path/PathScripts/PathJob.py index 322db6def5..cb3d6fbe62 100644 --- a/src/Mod/Path/PathScripts/PathJob.py +++ b/src/Mod/Path/PathScripts/PathJob.py @@ -115,7 +115,7 @@ class ObjectJob: obj.Base = createResourceClone(obj, base, 'Base', 'BaseGeometry') obj.Proxy = self - self.assignTemplate(obj, template) + self.setFromTemplate(obj, template) if not obj.Stock: obj.Stock = PathStock.CreateFromBase(obj) if obj.Stock.ViewObject: @@ -165,8 +165,8 @@ class ObjectJob: return obj.Base.Objects[0] return obj.Base - def assignTemplate(self, obj, template): - '''assignTemplate(obj, template) ... extract the properties from the given template file and assign to receiver. + def setFromTemplate(self, obj, template): + '''setFromTemplate(obj, template) ... extract the properties from the given template file and assign to receiver. This will also create any TCs stored in the template.''' tcs = [] if template: diff --git a/src/Mod/Path/PathScripts/PathToolController.py b/src/Mod/Path/PathScripts/PathToolController.py index 660ce08ec5..b068b51fcc 100644 --- a/src/Mod/Path/PathScripts/PathToolController.py +++ b/src/Mod/Path/PathScripts/PathToolController.py @@ -56,7 +56,7 @@ class ToolControllerTemplate: HorizRapid = 'hrapid' SpindleSpeed = 'speed' SpindleDir = 'dir' - Tool = 'Tool' + Tool = 'tool' class ToolController: def __init__(self, obj, tool=1): @@ -77,8 +77,8 @@ class ToolController: mode = 2 obj.setEditorMode('Placement', mode) - def assignTemplate(self, obj, template): - '''assignTemplate(obj, xmlItem) ... extract properties from xmlItem and assign to receiver.''' + def setFromTemplate(self, obj, template): + '''setFromTemplate(obj, xmlItem) ... extract properties from xmlItem and assign to receiver.''' PathLog.track(obj.Name, template) if template.get(ToolControllerTemplate.Label): obj.Label = template.get(ToolControllerTemplate.Label) @@ -97,23 +97,27 @@ class ToolController: if template.get(ToolControllerTemplate.ToolNumber): obj.ToolNumber = int(template.get(ToolControllerTemplate.ToolNumber)) - for t in template.iter(ToolControllerTemplate.Tool): - tool = Path.Tool() - tool.setFromTemplate(xml.tostring(t)) - obj.Tool = tool + if hasattr(template, 'iter'): + for t in template.iter(ToolControllerTemplate.Tool): + tool = Path.Tool() + tool.setFromTemplate(xml.tostring(t)) + obj.Tool = tool + elif template.get(ToolControllerTemplate.Tool): + obj.Tool.setFromTemplate(template.get(ToolControllerTemplate.Tool)) def templateAttrs(self, obj): '''templateAttrs(obj) ... answer a dictionary with all properties that should be stored for a template.''' attrs = {} - attrs[ToolControllerTemplate.Name] = ("%s" % (obj.Name)) - attrs[ToolControllerTemplate.Label] = ("%s" % (obj.Label)) - attrs[ToolControllerTemplate.ToolNumber] = ("%d" % (obj.ToolNumber)) + attrs[ToolControllerTemplate.Name] = obj.Name + attrs[ToolControllerTemplate.Label] = obj.Label + attrs[ToolControllerTemplate.ToolNumber] = obj.ToolNumber attrs[ToolControllerTemplate.VertFeed] = ("%s" % (obj.VertFeed)) attrs[ToolControllerTemplate.HorizFeed] = ("%s" % (obj.HorizFeed)) attrs[ToolControllerTemplate.VertRapid] = ("%s" % (obj.VertRapid)) attrs[ToolControllerTemplate.HorizRapid] = ("%s" % (obj.HorizRapid)) - attrs[ToolControllerTemplate.SpindleSpeed] = ("%f" % (obj.SpindleSpeed)) - attrs[ToolControllerTemplate.SpindleDir] = ("%s" % (obj.SpindleDir)) + attrs[ToolControllerTemplate.SpindleSpeed] = obj.SpindleSpeed + attrs[ToolControllerTemplate.SpindleDir] = obj.SpindleDir + attrs[ToolControllerTemplate.Tool] = obj.Tool.templateAttrs() return attrs def execute(self, obj): @@ -223,7 +227,7 @@ def FromTemplate(template, assignViewProvider=True): if FreeCAD.GuiUp and assignViewProvider: ViewProvider(obj.ViewObject) - tc.assignTemplate(obj, template) + tc.setFromTemplate(obj, template) return obj @@ -410,14 +414,11 @@ class DlgToolControllerEdit: def exec_(self): restoreTC = self.obj.Proxy.templateAttrs(self.obj) - restoreTool = self.obj.Tool.Content rc = False if not self.editor.form.exec_(): PathLog.info("revert") - root = xml.Element('ToolController', restoreTC) - root.append(xml.fromstring(restoreTool)) - self.obj.Proxy.assignTemplate(self.obj, root) + self.obj.Proxy.setFromTemplate(self.obj, restoreTC) rc = True return rc diff --git a/src/Mod/Path/PathTests/TestPathToolController.py b/src/Mod/Path/PathTests/TestPathToolController.py new file mode 100644 index 0000000000..b3579e5207 --- /dev/null +++ b/src/Mod/Path/PathTests/TestPathToolController.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- + +# *************************************************************************** +# * * +# * Copyright (c) 2017 sliptonic * +# * * +# * 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. * +# * * +# * This program 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 this program; if not, write to the Free Software * +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * +# * USA * +# * * +# *************************************************************************** + +import FreeCAD +import Path +import PathScripts.PathToolController as PathToolController + +from PathTests.PathTestUtils import PathTestBase + +class TestPathToolController(PathTestBase): + + def setUp(self): + self.doc = FreeCAD.newDocument("TestPathToolController") + + def tearDown(self): + FreeCAD.closeDocument(self.doc.Name) + + def createTool(self, name='t1', diameter=1.75): + return Path.Tool(name=name, diameter=diameter) + + def test00(self): + '''Verify ToolController templateAttrs''' + t = self.createTool('T1') + tc = PathToolController.Create('TC0', t) + + tc.Label = 'ToolController' + tc.ToolNumber = 7 + tc.VertFeed = '3 in/s' + tc.HorizFeed = '10 mm/s' + tc.VertRapid = 40 + tc.HorizRapid = 28 + tc.SpindleDir = 'Reverse' + tc.SpindleSpeed = 12000 + + attrs = tc.Proxy.templateAttrs(tc) + + self.assertEqual(attrs['name'], 'TC0') + self.assertEqual(attrs['label'], 'ToolController') + self.assertEqual(attrs['nr'], 7) + self.assertEqual(attrs['vfeed'], '76.2 mm/s') + self.assertEqual(attrs['hfeed'], '10 mm/s') + self.assertEqual(attrs['vrapid'], '40 mm/s') + self.assertEqual(attrs['hrapid'], '28 mm/s') + self.assertEqual(attrs['dir'], 'Reverse') + self.assertEqual(attrs['speed'], 12000) + self.assertEqual(attrs['tool'], t.templateAttrs()) + + return tc + + def test01(self): + '''Verify ToolController template roundtrip.''' + + tc0 = self.test00() + tc1 = PathToolController.FromTemplate(tc0.Proxy.templateAttrs(tc0)) + + self.assertNotEqual(tc0.Name, tc1.Name) + self.assertNotEqual(tc0.Label, tc1.Label) + self.assertEqual(tc0.ToolNumber, tc1.ToolNumber) + self.assertRoughly(tc0.VertFeed, tc1.VertFeed) + self.assertRoughly(tc0.HorizFeed, tc1.HorizFeed) + self.assertRoughly(tc0.VertRapid, tc1.VertRapid) + self.assertRoughly(tc0.HorizRapid, tc1.HorizRapid) + self.assertEqual(tc0.SpindleDir, tc1.SpindleDir) + self.assertRoughly(tc0.SpindleSpeed, tc1.SpindleSpeed) + self.assertEqual(tc0.Tool.Name, tc1.Tool.Name) + self.assertRoughly(tc0.Tool.Diameter, tc1.Tool.Diameter) diff --git a/src/Mod/Path/TestPathApp.py b/src/Mod/Path/TestPathApp.py index 0add394bdc..c79aee75d1 100644 --- a/src/Mod/Path/TestPathApp.py +++ b/src/Mod/Path/TestPathApp.py @@ -24,14 +24,15 @@ 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 TestDressupDogbone -from PathTests.TestPathStock import TestPathStock -from PathTests.TestPathTool import TestPathTool -from PathTests.TestPathTooltable import TestPathTooltable +#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 +#from PathTests.TestPathStock import TestPathStock +#from PathTests.TestPathTool import TestPathTool +#from PathTests.TestPathTooltable import TestPathTooltable +from PathTests.TestPathToolController import TestPathToolController