Files
Trac3r-python/main.py

173 lines
5.2 KiB
Python

from tkinter import *
from tkinter import filedialog
from tkinter.ttk import Notebook
from PIL import Image, ImageTk
import os
from GCodeRenderer import Renderer
from Svg2GcodeConverter import Svg2GcodeConverter
from ImageConverter import ImageConverter
from Simulator import Simulator
class Settings:
def __init__(self):
# ============ HARDCODED VALUES ===========
# Canvas size
self.canvas_x = 700
self.canvas_y = 700
# The position of the pulley centers in relation to the top left and right of the canvas
self.left_pulley_x_offset = -40
self.right_pulley_x_offset = 40
self.pulley_y_droop = 60
# Diameter of the inner portion of the pulley in millimeters
self.pulley_diameter = 45
# Feed rates
self.speed = 1000
# Whether we render lift markers
self.lift_markers = False
self.lift_counter = 0
# ============ CALCULATED VALUES ===========
self.distance_between_centers = abs(self.left_pulley_x_offset) + self.canvas_x + self.right_pulley_x_offset
# Main GUI class and program entry point
class Tracer(Tk):
def update_highpass_value(self, value):
self.highpass_filter = value
def update_blur_value(self, value):
self.blur = value
def __init__(self):
super().__init__()
# Setup the file structure
if not os.path.exists("output"):
os.makedirs("output")
if not os.path.exists("tmp"):
os.makedirs("tmp")
# Settings for the printer are loaded, TODO: Customize for our dual motor printer
self.settings = Settings()
# Image filename which we are converting
self.filename = None
# GCODE -> SVG,PNG renderer
self.cairo_renderer = Renderer(self.settings)
# SVG -> GCODE converter
self.gcode_converter = Svg2GcodeConverter(self.settings)
# FILE -> SVG converter
self.image_converter = ImageConverter()
self.image_converter_settings = ImageConverter.ConverterSettings()
self.label = None
self.pix = None
self.label1 = None
self.image_ref = None
# Initialize TK
self.geometry("{}x{}".format(500, 500))
self.n = Notebook(self, width= 400, height =400)
self.n.pack(fill=BOTH, expand=1)
self.f1 = Frame(self.n)
self.f2 = Frame(self.n)
self.rightframe = Frame(self)
self.rightframe.pack(side=RIGHT)
self.image_select_button = Button(self.rightframe, text="Select Image", command=self.file_select_callback)
self.image_select_button.pack()
self.rerender_button = Button(self.rightframe, text="Re-Render", command=self.render)
self.rerender_button.pack()
self.render_simulation_button = Button(self.rightframe, text="Render Simulation", command=self.render_simulation)
self.render_simulation_button.pack()
self.lift_markers_checkbox = Checkbutton(self.rightframe, text="Lift Markers", command=self.cairo_renderer.toggle_flip_markers)
self.lift_markers_checkbox.pack()
self.highpass_slider = Scale(self.rightframe, command=self.update_highpass_value, resolution=0.1, to=15)
self.highpass_slider.set(self.image_converter_settings.highpass_filter)
self.highpass_slider.pack()
self.blur_slider = Scale(self.rightframe, command=self.update_blur_value, resolution=0.1, to=5)
self.blur_slider.set(self.image_converter_settings.blur)
self.blur_slider.pack()
# Start TK
self.mainloop()
def file_select_callback(self):
filepath = filedialog.askopenfilename(initialdir=".", title="Select file",
filetypes=(("jpeg files", "*.jpg"), ("all files", "*.*")))
# User didn't select a file
if len(filepath) is 0:
return
self.update_idletasks()
self.filename = os.path.basename(filepath)
self.render()
def render(self):
self.image_converter.convert_image(self.filename, self.image_converter_settings)
self.gcode_converter.convert_gcode()
self.cairo_renderer.clear_screen()
self.cairo_renderer.render_gcode()
self.f1.pack_forget()
self.f2.pack_forget()
if self.label is not None:
self.label.pack_forget()
if self.label1 is not None:
self.label1.pack_forget()
pil_image = Image.open("tmp/rendered-output.png")
# scale = self.winfo_width() / pil_image.width
# pil_image = pil_image.resize((int(scale * pil_image.width), int(scale * pil_image.height)))
self.image_ref = ImageTk.PhotoImage(pil_image)
self.label = Label(self.f1, image=self.image_ref)
self.n.add(self.f1, text="Converted")
self.label.pack(expand=True, fill="both")
self.pic = ImageTk.PhotoImage(file="input-images/{}".format(self.filename))
self.label1 = Label(self.f2, image=self.pic)
self.n.add(self.f2, text="Original")
self.label1.pack(expand=True, fill="both")
def render_simulation(self):
simulator = Simulator()
simulator.render()
if __name__ == "__main__":
Tracer()