From 31fd0024eedcc9ed02f148eb3093acc43e909c0c Mon Sep 17 00:00:00 2001 From: Florian Festi Date: Sun, 6 Jan 2019 10:09:31 +0100 Subject: [PATCH] Add RoundedTriangleEdge t Based on the Caddy generator by bobm123 in the PR #14 (https://github.com/florianfesti/boxes/pull/14) Edge will be added to the TypeTray generator to achieve similar results as Caddy Co-authored-by: bobm123 --- boxes/__init__.py | 3 +++ boxes/edges.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/boxes/__init__.py b/boxes/__init__.py index 67f6334..bf9c2c2 100755 --- a/boxes/__init__.py +++ b/boxes/__init__.py @@ -445,6 +445,9 @@ class Boxes: # Sliding Lid edges.LidSettings(self.thickness, True, **self.edgesettings.get("Lid", {})).edgeObjects(self) + # Rounded Triangle Edge + edges.RoundedTriangleEdgeSettings(self.thickness, True, + **self.edgesettings.get("RoundedTriangleEdge", {})).edgeObjects(self) # Nuts self.addPart(NutHole(self, None)) diff --git a/boxes/edges.py b/boxes/edges.py index 05c3a0c..9c98c29 100644 --- a/boxes/edges.py +++ b/boxes/edges.py @@ -1906,3 +1906,59 @@ class RackEdge(BaseEdge): def margin(self): return self.settings.dimension * 1.1 + +class RoundedTriangleEdgeSettings(Settings): + + """Settings for RoundedTriangleEdge +Values: + +* absolute_params + + * height : 150. : height above the wall + * radius : 30. : radius of top corner + * r_hole : 0. : radius of hole +""" + + absolute_params = { + "height" : 150., + "radius" : 30., + "r_hole" : 2., + } + + relative_params = { + "outset" : 0., + } + + def edgeObjects(self, boxes, chars="t", add=True): + edges = [RoundedTriangleEdge(boxes, self)] + return self._edgeObjects(edges, boxes, chars, add) + +class RoundedTriangleEdge(Edge): + """Makes an 'edge' with a rounded triangular bumpout and + optional hole""" + description = "Triangle for handle" + char = "t" + def __call__(self, length, **kw): + r = self.settings.radius + if r > length / 2: + r = length / 2 + if length-2*r < self.settings.height: # avoid division by zero + angle = 90-math.degrees(math.atan( + (length-2*r)/(2*self.settings.height))) + l = self.settings.height / math.cos(math.radians(90-angle)) + else: + angle = math.degrees(math.atan( + 2*self.settings.height/(length-2*r))) + l = 0.5 * (length-2*r) / math.cos(math.radians(angle)) + if self.settings.r_hole: + self.hole(length/2., -self.settings.height, self.settings.r_hole) + self.corner(-90) + self.corner(90-angle, r) + self.edge(l) + self.corner(2*angle, r) + self.edge(l) + self.corner(90-angle, r) + self.corner(-90) + + def margin(self): + return self.settings.height + self.settings.radius