Source code for boxes.generators.stackablebin

# Copyright (C) 2013-2016 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 <http://www.gnu.org/licenses/>.

from boxes import *


class StackableBinEdge(edges.BaseEdge):
    char = "B"

    def __call__(self, length, **kw):
        f = self.settings.front
        a1 = math.degrees(math.atan(f/(1-f)))
        a2 = 45 + a1
        self.corner(-a1)

        self.edges["e"](self.settings.h* (f**2+(1-f)**2)**0.5)
        self.corner(a2)
        self.edges["f"](self.settings.h*f*2**0.5)

        self.corner(-45)

    def margin(self) -> float:
        return self.settings.h * self.settings.front

class StackableBinSideEdge(StackableBinEdge):
    char = 'b'

[docs] class StackableBin(Boxes): """Stackable bin base on bintray""" ui_group = "Shelf" def __init__(self) -> None: Boxes.__init__(self) self.addSettingsArgs(edges.StackableSettings, bottom_stabilizers=2.4) self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=0.5) self.buildArgParser("outside") self.buildArgParser(x=70, h=50) self.argparser.add_argument( "--d", action="store", type=float, default=100, help="bin (d)epth") self.argparser.add_argument( "--front", action="store", type=float, default=0.4, help="fraction of bin height covered with slope") def render(self): self.front = min(self.front, 0.999) self.addPart(StackableBinEdge(self, self)) self.addPart(StackableBinSideEdge(self, self)) angledsettings = copy.deepcopy(self.edges["f"].settings) angledsettings.setValues(self.thickness, True, angle=45) angledsettings.edgeObjects(self, chars="gGH") if self.outside: self.x = self.adjustSize(self.x) self.h = self.adjustSize(self.h, "s", "S") self.d = self.adjustSize(self.d, "h", "b") with self.saved_context(): self.rectangularWall(self.x, self.d, "ffGf", label="bottom", move="up") self.rectangularWall(self.x, self.h, "hfef", label="back", move="up ") self.rectangularWall(self.x, self.h*self.front*2**0.5, "gFeF", label="retainer", move="up") self.rectangularWall(self.x, 3, "EEEE", label="for label (optional)") self.rectangularWall(self.x, 3, "EEEE", label="movement", move="right only") self.rectangularWall(self.d, self.h, "shSb", label="left", move="up") self.rectangularWall(self.d, self.h, "shSb", label="right", move="mirror up")