Compare commits

...

2 commits

Author SHA1 Message Date
bMorgan01
557f5ef5fc bug fixes and improvements 2021-10-05 01:21:39 -06:00
bMorgan01
ad4a63355d bug fixes and improvements 2021-10-05 00:32:53 -06:00

57
main.py
View file

@ -1,6 +1,6 @@
import os import os
import sys import sys
from copy import copy from copy import copy, deepcopy
from math import sqrt, ceil, floor from math import sqrt, ceil, floor
import numpy as np import numpy as np
import tkinter as tk import tkinter as tk
@ -28,6 +28,14 @@ bins = None
blocked = False blocked = False
saveBinsButton = None saveBinsButton = None
showKeyButton = None showKeyButton = None
exportHeightEntry = None
exportWidthEntry = None
exportKerfEntry = None
lastW = None
lastH = None
lastK = None
resultWinHeight = None
resultWinWidth = None
# shows dimensions and layer count in main gui window # shows dimensions and layer count in main gui window
@ -102,12 +110,14 @@ def focus_results():
# bring results window forward # bring results window forward
if results is not None and 'normal' == results.state(): if results is not None and 'normal' == results.state():
results.focus_set() results.focus_set()
results.geometry("")
return return
# run slices, show export window # run slices, show export window
def go(): def go():
global combined, sections, results, saveBinsButton, showKeyButton, showKey global combined, sections, results, saveBinsButton, showKeyButton, showKey, exportHeightEntry, exportWidthEntry, exportKerfEntry, resultWinWidth, resultWinHeight
focus_results() focus_results()
@ -134,6 +144,7 @@ def go():
results = tk.Toplevel(root) results = tk.Toplevel(root)
results.title("Results") results.title("Results")
results.protocol("WM_DELETE_WINDOW", clearResults) results.protocol("WM_DELETE_WINDOW", clearResults)
results.resizable(0, 0)
buttonFrame = tk.Frame(results) buttonFrame = tk.Frame(results)
viewFrame = tk.Frame(buttonFrame) viewFrame = tk.Frame(buttonFrame)
@ -182,6 +193,9 @@ def go():
results.update() results.update()
results.geometry(f'+{root.winfo_rootx()+int((root.winfo_width()-results.winfo_width())/2)}+{root.winfo_rooty()+int((root.winfo_height()-results.winfo_height())/2)}') results.geometry(f'+{root.winfo_rootx()+int((root.winfo_width()-results.winfo_width())/2)}+{root.winfo_rooty()+int((root.winfo_height()-results.winfo_height())/2)}')
resultWinWidth = results.winfo_width()
resultWinHeight = results.winfo_height()
results.mainloop() results.mainloop()
@ -241,15 +255,37 @@ def export():
blocked = False blocked = False
def checkPrepared(args=None):
shouldRemove = False
try:
shouldRemove = float(exportWidthEntry.get()) != lastW or float(exportHeightEntry.get()) != lastH or float(exportKerfEntry.get()) != lastK
except ValueError:
shouldRemove = True
finally:
if shouldRemove:
saveBinsButton.pack_forget()
showKeyButton.pack_forget()
results.geometry(f"{resultWinHeight}x{resultWinHeight}")
else:
if not saveBinsButton.winfo_ismapped():
results.geometry("")
saveBinsButton.pack(side=LEFT, padx=1)
showKeyButton.pack(side=LEFT)
# prepares bins for export, performs bin packing # prepares bins for export, performs bin packing
# arguments: bin height, bin width, kerf # arguments: bin height, bin width, kerf
def exportFile(h, w, k): def exportFile(h, w, k):
global blocked, bins, pdfSections global blocked, bins, pdfSections, exportWidthEntry, exportHeightEntry, exportKerfEntry, lastW, lastH, lastK
# if other window is not open # if other window is not open
if not blocked: if not blocked:
blocked = True blocked = True
lastW = w
lastH = h
lastK = k
# prepare packers, one with rotation enabled, one disabled, results will be compared later # prepare packers, one with rotation enabled, one disabled, results will be compared later
packer = newPacker(mode=PackingMode.Offline, bin_algo=PackingBin.Global, sort_algo=SORT_NONE, rotation=False) packer = newPacker(mode=PackingMode.Offline, bin_algo=PackingBin.Global, sort_algo=SORT_NONE, rotation=False)
rotPacker = newPacker(mode=PackingMode.Offline, bin_algo=PackingBin.Global, sort_algo=SORT_NONE, rotation=True) rotPacker = newPacker(mode=PackingMode.Offline, bin_algo=PackingBin.Global, sort_algo=SORT_NONE, rotation=True)
@ -258,9 +294,10 @@ def exportFile(h, w, k):
for i in range(len(sections)): for i in range(len(sections)):
dimensions = sections[i].bounds dimensions = sections[i].bounds
sections[i].apply_translation((-dimensions[0][0], -dimensions[0][1])) sect = deepcopy(sections[i])
sect.apply_translation((-dimensions[0][0], -dimensions[0][1]))
dimensions = sections[i].bounds dimensions = sect.bounds
# set dimensions to bounds plus kerf # set dimensions to bounds plus kerf
r = (float2dec((dimensions[1][0]) + k, 5), float2dec((dimensions[1][1]) + k, 5)) r = (float2dec((dimensions[1][0]) + k, 5), float2dec((dimensions[1][1]) + k, 5))
@ -277,6 +314,7 @@ def exportFile(h, w, k):
# init var to largest bin area of packers, will be overridden to find minimum area used, minimizing material wastage # init var to largest bin area of packers, will be overridden to find minimum area used, minimizing material wastage
leastBinSum = w * h * max(len(packer), len(rotPacker)) leastBinSum = w * h * max(len(packer), len(rotPacker))
leastPacker = packer
# loop through packers # loop through packers
for pack in (packer, rotPacker): for pack in (packer, rotPacker):
binSum = 0 binSum = 0
@ -329,7 +367,7 @@ def exportFile(h, w, k):
# add rectangles to their designated bins # add rectangles to their designated bins
for rect in packer.rect_list(): for rect in packer.rect_list():
section = sections[rect[5]] section = deepcopy(sections[rect[5]])
bin = rect[0] bin = rect[0]
# find position of bin for display purposes (bins displayed in grid, find row & col) # find position of bin for display purposes (bins displayed in grid, find row & col)
@ -372,6 +410,12 @@ def exportFile(h, w, k):
saveBinsButton.pack(side=LEFT, padx=1) saveBinsButton.pack(side=LEFT, padx=1)
showKeyButton.pack(side=LEFT) showKeyButton.pack(side=LEFT)
exportWidthEntry.bind('<KeyRelease>', checkPrepared)
exportHeightEntry.bind('<KeyRelease>', checkPrepared)
exportKerfEntry.bind('<KeyRelease>', checkPrepared)
focus_results()
blocked = False blocked = False
@ -434,6 +478,7 @@ root.attributes("-toolwindow", 1)
p1 = tk.PhotoImage(file=resource_path('icon.png')) p1 = tk.PhotoImage(file=resource_path('icon.png'))
# Icon set for program window # Icon set for program window
root.iconphoto(True, p1) root.iconphoto(True, p1)
root.resizable(0, 0)
# clear children of base window # clear children of base window
clearList = root.winfo_children() clearList = root.winfo_children()