main.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #!`/usr/bin/whereis python3`
  2. # -*- coding: iso-8859-9 -*-
  3. import os
  4. import wow
  5. import tkinter as tk
  6. import tkinter.filedialog
  7. import tkinter.messagebox
  8. import sys
  9. try:
  10. import BUILD_CONSTANTS
  11. version = BUILD_CONSTANTS.BUILD_VERSION
  12. except ImportError:
  13. try:
  14. import git
  15. r = git.repo.Repo('./')
  16. version = r.git.describe("--tags", "--dirty")
  17. except ImportError:
  18. version = "?version unknown?"
  19. from PIL import ImageTk
  20. class WOWFileViewer:
  21. _Types = ("Thickness", "Speed up", "Exposure level", "Speed down", "Exposure time", "Up movement distance")
  22. def __init__(self, master, wowfile):
  23. self.currentLayer = 0
  24. self.master = master
  25. self.wowfile = wowfile
  26. master.title("WOW file viewer - {ver}".format(ver=version))
  27. self.layer_count = wowfile.get_layercount()
  28. self.layer = wowfile.get_layer(self.currentLayer)
  29. # Configure columns and row
  30. self.master.columnconfigure(1, weight=1)
  31. self.master.columnconfigure(4, weight=1)
  32. self.master.rowconfigure(2, weight=1)
  33. # Row 1
  34. self.label = tk.Label(master, text="Layer: {num} / {tot}".format(num=self.layer.number, tot=self.layer_count))
  35. self.label.grid(row=1, columnspan=6)
  36. self.layern_var = tk.StringVar()
  37. self.layern_var.set(str(self.layer.number))
  38. self.layern_ent = tk.Entry(master, textvariable=self.layern_var, width=6)
  39. self.layern_ent.grid(row=1, column=7, sticky=tk.E+tk.W)
  40. self.layern_btn = tk.Button(master, text=" Change ", command=self.layerManualSet)
  41. self.layern_btn.grid(row=1, column=8, sticky=tk.E+tk.W+tk.N+tk.S)
  42. # Row 2
  43. self.img = ImageTk.PhotoImage(self.layer.image)
  44. self.layer_img = tk.Label(master, image=self.img)
  45. self.layer_img.grid(row=2, column=1, columnspan=7)
  46. tickinterval = self.layer_count/10
  47. self.layer_select = tk.Scale(master, from_=1, to=self.layer_count,
  48. command=self.sliderUpdate, orient=tk.VERTICAL,
  49. resolution=-1, length=400, tickinterval=tickinterval,
  50. takefocus=1)
  51. self.layer_select.grid(row=2, column=8, sticky=tk.E+tk.W+tk.N+tk.S)
  52. # Row 3
  53. self.thick_var = tk.StringVar()
  54. self.thick_var.set(str(self.layer.thickness * 1000))
  55. self.thick_lbl = tk.Label(master, text="Layer thickness (µm): ")
  56. self.thick_lbl.grid(row=3, column=1, sticky=tk.E)
  57. self.thick_ent = tk.Entry(master, textvariable=self.thick_var, width=10)
  58. self.thick_ent.grid(row=3, column=2, sticky=tk.E + tk.W)
  59. self.thick_btn = tk.Button(master, text="A",
  60. command=lambda: self.applyValueToAllLayer(1, self.thick_var.get()))
  61. self.thick_btn.grid(row=3, column=3, sticky=tk.E + tk.W + tk.N + tk.S)
  62. self.spdu_var = tk.StringVar()
  63. self.spdu_var.set(str(self.layer.speed_up))
  64. self.spdu_lbl = tk.Label(master, text="Speed up (mm/min): ")
  65. self.spdu_lbl.grid(row=3, column=4, sticky=tk.E)
  66. self.spdu_ent = tk.Entry(master, textvariable=self.spdu_var, width=10)
  67. self.spdu_ent.grid(row=3, column=5, sticky=tk.E + tk.W)
  68. self.spdu_btn = tk.Button(master, text="A",
  69. command=lambda: self.applyValueToAllLayer(2, self.spdu_var.get()))
  70. self.spdu_btn.grid(row=3, column=6, sticky=tk.E + tk.W + tk.N + tk.S)
  71. # Row 4
  72. self.exp_var = tk.StringVar()
  73. self.exp_var.set(str(self.layer.exposition))
  74. self.exp_lbl = tk.Label(master, text="Layer exposure level (0-255): ")
  75. self.exp_lbl.grid(row=4, column=1, sticky=tk.E)
  76. self.exp_ent = tk.Entry(master, textvariable=self.exp_var, width=10)
  77. self.exp_ent.grid(row=4, column=2, sticky=tk.E+tk.W)
  78. self.exp_btn = tk.Button(master, text="A",
  79. command=lambda: self.applyValueToAllLayer(3, self.exp_var.get()))
  80. self.exp_btn.grid(row=4, column=3, sticky=tk.E + tk.W + tk.N + tk.S)
  81. self.spdd_var = tk.StringVar()
  82. self.spdd_var.set(str(self.layer.speed_down))
  83. self.spdd_lbl = tk.Label(master, text="Speed down (mm/min): ")
  84. self.spdd_lbl.grid(row=4, column=4, sticky=tk.E)
  85. self.spdd_ent = tk.Entry(master, textvariable=self.spdd_var, width=10)
  86. self.spdd_ent.grid(row=4, column=5, sticky=tk.E+tk.W)
  87. self.spdd_btn = tk.Button(master, text="A",
  88. command=lambda: self.applyValueToAllLayer(4, self.spdd_var.get()))
  89. self.spdd_btn.grid(row=4, column=6, sticky=tk.E + tk.W + tk.N + tk.S)
  90. # Row 5
  91. self.expt_var = tk.StringVar()
  92. self.expt_var.set(str(self.layer.exposition_time))
  93. self.expt_lbl = tk.Label(master, text="Layer exposure time (in sec): ")
  94. self.expt_lbl.grid(row=5, column=1, sticky=tk.E)
  95. self.expt_ent = tk.Entry(master, textvariable=self.expt_var, width=10)
  96. self.expt_ent.grid(row=5, column=2, sticky=tk.E+tk.W)
  97. self.expt_btn = tk.Button(master, text="A",
  98. command=lambda: self.applyValueToAllLayer(5, self.expt_var.get()))
  99. self.expt_btn.grid(row=5, column=3, sticky=tk.E + tk.W + tk.N + tk.S)
  100. self.updist_var = tk.StringVar()
  101. self.updist_var.set(str(self.layer.up_distance))
  102. self.updist_lbl = tk.Label(master, text="Up mvmt distance (mm): ")
  103. self.updist_lbl.grid(row=5, column=4, sticky=tk.E)
  104. self.updist_ent = tk.Entry(master, textvariable=self.updist_var, width=10)
  105. self.updist_ent.grid(row=5, column=5, sticky=tk.E + tk.W)
  106. self.updist_btn = tk.Button(master, text="A",
  107. command=lambda: self.applyValueToAllLayer(6, self.updist_var.get()))
  108. self.updist_btn.grid(row=5, column=6, sticky=tk.E + tk.W + tk.N + tk.S)
  109. # Row 6
  110. self.printtime_var = tk.StringVar()
  111. self.printtime_var.set(str(wowfile.get_printtime(human_readable=True)))
  112. self.printtime_lbl = tk.Label(master, text="Estimated print time: ")
  113. self.printtime_lbl.grid(row=6, column=1, sticky=tk.E)
  114. self.printtime_ent = tk.Label(master, textvariable=self.printtime_var)
  115. self.printtime_ent.grid(row=6, column=2, sticky=tk.W)
  116. self.apply_btn = tk.Button(master, text=" Apply Changes ", command=self.applyLayerChange)
  117. self.apply_btn.grid(row=6, column=5, sticky=tk.E+tk.W+tk.N+tk.S)
  118. self.saveas_btn = tk.Button(master, text=" Save As ", command=self.saveAsNewFile)
  119. self.saveas_btn.grid(row=6, column=6, columnspan=2, sticky=tk.E+tk.W+tk.N+tk.S)
  120. self.close_btn = tk.Button(master, text=" Exit ", command=master.quit)
  121. self.close_btn.grid(row=6, column=8, sticky=tk.E+tk.W+tk.N+tk.S)
  122. self.layer_select.focus_force()
  123. def applyLayerChange(self):
  124. try:
  125. self.layer.thickness = round(float(self.thick_var.get()) / 1000, 10)
  126. self.layer.exposition = float(self.exp_var.get())
  127. self.layer.exposition_time = float(self.expt_var.get())
  128. self.layer.speed_up = float(self.spdu_var.get())
  129. self.layer.speed_down = float(self.spdd_var.get())
  130. self.layer.up_distance = float(self.updist_var.get())
  131. self.layer.update_movetime()
  132. self.printtime_var.set(str(self.wowfile.get_printtime(human_readable=True)))
  133. self.layerChange(self.layer.number)
  134. except ValueError:
  135. tk.messagebox.showerror("WoW File Viewer", "Value error:\nOne of the layer field is invalid, please check")
  136. def applyValueToAllLayer(self, type, value):
  137. strtype = self._Types[type-1]
  138. answer = tk.messagebox.askyesno("WoW File Viewer", "Are you sure you want to apply the value '{value}'\n"
  139. "to all layer for '{type}'?".format(value=value,
  140. type=strtype))
  141. if answer == tk.YES:
  142. # The fun begins!
  143. try:
  144. for l in self.wowfile.layers:
  145. if type == 1: # Thickness
  146. l.thickness = round(float(value) / 1000, 10)
  147. elif type == 2: # Speed up
  148. l.speed_up = round(float(value), 5)
  149. elif type == 3: # Exposure
  150. l.exposition = round(float(value), 5)
  151. elif type == 4: # Speed down
  152. l.speed_down = round(float(value), 5)
  153. elif type == 5: # Exposure time
  154. l.exposition_time = round(float(value), 5)
  155. elif type == 6: # Up movement distance
  156. l.up_distance = round(float(value), 5)
  157. l.update_movetime()
  158. self.printtime_var.set(str(self.wowfile.get_printtime(human_readable=True)))
  159. self.layerChange(self.layer.number)
  160. except ValueError:
  161. tk.messagebox.showerror("WoW File Viewer",
  162. "Value error:\n"
  163. "The value {value} is not valid, please check".format(value=value))
  164. def saveAsNewFile(self):
  165. newfile = tk.filedialog.asksaveasfilename(defaultextension=".wow",
  166. filetypes=(("WOW print file", "*.wow"),("All files", "*.*")))
  167. self.wowfile.write_wow(newfile)
  168. def sliderUpdate(self, pos):
  169. self.layerChange(int(pos))
  170. def layerManualSet(self):
  171. self.layer_select.set(int(self.layern_var.get()))
  172. return True
  173. def layerChange(self, layer):
  174. self.layer = self.wowfile.get_layer(layer - 1)
  175. self.img = ImageTk.PhotoImage(self.layer.image)
  176. self.layer_img.configure(image=self.img)
  177. self.label.configure(text="Layer: {num} / {tot}".format(num=self.layer.number, tot=self.layer_count))
  178. self.layern_var.set(str(self.layer.number))
  179. self.thick_var.set(str(self.layer.thickness * 1000))
  180. self.exp_var.set(str(self.layer.exposition))
  181. self.expt_var.set(str(self.layer.exposition_time))
  182. self.spdu_var.set(str(self.layer.speed_up))
  183. self.spdd_var.set(str(self.layer.speed_down))
  184. self.updist_var.set(str(self.layer.up_distance))
  185. def main():
  186. print("WOW File viewer {ver}".format(ver=version))
  187. root = tk.Tk()
  188. root.title("WOW file viewer")
  189. lbl = tk.Label(root, text="Please Wait...")
  190. lbl.grid(row=1, column=1)
  191. filename = tkinter.filedialog.askopenfilename(filetypes=(("WOW print file", "*.wow"),("All files", "*.*")))
  192. if filename is "":
  193. sys.exit(0)
  194. lbl.configure(text="")
  195. wowfile = wow.WowFile(filename)
  196. lbl = None
  197. my_gui = WOWFileViewer(root, wowfile)
  198. root.focus_force()
  199. root.mainloop()
  200. if __name__ == "__main__":
  201. main()