From 7bd0ab9e7db2abfb1efb7098f7d28cbb9bd9abbe Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Fri, 7 Apr 2023 21:32:28 +0200 Subject: [PATCH] Add Lid option to more Generators * DividerTray * DrillBox * GridfinityBase * GridfinityTrayLayout * SmallPartsTray * SmallPartsTray2 * TrayLayout * TypeTray Related: #128 Related: #277 --- boxes/generators/dividertray.py | 5 ++++- boxes/generators/drillbox.py | 4 +++- boxes/generators/gridfinitybase.py | 25 ++++++++++++------------ boxes/generators/gridfinitytraylayout.py | 17 ++++++++++------ boxes/generators/smallpartstray.py | 12 +++++++++--- boxes/generators/smallpartstray2.py | 5 +++-- boxes/generators/traylayout.py | 7 +++++-- boxes/generators/typetray.py | 4 +++- boxes/lids.py | 2 +- 9 files changed, 52 insertions(+), 29 deletions(-) diff --git a/boxes/generators/dividertray.py b/boxes/generators/dividertray.py index 2b9069a..fc16f35 100644 --- a/boxes/generators/dividertray.py +++ b/boxes/generators/dividertray.py @@ -19,7 +19,7 @@ from __future__ import annotations import math from functools import partial -from boxes import Boxes, edges, boolarg +from boxes import Boxes, edges, boolarg, lids class NotchSettings(edges.Settings): @@ -94,6 +94,7 @@ You will likely need to cut each of the dividers you want multiple times. Boxes.__init__(self) self.addSettingsArgs(edges.FingerJointSettings) self.addSettingsArgs(edges.HandleEdgeSettings) + self.addSettingsArgs(lids.LidSettings) self.buildArgParser("sx", "sy", "h", "outside") self.addSettingsArgs(SlotSettings) self.addSettingsArgs(NotchSettings) @@ -194,6 +195,8 @@ You will likely need to cut each of the dividers you want multiple times. side_wall_length, self.h, [be, "f", se, "f"], move="up", label="Sidepiece " + str(_ + 1) ) + self.lid(facing_wall_length, side_wall_length) + # Switch to right side of the file self.ctx.restore() self.rectangularWall( diff --git a/boxes/generators/drillbox.py b/boxes/generators/drillbox.py index 34c646d..6cb73c7 100644 --- a/boxes/generators/drillbox.py +++ b/boxes/generators/drillbox.py @@ -15,7 +15,7 @@ # along with this program. If not, see . from boxes import Boxes, edges, Color, ArgparseEdgeType -from boxes.lids import _TopEdge +from boxes.lids import _TopEdge, LidSettings class DrillBox(_TopEdge): """A parametrized box for drills""" @@ -32,6 +32,7 @@ class DrillBox(_TopEdge): self.addSettingsArgs(edges.RoundedTriangleEdgeSettings, outset=1) self.addSettingsArgs(edges.StackableSettings) self.addSettingsArgs(edges.MountingSettings) + self.addSettingsArgs(LidSettings) self.argparser.add_argument( "--top_edge", action="store", type=ArgparseEdgeType("eStG"), choices=list("eStG"), @@ -125,3 +126,4 @@ class DrillBox(_TopEdge): x, y, "ffff", callback=[lambda: self.drillholes(description=True)], move="right") + self.lid(x, y, self.top_edge) diff --git a/boxes/generators/gridfinitybase.py b/boxes/generators/gridfinitybase.py index 927a6ce..2f870c6 100644 --- a/boxes/generators/gridfinitybase.py +++ b/boxes/generators/gridfinitybase.py @@ -15,6 +15,7 @@ # along with this program. If not, see . from boxes import * +from boxes import lids class GridfinityBase(Boxes): """A parameterized Gridfinity base""" @@ -28,6 +29,7 @@ class GridfinityBase(Boxes): def __init__(self) -> None: Boxes.__init__(self) self.addSettingsArgs(edges.FingerJointSettings, space=4, finger=4) + self.addSettingsArgs(lids.LidSettings) self.argparser.add_argument("--x", type=int, default=3, help="number of grids in X direction") self.argparser.add_argument("--y", type=int, default=2, help="number of grids in Y direction") self.argparser.add_argument("--h", type=float, default=7*3, help="height of sidewalls of the tray (mm)") @@ -69,23 +71,22 @@ class GridfinityBase(Boxes): b = self.edges.get(self.bottom_edge, self.edges["F"]) sideedge = "F" # if self.vertical_edges == "finger joints" else "h" - with self.saved_context(): - self.rectangularWall(x, h, [b, sideedge, t1, sideedge], - ignore_widths=[1, 6], move="up") - self.rectangularWall(x, h, [b, sideedge, t3, sideedge], - ignore_widths=[1, 6], move="up") - - if self.bottom_edge != "e": - self.rectangularWall(x, y, "ffff", move="up") - - self.rectangularWall(x, h, [b, sideedge, t3, sideedge], - ignore_widths=[1, 6], move="right only") + self.rectangularWall(x, h, [b, sideedge, t1, sideedge], + ignore_widths=[1, 6], move="right") self.rectangularWall(y, h, [b, "f", t2, "f"], ignore_widths=[1, 6], move="up") self.rectangularWall(y, h, [b, "f", t4, "f"], - ignore_widths=[1, 6], move="up") + ignore_widths=[1, 6], move="") + self.rectangularWall(x, h, [b, sideedge, t3, sideedge], + ignore_widths=[1, 6], move="left up") + + if self.bottom_edge != "e": + self.rectangularWall(x, y, "ffff", move="up") + return def render(self): self.create_base_plate() self.create_tray() + self.lid(self.x*self.pitch + 2*self.m, + self.y*self.pitch + 2*self.m) diff --git a/boxes/generators/gridfinitytraylayout.py b/boxes/generators/gridfinitytraylayout.py index d0a2253..e815f4a 100644 --- a/boxes/generators/gridfinitytraylayout.py +++ b/boxes/generators/gridfinitytraylayout.py @@ -2,7 +2,7 @@ import boxes from boxes import Boxes from boxes.generators.traylayout import TrayLayout from boxes.Color import Color -from boxes import restore +from boxes import restore, lids class GridfinityTrayLayout(TrayLayout): """A Gridfinity Tray Generator based on TrayLayout""" @@ -25,6 +25,7 @@ this compartment. def __init__(self) -> None: Boxes.__init__(self) self.addSettingsArgs(boxes.edges.FingerJointSettings) + self.addSettingsArgs(lids.LidSettings) self.buildArgParser(h=50) self.outside = True # We're *always* outside for gridfinity self.pitch = 42.0 # gridfinity pitch is defined as 42. @@ -103,9 +104,13 @@ this compartment. self.prepare() self.walls() + with self.saved_context(): + self.base_plate(callback=[self.baseplate_etching], + move="mirror right") + foot = self.opening - self.opening_margin + for i in range(min(self.nx * self.ny, 4)): + self.rectangularWall(foot, foot, move="right") self.base_plate(callback=[self.baseplate_etching], - move="mirror right") - foot = self.opening - self.opening_margin - for i in range(min(self.nx * self.ny, 4)): - self.rectangularWall(foot, foot, move="right") - + move="up only") + self.lid(sum(self.x) + (len(self.x)-1) * self.thickness, + sum(self.y) + (len(self.y)-1) * self.thickness) diff --git a/boxes/generators/smallpartstray.py b/boxes/generators/smallpartstray.py index e8f9929..f2ada5a 100644 --- a/boxes/generators/smallpartstray.py +++ b/boxes/generators/smallpartstray.py @@ -15,6 +15,7 @@ # along with this program. If not, see . from boxes import * +from boxes import lids from boxes.edges import CompoundEdge class SmallPartsTray(Boxes): @@ -27,6 +28,7 @@ class SmallPartsTray(Boxes): self.addSettingsArgs(edges.FingerJointSettings) # self.addSettingsArgs(edges.StackableSettings) + self.addSettingsArgs(lids.LidSettings) self.buildArgParser(sx="50*3", y=100, h=30, outside=True) self.argparser.add_argument( @@ -243,7 +245,11 @@ class SmallPartsTray(Boxes): if self.two_sided: - for l in self.sx: - self.render_simple_tray_divider(l, h, move="right") + with self.saved_context(): + for l in self.sx: + self.render_simple_tray_divider(l, h, move="right") - self.partsMatrix(len(self.sx), 0, "right", self.render_simple_tray_divider_feet) + self.partsMatrix(len(self.sx), 0, "right", self.render_simple_tray_divider_feet) + self.render_simple_tray_divider(l, h, move="up only") + + self.lid(x, y) diff --git a/boxes/generators/smallpartstray2.py b/boxes/generators/smallpartstray2.py index 5fbad81..19e6526 100644 --- a/boxes/generators/smallpartstray2.py +++ b/boxes/generators/smallpartstray2.py @@ -15,7 +15,7 @@ # along with this program. If not, see . from boxes import * -from boxes.lids import _TopEdge +from boxes.lids import _TopEdge, LidSettings class TopEdge(edges.BaseEdge): @@ -55,6 +55,7 @@ If there are no inner front to back walls just add everything to one side wall a Boxes.__init__(self) self.addTopEdgeSettings(fingerjoint={"surroundingspaces": 1.0}, roundedtriangle={"outset" : 1}) + self.addSettingsArgs(LidSettings) self.buildArgParser("sx", "sy", "hi", "outside", h=30) # "bottom_edge", "top_edge") self.argparser.add_argument( @@ -178,7 +179,6 @@ If there are no inner front to back walls just add everything to one side wall a callback=[self.fingerHolesCB(self.sx, hi-t2)], move="up", label="floor front side") floors.append(hi-t2) - print(y, sum(floors), floors) # Inner walls @@ -198,6 +198,7 @@ If there are no inner front to back walls just add everything to one side wall a # top / lid self.drawLid(x, y, self.top_edge) # XXX deal with front + self.lid(x, y, self.top_edge) self.ctx.restore() self.rectangularWall(x, hi, "ffff", move="right only") diff --git a/boxes/generators/traylayout.py b/boxes/generators/traylayout.py index b119456..75c2cc8 100644 --- a/boxes/generators/traylayout.py +++ b/boxes/generators/traylayout.py @@ -17,7 +17,7 @@ from __future__ import annotations import boxes from boxes import * - +from boxes import lids class TrayLayoutFile(Boxes): """Generate a layout file for a typetray.""" @@ -101,6 +101,7 @@ You can replace the space characters representing the floor by a "X" to remove t def __init__(self) -> None: super().__init__() self.addSettingsArgs(boxes.edges.FingerJointSettings) + self.addSettingsArgs(lids.LidSettings) self.buildArgParser("h", "hi", "outside", "sx", "sy") if self.UI == "web": self.argparser.add_argument( @@ -452,4 +453,6 @@ You can replace the space characters representing the floor by a "X" to remove t def render(self) -> None: self.prepare() self.walls() - self.base_plate() + self.base_plate(move="up") + self.lid(sum(self.x) + (len(self.x)-1) * self.thickness, + sum(self.y) + (len(self.y)-1) * self.thickness) diff --git a/boxes/generators/typetray.py b/boxes/generators/typetray.py index ec98bc2..c9cfc3b 100644 --- a/boxes/generators/typetray.py +++ b/boxes/generators/typetray.py @@ -15,7 +15,7 @@ # along with this program. If not, see . from boxes import * -from boxes.lids import _TopEdge +from boxes.lids import _TopEdge, LidSettings class TypeTray(_TopEdge): """Type tray - allows only continuous walls""" @@ -26,6 +26,7 @@ class TypeTray(_TopEdge): Boxes.__init__(self) self.addTopEdgeSettings(fingerjoint={"surroundingspaces": 0.5}, roundedtriangle={"outset" : 1}) + self.addSettingsArgs(lids.LidSettings) self.buildArgParser("sx", "sy", "h", "hi", "outside", "bottom_edge", "top_edge") self.argparser.add_argument( @@ -156,6 +157,7 @@ class TypeTray(_TopEdge): self.xSlots, self.ySlots], move="up", label="top") else: self.drawLid(x, y, self.top_edge) + self.lid(x, y, self.top_edge) self.ctx.restore() self.rectangularWall(x, hi, "ffff", move="right only") diff --git a/boxes/lids.py b/boxes/lids.py index 7ef6f12..e10e840 100644 --- a/boxes/lids.py +++ b/boxes/lids.py @@ -63,7 +63,7 @@ class Lid: if style == "flat": self.rectangularWall(x, y, "eeee", callback=[self.handleCB(x, y)], - move="right", label="lid bottom") + move="up", label="lid bottom") self.rectangularWall(x, y, "EEEE", callback=[self.handleCB(x, y)], move="up", label="lid top")