From 27efdf9caf1c1ca0897cde70c8b14898158c4b4f Mon Sep 17 00:00:00 2001 From: sliptonic Date: Tue, 22 Feb 2022 08:58:10 -0600 Subject: [PATCH] Fixes #6275 Make PathPost emit tool controllers even if tool number is same. --- .../Path/Generators/toolchange_generator.py | 30 ++ src/Mod/Path/PathScripts/PathGui.py | 37 ++ src/Mod/Path/PathScripts/PathPost.py | 315 ++++++++++-------- src/Mod/Path/PathTests/TestPathPost.py | 302 ++++++++++++++++- src/Mod/Path/PathTests/boxtest.fcstd | Bin 11426 -> 37622 bytes src/Mod/Path/TestPathApp.py | 1 + 6 files changed, 540 insertions(+), 145 deletions(-) diff --git a/src/Mod/Path/Generators/toolchange_generator.py b/src/Mod/Path/Generators/toolchange_generator.py index 9a6f67a725..e7a6f35b7f 100644 --- a/src/Mod/Path/Generators/toolchange_generator.py +++ b/src/Mod/Path/Generators/toolchange_generator.py @@ -75,3 +75,33 @@ def generate( PathLog.track(commands) return commands + + +def generateSubstitute(newTC, oldTC=None): + """ + The specific commands to emit, depend on the state of the machine. + For example, the toolnumber may not change, only the spindle speed. + This routine will generate a list of commands to substitute for a TC + object to be handed to the postprocessor. + It will contain only the commands needed + """ + + if oldTC is None: + return newTC.Path.Commands + + if newTC.ToolNumber != oldTC.ToolNumber: # Full toolchange + return newTC.Path.Commands + + if (newTC.SpindleSpeed != oldTC.SpindleSpeed) or ( + newTC.SpindleDir != oldTC.SpindleDir + ): + if newTC.SpindleDir == "Forward": + sd = SpindleDirection.CW + elif newTC.SpindleDir == "Reverse": + sd = SpindleDirection.CCW + else: + sd = SpindleDirection.OFF + + return [Path.Command(sd.value, {"S": newTC.SpindleSpeed})] + + return [] diff --git a/src/Mod/Path/PathScripts/PathGui.py b/src/Mod/Path/PathScripts/PathGui.py index 6bdd15f411..a39f506c4f 100644 --- a/src/Mod/Path/PathScripts/PathGui.py +++ b/src/Mod/Path/PathScripts/PathGui.py @@ -21,9 +21,11 @@ # *************************************************************************** import FreeCAD +import FreeCADGui import PathScripts.PathGeom as PathGeom import PathScripts.PathLog as PathLog import PathScripts.PathUtil as PathUtil +from PySide import QtGui, QtCore from PySide import QtCore, QtGui @@ -199,3 +201,38 @@ class QuantitySpinBox(QtCore.QObject): if prop == self.prop: return exp return None + + +def getDocNode(): + doc = FreeCADGui.ActiveDocument.Document.Name + tws = FreeCADGui.getMainWindow().findChildren(QtGui.QTreeWidget) + + for tw in tws: + if tw.topLevelItemCount() != 1 or tw.topLevelItem(0).text(0) != "Application": + continue + toptree = tw.topLevelItem(0) + for i in range(0, toptree.childCount()): + docitem = toptree.child(i) + if docitem.text(0) == doc: + return docitem + return None + + +def disableItem(item): + Dragflag = QtCore.Qt.ItemFlag.ItemIsDragEnabled + Dropflag = QtCore.Qt.ItemFlag.ItemIsDropEnabled + item.setFlags(item.flags() & ~Dragflag) + item.setFlags(item.flags() & ~Dropflag) + for idx in range(0, item.childCount()): + disableItem(item.child(idx)) + + +def findItem(docitem, objname): + print(docitem.text(0)) + for i in range(0, docitem.childCount()): + if docitem.child(i).text(0) == objname: + return docitem.child(i) + res = findItem(docitem.child(i), objname) + if res: + return res + return None diff --git a/src/Mod/Path/PathScripts/PathPost.py b/src/Mod/Path/PathScripts/PathPost.py index 52aba08b85..d1e02d459c 100644 --- a/src/Mod/Path/PathScripts/PathPost.py +++ b/src/Mod/Path/PathScripts/PathPost.py @@ -41,8 +41,11 @@ from PySide.QtCore import QT_TRANSLATE_NOOP LOG_MODULE = PathLog.thisModule() -PathLog.setLevel(PathLog.Level.INFO, LOG_MODULE) - +if False: + PathLog.setLevel(PathLog.Level.DEBUG, PathLog.thisModule()) + PathLog.trackModule(PathLog.thisModule()) +else: + PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) translate = FreeCAD.Qt.translate @@ -50,7 +53,6 @@ translate = FreeCAD.Qt.translate class _TempObject: Path = None Name = "Fixture" - InList = [] Label = "Fixture" @@ -216,6 +218,167 @@ class CommandPathPost: else: return (True, "", filename) + def buildPostList(self, job): + """ + Parses the job and returns the list(s) of objects to be written by the post + Postlist is a list of lists. Each sublist is intended to be a separate file + """ + orderby = job.OrderOutputBy + + fixturelist = [] + for f in job.Fixtures: + # create an object to serve as the fixture path + fobj = _TempObject() + fobj.Label = f + c1 = Path.Command(f) + c2 = Path.Command( + "G0 Z" + + str( + job.Stock.Shape.BoundBox.ZMax + + job.SetupSheet.ClearanceHeightOffset.Value + ) + ) + fobj.Path = Path.Path([c1, c2]) + # fobj.InList.append(job) + fixturelist.append(fobj) + + postlist = [] + + if orderby == "Fixture": + PathLog.debug("Ordering by Fixture") + # Order by fixture means all operations and tool changes will be completed in one + # fixture before moving to the next. + + for f in fixturelist: + scratchpad = [(f, None)] + + # Now generate the gcode + for obj in job.Operations.Group: + if not PathUtil.opProperty(obj, "Active"): + continue + tc = PathUtil.toolControllerForOp(obj) + scratchpad.append((obj, tc)) + + sublist = [] + temptool = None + for item in scratchpad: + if item[1] in [temptool, None]: + sublist.append(item[0]) + else: + sublist.append(item[1]) + temptool = item[1] + sublist.append(item[0]) + postlist.append(sublist) + + elif orderby == "Tool": + PathLog.debug("Ordering by Tool") + # Order by tool means tool changes are minimized. + # all operations with the current tool are processed in the current + # fixture before moving to the next fixture. + + currTool = None + + # Now generate the gcode + curlist = [] # list of ops for tool, will repeat for each fixture + # sublist = [] # list of ops for output splitting + + for idx, obj in enumerate(job.Operations.Group): + + # check if the operation is active + active = PathUtil.opProperty(obj, "Active") + + tc = PathUtil.toolControllerForOp(obj) + + if not active: # pass on any inactive ops + continue + + if tc is None: + curlist.append((obj, None)) + continue + + if tc == currTool: + curlist.append((obj, tc)) + + if tc != currTool and currTool is None: # first TC + currTool = tc + curlist.append((obj, tc)) + continue + + if tc != currTool and currTool is not None: # TC changed + if tc.ToolNumber == currTool.ToolNumber: # Same tool /diff params + curlist.append((obj, tc)) + currTool = tc + else: # Actual Toolchange + # dump current state to postlist + sublist = [] + t = None + for fixture in fixturelist: + sublist.append(fixture) + for item in curlist: + if item[1] == t: + sublist.append(item[0]) + else: + sublist.append(item[1]) + t = item[1] + sublist.append(item[0]) + + postlist.append(sublist) + + # set up for next tool group + currTool = tc + curlist = [(obj, tc)] + + # flush remaining curlist to output + sublist = [] + t = None + for fixture in fixturelist: + sublist.append(fixture) + for item in curlist: + if item[1] == t: + sublist.append(item[0]) + else: + sublist.append(item[1]) + t = item[1] + sublist.append(item[0]) + postlist.append(sublist) + + elif orderby == "Operation": + PathLog.debug("Ordering by Operation") + # Order by operation means ops are done in each fixture in + # sequence. + currTool = None + # firstFixture = True + + # Now generate the gcode + for obj in job.Operations.Group: + scratchpad = [] + tc = PathUtil.toolControllerForOp(obj) + if not PathUtil.opProperty(obj, "Active"): + continue + + PathLog.debug("obj: {}".format(obj.Name)) + for f in fixturelist: + + scratchpad.append((f, None)) + scratchpad.append((obj, tc)) + + sublist = [] + temptool = None + for item in scratchpad: + if item[1] in [temptool, None]: + sublist.append(item[0]) + else: + sublist.append(item[1]) + temptool = item[1] + sublist.append(item[0]) + postlist.append(sublist) + + if job.SplitOutput: + return postlist + else: + finalpostlist = [item for slist in postlist for item in slist] + return [finalpostlist] + def Activated(self): PathLog.track() FreeCAD.ActiveDocument.openTransaction("Post Process the Selected path(s)") @@ -265,150 +428,14 @@ class CommandPathPost: PathLog.debug("about to postprocess job: {}".format(job.Name)) - wcslist = job.Fixtures - orderby = job.OrderOutputBy - split = job.SplitOutput - - postlist = [] - - if orderby == "Fixture": - PathLog.debug("Ordering by Fixture") - # Order by fixture means all operations and tool changes will be completed in one - # fixture before moving to the next. - - currTool = None - for index, f in enumerate(wcslist): - # create an object to serve as the fixture path - fobj = _TempObject() - c1 = Path.Command(f) - fobj.Path = Path.Path([c1]) - if index != 0: - c2 = Path.Command( - "G0 Z" - + str( - job.Stock.Shape.BoundBox.ZMax - + job.SetupSheet.ClearanceHeightOffset.Value - ) - ) - fobj.Path.addCommands(c2) - fobj.InList.append(job) - sublist = [fobj] - - # Now generate the gcode - for obj in job.Operations.Group: - tc = PathUtil.toolControllerForOp(obj) - if tc is not None and PathUtil.opProperty(obj, "Active"): - if tc.ToolNumber != currTool or split is True: - sublist.append(tc) - PathLog.debug("Appending TC: {}".format(tc.Name)) - currTool = tc.ToolNumber - sublist.append(obj) - postlist.append(sublist) - - elif orderby == "Tool": - PathLog.debug("Ordering by Tool") - # Order by tool means tool changes are minimized. - # all operations with the current tool are processed in the current - # fixture before moving to the next fixture. - - currTool = None - fixturelist = [] - for f in wcslist: - # create an object to serve as the fixture path - fobj = _TempObject() - c1 = Path.Command(f) - c2 = Path.Command( - "G0 Z" - + str( - job.Stock.Shape.BoundBox.ZMax - + job.SetupSheet.ClearanceHeightOffset.Value - ) - ) - fobj.Path = Path.Path([c1, c2]) - fobj.InList.append(job) - fixturelist.append(fobj) - - # Now generate the gcode - curlist = [] # list of ops for tool, will repeat for each fixture - sublist = [] # list of ops for output splitting - - for idx, obj in enumerate(job.Operations.Group): - - # check if the operation is active - active = PathUtil.opProperty(obj, "Active") - - tc = PathUtil.toolControllerForOp(obj) - if tc is None or tc.ToolNumber == currTool and active: - curlist.append(obj) - elif ( - tc.ToolNumber != currTool and currTool is None and active - ): # first TC - sublist.append(tc) - curlist.append(obj) - currTool = tc.ToolNumber - elif ( - tc.ToolNumber != currTool and currTool is not None and active - ): # TC - for fixture in fixturelist: - sublist.append(fixture) - sublist.extend(curlist) - postlist.append(sublist) - sublist = [tc] - curlist = [obj] - currTool = tc.ToolNumber - - if idx == len(job.Operations.Group) - 1: # Last operation. - for fixture in fixturelist: - sublist.append(fixture) - sublist.extend(curlist) - postlist.append(sublist) - - elif orderby == "Operation": - PathLog.debug("Ordering by Operation") - # Order by operation means ops are done in each fixture in - # sequence. - currTool = None - firstFixture = True - - # Now generate the gcode - for obj in job.Operations.Group: - if PathUtil.opProperty(obj, "Active"): - sublist = [] - PathLog.debug("obj: {}".format(obj.Name)) - for f in wcslist: - fobj = _TempObject() - c1 = Path.Command(f) - fobj.Path = Path.Path([c1]) - if not firstFixture: - c2 = Path.Command( - "G0 Z" - + str( - job.Stock.Shape.BoundBox.ZMax - + job.SetupSheet.ClearanceHeightOffset.Value - ) - ) - fobj.Path.addCommands(c2) - fobj.InList.append(job) - sublist.append(fobj) - firstFixture = False - tc = PathUtil.toolControllerForOp(obj) - if tc is not None: - if job.SplitOutput or (tc.ToolNumber != currTool): - sublist.append(tc) - currTool = tc.ToolNumber - sublist.append(obj) - postlist.append(sublist) + postlist = self.buildPostList(job) fail = True rc = "" - if split: - for slist in postlist: - (fail, rc, filename) = self.exportObjectsWith(slist, job) - if fail: - break - else: - finalpostlist = [item for slist in postlist for item in slist] - (fail, rc, filename) = self.exportObjectsWith(finalpostlist, job) + for slist in postlist: + (fail, rc, filename) = self.exportObjectsWith(slist, job) + if fail: + break self.subpart = 1 diff --git a/src/Mod/Path/PathTests/TestPathPost.py b/src/Mod/Path/PathTests/TestPathPost.py index 3bddac16c3..a90d3bf235 100644 --- a/src/Mod/Path/PathTests/TestPathPost.py +++ b/src/Mod/Path/PathTests/TestPathPost.py @@ -25,7 +25,7 @@ import PathScripts import PathScripts.post import PathScripts.PathProfileContour import PathScripts.PathJob -import PathScripts.PathPost +import PathScripts.PathPost as PathPost import PathScripts.PathToolController import PathScripts.PathUtil import PathScripts.PostUtils as PostUtils @@ -324,3 +324,303 @@ class TestPathPostImport(unittest.TestCase): ] ) self.assertTrue(gcodeByToolNumberList[1][1] == 2) + + +class OutputOrderingTestCases(unittest.TestCase): + def setUp(self): + testfile = FreeCAD.getHomePath() + "Mod/Path/PathTests/boxtest.fcstd" + self.doc = FreeCAD.open(testfile) + self.job = FreeCAD.ActiveDocument.getObject("Job001") + + def tearDown(self): + FreeCAD.closeDocument("boxtest") + + def test010(self): + # Basic postprocessing: + + self.job.Fixtures = ["G54"] + self.job.SplitOutput = False + self.job.OrderOutputBy = "Fixture" + + cpp = PathPost.CommandPathPost + self.postlist = cpp.buildPostList(self, self.job) + + outlist = [i.Label for i in self.postlist[0]] + + self.assertTrue(len(self.postlist) == 1) + expected = [ + "G54", + "T1", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + "T3", + "FifthOp-(T3)", + ] + self.assertListEqual(outlist, expected) + + def test020(self): + # Multiple Fixtures + + self.job.Fixtures = ["G54", "G55"] + self.job.SplitOutput = False + self.job.OrderOutputBy = "Fixture" + + cpp = PathPost.CommandPathPost + self.postlist = cpp.buildPostList(self, self.job) + + self.assertTrue(len(self.postlist) == 1) + + outlist = [i.Label for i in self.postlist[0]] + expected = [ + "G54", + "T1", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + "T3", + "FifthOp-(T3)", + "G55", + "T1", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + "T3", + "FifthOp-(T3)", + ] + + self.assertListEqual(outlist, expected) + + def test030(self): + # Multiple Fixtures - Split output + + self.job.Fixtures = ["G54", "G55"] + self.job.SplitOutput = True + self.job.OrderOutputBy = "Fixture" + + cpp = PathPost.CommandPathPost + self.postlist = cpp.buildPostList(self, self.job) + + self.assertTrue(len(self.postlist) == 2) + + outlist = [i.Label for i in self.postlist[0]] + print(outlist) + + expected = [ + "G54", + "T1", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + "T3", + "FifthOp-(T3)", + ] + self.assertListEqual(outlist, expected) + + expected = [ + "G55", + "T1", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + "T3", + "FifthOp-(T3)", + ] + outlist = [i.Label for i in self.postlist[1]] + self.assertListEqual(outlist, expected) + + def test040(self): + # Order by 'Tool' + + self.job.Fixtures = ["G54", "G55"] + self.job.SplitOutput = False + self.job.OrderOutputBy = "Tool" + + cpp = PathPost.CommandPathPost + self.postlist = cpp.buildPostList(self, self.job) + outlist = [i.Label for i in self.postlist[0]] + + self.assertTrue(len(self.postlist) == 1) + expected = [ + "G54", + "T1", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + "G55", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + "G54", + "T3", + "FifthOp-(T3)", + "G55", + "FifthOp-(T3)", + ] + + self.assertListEqual(outlist, expected) + + def test050(self): + # Order by 'Tool' and split + + self.job.Fixtures = ["G54", "G55"] + self.job.SplitOutput = True + self.job.OrderOutputBy = "Tool" + + cpp = PathPost.CommandPathPost + self.postlist = cpp.buildPostList(self, self.job) + outlist = [i.Label for i in self.postlist[0]] + + expected = [ + "G54", + "T1", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + "G55", + "FirstOp-(T1)", + "SecondOp-(T1)", + "T2", + "ThirdOp-(T2)", + "T1", + "FourthOp-(T1)", + ] + self.assertListEqual(outlist, expected) + + outlist = [i.Label for i in self.postlist[1]] + + expected = [ + "G54", + "T3", + "FifthOp-(T3)", + "G55", + "FifthOp-(T3)", + ] + self.assertListEqual(outlist, expected) + + def test060(self): + # Order by 'Operation' + + self.job.Fixtures = ["G54", "G55"] + self.job.SplitOutput = False + self.job.OrderOutputBy = "Operation" + + cpp = PathPost.CommandPathPost + self.postlist = cpp.buildPostList(self, self.job) + outlist = [i.Label for i in self.postlist[0]] + + self.assertTrue(len(self.postlist) == 1) + expected = [ + "G54", + "T1", + "FirstOp-(T1)", + "G55", + "FirstOp-(T1)", + "G54", + "T1", + "SecondOp-(T1)", + "G55", + "SecondOp-(T1)", + "G54", + "T2", + "ThirdOp-(T2)", + "G55", + "ThirdOp-(T2)", + "G54", + "T1", + "FourthOp-(T1)", + "G55", + "FourthOp-(T1)", + "G54", + "T3", + "FifthOp-(T3)", + "G55", + "FifthOp-(T3)", + ] + + self.assertListEqual(outlist, expected) + + def test070(self): + # Order by 'Operation' and split + + self.job.Fixtures = ["G54", "G55"] + self.job.SplitOutput = True + self.job.OrderOutputBy = "Operation" + + cpp = PathPost.CommandPathPost + self.postlist = cpp.buildPostList(self, self.job) + self.assertTrue(len(self.postlist) == 5) + + outlist = [i.Label for i in self.postlist[0]] + expected = [ + "G54", + "T1", + "FirstOp-(T1)", + "G55", + "FirstOp-(T1)", + ] + self.assertListEqual(outlist, expected) + + outlist = [i.Label for i in self.postlist[1]] + expected = [ + "G54", + "T1", + "SecondOp-(T1)", + "G55", + "SecondOp-(T1)", + ] + self.assertListEqual(outlist, expected) + + outlist = [i.Label for i in self.postlist[2]] + expected = [ + "G54", + "T2", + "ThirdOp-(T2)", + "G55", + "ThirdOp-(T2)", + ] + self.assertListEqual(outlist, expected) + + outlist = [i.Label for i in self.postlist[3]] + expected = [ + "G54", + "T1", + "FourthOp-(T1)", + "G55", + "FourthOp-(T1)", + ] + self.assertListEqual(outlist, expected) + + outlist = [i.Label for i in self.postlist[4]] + expected = [ + "G54", + "T3", + "FifthOp-(T3)", + "G55", + "FifthOp-(T3)", + ] + self.assertListEqual(outlist, expected) diff --git a/src/Mod/Path/PathTests/boxtest.fcstd b/src/Mod/Path/PathTests/boxtest.fcstd index cc338da2d8a7e5d7ee585ca514cd1f5e868837f4..2a6e76e292557c82cc37f043bfa0606ac5425335 100644 GIT binary patch literal 37622 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 WXj#BD@IXQ~`uhC50(gIBTmKLKU5QNq literal 11426 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 D