You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
5.7 KiB

from math import sqrt
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
def xy_to_radial(settings, current_xy, dest_xy, pulley_diameter):
# maybe check for the distance of the move. Split it up into multiple to avoid distortion
# get the current length of the left pulley wire
b = (settings.left_pulley_x_offset - settings.pulley_diameter + current_xy[0])
a = settings.pulley_y_droop
length = sqrt(pow(a, 2) + pow(b, 2))
# get the current length of the right pulley wire
# get the desired length of the left pulley wire
# get the desired length of the right pulley wire
return
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
# ============ 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.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()