diff --git a/src/Mod/Path/PathScripts/PathSetupSheet.py b/src/Mod/Path/PathScripts/PathSetupSheet.py index 4d1e45740f..19d7b530f8 100644 --- a/src/Mod/Path/PathScripts/PathSetupSheet.py +++ b/src/Mod/Path/PathScripts/PathSetupSheet.py @@ -74,9 +74,9 @@ It's mostly a convencience wrapper around Spreadsheet. def __init__(self, obj): self.obj = obj - def setup(self, label=None): + def setup(self, label='SetupSheet'): '''setup(label=None) ... initializes receiver with default values.''' - self.obj.SetupSheet = self.obj.Document.addObject('Spreadsheet::Sheet', 'SetupSheet') + self.obj.SetupSheet = self.obj.Document.addObject('Spreadsheet::Sheet', 'Spreadsheet') if label: self.obj.SetupSheet.Label = label self.obj.SetupSheet.set('A2', translate('PathSetupSheet', 'Tool Rapid Speeds')) @@ -127,12 +127,30 @@ It's mostly a convencience wrapper around Spreadsheet. def expressionReference(self): '''expressionReference() ... returns the string to be used in expressions''' - return self.obj.SetupSheet.Label + # Using the Name here and not the Label (both would be valid) because the Name 'fails early'. + # + # If there is a Name/Label conflict and an expression is bound to the Name we'll get an error + # on creation (Property not found). Not good, but at least there's some indication that + # something's afoul. + # + # If the expression is based on the Label everything works out nicely - until the document is + # saved and loaded from disk. The Labels change in order to avoid the Name/Label conflict + # but the expression stays the same. If the user's lucky the expression is broken because the + # conflicting object doesn't have the properties reference by the expressions. If the user is + # not so lucky those properties also exist in the other object, there is no indication that + # anything is wrong but the expressions will substitute the values from the wrong object. + # + # I prefer the question: "why do I get this error when I create ..." over "my cnc machine just + # rammed it's tool head into the table ..." or even "I saved my file and now it's corrupt..." + # + # https://forum.freecadweb.org/viewtopic.php?f=10&t=24839 + # https://forum.freecadweb.org/viewtopic.php?f=10&t=24845 + return self.obj.SetupSheet.Name def encodeTemplateAttributes(self, attrs): '''encodeTemplateAttributes(attrs) ... return a dictionary with all values encoded.''' - return _traverseTemplateAttributes(attrs, lambda value: value.replace(self.expressionReference(), self.TemplateReference)) + return _traverseTemplateAttributes(attrs, lambda value: unicode(value.replace(self.expressionReference(), self.TemplateReference))) def decodeTemplateAttributes(self, attrs): '''decodeTemplateAttributes(attrs) ... expand template attributes to reference the receiver where applicable.''' - return _traverseTemplateAttributes(attrs, lambda value: value.replace(self.TemplateReference, self.expressionReference())) + return _traverseTemplateAttributes(attrs, lambda value: unicode(value.replace(self.TemplateReference, self.expressionReference()))) diff --git a/src/Mod/Path/PathTests/TestPathSetupSheet.py b/src/Mod/Path/PathTests/TestPathSetupSheet.py index 834097a6de..57a08967b8 100644 --- a/src/Mod/Path/PathTests/TestPathSetupSheet.py +++ b/src/Mod/Path/PathTests/TestPathSetupSheet.py @@ -81,7 +81,7 @@ class TestPathSetupSheet(PathTestBase): ss = PathSetupSheet.SetupSheet(self.obj) ss.setup('x') - self.assertEqual(ss.expressionReference(), 'x') + self.assertEqual(ss.expressionReference(), 'Spreadsheet') self.assertEqual(str(ss.encodeTemplateAttributes({'00': 13.00})), "{'00': 13.0}") self.assertEqual(str(ss.decodeTemplateAttributes({'00': 13.00})), "{'00': 13.0}") @@ -92,14 +92,14 @@ class TestPathSetupSheet(PathTestBase): ss.setup('x') self.assertEqual(str(ss.encodeTemplateAttributes({'00': 'SetupSheet'})), "{'00': u'SetupSheet'}") - self.assertEqual(str(ss.encodeTemplateAttributes({'00': 'x'})), "{'00': u'${SetupSheet}'}") - self.assertEqual(str(ss.encodeTemplateAttributes({'00': 'x.y'})), "{'00': u'${SetupSheet}.y'}") + self.assertEqual(str(ss.encodeTemplateAttributes({'00': 'Spreadsheet'})), "{'00': u'${SetupSheet}'}") + self.assertEqual(str(ss.encodeTemplateAttributes({'00': 'Spreadsheet.y'})), "{'00': u'${SetupSheet}.y'}") self.assertEqual(str(ss.encodeTemplateAttributes({'00': '${SetupSheet}'})), "{'00': u'${SetupSheet}'}") self.assertEqual(str(ss.decodeTemplateAttributes({'00': 'SetupSheet'})), "{'00': u'SetupSheet'}") - self.assertEqual(str(ss.decodeTemplateAttributes({'00': '${SetupSheet}'})), "{'00': u'x'}") - self.assertEqual(str(ss.decodeTemplateAttributes({'00': '${SetupSheet}.y'})), "{'00': u'x.y'}") - self.assertEqual(str(ss.decodeTemplateAttributes({'00': '${SetupSheet}.y - ${SetupSheet}.z'})), "{'00': u'x.y - x.z'}") + self.assertEqual(str(ss.decodeTemplateAttributes({'00': '${SetupSheet}'})), "{'00': u'Spreadsheet'}") + self.assertEqual(str(ss.decodeTemplateAttributes({'00': '${SetupSheet}.y'})), "{'00': u'Spreadsheet.y'}") + self.assertEqual(str(ss.decodeTemplateAttributes({'00': '${SetupSheet}.y - ${SetupSheet}.z'})), "{'00': u'Spreadsheet.y - Spreadsheet.z'}") def test12(self): '''Verify template attributes encoding/decoding of dictionaries.''' @@ -107,10 +107,10 @@ class TestPathSetupSheet(PathTestBase): ss.setup('rrr') self.assertEqual(str(ss.encodeTemplateAttributes({'00': {'01': 'SetupSheet'}})), "{'00': {'01': u'SetupSheet'}}") - self.assertEqual(str(ss.encodeTemplateAttributes({'00': {'01': 'rrr.y - rrr.z'}})), "{'00': {'01': u'${SetupSheet}.y - ${SetupSheet}.z'}}") + self.assertEqual(str(ss.encodeTemplateAttributes({'00': {'01': 'Spreadsheet.y - Spreadsheet.z'}})), "{'00': {'01': u'${SetupSheet}.y - ${SetupSheet}.z'}}") self.assertEqual(str(ss.decodeTemplateAttributes({'00': {'01': 'SetupSheet'}})), "{'00': {'01': u'SetupSheet'}}") - self.assertEqual(str(ss.decodeTemplateAttributes({'00': {'01': '${SetupSheet}.y - ${SetupSheet}.z'}})), "{'00': {'01': u'rrr.y - rrr.z'}}") + self.assertEqual(str(ss.decodeTemplateAttributes({'00': {'01': '${SetupSheet}.y - ${SetupSheet}.z'}})), "{'00': {'01': u'Spreadsheet.y - Spreadsheet.z'}}") def test13(self): '''Verify template attributes encoding/decoding of lists.''' @@ -118,9 +118,9 @@ class TestPathSetupSheet(PathTestBase): ss.setup('hugo') attrs = {} - attrs['00'] = 'x.hugo' - attrs['01'] = [{'10': 'hugo', '11': 'hugo.y'}, {'20': 'hugo'}] - attrs['02'] = [{'a': [{'b': 'hugo'}, {'c': 'hugo'}], 'b': [{'b': 'hugo'}]}] + attrs['00'] = 'x.Spreadsheet' + attrs['01'] = [{'10': 'Spreadsheet', '11': 'Spreadsheet.y'}, {'20': 'Spreadsheet'}] + attrs['02'] = [{'a': [{'b': 'Spreadsheet'}, {'c': 'Spreadsheet'}], 'b': [{'b': 'Spreadsheet'}]}] encoded = ss.encodeTemplateAttributes(attrs) self.assertEqual(encoded['00'], 'x.${SetupSheet}') @@ -150,8 +150,14 @@ class TestPathSetupSheet(PathTestBase): self.assertEqual(decoded['02'][0]['b'][0]['b'], attrs['02'][0]['b'][0]['b']) # just to be safe ... - self.obj.SetupSheet.Label = 'xxx' - self.assertEqual(ss.expressionReference(), 'xxx') - dec = ss.decodeTemplateAttributes(encoded) + o2 = self.TestObject(self.doc) + s2 = PathSetupSheet.SetupSheet(o2) + s2.setup() + self.doc.recompute() + s2.setFromTemplate(ss.templateAttributes()) + o2.SetupSheet.Label = 'xxx' + self.assertEqual(s2.expressionReference(), 'Spreadsheet001') + dec = s2.decodeTemplateAttributes(encoded) # pick one - self.assertEqual(dec['01'][0]['11'], 'xxx.y') + self.assertEqual(dec['01'][0]['11'], 'Spreadsheet001.y') +