Add Edge types, example and UIGroup for slat wall compatible boxes
This commit is contained in:
parent
753422fa46
commit
aadf5ceafc
190
boxes/edges.py
190
boxes/edges.py
|
@ -1991,3 +1991,193 @@ class RoundedTriangleEdge(Edge):
|
||||||
|
|
||||||
def margin(self):
|
def margin(self):
|
||||||
return self.settings.height + self.settings.radius
|
return self.settings.height + self.settings.radius
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
#### Slat wall
|
||||||
|
#############################################################################
|
||||||
|
|
||||||
|
class SlatWallSettings(Settings):
|
||||||
|
|
||||||
|
"""Settings for SlatWallEdges
|
||||||
|
Values:
|
||||||
|
|
||||||
|
* absolute_params
|
||||||
|
|
||||||
|
|
||||||
|
* relative (in multiples of thickness)
|
||||||
|
|
||||||
|
* hook_extra_height : 2.0 : space surrounding connectors (in multiples of thickness)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
absolute_params = {
|
||||||
|
}
|
||||||
|
|
||||||
|
relative_params = {
|
||||||
|
"hook_extra_height" : 2.0,
|
||||||
|
}
|
||||||
|
|
||||||
|
def edgeObjects(self, boxes, chars="aAbBcC", add=True):
|
||||||
|
edges = [SlatWallEdge(boxes, self),
|
||||||
|
SlatWallEdgeReversed(boxes, self),
|
||||||
|
SlatWallJoinedEdge(boxes, self),
|
||||||
|
SlatWallJoinedEdgeReversed(boxes, self),
|
||||||
|
SlatWallBackEdge(boxes, self),
|
||||||
|
SlatWallBackEdgeReversed(boxes, self),
|
||||||
|
]
|
||||||
|
return self._edgeObjects(edges, boxes, chars, add)
|
||||||
|
|
||||||
|
|
||||||
|
class SlatWallEdge(BaseEdge):
|
||||||
|
|
||||||
|
char = "a"
|
||||||
|
reversed_ = False
|
||||||
|
|
||||||
|
def _top_hook(self, reversed_=False):
|
||||||
|
w = 6
|
||||||
|
ro = 6
|
||||||
|
ri = 2
|
||||||
|
rt = min(1, w/2)
|
||||||
|
poly = [0, -90, 5.5-ri, (-90, ri), 12-ri-w-rt, (90, rt),
|
||||||
|
w-2*rt, (90, rt), 12-ro-rt, (90, ro), 5.5+w-ro, -90,
|
||||||
|
self.settings.hook_extra_height]
|
||||||
|
if reversed_:
|
||||||
|
poly = reversed(poly)
|
||||||
|
self.polyline(*poly)
|
||||||
|
|
||||||
|
def _top_hook_len(self):
|
||||||
|
w = 6 + 1
|
||||||
|
return (w, self.settings.hook_extra_height - 1)
|
||||||
|
|
||||||
|
def _bottom_hook(self, reversed_=False):
|
||||||
|
slot = 8
|
||||||
|
r_plug = slot*.4
|
||||||
|
slotslot = slot - r_plug * 2**0.5
|
||||||
|
poly = [self.settings.hook_extra_height, -90,
|
||||||
|
5.0, -45, 0, (135, r_plug),
|
||||||
|
0, 90, 10, -90, slotslot, -90, 10, 90, 0,
|
||||||
|
(135, r_plug), 0, -45, 5, -90, self.settings.hook_extra_height]
|
||||||
|
if reversed_:
|
||||||
|
poly = reversed(poly)
|
||||||
|
self.polyline(*poly)
|
||||||
|
|
||||||
|
def _bottom_hook_len(self):
|
||||||
|
slot = 8
|
||||||
|
return (slot + self.settings.hook_extra_height,
|
||||||
|
self.settings.hook_extra_height)
|
||||||
|
|
||||||
|
def _joint(self, length, reversed_=False):
|
||||||
|
self.polyline(length)
|
||||||
|
|
||||||
|
def __call__(self, length, **kw):
|
||||||
|
step = 100
|
||||||
|
tht, thb = self._top_hook_len()
|
||||||
|
bht, bhb = self._bottom_hook_len()
|
||||||
|
|
||||||
|
if length >= step + tht + bhb:
|
||||||
|
top_len = ((length-tht-1) // step) * step - thb - bht
|
||||||
|
bottom_len = (length-tht) % step - bhb
|
||||||
|
else:
|
||||||
|
top_len = length-tht-thb
|
||||||
|
bottom_len = None
|
||||||
|
|
||||||
|
if self.reversed_:
|
||||||
|
if bottom_len is not None:
|
||||||
|
self._joint(bottom_len, True)
|
||||||
|
self._bottom_hook(True)
|
||||||
|
self._joint(top_len, True)
|
||||||
|
self._top_hook(True)
|
||||||
|
else:
|
||||||
|
self._top_hook()
|
||||||
|
self._joint(top_len, True)
|
||||||
|
if bottom_len is not None:
|
||||||
|
self._bottom_hook(True)
|
||||||
|
self._joint(bottom_len, True)
|
||||||
|
|
||||||
|
def margin(self):
|
||||||
|
return 6+5.5
|
||||||
|
|
||||||
|
class SlatWallEdgeReversed(SlatWallEdge):
|
||||||
|
char = "A"
|
||||||
|
reversed_ = True
|
||||||
|
|
||||||
|
class SlatWallJoinedEdge(SlatWallEdge):
|
||||||
|
char = "b"
|
||||||
|
|
||||||
|
def _joint(self, length, reversed_=False):
|
||||||
|
t = self.settings.thickness
|
||||||
|
self.polyline(0, 90, t, -90)
|
||||||
|
self.edges["f"](length)
|
||||||
|
self.polyline(0, -90, t, 90)
|
||||||
|
|
||||||
|
def start_width(self):
|
||||||
|
return self.settings.thickness
|
||||||
|
|
||||||
|
class SlatWallJoinedEdgeReversed(SlatWallJoinedEdge):
|
||||||
|
char = "B"
|
||||||
|
reversed_ = True
|
||||||
|
|
||||||
|
class SlatWallBackEdge(SlatWallEdge):
|
||||||
|
|
||||||
|
char = "c"
|
||||||
|
|
||||||
|
def _top_hook(self, reversed_=False):
|
||||||
|
self.polyline(sum(self._top_hook_len()))
|
||||||
|
|
||||||
|
def _bottom_hook(self, reversed_=False):
|
||||||
|
self.polyline(sum(self._bottom_hook_len()))
|
||||||
|
|
||||||
|
def _joint(self, length, reversed_=False):
|
||||||
|
t = self.settings.thickness
|
||||||
|
self.polyline(0, -90, t, 90)
|
||||||
|
self.edges["F"](length)
|
||||||
|
self.polyline(0, 90, t, -90)
|
||||||
|
|
||||||
|
def margin(self):
|
||||||
|
return self.settings.thickness
|
||||||
|
|
||||||
|
class SlatWallBackEdgeReversed(SlatWallBackEdge):
|
||||||
|
char = "C"
|
||||||
|
reversed_ = True
|
||||||
|
|
||||||
|
class SlatWallHoles(SlatWallEdge):
|
||||||
|
|
||||||
|
reversed_ = True
|
||||||
|
|
||||||
|
def _top_hook(self, reversed_=False):
|
||||||
|
h = sum(self._top_hook_len())
|
||||||
|
self.rectangularHole(h/2, 0, h, self.settings.thickness)
|
||||||
|
self.moveTo(h, 0)
|
||||||
|
|
||||||
|
def _bottom_hook(self, reversed_=False):
|
||||||
|
h = sum(self._bottom_hook_len())
|
||||||
|
self.rectangularHole(h/2, 0, h, self.settings.thickness)
|
||||||
|
self.moveTo(h, 0)
|
||||||
|
|
||||||
|
def _joint(self, length, reversed_=False):
|
||||||
|
self.fingerHolesAt(0, 0, length, 0)
|
||||||
|
self.moveTo(length, 0)
|
||||||
|
|
||||||
|
def __call__(self, x, y, length, angle, **kw):
|
||||||
|
"""
|
||||||
|
Draw holes for a matching SlatWallJoinedEdge
|
||||||
|
|
||||||
|
:param x: position
|
||||||
|
:param y: position
|
||||||
|
:param length: length of matching edge
|
||||||
|
:param angle: (Default value = 90)
|
||||||
|
:param bedBolts: (Default value = None)
|
||||||
|
:param bedBoltSettings: (Default value = None)
|
||||||
|
|
||||||
|
"""
|
||||||
|
with self.boxes.saved_context():
|
||||||
|
self.boxes.moveTo(x, y, angle)
|
||||||
|
b = self.boxes.burn
|
||||||
|
t = self.settings.thickness
|
||||||
|
|
||||||
|
if self.boxes.debug: # XXX
|
||||||
|
width = self.settings.thickness
|
||||||
|
self.ctx.rectangle(b, -width / 2 + b,
|
||||||
|
length - 2 * b, width - 2 * b)
|
||||||
|
|
||||||
|
SlatWallEdge.__call__(self, length)
|
||||||
|
|
|
@ -24,6 +24,7 @@ ui_groups = [
|
||||||
UIGroup("FlexBox", "Boxes with flex"),
|
UIGroup("FlexBox", "Boxes with flex"),
|
||||||
UIGroup("Tray", "Trays and Drawer Inserts"),
|
UIGroup("Tray", "Trays and Drawer Inserts"),
|
||||||
UIGroup("Shelf", "Shelves"),
|
UIGroup("Shelf", "Shelves"),
|
||||||
|
UIGroup("SlatWall"),
|
||||||
UIGroup("Part", "Parts and Samples"),
|
UIGroup("Part", "Parts and Samples"),
|
||||||
UIGroup("Misc"),
|
UIGroup("Misc"),
|
||||||
UIGroup("Unstable", description="Generators are still untested or need manual adjustment to be useful."),
|
UIGroup("Unstable", description="Generators are still untested or need manual adjustment to be useful."),
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# 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 SlatwallEdges(Boxes):
|
||||||
|
"""Shows the different edge types for slat walls"""
|
||||||
|
|
||||||
|
ui_group = "SlatWall" # see ./__init__.py for names
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
Boxes.__init__(self)
|
||||||
|
|
||||||
|
self.addSettingsArgs(edges.FingerJointSettings)
|
||||||
|
self.addSettingsArgs(edges.SlatWallSettings)
|
||||||
|
self.buildArgParser(h=120)
|
||||||
|
|
||||||
|
def render(self):
|
||||||
|
|
||||||
|
s = edges.SlatWallSettings(self.thickness, True,
|
||||||
|
**self.edgesettings.get("SlatWall", {}))
|
||||||
|
s.edgeObjects(self)
|
||||||
|
self.slatWallHolesAt = edges.SlatWallHoles(self, s)
|
||||||
|
|
||||||
|
h = self.h
|
||||||
|
|
||||||
|
for i, c in enumerate("aAbBcC"):
|
||||||
|
self.text(c, x=i*30+15, y=5)
|
||||||
|
self.text("slatWallHolesAt", 115, 15)
|
||||||
|
self.moveTo(0, 25)
|
||||||
|
self.rectangularWall(40, h, "eAea", move="right")
|
||||||
|
self.rectangularWall(40, h, "eBeb", move="right")
|
||||||
|
self.rectangularWall(40, h, "eCec", callback=[
|
||||||
|
lambda: self.slatWallHolesAt(20, 0, h, 90)], move="right")
|
Loading…
Reference in New Issue