From 05fc5aab32214ee96caf32a9cdb9f01d360656ae Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Sat, 30 Jul 2022 23:37:54 +0200 Subject: [PATCH] New Generator: CardHolder Resolves: #279 --- boxes/__init__.py | 7 ++- boxes/generators/cardholder.py | 112 +++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 2 deletions(-) create mode 100644 boxes/generators/cardholder.py diff --git a/boxes/__init__.py b/boxes/__init__.py index 97003ab..1d26b60 100755 --- a/boxes/__init__.py +++ b/boxes/__init__.py @@ -2469,8 +2469,11 @@ class Boxes: r = min(r, x, y) a = math.atan2(y-r, float(x-r)) alpha = math.degrees(a) - - width = x + (edges[-1].spacing()+self.spacing)/math.sin(a) + edges[1].spacing() + self.spacing + print(a, alpha) + if a > 0: + width = x + (edges[-1].spacing()+self.spacing)/math.sin(a) + edges[1].spacing() + self.spacing + else: + width = x + (edges[-1].spacing()+self.spacing) + edges[1].spacing() + self.spacing height = y + edges[0].spacing() + edges[2].spacing() * math.cos(a) + 2* self.spacing + self.spacing if num > 1: width = 2*width - x + r - self.spacing diff --git a/boxes/generators/cardholder.py b/boxes/generators/cardholder.py new file mode 100644 index 0000000..1fa6caf --- /dev/null +++ b/boxes/generators/cardholder.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +# Copyright (C) 2013-2021 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 * + + +class CardHolder(Boxes): + """Shelf for holding (multiple) piles of playing cards / notes""" + + ui_group = "Shelf" + + def __init__(self): + Boxes.__init__(self) + + self.addSettingsArgs(edges.GroovedSettings) + self.addSettingsArgs(edges.FingerJointSettings, surroundingspaces=1.0) + + self.buildArgParser(sx="68*3", y=100, h=40, outside=False) + self.argparser.add_argument( + "--angle", action="store", type=float, default=7.5, + help="backward angle of floor") + self.argparser.add_argument( + "--stackable", action="store", type=boolarg, default=True, + help="make holders stackable") + + def side(self): + t = self.thickness + a = math.radians(self.angle) + + pos_y = self.y - abs(0.5 * t * math.sin(a)) + pos_h = t - math.cos(a) * 0.5 * t + self.fingerHolesAt(pos_y, pos_h, self.y, 180-self.angle) + + def fingerHoleCB(self, length, posy=0.0): + def CB(): + t = self.thickness + px = -0.5 * t + for x in self.sx[:-1]: + px += x + t + self.fingerHolesAt(px, posy, length, 90) + return CB + + def middleWall(self, move=None): + y, h = self.y , self.h + a = self.angle + t = self.thickness + tw = y + t + th = h + + if self.move(tw, th, move, True): + return + + self.moveTo(t, t, a) + + self.edges["f"](y) + self.polyline(0, 90-a, h-t-y*math.sin(math.radians(a)), 90, + y*math.cos(math.radians(a)), 90) + self.edges["f"](h-t) + + self.move(tw, th, move) + + def render(self): + sx, y = self.sx, self.y + t = self.thickness + + bottom = "ลก" if self.stackable else "e" + top = "S" if self.stackable else "e" + + if self.outside: + self.sx = sx = self.adjustSize(sx) + h = self.h = self.adjustSize(self.h, bottom, top) + else: + h = self.h = self.h + t + y * math.sin(math.radians(self.angle)) + self.x = x = sum(sx) + t * (len(sx) - 1) + + self.rectangularWall(y, h, [bottom, "F", top, "e"], + ignore_widths=[1, 6], + callback=[self.side], move="up") + self.rectangularWall(y, h, [bottom, "F", top, "e"], + ignore_widths=[1, 6], + callback=[self.side], move="up mirror") + + nx = len(sx) + f_lengths = [] + for val in self.sx: + f_lengths.append(val) + f_lengths.append(t) + f_lengths = f_lengths[:-1] + + frontedge = edges.CompoundEdge( + self, "e".join("z" * nx), f_lengths) + + self.rectangularWall(x, y, [frontedge, "f", "e", "f"], + callback=[self.fingerHoleCB(y)], move="up") + self.rectangularWall(x, h, bottom + "f" + top + "f", + ignore_widths=[1, 6], + callback=[self.fingerHoleCB(h-t, t)], move="up") + for i in range(nx-1): + self.middleWall(move="right")