From 7f5bd4e7286fc09601ef8b958e8a9e8a2e157927 Mon Sep 17 00:00:00 2001 From: Godzil Date: Fri, 23 Feb 2018 01:02:31 +0000 Subject: [PATCH] First working version --- main.py | 115 +++++++++++++++++++++++++++++++++++------------ requirements.txt | 4 ++ setup.py | 42 +++++++++++++++++ wow.py | 28 +++++++++++- 4 files changed, 159 insertions(+), 30 deletions(-) create mode 100644 requirements.txt create mode 100644 setup.py diff --git a/main.py b/main.py index 2174895..b871382 100644 --- a/main.py +++ b/main.py @@ -2,43 +2,86 @@ import wow import tkinter as tk +import tkinter.filedialog +import sys + from PIL import ImageTk -wowfile = wow.WowFile("CG_LCD_W.wow") - class WOWFileViewer: - def __init__(self, master): + + def __init__(self, master, wowfile): self.currentLayer = 0 self.master = master + self.wowfile = wowfile master.title("WOW file viewer") - self.top_frame = tk.Frame(master) - self.top_frame.pack(fill=tk.X) + self.layer_count = wowfile.get_layercount() - self.label = tk.Label(self.top_frame, text="Layer:".format(num=self.currentLayer)) - self.label.pack(fill=tk.X) + self.layer = wowfile.get_layer(self.currentLayer) - self.mid_frame = tk.Frame(master) - self.mid_frame.pack(fill=tk.X) + self.label = tk.Label(master, text="Layer: {num} / {tot}".format(num=self.layer.number, tot=self.layer_count)) + self.label.grid(row=1, columnspan=4) - self.img = ImageTk.PhotoImage(wowfile.layers[self.currentLayer].image) - self.layer_img = tk.Label(self.mid_frame, image=self.img) - self.layer_img.pack(side=tk.LEFT) - self.layer_select = tk.Scale(self.mid_frame, from_=0, to=wowfile.get_layercount(), command=self.sliderUpdate, orient=tk.VERTICAL) - self.layer_select.pack(side=tk.RIGHT, fill=tk.X, expand=True) + self.img = ImageTk.PhotoImage(self.layer.image) + self.layer_img = tk.Label(master, image=self.img) + self.layer_img.grid(row=2, column=1, columnspan=3) - self.bottom_frame = tk.Frame(master) - self.bottom_frame.pack(fill=tk.X) + tickinterval = self.layer_count/10 + self.layer_select = tk.Scale(master, from_=1, to=self.layer_count, + command=self.sliderUpdate, orient=tk.VERTICAL, + resolution=1, length=400, tickinterval=tickinterval) + self.layer_select.grid(row=2, column=4) + self.thick_var = tk.StringVar() + self.thick_var.set(str(self.layer.thickness * 1000)) + self.thick_lbl = tk.Label(master, text="Layer thickness (µm): ") + self.thick_lbl.grid(row=3, column=1, sticky=tk.E) + self.thick_ent = tk.Entry(master, textvariable=self.thick_var) + self.thick_ent.grid(row=3, column=2, sticky=tk.W) - self.close_button2 = tk.Button(self.bottom_frame, text="Exit", command=master.quit) - self.close_button2.pack() + self.exp_var = tk.StringVar() + self.exp_var.set(str(self.layer.exposition)) + self.exp_lbl = tk.Label(master, text="Layer exposure level (0-255): ") + self.exp_lbl.grid(row=4, column=1, sticky=tk.E) + self.exp_ent = tk.Entry(master, textvariable=self.exp_var) + self.exp_ent.grid(row=4, column=2, sticky=tk.W) + + self.spdu_var = tk.StringVar() + self.spdu_var.set(str(self.layer.speed_up)) + self.spdu_lbl = tk.Label(master, text="Speed up (mm/min): ") + self.spdu_lbl.grid(row=3, column=3, sticky=tk.E) + self.spdu_ent = tk.Entry(master, textvariable=self.spdu_var) + self.spdu_ent.grid(row=3, column=4, sticky=tk.W) + + self.spdd_var = tk.StringVar() + self.spdd_var.set(str(self.layer.speed_down)) + self.spdd_lbl = tk.Label(master, text="Speed down (mm/min): ") + self.spdd_lbl.grid(row=4, column=3, sticky=tk.E) + self.spdd_ent = tk.Entry(master, textvariable=self.spdd_var) + self.spdd_ent.grid(row=4, column=4, sticky=tk.W) + + self.expt_var = tk.StringVar() + self.expt_var.set(str(self.layer.exposition_time)) + self.expt_lbl = tk.Label(master, text="Layer exposure time (in sec): ") + self.expt_lbl.grid(row=5, column=1, sticky=tk.E) + self.expt_ent = tk.Entry(master, textvariable=self.expt_var) + self.expt_ent.grid(row=5, column=2, sticky=tk.W) + + self.printtime_var = tk.StringVar() + self.printtime_var.set(str(wowfile.get_printtime(human_readable=True))) + self.printtime_lbl = tk.Label(master, text="Estimated print time: ") + self.printtime_lbl.grid(row=6, column=1, sticky=tk.E) + self.printtime_ent = tk.Label(master, textvariable=self.printtime_var) + self.printtime_ent.grid(row=6, column=2, sticky=tk.W) + + self.close_button2 = tk.Button(master, text=" Exit ", command=master.quit) + self.close_button2.grid(row=6, column=4) def sliderUpdate(self, pos): self.layerChange(int(pos)) def layerUp(self): - if self.currentLayer < wowfile.get_layercount(): + if self.currentLayer < self.wowfile.get_layercount(): self.currentLayer += 1 self.layerChange(self.currentLayer) @@ -47,16 +90,32 @@ class WOWFileViewer: self.currentLayer -= 1 self.layerChange(self.currentLayer) - def layerChange(self, layer): - self.img = ImageTk.PhotoImage(wowfile.layers[layer].image) + self.layer = self.wowfile.get_layer(layer - 1) + self.img = ImageTk.PhotoImage(self.layer.image) self.layer_img.configure(image=self.img) - self.label.configure(text="Layer: {num}".format(num=layer)) + self.label.configure(text="Layer: {num} / {tot}".format(num=self.layer.number, tot=self.layer_count)) + self.thick_var.set(str(self.layer.thickness * 1000)) + self.exp_var.set(str(self.layer.exposition)) + self.expt_var.set(str(self.layer.exposition_time)) + self.spdu_var.set(str(self.layer.speed_up)) + self.spdd_var.set(str(self.layer.speed_down)) + +def main(): + root = tk.Tk() + root.title("WOW file viewer") + lbl = tk.Label(root, text="Please Wait...") + lbl.grid(row=1, column=1) + filename = tkinter.filedialog.askopenfilename(filetypes=(("WOW print file", "*.wow"),("All files", "*.*"))) + if filename is "": + sys.exit(0) + + lbl.configure(text="") + wowfile = wow.WowFile(filename) + lbl = None + my_gui = WOWFileViewer(root, wowfile) + root.mainloop() -root = tk.Tk() -my_gui = WOWFileViewer(root) -root.mainloop() - - -# if __name__ == "__main__": \ No newline at end of file +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..53a1308 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +Pillow==5.0.0 +Pillow-PIL==0.1.dev0 +cx_Freeze==6.0b1 +GitPython==2.1.8 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..b850f7a --- /dev/null +++ b/setup.py @@ -0,0 +1,42 @@ +import sys, os +import os.path +import git +from cx_Freeze import setup, Executable + + +targetName="wowviewer" +__version__ = "0.1.0" +copyright = "© 2018 986-Studio" +packages = ["datetime", "PIL", "tkinter", "wow"] + +base = None +if sys.platform == "win32": + base = "Win32GUI" + targetName = targetName + ".exe" + +PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__)) +os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6') +os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6') + +options = { + 'build_exe': { + 'include_files':[ + os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), + os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), + ], + 'packages': packages, + 'include_msvcr': True, + }, +} + +executable = [ + Executable("main.py", base=base, targetName=targetName, copyright=copyright) +] + +setup( + name = "WOWFileViewer", + description='Viewer for SparkMaker WOW files', + version=__version__, + options=options, + executables=executable +) \ No newline at end of file diff --git a/wow.py b/wow.py index 5857a3c..76b324e 100644 --- a/wow.py +++ b/wow.py @@ -188,11 +188,35 @@ class WowFile: height = round(height + l.thickness, 5) return height - def get_printtime(self): + def get_layer(self, layer_num): + return self.layers[layer_num] + + def get_printtime(self, human_readable=False): exptime = 0 for l in self.layers: exptime += l.exposition_time - return exptime + exptime += l.move_time + exptime = round(exptime, 5) + + if human_readable: + sec = round(exptime % 60, 0) + mn = round(exptime // 60, 0) + hour = round(mn // 60, 0) + mn = round(mn % 60, 0) + day = round(hour // 24, 0) + hour = round(hour % 24, 0) + out = "" + if day > 0: + out = " {d:g}d".format(d=day) + if hour > 0: + out = " {h:g}hr".format(h=hour) + if mn > 0: + out = out + " {m:g}min".format(m=mn) + if sec > 0: + out = out + " {s:g}s".format(s=sec) + return out.lstrip() + else: + return exptime def get_layercount(self): return len(self.layers)