diff --git a/src/Mod/Path/PathScripts/PathCustom.py b/src/Mod/Path/PathScripts/PathCustom.py index 4be7e94314..d78bffe360 100644 --- a/src/Mod/Path/PathScripts/PathCustom.py +++ b/src/Mod/Path/PathScripts/PathCustom.py @@ -25,12 +25,13 @@ import FreeCAD import FreeCADGui import Path from PySide import QtCore -from copy import copy + __doc__ = """Path Custom object and FreeCAD command""" movecommands = ['G0', 'G00', 'G1', 'G01', 'G2', 'G02', 'G3', 'G03'] + # Qt translation handling def translate(context, text, disambig=None): return QtCore.QCoreApplication.translate(context, text, disambig) @@ -38,11 +39,13 @@ def translate(context, text, disambig=None): class ObjectCustom: - def __init__(self,obj): - obj.addProperty("App::PropertyStringList", "Gcode", "Path", QtCore.QT_TRANSLATE_NOOP("PathCustom", "The gcode to be inserted")) - obj.addProperty("App::PropertyLink", "ToolController", "Path", QtCore.QT_TRANSLATE_NOOP("PathCustom", "The tool controller that will be used to calculate the path")) - obj.addProperty("App::PropertyBool", "OperationPlacement", "Path", "Use operation placement") - obj.OperationPlacement = False + def __init__(self, obj): + obj.addProperty("App::PropertyStringList", "Gcode", "Path", + QtCore.QT_TRANSLATE_NOOP("PathCustom", "The gcode to be inserted")) + obj.addProperty("App::PropertyLink", "ToolController", "Path", + QtCore.QT_TRANSLATE_NOOP("PathCustom", "The tool controller that will be used to calculate the path")) + obj.addProperty("App::PropertyPlacement", "Offset", "Path", + "Placement Offset") obj.Proxy = self def __getstate__(self): @@ -52,23 +55,21 @@ class ObjectCustom: return None def execute(self, obj): - commands = [] - newPath = Path.Path + newpath = Path.Path() if obj.Gcode: for l in obj.Gcode: - newcommand=Path.Command(str(l)) - if newcommand.Name in movecommands and obj.OperationPlacement: + newcommand = Path.Command(str(l)) + if newcommand.Name in movecommands: if 'X' in newcommand.Parameters: - newcommand.x += obj.Placement.Base.x + newcommand.x += obj.Offset.Base.x if 'Y' in newcommand.Parameters: - newcommand.y += obj.Placement.Base.y + newcommand.y += obj.Offset.Base.y if 'Z' in newcommand.Parameters: - newcommand.z += obj.Placement.Base.z + newcommand.z += obj.Offset.Base.z - commands.append(newcommand) - newPath.addCommands(commands) + newpath.insertCommand(newcommand) - obj.Path = newPath + obj.Path=newpath class CommandPathCustom: @@ -89,7 +90,7 @@ class CommandPathCustom: FreeCAD.ActiveDocument.openTransaction("Create Custom Path") FreeCADGui.addModule("PathScripts.PathCustom") FreeCADGui.addModule("PathScripts.PathUtils") - FreeCADGui.doCommand('obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython","Custom")') + FreeCADGui.doCommand('obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "Custom")') FreeCADGui.doCommand('PathScripts.PathCustom.ObjectCustom(obj)') FreeCADGui.doCommand('obj.ViewObject.Proxy = 0') FreeCADGui.doCommand('PathScripts.PathUtils.addToJob(obj)') @@ -100,4 +101,4 @@ class CommandPathCustom: if FreeCAD.GuiUp: # register the FreeCAD command - FreeCADGui.addCommand('Path_Custom', CommandPathCustom()) + FreeCADGui.addCommand('Path_Custom', CommandPathCustom()) \ No newline at end of file diff --git a/src/Mod/Path/PathScripts/post/example_pre.py b/src/Mod/Path/PathScripts/post/example_pre.py index 5928c30301..6e90d556b9 100644 --- a/src/Mod/Path/PathScripts/post/example_pre.py +++ b/src/Mod/Path/PathScripts/post/example_pre.py @@ -73,13 +73,11 @@ def insert(filename, docname): def parse(inputstring): "parse(inputstring): returns a parsed output string" print("preprocessing...") - print(inputstring) PathLog.track(inputstring) # split the input by line lines = inputstring.split("\n") - output = "" - lastcommand = None - print(lines) + output = [] #"" + lastcommand = None for lin in lines: # remove any leftover trailing and preceding spaces @@ -91,7 +89,7 @@ def parse(inputstring): # remove line numbers lin = lin.split(" ", 1) if len(lin) >= 1: - lin = lin[1] + lin = lin[1].strip() else: continue @@ -100,7 +98,8 @@ def parse(inputstring): continue if lin[0].upper() in ["G", "M"]: # found a G or M command: we store it - output += lin + "\n" + #output += lin + "\n" + output.append(lin) # + "\n" last = lin[0].upper() for c in lin[1:]: if not c.isdigit(): @@ -110,7 +109,7 @@ def parse(inputstring): lastcommand = last elif lastcommand: # no G or M command: we repeat the last one - output += lastcommand + " " + lin + "\n" + output.append(lastcommand + " " + lin) # + "\n" print("done preprocessing.") return output diff --git a/src/Mod/Path/PathScripts/post/gcode_pre.py b/src/Mod/Path/PathScripts/post/gcode_pre.py index 0ec421b521..1b3eee4b49 100644 --- a/src/Mod/Path/PathScripts/post/gcode_pre.py +++ b/src/Mod/Path/PathScripts/post/gcode_pre.py @@ -36,6 +36,7 @@ import Path import FreeCAD import PathScripts.PathUtils import PathScripts.PathLog as PathLog +import re # LEVEL = PathLog.Level.DEBUG LEVEL = PathLog.Level.INFO @@ -64,14 +65,20 @@ def insert(filename, docname): gfile = pythonopen(filename) gcode = gfile.read() gfile.close() - gcode = parse(gcode) - doc = FreeCAD.getDocument(docname) - obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "Custom") - PathScripts.PathCustom.ObjectCustom(obj) - obj.ViewObject.Proxy = 0 - obj.Gcode = gcode - PathScripts.PathUtils.addToJob(obj) - obj.ToolController = PathScripts.PathUtils.findToolController(obj) + # split on tool changes + paths = re.split('(?=[mM]+\s?0?6)', gcode) + # if there are any tool changes combine the preamble with the default tool + if len(paths) > 1: + paths = ["\n".join(paths[0:2])] + paths[2:] + for path in paths: + gcode = parse(path) + doc = FreeCAD.getDocument(docname) + obj = FreeCAD.ActiveDocument.addObject("Path::FeaturePython", "Custom") + PathScripts.PathCustom.ObjectCustom(obj) + obj.ViewObject.Proxy = 0 + obj.Gcode = gcode + PathScripts.PathUtils.addToJob(obj) + obj.ToolController = PathScripts.PathUtils.findToolController(obj) FreeCAD.ActiveDocument.recompute() @@ -82,7 +89,7 @@ def parse(inputstring): # split the input by line lines = inputstring.split("\n") output = [] #"" - lastcommand = None + lastcommand = None for lin in lines: # remove any leftover trailing and preceding spaces