Files
wallter/plotter-app/Gcode_generator.py

79 lines
2.4 KiB
Python

from enum import Enum
class Machine(Enum):
LASER = 1
THREEAXIS = 2
class Gcode:
def __init__(self, file, mm_per_px, speed, machine, max_s=0, safe_z=0, work_z=0):
self.file = file
self.mm_per_px = mm_per_px
self.speed = speed
self.machine = machine
self.max_s = max_s
self.safe_z = safe_z
self.work_z = work_z
self.output = None
self.init_file()
def init_file(self):
self.output = open(f"{self.file}.gcode", "w")
self.output.write("G21 ;Unit to mm\n")
self.output.write("G90 ;Absolute positioning\n\n")
self.output.write(f"F{self.speed}\n")
if self.machine == Machine.LASER:
self.output.write(f"S{self.max_s}\n")
self.output.write("M3\n\n")
def draw_line(self, x1, y1, x2, y2):
self.go_to(x1, y1)
self.write_to(x2, y2)
def go_to(self, x, y):
x_mm = x * self.mm_per_px
y_mm = y * self.mm_per_px
if self.machine == Machine.LASER:
self.output.write(f"G0 X{x_mm} Y{y_mm}\n")
elif self.machine == Machine.THREEAXIS:
self.output.write(f"G0 Z{self.safe_z}\n")
self.output.write(f"G0 X{x_mm} Y{y_mm} Z{self.safe_z}\n")
def write_to(self, x, y):
x_mm = x * self.mm_per_px
y_mm = y * self.mm_per_px
if self.machine == Machine.LASER:
self.output.write(f"G1 X{x_mm} Y{y_mm}\n")
elif self.machine == Machine.THREEAXIS:
self.output.write(f"G0 Z{self.work_z}\n")
self.output.write(f"G1 X{x_mm} Y{y_mm} Z{self.work_z}\n")
def refill(self, x, y, depth, dip_number):
self.output.write(";#################\n")
if self.machine == Machine.THREEAXIS:
self.go_to(x, y)
for _ in range(dip_number):
self.output.write(f"G1 Z{depth}\n")
self.output.write(f"G0 Z{self.safe_z}\n")
elif self.machine == Machine.LASER:
self.go_to(x, y)
self.set_pause()
def set_pause(self):
self.output.write("M0\n")
def end_gcode(self):
if self.machine == Machine.THREEAXIS:
self.go_to(0, 0)
self.output.write("M5\n")
self.output.close()
def new_file(self, new_file_name):
self.end_gcode()
self.file = new_file_name
self.init_file()