197 lines
5.9 KiB
Python
197 lines
5.9 KiB
Python
|
"""Generator for a split atreus keyboard."""
|
||
|
|
||
|
from copy import deepcopy
|
||
|
|
||
|
from boxes import Boxes, Color, holeCol, restore, boolarg
|
||
|
from boxes.edges import FingerJointSettings
|
||
|
|
||
|
|
||
|
class Atreus21(Boxes):
|
||
|
"""Generator for a split atreus keyboard."""
|
||
|
ui_group = 'Misc'
|
||
|
btn_size = 15.6
|
||
|
btn_outer = btn_size + 3.4
|
||
|
border = 6
|
||
|
|
||
|
row_offsets=[3, 6, 11, 5, 0, btn_size * .5]
|
||
|
row_keys=[4, 4, 4, 4, 4, 1]
|
||
|
|
||
|
def __init__(self):
|
||
|
super().__init__()
|
||
|
self.argparser.add_argument(
|
||
|
'--top1_thickness', action='store', type=float, default=1.5,
|
||
|
help=('thickness of the button hold layer, cherry like switches '
|
||
|
'need 1.5mm or smaller to snap in')
|
||
|
)
|
||
|
self.argparser.add_argument(
|
||
|
'--top2_enable', action='store', type=boolarg, default=False,
|
||
|
help=('enables another top layer that can hold CPG151101S11 '
|
||
|
'sockets')
|
||
|
)
|
||
|
self.argparser.add_argument(
|
||
|
'--top2_thickness', action='store', type=float, default=1.5,
|
||
|
help=('thickness of the hotplug layer, CPG151101S11 sockets '
|
||
|
'need 1.2mm to 1.5mm')
|
||
|
)
|
||
|
self.addSettingsArgs(FingerJointSettings, surroundingspaces=1)
|
||
|
|
||
|
def render(self):
|
||
|
"""Renders the keypad."""
|
||
|
# deeper edge for top to add multiple layers
|
||
|
deep_edge = deepcopy(self.edges['f'].settings)
|
||
|
deep_edge.thickness = self.thickness + self.top1_thickness
|
||
|
if self.top2_enable:
|
||
|
deep_edge.thickness += self.top2_thickness
|
||
|
deep_edge.edgeObjects(self, 'gGH', True)
|
||
|
|
||
|
self.moveTo(10, 30)
|
||
|
case_x, case_y = self._case_x_y()
|
||
|
|
||
|
self.hole(0, 0, d=0.7)
|
||
|
|
||
|
for reverse in [False, True]:
|
||
|
# keyholder
|
||
|
self.outer()
|
||
|
self.half(reverse=reverse)
|
||
|
self.holes()
|
||
|
self.moveTo(case_x + 13)
|
||
|
|
||
|
# support
|
||
|
self.outer()
|
||
|
self.half(self.support, reverse=reverse)
|
||
|
self.holes()
|
||
|
self.moveTo(-case_x - 13, case_y + 13)
|
||
|
|
||
|
# hotplug
|
||
|
self.outer()
|
||
|
self.half(self.hotplug, reverse=reverse)
|
||
|
self.holes()
|
||
|
self.moveTo(case_x + 13)
|
||
|
|
||
|
# border
|
||
|
self.outer()
|
||
|
self.rim()
|
||
|
self.holes()
|
||
|
self.moveTo(-case_x - 13, case_y + 13)
|
||
|
|
||
|
|
||
|
def holes(self):
|
||
|
case_x, case_y = self._case_x_y()
|
||
|
self.hole(-1.5, -1.5, d=3)
|
||
|
self.hole(case_x + 1.5, -1.5, d=3)
|
||
|
self.hole(-1.5, case_y + 1.5, d=3)
|
||
|
self.hole(case_x + 1.5, case_y + 1.5, d=3)
|
||
|
|
||
|
def micro(self):
|
||
|
x = 17.9
|
||
|
y = 33
|
||
|
b = self.border
|
||
|
case_x, case_y = self._case_x_y()
|
||
|
self.rectangularHole(
|
||
|
x * -.5 + case_x + b * .5,
|
||
|
y * -.5 + case_y + b * .5,
|
||
|
x, y
|
||
|
)
|
||
|
|
||
|
def rim(self):
|
||
|
s = 5
|
||
|
x, y = self._case_x_y()
|
||
|
self.moveTo(x * .5, y * .5)
|
||
|
self.rectangularHole(0, 0, x, y, 5)
|
||
|
self.moveTo(x * -.5, y * -.5)
|
||
|
|
||
|
def outer(self):
|
||
|
x, y = self._case_x_y()
|
||
|
b = self.border
|
||
|
self.moveTo(0, -b)
|
||
|
corner = [90, b]
|
||
|
self.polyline(*([x, corner, y, corner] * 2))
|
||
|
self.moveTo(0, b)
|
||
|
|
||
|
def half(self, cb=None, reverse=False):
|
||
|
row_offsets=self.row_offsets
|
||
|
row_keys=self.row_keys
|
||
|
scheme = list(zip(row_offsets, row_keys))
|
||
|
if reverse:
|
||
|
scheme.reverse()
|
||
|
for offset, keys in scheme:
|
||
|
self.moveTo(0, offset)
|
||
|
self.key_row(keys, cb)
|
||
|
self.moveTo(self.btn_outer)
|
||
|
self.moveTo(0, -offset)
|
||
|
|
||
|
total_moved_rows = len(row_offsets) * (self.btn_outer)
|
||
|
self.moveTo(total_moved_rows * -1, 0)
|
||
|
|
||
|
def key_row(self, n, hole_cb=None):
|
||
|
"""Callback for the key holes."""
|
||
|
if hole_cb == None:
|
||
|
hole_cb = self.key
|
||
|
for _ in range(n):
|
||
|
hole_cb()
|
||
|
self.moveTo(0, -n * (self.btn_outer))
|
||
|
|
||
|
def support(self):
|
||
|
btn = [11.6, (-90, 2)] * 4
|
||
|
self.set_source_color(Color.BLUE)
|
||
|
self.moveTo(0, 2, 90)
|
||
|
self.polyline(*btn)
|
||
|
self.moveTo(-2, 0, 270)
|
||
|
self.moveTo(0, self.btn_outer)
|
||
|
self.set_source_color(Color.BLACK)
|
||
|
|
||
|
def hotplug(self):
|
||
|
self.moveTo(7.8 , 7.8)
|
||
|
self.hole(0, 0, d=4)
|
||
|
self.hole(1.27 * -3, 1.27 * 2, d=2.9)
|
||
|
self.hole(1.27 * 2, 1.27 * 4, d=2.9)
|
||
|
|
||
|
# pcb mounts
|
||
|
self.hole(1.27 * -4, 0, d=1.7)
|
||
|
self.hole(1.27 * 4, 0, d=1.7)
|
||
|
|
||
|
self.moveTo(-7.8, -7.8)
|
||
|
self.moveTo(0, self.btn_outer)
|
||
|
|
||
|
def key(self):
|
||
|
self.set_source_color(Color.BLUE)
|
||
|
|
||
|
# draw clock wise to work with burn correction
|
||
|
btn_half_side = [0.98, 90, 0.81, -90, 3.5, -90, 0.81, 90, 2.505]
|
||
|
btn_full_side = [*btn_half_side, 0, *btn_half_side[::-1]]
|
||
|
btn = [*btn_full_side, -90] * 4
|
||
|
|
||
|
self.moveTo(0.81, 0.81, 90)
|
||
|
self.polyline(*btn)
|
||
|
self.moveTo(0, 0, 270)
|
||
|
self.moveTo(-0.81, -0.81)
|
||
|
self.moveTo(0, self.btn_outer)
|
||
|
|
||
|
self.set_source_color(Color.BLACK)
|
||
|
|
||
|
# stolen form electronics-box
|
||
|
def wallx_cb(self):
|
||
|
"""Callback for triangle holes on x-side."""
|
||
|
x, _ = self._get_x_y()
|
||
|
t = self.thickness
|
||
|
self.fingerHolesAt(0, self.h - 1.5 * t, self.triangle, 0)
|
||
|
self.fingerHolesAt(x, self.h - 1.5 * t, self.triangle, 180)
|
||
|
|
||
|
# stolen form electronics-box
|
||
|
def wally_cb(self):
|
||
|
"""Callback for triangle holes on y-side."""
|
||
|
_, y = self._get_x_y()
|
||
|
t = self.thickness
|
||
|
self.fingerHolesAt(0, self.h - 1.5 * t, self.triangle, 0)
|
||
|
self.fingerHolesAt(y, self.h - 1.5 * t, self.triangle, 180)
|
||
|
|
||
|
# get case sizes
|
||
|
def _case_x_y(self):
|
||
|
x = len(self.row_offsets) * self.btn_outer - 4
|
||
|
y = sum([
|
||
|
max(self.row_keys) * self.btn_outer, # total button sizes
|
||
|
max(self.row_offsets), # offset of highest row
|
||
|
-4,
|
||
|
])
|
||
|
return x, y
|