tool for shifting GCode
This commit is contained in:
parent
8d6ddd09d9
commit
e4b7b7d00a
1 changed files with 69 additions and 0 deletions
69
gcode-tools/gcode-shifter/gcode_shift.py
Executable file
69
gcode-tools/gcode-shifter/gcode_shift.py
Executable file
|
@ -0,0 +1,69 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from decimal import Decimal as d
|
||||||
|
|
||||||
|
|
||||||
|
class GCodePosition(object):
|
||||||
|
|
||||||
|
def __init__(self, lower, upper, shift):
|
||||||
|
self.pos = [d(0), d(0), d(0)]
|
||||||
|
self.lower = lower
|
||||||
|
self.upper = upper
|
||||||
|
self.shift = shift
|
||||||
|
|
||||||
|
def is_inside(self):
|
||||||
|
for i in range(len(self.pos)):
|
||||||
|
if not ((self.lower[i] is None or (self.lower[i] <= self.pos[i])) and \
|
||||||
|
(self.upper[i] is None or (self.upper[i] >= self.pos[i]))):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def get_shifted_line(self, line):
|
||||||
|
""" parse the line, update current position replace shifted values
|
||||||
|
"""
|
||||||
|
axis_pattern = r"\b([XYZ][\+\-0-9\.]+)\b"
|
||||||
|
result = []
|
||||||
|
# first: update the x/y/z position (make sure that we are in the box)
|
||||||
|
for token in re.findall(axis_pattern, line, flags=re.I):
|
||||||
|
for i, axis in enumerate("XYZ"):
|
||||||
|
if token.upper().startswith(axis):
|
||||||
|
self.pos[i] = d(token[1:])
|
||||||
|
# second: replace values
|
||||||
|
if self.is_inside():
|
||||||
|
def replace_value(match):
|
||||||
|
token = match.group(0).upper()
|
||||||
|
for i, axis in enumerate("XYZ"):
|
||||||
|
if token.startswith(axis):
|
||||||
|
value = d(token[1:])
|
||||||
|
return token[0] + str(value + self.shift[i])
|
||||||
|
return token
|
||||||
|
return re.sub(axis_pattern, replace_value, line, re.I)
|
||||||
|
else:
|
||||||
|
return line
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
parser = argparse.ArgumentParser(description="Shift parts of gcode")
|
||||||
|
parser.add_argument('--minx', dest="minx", type=d)
|
||||||
|
parser.add_argument('--maxx', dest="maxx", type=d)
|
||||||
|
parser.add_argument('--miny', dest="miny", type=d)
|
||||||
|
parser.add_argument('--maxy', dest="maxy", type=d)
|
||||||
|
parser.add_argument('--minz', dest="minz", type=d)
|
||||||
|
parser.add_argument('--maxz', dest="maxz", type=d)
|
||||||
|
parser.add_argument('--shiftx', dest="shiftx", type=d, default=d(0))
|
||||||
|
parser.add_argument('--shifty', dest="shifty", type=d, default=d(0))
|
||||||
|
parser.add_argument('--shiftz', dest="shiftz", type=d, default=d(0))
|
||||||
|
infile = sys.stdin
|
||||||
|
outfile = sys.stdout
|
||||||
|
options = parser.parse_args()
|
||||||
|
shifter = GCodePosition((options.minx, options.miny, options.minz),
|
||||||
|
(options.maxx, options.maxy, options.maxz),
|
||||||
|
(options.shiftx, options.shifty, options.shiftz))
|
||||||
|
for line in infile.readlines():
|
||||||
|
outfile.write(shifter.get_shifted_line(line))
|
||||||
|
|
Loading…
Reference in a new issue