Update compartmentbox.py

Added stackable edge settings.
Added options for margin or spacing at the sliding lid.
Changed hard coded values with settings from stackable edge.
This commit is contained in:
J-Waal 2023-05-11 12:25:46 +02:00
parent 0da8653f26
commit 72a2c44599
1 changed files with 39 additions and 10 deletions

View File

@ -22,12 +22,15 @@ class CompartmentBox(TypeTray):
description = """Sliding lid rests on inner walls,
so will not work if no inner walls are present.
Suggested to place walls close to both sides for maximum stability."""
Suggested to place walls close to both sides for maximum stability.
Margin helps to prevent the lid from getting stuck.
Vertical margin is added to height."""
ui_group = "Tray"
def __init__(self) -> None:
Boxes.__init__(self) # avoid TypeTray.__init__
self.addSettingsArgs(edges.StackableSettings)
self.buildArgParser("sx", "sy", "h", "outside", "bottom_edge")
self.argparser.add_argument(
"--handle", action="store", type=str, default="lip",
@ -40,6 +43,12 @@ class CompartmentBox(TypeTray):
"--holes", action="store", type=str,
default="70",
help="width of hole(s) in percentage of maximum hole width")
self.argparser.add_argument(
"--margin_t", action="store", type=float, default=0.1,
dest="margin_vertical", help="vertical margin for sliding lid (multiples of thickness)")
self.argparser.add_argument(
"--margin_s", action="store", type=float, default=0.05,
dest="margin_side", help="margin to add at both sides of sliding lid (multiples of thickness)")
def render(self):
t = self.thickness
@ -53,15 +62,24 @@ class CompartmentBox(TypeTray):
h = self.h
b = self.bottom_edge
stackable = b == "s"
margin_vertical = self.margin_vertical * t
margin_side = self.margin_side
stackable = b == "s"
tside, tback = ["Š","S"] if stackable else ["F","E"] # top edges
if (margin_vertical < 0):
raise ValueError("vertical margin can not be negative")
if (margin_side < 0):
raise ValueError("side margin can not be negative")
# x walls
self.ctx.save()
# outer walls - front/back
hb = h+t * (3 if stackable else 1)
hb = h + t + margin_vertical
if stackable:
hb += t + self.edges["S"].settings.holedistance
self.rectangularWall(x, hb, [b, "F", tback, "F"],
callback=[self.xHoles],
ignore_widths=[1,2,5,6],
@ -85,13 +103,24 @@ class CompartmentBox(TypeTray):
# top / lid
handle = self.handle
x_compensated = x - 2*margin_side*t # margin at both sides (left, right)
if handle == "lip":
self.rectangularWall(x, y, "feee", move="up", label="lid")
self.rectangularWall(x, t * (2 if b == "s" else 1), "fe" + ("S" if b == "s" else "e") + "e", move="up", label="lid lip")
#compensate for the lid being a bit lower due to the margin, goal is to keep top at same height
lip_height = (0 if stackable else t) + margin_vertical/2
if (stackable):
#compensate for the stackable edge extra height
lip_height += self.edges["S"].settings.holedistance #get this value from the settings
# correct the stackable edge for the length lost at the ends
s = copy.deepcopy(self.edges["S"].settings)
# get value from settings and make change
s.setValues(self.thickness, width = self.edges["S"].settings.width/self.thickness - margin_side)
s.edgeObjects(self, chars="aA") # this seems to be correct
self.rectangularWall(x_compensated, y, "feee", move="up", label="lid")
self.rectangularWall(x_compensated, lip_height, "fe" + ("A" if stackable else "e") + "e", move="up", label="lid lip")
if handle == "hole":
self.rectangularWall(x, y + t, move="up", label="lid", callback=[self.gripHole])
self.rectangularWall(x_compensated, y + t, move="up", label="lid", callback=[self.gripHole])
if handle == "none":
self.rectangularWall(x, y + t, move="up", label="lid")
self.rectangularWall(x_compensated, y + t, move="up", label="lid")
self.ctx.restore()
@ -99,11 +128,11 @@ class CompartmentBox(TypeTray):
# y walls
# outer walls - left/right
f = edges.CompoundEdge(self, "fE", [h+self.edges[b].startwidth(), t])
self.rectangularWall(y, h+t, [b, f, tside, "f"], callback=[self.yHoles, ],
f = edges.CompoundEdge(self, "fE", [h+self.edges[b].startwidth(), t+margin_vertical])
self.rectangularWall(y, h+t+margin_vertical, [b, f, tside, "f"], callback=[self.yHoles, ],
ignore_widths=[1,5,6],
move="up", label="left side")
self.rectangularWall(y, h+t, [b, f, tside, "f"], callback=[self.yHoles, ],
self.rectangularWall(y, h+t+margin_vertical, [b, f, tside, "f"], callback=[self.yHoles, ],
ignore_widths=[1,5,6],
move="mirror up", label="right side")