From 810c3dbe3eb8767b201ae89c195bc43f064a536a Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Sat, 22 Jun 2019 00:05:57 +0200 Subject: [PATCH] New generator: SwTypeTray - a tray to hang at a slat wall --- boxes/generators/swtypetray.py | 144 +++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 boxes/generators/swtypetray.py diff --git a/boxes/generators/swtypetray.py b/boxes/generators/swtypetray.py new file mode 100644 index 0000000..c11a042 --- /dev/null +++ b/boxes/generators/swtypetray.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 +# Copyright (C) 2013-2014 Florian Festi +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from boxes import * +from boxes.lids import _TopEdge + +class SwTypeTray(_TopEdge): + """Type tray - allows only continuous walls""" + + ui_group = "SlatWall" + + def __init__(self): + Boxes.__init__(self) + self.addSettingsArgs(edges.FingerJointSettings) + self.addSettingsArgs(edges.StackableSettings) + self.addSettingsArgs(edges.SlatWallSettings) + self.buildArgParser("sx", "sy", "h", "hi", "outside", "bottom_edge") + self.argparser.add_argument( + "--back_height", action="store", type=float, default=0.0, + help="additional height of the back wall") + self.argparser.add_argument( + "--radius", action="store", type=float, default=0.0, + help="radius for strengthening walls with the hooks") + + + def xSlots(self): + posx = -0.5 * self.thickness + for x in self.sx[:-1]: + posx += x + self.thickness + posy = 0 + for y in self.sy: + self.fingerHolesAt(posx, posy, y) + posy += y + self.thickness + + def ySlots(self): + posy = -0.5 * self.thickness + for y in self.sy[:-1]: + posy += y + self.thickness + posx = 0 + for x in reversed(self.sx): + self.fingerHolesAt(posy, posx, x) + posx += x + self.thickness + + def xHoles(self): + posx = -0.5 * self.thickness + for x in self.sx[:-1]: + posx += x + self.thickness + self.fingerHolesAt(posx, 0, self.hi) + + def yHoles(self): + posy = -0.5 * self.thickness + for y in self.sy[:-1]: + posy += y + self.thickness + self.fingerHolesAt(posy, 0, self.hi) + + def render(self): + + # Add slat wall edges + s = edges.SlatWallSettings(self.thickness, True, + **self.edgesettings.get("SlatWall", {})) + s.edgeObjects(self) + self.slatWallHolesAt = edges.SlatWallHoles(self, s) + + + if self.outside: + self.sx = self.adjustSize(self.sx) + self.sy = self.adjustSize(self.sy) + self.h = self.adjustSize(self.h, e2=False) + if self.hi: + self.hi = self.adjustSize(self.hi, e2=False) + + x = sum(self.sx) + self.thickness * (len(self.sx) - 1) + y = sum(self.sy) + self.thickness * (len(self.sy) - 1) + h = self.h + bh = self.back_height + sameh = not self.hi + hi = self.hi = self.hi or h + t = self.thickness + + + # outer walls + b = self.bottom_edge + t1, t2, t3, t4 = "eeee" #self.topEdges(self.top_edge) + self.closedtop = False # self.top_edge in "fF" + + # x sides + + self.ctx.save() + + # outer walls + self.rectangularWall(x, h, [b, "F", t1, "F"], callback=[self.xHoles], move="up") + self.rectangularWall(x, h+bh, [b, "C", t3, "c"], callback=[self.mirrorX(self.xHoles, x), ], move="up") + + # floor + if b != "e": + self.rectangularWall(x, y, "ffff", callback=[ + self.xSlots, self.ySlots], move="up") + + # Inner walls + + be = "f" if b != "e" else "e" + + for i in range(len(self.sy) - 1): + e = [edges.SlottedEdge(self, self.sx, be), "f", + edges.SlottedEdge(self, self.sx[::-1], "e", slots=0.5 * hi), "f"] + if self.closedtop and sameh: + e = [edges.SlottedEdge(self, self.sx, be), "f", + edges.SlottedEdge(self, self.sx[::-1], "f", slots=0.5 * hi), "f"] + + self.rectangularWall(x, hi, e, move="up") + + # y walls + + # outer walls + self.trapezoidSideWall(y, h, h+bh, [b, "B", t2, "h"], radius=self.radius, callback=[self.yHoles, ], move="up") + self.moveTo(0, 8) + self.trapezoidSideWall(y, h+bh, h, [b, "h", t4, "b"], radius=self.radius, callback=[self.mirrorX(self.yHoles, y), ], move="up") + self.moveTo(0, 8) + + # inner walls + for i in range(len(self.sx) - 1): + e = [edges.SlottedEdge(self, self.sy, be, slots=0.5 * hi), + "f", "e", "f"] + if self.closedtop and sameh: + e = [edges.SlottedEdge(self, self.sy, be, slots=0.5 * hi),"f", + edges.SlottedEdge(self, self.sy[::-1], "f"), "f"] + self.rectangularWall(y, hi, e, move="up") + + + +