Browse Source

First working version

Godzil 6 years ago
parent
commit
7f5bd4e728
4 changed files with 167 additions and 38 deletions
  1. 95 36
      main.py
  2. 4 0
      requirements.txt
  3. 42 0
      setup.py
  4. 26 2
      wow.py

+ 95 - 36
main.py

@@ -2,43 +2,86 @@
 
 import wow
 import tkinter as tk
-from PIL import ImageTk
+import tkinter.filedialog
+import sys
 
-wowfile = wow.WowFile("CG_LCD_W.wow")
+from PIL import ImageTk
 
 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.label = tk.Label(self.top_frame, text="Layer:".format(num=self.currentLayer))
-        self.label.pack(fill=tk.X)
-
-        self.mid_frame = tk.Frame(master)
-        self.mid_frame.pack(fill=tk.X)
-
-        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.bottom_frame = tk.Frame(master)
-        self.bottom_frame.pack(fill=tk.X)
-
-
-        self.close_button2 = tk.Button(self.bottom_frame, text="Exit", command=master.quit)
-        self.close_button2.pack()
+        self.layer_count = wowfile.get_layercount()
+
+        self.layer = wowfile.get_layer(self.currentLayer)
+
+        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(self.layer.image)
+        self.layer_img = tk.Label(master, image=self.img)
+        self.layer_img.grid(row=2, column=1, columnspan=3)
+
+        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.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))
-
-
-root = tk.Tk()
-my_gui = WOWFileViewer(root)
-root.mainloop()
-
-
-# if __name__ == "__main__":
+        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()
+
+
+if __name__ == "__main__":
+    main()

+ 4 - 0
requirements.txt

@@ -0,0 +1,4 @@
+Pillow==5.0.0
+Pillow-PIL==0.1.dev0
+cx_Freeze==6.0b1
+GitPython==2.1.8

+ 42 - 0
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
+)

+ 26 - 2
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)