Skip to content

Commit 874af95

Browse files
committed
Dry up implementation of alternating finger joints
1 parent d7f20d5 commit 874af95

2 files changed

Lines changed: 21 additions & 77 deletions

File tree

boxes/edges.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import math
2020
import re
2121
from abc import ABC, abstractmethod
22-
from typing import Any
22+
from typing import Any, Literal
2323

2424
from boxes import gears
2525

@@ -872,6 +872,8 @@ class FingerJointSettings(Settings):
872872

873873
angle = 90 # Angle of the walls meeting
874874

875+
alternating: Literal['even', 'odd'] | None = None # even or odd for which alternating pattern to use
876+
875877
def checkValues(self) -> None:
876878
if abs(self.space + self.finger) < 0.1:
877879
raise ValueError("FingerJointSettings: space + finger must not be close to zero")
@@ -976,6 +978,7 @@ def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw):
976978
play = self.settings.play
977979

978980
fingers, leftover = self.calcFingers(length, bedBolts)
981+
altMod = 1 if self.settings.alternating == "odd" and fingers % 2 == 1 else 0
979982

980983
# not enough space for normal fingers - use small rectangular one
981984
if (fingers == 0 and f and
@@ -1007,8 +1010,13 @@ def __call__(self, length, bedBolts=None, bedBoltSettings=None, **kw):
10071010
self.bedBoltHole(s, bedBoltSettings)
10081011
else:
10091012
self.edge(s)
1010-
self.draw_finger(f, h, style,
1011-
positive, i < fingers // 2)
1013+
1014+
# Skip finger if alternating
1015+
if self.settings.alternating and i % 2 == altMod:
1016+
self.edge(f)
1017+
else:
1018+
self.draw_finger(f, h, style,
1019+
positive, i < fingers // 2)
10121020

10131021
self.edge(leftover / 2.0, tabs=1)
10141022

boxes/generators/apothecarydrawerbox.py

Lines changed: 10 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,11 @@
11
from boxes import *
22
from boxes.edges import FingerJointEdge
3+
import copy
34

45
# Dependent generators for drawers
56
from boxes.generators.abox import ABox
67
from boxes.generators.dividertray import DividerTray
78

8-
class AlternatingFingerJointEdgeEven(FingerJointEdge):
9-
"""Alternating finger joint edge """
10-
char = 'a'
11-
description = "Alternating Finger Joint"
12-
positive = True
13-
14-
# Pasted from FingerJointEdge but with added alternate args and rendering
15-
def __call__(self, length, bedBolts=None, bedBoltSettings=None, alternate=True, altMod=0, **kw):
16-
positive = self.positive
17-
t = self.settings.thickness
18-
19-
s, f = self.settings.space, self.settings.finger
20-
thickness = self.settings.thickness
21-
style = self.settings.style
22-
play = self.settings.play
23-
24-
fingers, leftover = self.calcFingers(length, bedBolts)
25-
26-
if (fingers == 0 and f and
27-
leftover > 0.75 * thickness and leftover > 4 * play):
28-
fingers = 1
29-
f = leftover = leftover / 2.0
30-
bedBolts = None
31-
style = "rectangular"
32-
33-
if not positive:
34-
f += play
35-
s -= play
36-
leftover -= play
37-
38-
self.edge(leftover / 2.0, tabs=1)
39-
40-
l1, l2 = self.fingerLength(self.settings.angle)
41-
h = l1 - l2
42-
43-
d = (bedBoltSettings or self.bedBoltSettings)[0]
44-
45-
for i in range(fingers):
46-
if i != 0:
47-
if not positive and bedBolts and bedBolts.drawBolt(i):
48-
self.hole(0.5 * s,
49-
0.5 * self.settings.thickness, 0.5 * d)
50-
51-
if positive and bedBolts and bedBolts.drawBolt(i):
52-
self.bedBoltHole(s, bedBoltSettings)
53-
else:
54-
self.edge(s)
55-
56-
# Skip finger if alternating
57-
if alternate and i % 2 == altMod:
58-
self.edge(f)
59-
else:
60-
self.draw_finger(f, h, style,
61-
positive, i < fingers // 2)
62-
63-
self.edge(leftover / 2.0, tabs=1)
64-
65-
class AlternatingFingerJointEdgeOdd(AlternatingFingerJointEdgeEven):
66-
"""Alternating finger joint edge """
67-
char = 'b'
68-
description = "Alternating Finger Joint"
69-
positive = True
70-
71-
def __call__(self, length, bedBolts=None, bedBoltSettings=None, alternate=True, altMod=1, **kw):
72-
fingers, leftover = self.calcFingers(length, bedBolts)
73-
# Handles odd number of fingers
74-
if fingers % 2 == 0:
75-
altMod = 0
76-
77-
super().__call__(length, bedBolts, bedBoltSettings, alternate=alternate, altMod=altMod, **kw)
78-
799
class DrawerSettings(edges.Settings):
8010
"""Settings for the Drawers
8111
Values:
@@ -156,10 +86,16 @@ def render(self):
15686
drawer_settings = self.edgesettings['Drawer']
15787
drawer_style = drawer_settings['style']
15888

159-
# Add alternating finger joint edges
160-
altEven = AlternatingFingerJointEdgeEven(self, self.edges["f"].settings)
89+
altFingerSettings = copy.copy(self.edges["f"].settings)
90+
# Even joint edge
91+
altEven = FingerJointEdge(self, altFingerSettings)
92+
altEven.settings.alternating = "even"
93+
altEven.char = "a"
16194
self.addPart(altEven)
162-
altOdd = AlternatingFingerJointEdgeOdd(self, self.edges["f"].settings)
95+
# Odd joint edge
96+
altOdd = FingerJointEdge(self, altFingerSettings)
97+
altOdd.settings.alternating = "odd"
98+
altOdd.char = "b"
16399
self.addPart(altOdd)
164100

165101
# Back panel

0 commit comments

Comments
 (0)