diff --git a/src/Mod/Path/PathScripts/post/centroid_post.py b/src/Mod/Path/PathScripts/post/centroid_post.py index 3dc4ebb5cf..d19f6831d8 100644 --- a/src/Mod/Path/PathScripts/post/centroid_post.py +++ b/src/Mod/Path/PathScripts/post/centroid_post.py @@ -116,6 +116,7 @@ if open.__module__ in ['__builtin__', 'io']: def processArguments(argstring): + # pylint: disable=global-statement global OUTPUT_HEADER global OUTPUT_COMMENTS global OUTPUT_LINE_NUMBERS @@ -147,6 +148,7 @@ def processArguments(argstring): def export(objectslist, filename, argstring): + # pylint: disable=global-statement processArguments(argstring) for i in objectslist: print(i.Name) @@ -221,6 +223,7 @@ def export(objectslist, filename, argstring): def linenumber(): + # pylint: disable=global-statement global LINENR if OUTPUT_LINE_NUMBERS is True: LINENR += 10 @@ -229,8 +232,6 @@ def linenumber(): def parse(pathobj): - global AXIS_PRECISION - global FEED_PRECISION out = "" lastcommand = None axis_precision_string = '.' + str(AXIS_PRECISION) + 'f' diff --git a/src/Mod/Path/PathScripts/post/comparams_post.py b/src/Mod/Path/PathScripts/post/comparams_post.py index e7644bd96b..672120a22d 100644 --- a/src/Mod/Path/PathScripts/post/comparams_post.py +++ b/src/Mod/Path/PathScripts/post/comparams_post.py @@ -23,7 +23,6 @@ # *************************************************************************** import FreeCAD import Path -import PathScripts import PathScripts.PostUtils as PostUtils TOOLTIP = ''' Example Post, using Path.Commands instead of Path.toGCode strings for Path gcode output. ''' @@ -81,6 +80,7 @@ def lineout(command, oldvals, modal): def export(obj, filename, argstring): + # pylint: disable=unused-argument modal = True gcode = '' safetyblock1 = 'G90G40G49\n' diff --git a/src/Mod/Path/PathScripts/post/dumper_post.py b/src/Mod/Path/PathScripts/post/dumper_post.py index a460f8f565..5683e2c47d 100644 --- a/src/Mod/Path/PathScripts/post/dumper_post.py +++ b/src/Mod/Path/PathScripts/post/dumper_post.py @@ -40,6 +40,9 @@ if open.__module__ in ['__builtin__','io']: def export(objectslist, filename,argstring): + "called when freecad exports a list of objects" + # pylint: disable=unused-argument + output = '''(This output produced with the dump post processor) (Dump is useful for inspecting the raw commands in your paths) (but is not useful for driving machines.) @@ -48,7 +51,6 @@ def export(objectslist, filename,argstring): ''' - "called when freecad exports a list of objects" for obj in objectslist: if not hasattr(obj, "Path"): diff --git a/src/Mod/Path/PathScripts/post/dynapath_post.py b/src/Mod/Path/PathScripts/post/dynapath_post.py index 1ce1deb768..8e27bf6371 100644 --- a/src/Mod/Path/PathScripts/post/dynapath_post.py +++ b/src/Mod/Path/PathScripts/post/dynapath_post.py @@ -111,7 +111,8 @@ if open.__module__ in ['__builtin__','io']: def export(objectslist,filename,argstring): - global UNITS + # pylint: disable=unused-argument + global UNITS # pylint: disable=global-statement for obj in objectslist: if not hasattr(obj,"Path"): print("the object " + obj.Name + " is not a path. Please select only path and Compounds.") @@ -128,9 +129,9 @@ def export(objectslist,filename,argstring): myMachine = pathobj.MachineName if hasattr(pathobj, "MachineUnits"): if pathobj.MachineUnits == "Metric": - UNITS = "G21" + UNITS = "G21" else: - UNITS = "G20" + UNITS = "G20" if myMachine is None: print("No machine found in this selection") @@ -185,7 +186,7 @@ def export(objectslist,filename,argstring): def linenumber(): - global LINENR + global LINENR # pylint: disable=global-statement if OUTPUT_LINE_NUMBERS == True: LINENR += 1 return "N" + str(LINENR) + " " diff --git a/src/Mod/Path/PathScripts/post/example_post.py b/src/Mod/Path/PathScripts/post/example_post.py index 4807b56e68..cc02939fa2 100644 --- a/src/Mod/Path/PathScripts/post/example_post.py +++ b/src/Mod/Path/PathScripts/post/example_post.py @@ -41,6 +41,7 @@ if open.__module__ in ['__builtin__','io']: def export(objectslist, filename,argstring): "called when freecad exports a list of objects" + # pylint: disable=unused-argument if len(objectslist) > 1: print("This script is unable to write more than one Path object") return diff --git a/src/Mod/Path/PathScripts/post/example_pre.py b/src/Mod/Path/PathScripts/post/example_pre.py index 42197b7a8b..5928c30301 100644 --- a/src/Mod/Path/PathScripts/post/example_pre.py +++ b/src/Mod/Path/PathScripts/post/example_pre.py @@ -50,8 +50,8 @@ if open.__module__ in ['__builtin__', 'io']: def open(filename): - PathLog.track(filename) "called when freecad opens a file." + PathLog.track(filename) docname = os.path.splitext(os.path.basename(filename))[0] doc = FreeCAD.newDocument(docname) insert(filename, doc.Name) diff --git a/src/Mod/Path/PathScripts/post/fablin_post.py b/src/Mod/Path/PathScripts/post/fablin_post.py index f2dccb795b..ddd6c8b557 100644 --- a/src/Mod/Path/PathScripts/post/fablin_post.py +++ b/src/Mod/Path/PathScripts/post/fablin_post.py @@ -94,6 +94,7 @@ if open.__module__ in ['__builtin__', 'io']: def processArguments(argstring): + # pylint: disable=global-statement global OUTPUT_HEADER global OUTPUT_COMMENTS global OUTPUT_LINE_NUMBERS @@ -124,6 +125,7 @@ def processArguments(argstring): def export(objectslist, filename, argstring): + # pylint: disable=global-statement processArguments(argstring) global UNITS for obj in objectslist: @@ -205,6 +207,7 @@ def export(objectslist, filename, argstring): def linenumber(): + # pylint: disable=global-statement global LINENR if OUTPUT_LINE_NUMBERS is True: LINENR += 10 diff --git a/src/Mod/Path/PathScripts/post/jtech_post.py b/src/Mod/Path/PathScripts/post/jtech_post.py index 29801abfeb..8628ad02e0 100644 --- a/src/Mod/Path/PathScripts/post/jtech_post.py +++ b/src/Mod/Path/PathScripts/post/jtech_post.py @@ -110,6 +110,7 @@ if open.__module__ == '__builtin__': def processArguments(argstring): + # pylint: disable=global-statement global OUTPUT_HEADER global OUTPUT_COMMENTS global OUTPUT_LINE_NUMBERS @@ -151,7 +152,7 @@ def processArguments(argstring): OUTPUT_DOUBLES = False POWER_ON_DELAY = float(args.power_on_delay) / 1000 # milliseconds - except Exception: + except Exception: # pylint: disable=broad-except return False return True @@ -160,9 +161,6 @@ def processArguments(argstring): def export(objectslist, filename, argstring): if not processArguments(argstring): return None - global UNITS - global UNIT_FORMAT - global UNIT_SPEED_FORMAT for obj in objectslist: if not hasattr(obj, "Path"): @@ -229,7 +227,7 @@ def export(objectslist, filename, argstring): def linenumber(): - global LINENR + global LINENR # pylint: disable=global-statement if OUTPUT_LINE_NUMBERS is True: LINENR += 10 return "N" + str(LINENR) + " " @@ -237,15 +235,6 @@ def linenumber(): def parse(pathobj): - global PRECISION - global MODAL - global OUTPUT_DOUBLES - global UNIT_FORMAT - global UNIT_SPEED_FORMAT - global POWER_ON_DELAY - global PRE_FEED - global POST_FEED - out = "" lastcommand = None precision_string = '.' + str(PRECISION) + 'f' diff --git a/src/Mod/Path/PathScripts/post/linuxcnc_post.py b/src/Mod/Path/PathScripts/post/linuxcnc_post.py index 244902111c..01007e04ce 100644 --- a/src/Mod/Path/PathScripts/post/linuxcnc_post.py +++ b/src/Mod/Path/PathScripts/post/linuxcnc_post.py @@ -102,6 +102,7 @@ if open.__module__ in ['__builtin__','io']: def processArguments(argstring): + # pylint: disable=global-statement global OUTPUT_HEADER global OUTPUT_COMMENTS global OUTPUT_LINE_NUMBERS @@ -142,13 +143,14 @@ def processArguments(argstring): print ('here') OUTPUT_DOUBLES = False - except Exception: + except Exception: # pylint: disable=broad-except return False return True def export(objectslist, filename, argstring): + # pylint: disable=global-statement if not processArguments(argstring): return None global UNITS @@ -239,6 +241,7 @@ def export(objectslist, filename, argstring): def linenumber(): + # pylint: disable=global-statement global LINENR if OUTPUT_LINE_NUMBERS is True: LINENR += 10 @@ -247,6 +250,7 @@ def linenumber(): def parse(pathobj): + # pylint: disable=global-statement global PRECISION global MODAL global OUTPUT_DOUBLES diff --git a/src/Mod/Path/PathScripts/post/opensbp_post.py b/src/Mod/Path/PathScripts/post/opensbp_post.py index 433370fb0f..274a5fd0ff 100644 --- a/src/Mod/Path/PathScripts/post/opensbp_post.py +++ b/src/Mod/Path/PathScripts/post/opensbp_post.py @@ -98,6 +98,7 @@ GetValue = getMetricValue def export(objectslist, filename, argstring): + # pylint: disable=global-statement global OUTPUT_COMMENTS global OUTPUT_HEADER global SHOW_EDITOR @@ -182,8 +183,6 @@ def export(objectslist, filename, argstring): def move(command): - global CurrentState - txt = "" # if 'F' in command.Parameters: @@ -298,7 +297,7 @@ def tool_change(command): def comment(command): - print("a comment") + print("a comment", command) return @@ -333,8 +332,6 @@ scommands = { def parse(pathobj): - global CurrentState - output = "" # Above list controls the order of parameters diff --git a/src/Mod/Path/PathScripts/post/opensbp_pre.py b/src/Mod/Path/PathScripts/post/opensbp_pre.py index 615e804ca4..eb8286eaf3 100644 --- a/src/Mod/Path/PathScripts/post/opensbp_pre.py +++ b/src/Mod/Path/PathScripts/post/opensbp_pre.py @@ -68,9 +68,9 @@ def open(filename): 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" + '''called when freecad imports a file + This insert expects parse to return a list of strings + each string will become a separate path''' gfile = pythonopen(filename) gcode = gfile.read() gfile.close() diff --git a/src/Mod/Path/PathScripts/post/philips_post.py b/src/Mod/Path/PathScripts/post/philips_post.py index 60c589c31e..0a65625d5b 100644 --- a/src/Mod/Path/PathScripts/post/philips_post.py +++ b/src/Mod/Path/PathScripts/post/philips_post.py @@ -27,7 +27,6 @@ # reload(generic_post) import FreeCAD -from FreeCAD import Units import argparse import time from PathScripts import PostUtils @@ -220,31 +219,19 @@ parser.add_argument('--no-show-editor', action='store_true', help='don\'t pop up TOOLTIP_ARGS = parser.format_help() def processArguments(argstring): - global OUTPUT_HEADER - global OUTPUT_COMMENTS - global OUTPUT_LINE_NUMBERS + # pylint: disable=global-statement + global LINENUMBERS global SHOW_EDITOR - global PRECISION for arg in argstring.split(): - if arg == '--header': - OUTPUT_HEADER = True - elif arg == '--no-header': - OUTPUT_HEADER = False - elif arg == '--comments': - OUTPUT_COMMENTS = True - elif arg == '--no-comments': - OUTPUT_COMMENTS = False - elif arg == '--line-numbers': - OUTPUT_LINE_NUMBERS = True + if arg == '--line-numbers': + LINENUMBERS = True elif arg == '--no-line-numbers': - OUTPUT_LINE_NUMBERS = False + LINENUMBERS = False elif arg == '--show-editor': SHOW_EDITOR = True elif arg == '--no-show-editor': SHOW_EDITOR = False - elif arg.split('=')[0] == '--output-precision': - PRECISION = arg.split('=')[1] def mkHeader(selection): job = PathUtils.findParentJob(selection[0]) @@ -324,7 +311,7 @@ def mapGCode(command): def linenumberify(GCodeString): # add a linenumber at every beginning of line - global linenr + global linenr # pylint: disable=global-statement if not LINENUMBERS: result = GCodeString + "\n" else: @@ -342,11 +329,9 @@ def linenumberify(GCodeString): return result def export(objectslist, filename, argstring): + # pylint: disable=unused-argument,global-statement global UNITS global linenr - global ABSOLUTE_CIRCLE_CENTER - global USE_RADIUS_IF_POSSIBLE - global RADIUS_COMMENT linenr = STARTLINENR lastX = 0 @@ -474,7 +459,7 @@ def export(objectslist, filename, argstring): # absolute center outstring.append( '(' + param + PostUtils.fmt(c.Parameters[param], AXIS_DECIMALS, UNITS) + ')') - z = c.Parameters['Z'] + z = c.Parameters['Z'] # pylint: disable=unused-variable k = c.Parameters['K'] if USE_RADIUS_IF_POSSIBLE and angleUnder180(command, lastX, lastY, c.Parameters['X'], c.Parameters['Y'], i, j): # R is handled with the I parameter, here: diff --git a/src/Mod/Path/PathScripts/post/rml_post.py b/src/Mod/Path/PathScripts/post/rml_post.py index 5400fcae12..202d28475e 100644 --- a/src/Mod/Path/PathScripts/post/rml_post.py +++ b/src/Mod/Path/PathScripts/post/rml_post.py @@ -46,6 +46,7 @@ if open.__module__ in ['__builtin__','io']: # Entrypoint used by FreeCAD def export(objectslist, filename, argstring): "Export objects as Roland Modela code." + # pylint: disable=unused-argument code = "" for obj in objectslist: @@ -68,8 +69,8 @@ def home(): return [ "H;" ] def setjog(): - # "!PZ%d,%d;",iz_down,iz_up); // set z down, jog - return "" + # "!PZ%d,%d;",iz_down,iz_up); // set z down, jog + return "" def addheader(): return [ "PA;PA;" ] # absolute positioning @@ -80,8 +81,10 @@ def mm2cord(mm): mm = float(mm) return int(40.0*mm) -def feed(x=None, y=None, z=None, state={}): +def feed(x=None, y=None, z=None, state=None): c = [] + if state is None: + state = {} if x is not None: x = float(x) @@ -100,21 +103,22 @@ def feed(x=None, y=None, z=None, state={}): # 2d in XY plane c.append("PD%d,%d;" % (mm2cord(x), mm2cord(y))) elif z is not None: - pass # XXX: is this used? + pass return c -def jog(x=None, y=None, z=None, state={}): +def jog(x=None, y=None, z=None, state=None): c = [] + if state is None: + state = {} if x is not None and y is not None: - x, y = float(x), float(y) - c.append("PU%d,%d;" % (mm2cord(x), mm2cord(y))) - state['X'] = x - state['Y'] = y + x, y = float(x), float(y) + c.append("PU%d,%d;" % (mm2cord(x), mm2cord(y))) + state['X'] = x + state['Y'] = y if z is not None: - z = float(z) - c.append("PU;") - # TODO: use !ZZ command - state['Z'] = z + z = float(z) + c.append("PU;") + state['Z'] = z return c @@ -132,16 +136,18 @@ def xyarc(args, state): p0 = circle.parameter(lastPoint) p1 = circle.parameter(newPoint) arc = Part.ArcOfCircle(circle, p0, p1) - steps = 64 # TODO: specify max error instead + steps = 64 # specify max error instead? points = arc.discretize(steps) - # TODO: consider direction + # consider direction? #print('p = Part.ArcOfCircle(Part.Circle(FreeCAD.Vector(%f, %f), FreeCAD.Vector(0, 0, 1), %f), %f, %f)' % (center.x, center.y, radius, p0, p1)) for p in points: c += feed(p.x, p.y, state['Z'], state) return c -def speed(xy=None, z=None, state={}): +def speed(xy=None, z=None, state=None): c = [] + if state is None: + state = {} print(xy, z, state) if xy is not None: xy = float(xy) @@ -223,7 +229,7 @@ def parse(inputstring): output += speed(2.0, 1.0, state) # defaults - # TODO: respect clearance height + # respect clearance height? # treat the input line by line lines = inputstring.split("\n") diff --git a/src/Mod/Path/PathScripts/post/smoothie_post.py b/src/Mod/Path/PathScripts/post/smoothie_post.py index 121dc4cdea..a8803be99b 100644 --- a/src/Mod/Path/PathScripts/post/smoothie_post.py +++ b/src/Mod/Path/PathScripts/post/smoothie_post.py @@ -106,6 +106,8 @@ POST_OPERATION = '''''' # Tool Change commands will be inserted before a tool change TOOL_CHANGE = '''''' +# Number of digits after the decimal point +PRECISION = 5 # to distinguish python built-in open function from the one declared below if open.__module__ in ['__builtin__', 'io']: @@ -113,6 +115,7 @@ if open.__module__ in ['__builtin__', 'io']: def processArguments(argstring): + # pylint: disable=global-statement global OUTPUT_HEADER global OUTPUT_COMMENTS global OUTPUT_LINE_NUMBERS @@ -159,7 +162,7 @@ def processArguments(argstring): IP_ADDR = args.IP_ADDR VERBOSE = args.verbose - except Exception: + except Exception: # pylint: disable=broad-except return False return True @@ -167,8 +170,7 @@ def processArguments(argstring): def export(objectslist, filename, argstring): processArguments(argstring) - global UNITS - global IP_ADDR + global UNITS # pylint: disable=global-statement for obj in objectslist: if not hasattr(obj, "Path"): FreeCAD.Console.PrintError("the object " + obj.Name + " is not a path. Please select only path and Compounds.\n") @@ -252,11 +254,10 @@ def export(objectslist, filename, argstring): return final -def sendToSmoothie(IP_ADDR, GCODE, fname): +def sendToSmoothie(ip, GCODE, fname): import sys import socket import os - global VERBOSE fname = os.path.basename(fname) FreeCAD.Console.PrintMessage('sending to smoothie: {}\n'.format(fname)) @@ -266,7 +267,7 @@ def sendToSmoothie(IP_ADDR, GCODE, fname): # make connection to sftp server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(4.0) - s.connect((IP_ADDR, 115)) + s.connect((ip, 115)) tn = s.makefile(mode='rw') # read startup prompt @@ -330,7 +331,7 @@ def sendToSmoothie(IP_ADDR, GCODE, fname): def linenumber(): - global LINENR + global LINENR # pylint: disable=global-statement if OUTPUT_LINE_NUMBERS is True: LINENR += 10 return "N" + str(LINENR) + " " @@ -338,10 +339,10 @@ def linenumber(): def parse(pathobj): - global PRECISION + global SPINDLE_SPEED # pylint: disable=global-statement + out = "" lastcommand = None - global SPINDLE_SPEED precision_string = '.' + str(PRECISION) + 'f' # params = ['X','Y','Z','A','B','I','J','K','F','S'] #This list control diff --git a/src/Mod/Path/utils/path-lint.sh b/src/Mod/Path/utils/path-lint.sh index 6d06c0f280..8b04133cbd 100755 --- a/src/Mod/Path/utils/path-lint.sh +++ b/src/Mod/Path/utils/path-lint.sh @@ -62,15 +62,17 @@ EXTERNAL_MODULES+=' importlib' EXTERNAL_MODULES+=' ocl' EXTERNAL_MODULES+=' pivy' -IGNORE_MODULES+=' post' +IGNORE_MODULES+=' grbl_post.py' IGNORE_MODULES+=' PathSimulatorGui.py' IGNORE_MODULES+=' PathSurface.py' #ARGS+=" --errors-only" ARGS+=" --disable=C,R" ARGS+=" --ignored-modules=$(echo ${EXTERNAL_MODULES} | tr ' ' ',')" -ARGS+=" --ignore=$(echo ${IGNORE_MODULES} | tr ' ' ',')" -ARGS+=" --jobs=4" +if [ -n "${IGNORE_MODULES}" ]; then + ARGS+=" --ignore=$(echo ${IGNORE_MODULES} | tr ' ' ',')" +fi +ARGS+=" --jobs=0" if [ -z "$(which pylint3)" ]; then echo "Cannot find pylint, please install and try again!"