#!/usr/bin/env python3 # usage gce mirror --axis x translate --y -200 file.gcode # usage gce arg_mirror_axis = 'y' arg_translation=[200, 0, 0] arg_file_path='file.gcode' from os import remove, rename from re import sub, findall, match, IGNORECASE # import click # modify_instructions = 'G0, G1, G2, G3, G90, G91, S, F, M3, M4'.split(', ') modify_instructions = '(G(0|1|2|3|90|91)|S|F|M(3|4))' temp_file_path = '.file.gcode.tmp' out_file_path = 'file_modified.gcode' # @click.command() # @click.option('--axis', default='x', help='mirror axis') # @click.argument('mirror') def mirror(instruction, axis='Y'): return instruction.replace(axis, f'{axis}-') def translate(instruction, translation=[0, 0, 0]): pattern = 'X[-0-9.]+' x = findall(pattern, instruction, IGNORECASE) if not x: return instruction try: x = float(x[0][1:]) except ValueError: return instruction x = round(x + translation[0], 3) return sub(pattern, f'X{x}', instruction, IGNORECASE) with open(arg_file_path, 'r') as gcode: try: remove(temp_file_path) except IOError: pass with open(temp_file_path, 'w') as tmp_gcode: instructions = gcode.readlines() instructions_length = len(instructions) instructions_count = 0 for instruction in instructions: instructions_count += 1 print(f'\rparsing instruction {instructions_count}/{instructions_length})', end='') instruction = instruction.strip() if match(modify_instructions, instruction, IGNORECASE): # if any(map(instruction.__contains__, modify_instructions)): # import pudb; pudb.set_trace() instruction = mirror(instruction, axis=arg_mirror_axis) instruction = translate(instruction, translation=arg_translation) tmp_gcode.write(f'{instruction}\n') rename(temp_file_path, out_file_path)