Skip to content

Commit

Permalink
Path: post processor cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
brad committed Jun 10, 2019
1 parent 795442a commit 6ccb0cf
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 119 deletions.
14 changes: 4 additions & 10 deletions src/Mod/Path/PathScripts/post/jtech_post.py
Expand Up @@ -28,7 +28,6 @@
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
Expand All @@ -54,7 +53,6 @@
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')


Expand Down Expand Up @@ -104,7 +102,6 @@
# 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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand All @@ -349,4 +342,5 @@ def parse(pathobj):

return out


print(__name__ + " gcode postprocessor loaded.")
2 changes: 1 addition & 1 deletion src/Mod/Path/PathScripts/post/linuxcnc_post.py
Expand Up @@ -142,7 +142,7 @@ def processArguments(argstring):
print ('here')
OUTPUT_DOUBLES = False

except:
except Exception:
return False

return True
Expand Down
14 changes: 8 additions & 6 deletions src/Mod/Path/PathScripts/post/opensbp_post.py
Expand Up @@ -26,7 +26,7 @@
# ***************************************************************************/


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
Expand All @@ -50,7 +50,7 @@
'''

TOOLTIP_ARGS='''
TOOLTIP_ARGS = '''
Arguments for opensbp:
--comments ... insert comments - mostly for debugging
--inches ... convert output to inches
Expand Down Expand Up @@ -80,16 +80,20 @@
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


Expand All @@ -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
Expand Down Expand Up @@ -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.
Expand All @@ -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

Expand Down
115 changes: 57 additions & 58 deletions src/Mod/Path/PathScripts/post/opensbp_pre.py
Expand Up @@ -49,24 +49,25 @@
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


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"
Expand All @@ -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

Expand All @@ -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.")

0 comments on commit 6ccb0cf

Please sign in to comment.