diff --git a/src/Mod/Path/PathScripts/post/jtech_post.py b/src/Mod/Path/PathScripts/post/jtech_post.py index 4d54f74b95..29801abfeb 100644 --- a/src/Mod/Path/PathScripts/post/jtech_post.py +++ b/src/Mod/Path/PathScripts/post/jtech_post.py @@ -28,7 +28,6 @@ import argparse import datetime import shlex from PathScripts import PostUtils -from PathScripts import PathUtils TOOLTIP = ''' This is a postprocessor file for the Path workbench. It is used to @@ -54,7 +53,6 @@ parser.add_argument('--postamble', help='set commands to be issued after the las parser.add_argument('--inches', action='store_true', help='Convert output for US imperial mode (G20)') parser.add_argument('--modal', action='store_true', help='Output the Same G-command Name USE NonModal Mode') parser.add_argument('--axis-modal', action='store_true', help='Output the Same Axis Value Mode') -#parser.add_argument('--power-max', help='set the max value for laser power default=255') parser.add_argument('--power-on-delay', default='255', help='milliseconds - Add a delay after laser on before moving to pre-heat material. Default=0') @@ -104,7 +102,6 @@ POST_OPERATION = '''''' # Tool Change commands will be inserted before a tool change TOOL_CHANGE = '''''' -#POWER_MAX = 255 POWER_ON_DELAY = 0 # to distinguish python built-in open function from the one declared below @@ -152,9 +149,9 @@ def processArguments(argstring): MODAL = True if args.axis_modal: OUTPUT_DOUBLES = False - POWER_ON_DELAY = float(args.power_on_delay) / 1000 #milliseconds + POWER_ON_DELAY = float(args.power_on_delay) / 1000 # milliseconds - except: + except Exception: return False return True @@ -290,7 +287,7 @@ def parse(pathobj): if command == lastcommand: outstring.pop(0) - if c.Name[0] == '(' and not OUTPUT_COMMENTS: # command is a comment + if c.Name[0] == '(' and not OUTPUT_COMMENTS: # command is a comment continue # Now add the remaining parameters in order @@ -326,10 +323,6 @@ def parse(pathobj): # Check for Tool Change: if command == 'M6': continue - # if OUTPUT_COMMENTS: - # out += linenumber() + "(begin toolchange)\n" - for line in TOOL_CHANGE.splitlines(True): - out += linenumber() + line if command == "message": if OUTPUT_COMMENTS is False: @@ -349,4 +342,5 @@ def parse(pathobj): return out + print(__name__ + " gcode postprocessor loaded.") diff --git a/src/Mod/Path/PathScripts/post/linuxcnc_post.py b/src/Mod/Path/PathScripts/post/linuxcnc_post.py index a73750d65d..244902111c 100644 --- a/src/Mod/Path/PathScripts/post/linuxcnc_post.py +++ b/src/Mod/Path/PathScripts/post/linuxcnc_post.py @@ -142,7 +142,7 @@ def processArguments(argstring): print ('here') OUTPUT_DOUBLES = False - except: + except Exception: return False return True diff --git a/src/Mod/Path/PathScripts/post/opensbp_post.py b/src/Mod/Path/PathScripts/post/opensbp_post.py index 307f43c551..433370fb0f 100644 --- a/src/Mod/Path/PathScripts/post/opensbp_post.py +++ b/src/Mod/Path/PathScripts/post/opensbp_post.py @@ -26,7 +26,7 @@ from PathScripts import PostUtils # ***************************************************************************/ -TOOLTIP=''' +TOOLTIP = ''' This is an postprocessor file for the Path workbench. It will output path data in a format suitable for OpenSBP controllers like shopbot. This postprocessor, once placed in the appropriate PathScripts folder, can be used directly from @@ -50,7 +50,7 @@ ToDo ''' -TOOLTIP_ARGS=''' +TOOLTIP_ARGS = ''' Arguments for opensbp: --comments ... insert comments - mostly for debugging --inches ... convert output to inches @@ -80,16 +80,20 @@ POST_OPERATION = '''''' TOOL_CHANGE = '''''' # to distinguish python built-in open function from the one declared below -if open.__module__ in ['__builtin__','io']: +if open.__module__ in ['__builtin__', 'io']: pythonopen = open CurrentState = {} + def getMetricValue(val): return val + + def getImperialValue(val): return val / 25.4 + GetValue = getMetricValue @@ -110,7 +114,6 @@ def export(objectslist, filename, argstring): if arg == '--no-show-editor': SHOW_EDITOR = False - for obj in objectslist: if not hasattr(obj, "Path"): s = "the object " + obj.Name @@ -333,7 +336,6 @@ def parse(pathobj): global CurrentState output = "" - params = ['X', 'Y', 'Z', 'A', 'B', 'I', 'J', 'K', 'F', 'S', 'T'] # Above list controls the order of parameters if hasattr(pathobj, "Group"): # We have a compound or project. @@ -356,7 +358,7 @@ def parse(pathobj): elif command[0] == '(': output += "' " + command + "\n" else: - print("I don't know what the hell the command: ",end='') + print("I don't know what the hell the command: ", end='') print(command + " means. Maybe I should support it.") return output diff --git a/src/Mod/Path/PathScripts/post/opensbp_pre.py b/src/Mod/Path/PathScripts/post/opensbp_pre.py index 61db9d9db4..615e804ca4 100644 --- a/src/Mod/Path/PathScripts/post/opensbp_pre.py +++ b/src/Mod/Path/PathScripts/post/opensbp_pre.py @@ -49,13 +49,14 @@ Many other OpenSBP commands not handled from __future__ import print_function import FreeCAD import PathScripts.PathUtil as PathUtil -import os, Path +import os +import Path -AXIS = 'X','Y','Z','A','B' #OpenSBP always puts multiaxis move parameters in this order -SPEEDS = 'XY','Z','A','B' +AXIS = 'X', 'Y', 'Z', 'A', 'B' # OpenSBP always puts multiaxis move parameters in this order +SPEEDS = 'XY', 'Z', 'A', 'B' # to distinguish python built-in open function from the one declared below -if open.__module__ in ['__builtin__','io']: +if open.__module__ in ['__builtin__', 'io']: pythonopen = open @@ -63,10 +64,10 @@ def open(filename): "called when freecad opens a file." docname = os.path.splitext(os.path.basename(filename))[0] doc = FreeCAD.newDocument(docname) - insert(filename,doc.Name) + insert(filename, doc.Name) -def insert(filename,docname): +def insert(filename, docname): "called when freecad imports a file" "This insert expects parse to return a list of strings" "each string will become a separate path" @@ -76,7 +77,7 @@ def insert(filename,docname): gcode = parse(gcode) doc = FreeCAD.getDocument(docname) for subpath in gcode: - obj = doc.addObject("Path::Feature","Path") + obj = doc.addObject("Path::Feature", "Path") path = Path.Path(subpath) obj.Path = path @@ -88,123 +89,121 @@ def parse(inputstring): lines = inputstring.split("\n") return_output = [] output = "" - last = {'X':None,'Y':None,'Z':None,'A':None,'B':None} - lastrapidspeed = {'XY':"50", 'Z':"50", 'A':"50", 'B':"50" } #set default rapid speeds - lastfeedspeed = {'XY':"50", 'Z':"50", 'A':"50", 'B':"50" } #set default feed speed + last = {'X': None, 'Y': None, 'Z': None, 'A': None, 'B': None} + lastrapidspeed = {'XY': "50", 'Z': "50", 'A': "50", 'B': "50"} # set default rapid speeds + lastfeedspeed = {'XY': "50", 'Z': "50", 'A': "50", 'B': "50"} # set default feed speed movecommand = ['G1', 'G0', 'G02', 'G03'] - for l in lines: + for line in lines: # remove any leftover trailing and preceding spaces - l = l.strip() - if not l: + line = line.strip() + if not line: # discard empty lines continue - if l[0] in ["'","&"]: + if line[0] in ["'", "&"]: # discard comment and other non strictly gcode lines - if l[0:9] == "'New Path": + if line[0:9] == "'New Path": # starting new path - if any (x in output for x in movecommand): #make sure the path has at least one move command. + if any(x in output for x in movecommand): # make sure the path has at least one move command. return_output.append(output) output = "" continue - words = [a.strip() for a in l.split(",")] + words = [a.strip() for a in line.split(",")] words[0] = words[0].upper() - if words[0] in ["J2","J3","J4","J5","M2","M3","M4","M5"]: #multi-axis jogs and moves - if words[0][0] == 'J': #jog move + if words[0] in ["J2", "J3", "J4", "J5", "M2", "M3", "M4", "M5"]: # multi-axis jogs and moves + if words[0][0] == 'J': # jog move s = "G0 " - else: #feed move + else: # feed move s = "G1 " speed = lastfeedspeed["XY"] - for i in range (1, len(words)): - if words [i] == '': - if last[AXIS[i-1]] == None: + for i in range(1, len(words)): + if words[i] == '': + if last[AXIS[i - 1]] is None: continue else: - s += AXIS[i-1] + last[AXIS[i-1]] + s += AXIS[i - 1] + last[AXIS[i - 1]] else: - s += AXIS[i-1] + words[i] - last[AXIS[i-1]] = words[i] - output += s +" F" + speed + '\n' + s += AXIS[i - 1] + words[i] + last[AXIS[i - 1]] = words[i] + output += s + " F" + speed + '\n' - if words[0] in ["JA","JB","JX","JY","JZ","MA","MB","MX","MY","MZ"]: #single axis jogs and moves - if words[0][0] == 'J': #jog move + if words[0] in ["JA", "JB", "JX", "JY", "JZ", "MA", "MB", "MX", "MY", "MZ"]: # single axis jogs and moves + if words[0][0] == 'J': # jog move s = "G0 " - if words[0][1] in ['X','Y']: + if words[0][1] in ['X', 'Y']: speed = lastrapidspeed["XY"] else: speed = lastrapidspeed[words[0][1]] - else: #feed move + else: # feed move s = "G1 " - if words[0][1] in ['X','Y']: + if words[0][1] in ['X', 'Y']: speed = lastfeedspeed["XY"] else: speed = lastfeedspeed[words[0][1]] - last[words[0][1]] = words[1] output += s for key, val in PathUtil.keyValueIter(last): if val is not None: output += key + str(val) + " F" + speed + "\n" - if words[0] in ["JS"]: #set jog speed - for i in range (1, len(words)): - if words [i] == '': + if words[0] in ["JS"]: # set jog speed + for i in range(1, len(words)): + if words[i] == '': continue else: - lastrapidspeed[SPEEDS[i-1]] = words[i] + lastrapidspeed[SPEEDS[i - 1]] = words[i] - if words[0] in ["MD"]: #move distance with distance and angle. - #unsupported at this time + if words[0] in ["MD"]: # move distance with distance and angle. + # unsupported at this time continue - if words[0] in ["MH"]: #move home - #unsupported at this time + if words[0] in ["MH"]: # move home + # unsupported at this time continue - if words[0] in ["MS"]: #set move speed - for i in range (1, len(words)): - if words [i] == '': + if words[0] in ["MS"]: # set move speed + for i in range(1, len(words)): + if words[i] == '': continue else: - lastfeedspeed[SPEEDS[i-1]] = words[i] - if words[0] in ["MO"]: #motors off - #unsupported at this time + lastfeedspeed[SPEEDS[i - 1]] = words[i] + if words[0] in ["MO"]: # motors off + # unsupported at this time continue - if words[0] in ["TR"]: #Setting spindle speed - if float(words[1]) < 0: + if words[0] in ["TR"]: # Setting spindle speed + if float(words[1]) < 0: s = "M4 S" else: s = "M3 S" s += str(abs(float(words[1]))) output += s + '\n' - if words[0] in ["CG"]: #Gcode circle/arc - if words[1] != "": # diameter mode + if words[0] in ["CG"]: # Gcode circle/arc + if words[1] != "": # diameter mode print("diameter mode not supported") continue else: - if words[7] == "1": #CW + if words[7] == "1": # CW s = "G2" - else: #CCW + else: # CCW s = "G3" - s += " X" + words[2] + " Y" + words[3] + " I" + words[4] + " J" + words[5] + " F" + str(lastfeedspeed["XY"]) - output += s + '\n' + output += s + '\n' last["X"] = words[2] last["Y"] = words[3] - #Make sure all appended paths have at least one move command. - if any (x in output for x in movecommand): + # Make sure all appended paths have at least one move command. + if any(x in output for x in movecommand): return_output.append(output) print("done preprocessing.") return return_output -print(__name__ + " gcode preprocessor loaded.") +print(__name__ + " gcode preprocessor loaded.") diff --git a/src/Mod/Path/PathScripts/post/smoothie_post.py b/src/Mod/Path/PathScripts/post/smoothie_post.py index 6929f1ba39..121dc4cdea 100644 --- a/src/Mod/Path/PathScripts/post/smoothie_post.py +++ b/src/Mod/Path/PathScripts/post/smoothie_post.py @@ -22,7 +22,14 @@ # ***************************************************************************/ from __future__ import print_function -TOOLTIP=''' +import argparse +import datetime +from PathScripts import PostUtils +import FreeCAD +from FreeCAD import Units +import shlex + +TOOLTIP = ''' This is a postprocessor file for the Path workbench. It is used to take a pseudo-gcode fragment outputted by a Path object, and output real GCode suitable for a smoothieboard. This postprocessor, once placed @@ -33,13 +40,6 @@ import smoothie_post smoothie_post.export(object,"/path/to/file.ncc","") ''' -import argparse -import datetime -from PathScripts import PostUtils -import FreeCAD -from FreeCAD import Units -import shlex - now = datetime.datetime.now() parser = argparse.ArgumentParser(prog='linuxcnc', add_help=False) @@ -58,7 +58,7 @@ parser.add_argument('--IP_ADDR', help='IP Address for machine target machine') parser.add_argument('--verbose', action='store_true', help='verbose output for debugging, default="False"') parser.add_argument('--inches', action='store_true', help='Convert output for US imperial mode (G20)') -TOOLTIP_ARGS=parser.format_help() +TOOLTIP_ARGS = parser.format_help() # These globals set common customization preferences OUTPUT_COMMENTS = True @@ -108,9 +108,10 @@ TOOL_CHANGE = '''''' # to distinguish python built-in open function from the one declared below -if open.__module__ in ['__builtin__','io']: +if open.__module__ in ['__builtin__', 'io']: pythonopen = open + def processArguments(argstring): global OUTPUT_HEADER global OUTPUT_COMMENTS @@ -125,7 +126,6 @@ def processArguments(argstring): global UNIT_SPEED_FORMAT global UNIT_FORMAT - try: args = parser.parse_args(shlex.split(argstring)) @@ -159,11 +159,12 @@ def processArguments(argstring): IP_ADDR = args.IP_ADDR VERBOSE = args.verbose - except: + except Exception: return False return True + def export(objectslist, filename, argstring): processArguments(argstring) global UNITS @@ -181,13 +182,13 @@ def export(objectslist, filename, argstring): # sure we're using the current values in the Machine Def. myMachine = None for pathobj in objectslist: - if hasattr(pathobj,"MachineName"): + if hasattr(pathobj, "MachineName"): myMachine = pathobj.MachineName if hasattr(pathobj, "MachineUnits"): if pathobj.MachineUnits == "Metric": - UNITS = "G21" + UNITS = "G21" else: - UNITS = "G20" + UNITS = "G20" if myMachine is None: FreeCAD.Console.PrintWarning("No machine found in this selection\n") @@ -258,68 +259,71 @@ def sendToSmoothie(IP_ADDR, GCODE, fname): global VERBOSE fname = os.path.basename(fname) - FreeCAD.Console.PrintMessage ('sending to smoothie: {}\n'.format(fname)) + FreeCAD.Console.PrintMessage('sending to smoothie: {}\n'.format(fname)) f = GCODE.rstrip() - filesize= len(f) + filesize = len(f) # make connection to sftp server - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(4.0) s.connect((IP_ADDR, 115)) - tn= s.makefile(mode='rw') + tn = s.makefile(mode='rw') # read startup prompt - ln= tn.readline() - if not ln.startswith("+") : + ln = tn.readline() + if not ln.startswith("+"): FreeCAD.Console.PrintMessage("Failed to connect with sftp: {}\n".format(ln)) - sys.exit(); + sys.exit() - if VERBOSE: print("RSP: " + ln.strip()) + if VERBOSE: + print("RSP: " + ln.strip()) # Issue initial store command tn.write("STOR OLD /sd/" + fname + "\n") tn.flush() - ln= tn.readline() - if not ln.startswith("+") : + ln = tn.readline() + if not ln.startswith("+"): FreeCAD.Console.PrintError("Failed to create file: {}\n".format(ln)) - sys.exit(); + sys.exit() - if VERBOSE: print("RSP: " + ln.strip()) + if VERBOSE: + print("RSP: " + ln.strip()) # send size of file tn.write("SIZE " + str(filesize) + "\n") tn.flush() - ln= tn.readline() - if not ln.startswith("+") : + ln = tn.readline() + if not ln.startswith("+"): FreeCAD.Console.PrintError("Failed: {}\n".format(ln)) - sys.exit(); + sys.exit() - if VERBOSE: print("RSP: " + ln.strip()) + if VERBOSE: + print("RSP: " + ln.strip()) - cnt= 0 + cnt = 0 # now send file for line in f.splitlines(1): tn.write(line) - if VERBOSE : + if VERBOSE: cnt += len(line) print("SND: " + line.strip()) print(str(cnt) + "/" + str(filesize) + "\r", end='') tn.flush() - ln= tn.readline() - if not ln.startswith("+") : + ln = tn.readline() + if not ln.startswith("+"): FreeCAD.Console.PrintError("Failed to save file: {}\n".format(ln)) - sys.exit(); + sys.exit() - if VERBOSE: print("RSP: " + ln.strip()) + if VERBOSE: + print("RSP: " + ln.strip()) # exit tn.write("DONE\n") tn.flush() - ln= tn.readline() tn.close() FreeCAD.Console.PrintMessage("Upload complete\n") @@ -332,12 +336,13 @@ def linenumber(): return "N" + str(LINENR) + " " return "" + def parse(pathobj): global PRECISION out = "" lastcommand = None global SPINDLE_SPEED - precision_string = '.' + str(PRECISION) +'f' + precision_string = '.' + str(PRECISION) + 'f' # params = ['X','Y','Z','A','B','I','J','K','F','S'] #This list control # the order of parameters @@ -373,10 +378,10 @@ def parse(pathobj): for param in params: if param in c.Parameters: if param == 'F': - if c.Name not in ["G0", "G00"]: #linuxcnc doesn't use rapid speeds + if c.Name not in ["G0", "G00"]: # linuxcnc doesn't use rapid speeds speed = Units.Quantity(c.Parameters['F'], FreeCAD.Units.Velocity) outstring.append( - param + format(float(speed.getValueAs(UNIT_SPEED_FORMAT)), precision_string ) ) + param + format(float(speed.getValueAs(UNIT_SPEED_FORMAT)), precision_string)) elif param == 'T': outstring.append(param + str(c.Parameters['T'])) elif param == 'S': @@ -385,8 +390,7 @@ def parse(pathobj): else: pos = Units.Quantity(c.Parameters[param], FreeCAD.Units.Length) outstring.append( - param + format(float(pos.getValueAs(UNIT_FORMAT)), precision_string) ) - #param + format(c.Parameters[param], precision_string)) + param + format(float(pos.getValueAs(UNIT_FORMAT)), precision_string)) if command in ['G1', 'G01', 'G2', 'G02', 'G3', 'G03']: outstring.append('S' + str(SPINDLE_SPEED)) @@ -413,7 +417,7 @@ def parse(pathobj): # append the line to the final output for w in outstring: - out += w + COMMAND_SPACE + out += w + COMMAND_SPACE out = out.strip() + "\n" return out