Compare commits
2 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
557f5ef5fc | ||
|
|
ad4a63355d |
1 changed files with 51 additions and 6 deletions
57
main.py
57
main.py
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue