summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Shreve <j.a.shreve@gmail.com>2021-09-05 12:42:29 -0400
committerJoshua Shreve <j.a.shreve@gmail.com>2021-09-05 12:42:29 -0400
commit69af2b76200742c68d62aa4d8176009795cdf66f (patch)
treed4f2356ab07cfa15d6c418a678ff5a86a724b624
parent3ebbe5dd2cbc406e93418ac9fb06fbbf175785ba (diff)
Added separable thumbs and cleaned up all the connections and thumb connections.
Added separable thumbs and cleaned up all the connections and thumb connections. Thumb connections previously contained what should be in the finger connections. Added extra screws for separable thumb config to secure it. Previously had one screw.
-rw-r--r--resources/multithumb_test.PNGbin0 -> 73978 bytes
-rw-r--r--src/dactyl_manuform.py518
-rw-r--r--src/generate_configuration.py37
-rw-r--r--src/run_config.json144
4 files changed, 344 insertions, 355 deletions
diff --git a/resources/multithumb_test.PNG b/resources/multithumb_test.PNG
new file mode 100644
index 0000000..7371b2c
--- /dev/null
+++ b/resources/multithumb_test.PNG
Binary files differ
diff --git a/src/dactyl_manuform.py b/src/dactyl_manuform.py
index 9913086..0e79458 100644
--- a/src/dactyl_manuform.py
+++ b/src/dactyl_manuform.py
@@ -569,7 +569,11 @@ def connectors():
debugprint('connectors()')
hulls = []
for column in range(ncols - 1):
- for row in range(lastrow): # need to consider last_row?
+ if (column in [2]):
+ iterrows = lastrow+1
+ else:
+ iterrows = lastrow
+ for row in range(iterrows): # need to consider last_row?
# for row in range(nrows): # need to consider last_row?
places = []
places.append(key_place(web_post_tl(), column + 1, row))
@@ -579,8 +583,11 @@ def connectors():
hulls.append(triangle_hulls(places))
for column in range(ncols):
- # for row in range(nrows-1):
- for row in range(cornerrow):
+ if (column in [2, 3]):
+ iterrows = lastrow
+ else:
+ iterrows = cornerrow
+ for row in range(iterrows):
places = []
places.append(key_place(web_post_bl(), column, row))
places.append(key_place(web_post_br(), column, row))
@@ -589,8 +596,11 @@ def connectors():
hulls.append(triangle_hulls(places))
for column in range(ncols - 1):
- # for row in range(nrows-1): # need to consider last_row?
- for row in range(cornerrow): # need to consider last_row?
+ if (column in [2]):
+ iterrows = lastrow
+ else:
+ iterrows = cornerrow
+ for row in range(iterrows):
places = []
places.append(key_place(web_post_br(), column, row))
places.append(key_place(web_post_tr(), column, row + 1))
@@ -598,6 +608,22 @@ def connectors():
places.append(key_place(web_post_tl(), column + 1, row + 1))
hulls.append(triangle_hulls(places))
+ if column == 1:
+ places = []
+ places.append(key_place(web_post_bl(), column + 1, iterrows))
+ places.append(key_place(web_post_br(), column, iterrows))
+ places.append(key_place(web_post_tl(), column + 1, iterrows + 1))
+ places.append(key_place(web_post_bl(), column + 1, iterrows + 1))
+ hulls.append(triangle_hulls(places))
+ if column == 3:
+ places = []
+ places.append(key_place(web_post_br(), column, iterrows))
+ places.append(key_place(web_post_bl(), column + 1, iterrows))
+ places.append(key_place(web_post_tr(), column, iterrows + 1))
+ places.append(key_place(web_post_br(), column, iterrows + 1))
+ hulls.append(triangle_hulls(places))
+
+
return union(hulls)
@@ -1006,19 +1032,12 @@ def default_thumb_connectors():
key_place(web_post_bl(), 1, cornerrow),
default_thumb_tr_place(web_post_tr()),
key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
key_place(web_post_bl(), 2, lastrow),
default_thumb_tr_place(web_post_tr()),
key_place(web_post_bl(), 2, lastrow),
default_thumb_tr_place(web_post_br()),
key_place(web_post_br(), 2, lastrow),
key_place(web_post_bl(), 3, lastrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, cornerrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- key_place(web_post_bl(), 4, cornerrow),
]
)
)
@@ -1040,41 +1059,10 @@ def default_thumb_connectors():
key_place(web_post_bl(), 2, lastrow),
default_thumb_tr_place(thumb_post_br()),
key_place(web_post_br(), 2, lastrow),
- key_place(web_post_bl(), 3, lastrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, cornerrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- key_place(web_post_bl(), 4, cornerrow),
]
)
)
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
- key_place(web_post_bl(), 2, cornerrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_br(), 2, cornerrow),
- key_place(web_post_bl(), 3, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, lastrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
-
return union(hulls)
############################
@@ -1250,49 +1238,13 @@ def mini_thumb_connectors():
key_place(web_post_bl(), 1, cornerrow),
mini_thumb_tr_place(mini_thumb_post_tr()),
key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
+ # key_place(web_post_tl(), 2, lastrow),
key_place(web_post_bl(), 2, lastrow),
mini_thumb_tr_place(mini_thumb_post_tr()),
key_place(web_post_bl(), 2, lastrow),
mini_thumb_tr_place(mini_thumb_post_br()),
key_place(web_post_br(), 2, lastrow),
key_place(web_post_bl(), 3, lastrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, cornerrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- ]
- )
- )
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, lastrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
- key_place(web_post_bl(), 2, cornerrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_br(), 2, cornerrow),
- key_place(web_post_bl(), 3, cornerrow),
]
)
)
@@ -1442,49 +1394,12 @@ def minidox_thumb_connectors():
key_place(web_post_bl(), 1, cornerrow),
minidox_thumb_tr_place(minidox_thumb_post_tr()),
key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
key_place(web_post_bl(), 2, lastrow),
minidox_thumb_tr_place(minidox_thumb_post_tr()),
key_place(web_post_bl(), 2, lastrow),
minidox_thumb_tr_place(minidox_thumb_post_br()),
key_place(web_post_br(), 2, lastrow),
key_place(web_post_bl(), 3, lastrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, cornerrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- ]
- )
- )
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, lastrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
- key_place(web_post_bl(), 2, cornerrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_br(), 2, cornerrow),
- key_place(web_post_bl(), 3, cornerrow),
]
)
)
@@ -1682,7 +1597,6 @@ def carbonfet_thumb_connectors():
key_place(web_post_bl(), 1, cornerrow),
carbonfet_thumb_tl_place(web_post_tr()),
key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
key_place(web_post_bl(), 2, lastrow),
carbonfet_thumb_tl_place(web_post_tr()),
key_place(web_post_bl(), 2, lastrow),
@@ -1698,28 +1612,6 @@ def carbonfet_thumb_connectors():
hulls.append(
triangle_hulls(
[
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_br(), 2, lastrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, lastrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
carbonfet_thumb_tr_place(web_post_br()),
carbonfet_thumb_tr_place(web_post_tr()),
key_place(web_post_bl(), 3, lastrow),
@@ -1727,40 +1619,6 @@ def carbonfet_thumb_connectors():
)
)
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
- key_place(web_post_bl(), 2, cornerrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_br(), 2, cornerrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, lastrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
-
return union(hulls)
@@ -1798,9 +1656,7 @@ def tbjs_thumb_tl_place(shape):
shape = translate(shape, (t_off[0], t_off[1]+tbjs_key_diameter/2, t_off[2]))
shape = rotate(shape, [0,0,-80])
shape = tbjs_place(shape)
- # shape = rotate(shape, [5, 10, -65])
- # shape = translate(shape, thumborigin())
- # shape = translate(shape, [-14, -9, 0])
+
return shape
def tbjs_thumb_mr_place(shape):
@@ -1812,9 +1668,6 @@ def tbjs_thumb_mr_place(shape):
shape = rotate(shape, [0,0,-130])
shape = tbjs_place(shape)
- # shape = rotate(shape, [7, 20, -105])
- # shape = translate(shape, thumborigin())
- # shape = translate(shape, [-12, -32, -5])
return shape
def tbjs_thumb_br_place(shape):
@@ -1827,9 +1680,6 @@ def tbjs_thumb_br_place(shape):
shape = rotate(shape, [0,0,-180])
shape = tbjs_place(shape)
- # shape = rotate(shape, [25, -11, 0])
- # shape = translate(shape, thumborigin())
- # shape = translate(shape, [-40, -50, -16])
return shape
@@ -1842,33 +1692,12 @@ def tbjs_thumb_bl_place(shape):
shape = rotate(shape, [0,0,-230])
shape = tbjs_place(shape)
- # shape = rotate(shape, [25, 0, -45])
- # shape = translate(shape, thumborigin())
- # shape = translate(shape, [-63, -41, -18])
return shape
-# def tbjs_thumb_tlold_place(shape):
-# debugprint('thumb_tl_place()')
-# shape = rotate(shape, [7.5, -10, 10])
-# shape = translate(shape, thumborigin())
-# shape = translate(shape, [-32.5, -14.5, -4])
-# return shape
-#
-#
-# def tbjs_thumb_mlold_place(shape):
-# debugprint('thumb_ml_place()')
-# shape = rotate(shape, [6, -34, 40])
-# shape = translate(shape, thumborigin())
-# shape = translate(shape, [-51, -25, -12])
-# return shape
-
-
def tbjs_thumb_1x_layout(shape):
return union([
tbjs_thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tr_rotation])),
- # tbjs_thumb_tlold_place(rotate(shape, [0, 0, thumb_plate_tl_rotation])),
- # tbjs_thumb_mlold_place(rotate(shape, [0, 0, thumb_plate_ml_rotation])),
tbjs_thumb_mr_place(rotate(shape, [0, 0, thumb_plate_mr_rotation])),
tbjs_thumb_bl_place(rotate(shape, [0, 0, thumb_plate_bl_rotation])),
tbjs_thumb_br_place(rotate(shape, [0, 0, thumb_plate_br_rotation])),
@@ -1887,8 +1716,6 @@ def tbjs_thumb_fx_layout(shape):
def trackball_layout(shape):
return union([
- # Relocating positioning to individual parts due to complexity.
- # tbjs_place(rotate(shape, [0, 0, trackball_rotation])),
tbjs_place(shape),
])
@@ -2051,30 +1878,6 @@ def tbjs_thumb_connectors():
)
)
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
- key_place(web_post_bl(), 2, cornerrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_br(), 2, cornerrow),
- key_place(web_post_bl(), 3, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, lastrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
-
return union(hulls)
@@ -2172,18 +1975,15 @@ def tbcj_holder():
return shape
def tbcj_thumb_position_rotation():
- # loc = np.array([-15, -60, -12]) + thumborigin()
- # shape = translate(shape, loc)
- # shape = rotate(shape, (0,0,0))
pos = np.array([-15, -60, -12]) + thumborigin()
- rot = (0,0,0)
+ rot = (0, 0, 0)
return pos, rot
def tbcj_place(shape):
loc = np.array([-15, -60, -12]) + thumborigin()
shape = translate(shape, loc)
- shape = rotate(shape, (0,0,0))
+ shape = rotate(shape, (0, 0, 0))
return shape
def tbcj_thumb(side="right"):
@@ -2274,43 +2074,12 @@ def tbcj_thumb_connectors():
key_place(web_post_bl(), 1, cornerrow),
tbcj_thumb_tr_place(web_post_tr()),
key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
key_place(web_post_bl(), 2, lastrow),
tbcj_thumb_tr_place(web_post_tr()),
key_place(web_post_bl(), 2, lastrow),
tbcj_thumb_tr_place(web_post_br()),
key_place(web_post_br(), 2, lastrow),
key_place(web_post_bl(), 3, lastrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, cornerrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- key_place(web_post_bl(), 4, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_br(), 1, cornerrow),
- key_place(web_post_tl(), 2, lastrow),
- key_place(web_post_bl(), 2, cornerrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_br(), 2, cornerrow),
- key_place(web_post_bl(), 3, cornerrow),
- ]
- )
- )
-
- hulls.append(
- triangle_hulls(
- [
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, lastrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_bl(), 4, cornerrow),
]
)
)
@@ -2431,11 +2200,6 @@ def wall_locate3(dx, dy, back=False):
dy * (wall_y_offset + wall_base_y_thickness),
-wall_z_offset,
]
- # return [
- # dx * (wall_xy_offset + wall_thickness),
- # dy * (wall_xy_offset + wall_thickness),
- # -wall_z_offset,
- # ]
def wall_brace(place1, dx1, dy1, post1, place2, dx2, dy2, post2, back=False):
@@ -2737,7 +2501,8 @@ def tbjs_thumb_connection(side='right'):
triangle_hulls(
[
key_place(web_post_bl(), 0, cornerrow),
- left_key_place(web_post(), lastrow - 1, -1, side=side, low_corner=True), # left_key_place(translate(web_post(), wall_locate1(-1, 0)), cornerrow, -1, low_corner=True),
+ left_key_place(web_post(), lastrow - 1, -1, side=side, low_corner=True),
+ # left_key_place(translate(web_post(), wall_locate1(-1, 0)), cornerrow, -1, low_corner=True),
tbjs_place(tbjs_post_tl()),
]
)
@@ -2754,7 +2519,6 @@ def tbjs_thumb_connection(side='right'):
tbjs_thumb_tl_place(web_post_tl()),
key_place(web_post_br(), 1, cornerrow),
tbjs_thumb_tl_place(web_post_tr()),
- key_place(web_post_tl(), 2, lastrow),
key_place(web_post_bl(), 2, lastrow),
tbjs_thumb_tl_place(web_post_tr()),
key_place(web_post_bl(), 2, lastrow),
@@ -2765,13 +2529,6 @@ def tbjs_thumb_connection(side='right'):
tbjs_thumb_mr_place(web_post_tl()),
key_place(web_post_br(), 2, lastrow),
- key_place(web_post_bl(), 3, lastrow),
- key_place(web_post_tr(), 2, lastrow),
- key_place(web_post_tl(), 3, lastrow),
- key_place(web_post_bl(), 3, cornerrow),
- key_place(web_post_tr(), 3, lastrow),
- key_place(web_post_br(), 3, cornerrow),
- key_place(web_post_bl(), 4, cornerrow),
]
)
)
@@ -3035,7 +2792,6 @@ def minidox_thumb_connection(side='right'):
left_key_place(web_post(), cornerrow, -1, low_corner=True, side=side),
left_key_place(translate(web_post(), wall_locate1(-1, 0)), cornerrow, -1, low_corner=True, side=side),
key_place(web_post_bl(), 0, cornerrow),
- # key_place(translate(web_post_bl(), wall_locate1(-1, 0)), cornerrow, -1, low_corner=True),
minidox_thumb_tl_place(minidox_thumb_post_tl()),
]
)])
@@ -3136,8 +2892,8 @@ def case_walls(side='right'):
left_wall(side=side),
right_wall(),
front_wall(),
- thumb_walls(side=side),
- thumb_connection(side=side),
+ # thumb_walls(side=side),
+ # thumb_connection(side=side),
])
)
@@ -3264,7 +3020,7 @@ def pcb_usb_hole():
(
pcb_usb_position[0],
pcb_usb_position[1],
- pcb_usb_hole_size[2] / 2 + pcb_usb_hole_z_offset + usb_holder_thickness,
+ pcb_usb_hole_size[2] / 2 + usb_holder_thickness,
)
)
return shape
@@ -3335,9 +3091,8 @@ def pcb_screw_hole():
hole = cylinder(*pcb_screw_hole_size)
hole = translate(hole, pcb_screw_position)
hole = translate(hole, (0, 0, pcb_screw_hole_size[1]/2-.1))
- holes.append(translate(hole, (pcb_screw_x_offsets[0], 0, 0)))
- holes.append(translate(hole, (pcb_screw_x_offsets[1], 0, 0)))
- holes.append(translate(hole, (pcb_screw_x_offsets[2], 0, 0)))
+ for offset in pcb_screw_x_offsets:
+ holes.append(translate(hole, (offset, 0, 0)))
return holes
@@ -3872,35 +3627,61 @@ def screw_insert(column, row, bottom_radius, top_radius, height, side='right'):
return shape
-def screw_insert_thumb(bottom_radius, top_radius, height):
- if thumb_style == 'MINI':
- position = thumborigin()
- position = list(np.array(position) + np.array([-29, -51, -16]))
- position[2] = 0
-
- elif thumb_style == 'MINIDOX':
- position = thumborigin()
- position = list(np.array(position) + np.array([-37, -32, -16]))
- position[1] = position[1] - .4 * (minidox_Usize - 1) * sa_length
- position[2] = 0
-
- elif thumb_style == 'CARBONFET':
- position = thumborigin()
- position = list(np.array(position) + np.array([-48, -37, 0]))
- position[2] = 0
- elif thumb_style == 'TRACKBALL':
- position = thumborigin()
- position = list(np.array(position) + np.array([-72, -40, -16]))
- position[2] = 0
+def thumb_screw_insert(bottom_radius, top_radius, height, offset=None, side='right'):
+ shape = screw_insert_shape(bottom_radius, top_radius, height)
+ shapes = []
+ if offset is None:
+ offset = 0.0
+
+ origin = thumborigin()
+ if ('TRACKBALL' in thumb_style) and not (side == ball_side or ball_side == 'both'):
+ _thumb_style = other_thumb
else:
- position = thumborigin()
- position = list(np.array(position) + np.array([-21, -58, 0]))
- position[2] = 0
+ _thumb_style = thumb_style
- shape = screw_insert_shape(bottom_radius, top_radius, height)
- shape = translate(shape, [position[0], position[1], height / 2])
- return shape
+ if _thumb_style == 'MINI':
+ if separable_thumb:
+ xypositions = copy.deepcopy(mini_separable_thumb_screw_xy_locations)
+ else:
+ xypositions = copy.deepcopy(mini_thumb_screw_xy_locations)
+
+ elif _thumb_style == 'MINIDOX':
+ if separable_thumb:
+ xypositions = copy.deepcopy(minidox_separable_thumb_screw_xy_locations)
+ else:
+ xypositions = copy.deepcopy(minidox_thumb_screw_xy_locations)
+ xypositions[0][1] = xypositions[0][1] - .4 * (minidox_Usize - 1) * sa_length
+
+ elif _thumb_style == 'CARBONFET':
+ if separable_thumb:
+ xypositions = copy.deepcopy(carbonfet_separable_thumb_screw_xy_locations)
+ else:
+ xypositions = copy.deepcopy(carbonfet_thumb_screw_xy_locations)
+
+ elif _thumb_style == 'TRACKBALL_ORBYL':
+ if separable_thumb:
+ xypositions = copy.deepcopy(orbyl_separable_thumb_screw_xy_locations)
+ else:
+ xypositions = copy.deepcopy(orbyl_thumb_screw_xy_locations)
+
+ elif _thumb_style == 'TRACKBALL_CJ':
+ if separable_thumb:
+ xypositions = copy.deepcopy(tbcj_separable_thumb_screw_xy_locations)
+ else:
+ xypositions = copy.deepcopy(tbcj_thumb_screw_xy_locations)
+
+ else:
+ if separable_thumb:
+ xypositions = copy.deepcopy(default_separable_thumb_screw_xy_locations)
+ else:
+ xypositions = copy.deepcopy(default_thumb_screw_xy_locations)
+
+ for xyposition in xypositions:
+ position = list(np.array(origin) + np.array([*xyposition, -origin[2]]))
+ shapes.append(translate(shape, [position[0], position[1], height / 2 + offset]))
+
+ return shapes
def screw_insert_all_shapes(bottom_radius, top_radius, height, offset=0, side='right'):
print('screw_insert_all_shapes()')
@@ -3911,13 +3692,21 @@ def screw_insert_all_shapes(bottom_radius, top_radius, height, offset=0, side='r
translate(screw_insert(3, 0, bottom_radius, top_radius, height, side=side), (0,0, offset)),
translate(screw_insert(lastcol, 0, bottom_radius, top_radius, height, side=side), (0, 0, offset)),
translate(screw_insert(lastcol, lastrow-1, bottom_radius, top_radius, height, side=side), (0, 0, offset)),
- translate(screw_insert_thumb(bottom_radius, top_radius, height), (0, 0, offset)),
+ # translate(screw_insert_thumb(bottom_radius, top_radius, height), (0, 0, offset)),
)
return shape
+def thumb_screw_insert_holes(side='right'):
+ return thumb_screw_insert(
+ screw_insert_bottom_radius, screw_insert_top_radius, screw_insert_height+.02, offset=-.01, side=side
+ )
-
+def thumb_screw_insert_outers(offset=0.0, side='right'):
+ bottom_radius = screw_insert_bottom_radius + 1.6
+ top_radius = screw_insert_top_radius + 1.6
+ height = screw_insert_height + 1.5
+ return thumb_screw_insert(bottom_radius, top_radius, height, offset, side=side)
def screw_insert_holes(side='right'):
return screw_insert_all_shapes(
@@ -3986,17 +3775,10 @@ def model_side(side="right"):
shape = union([shape, connector_shape])
if debug_exports:
export_file(shape=shape, fname=path.join(r"..", "things", r"debug_connector_shape"))
- thumb_shape = thumb(side=side)
- if debug_exports:
- export_file(shape=thumb_shape, fname=path.join(r"..", "things", r"debug_thumb_shape"))
- shape = union([shape, thumb_shape])
- thumb_connector_shape = thumb_connectors(side=side)
- shape = union([shape, thumb_connector_shape])
- if debug_exports:
- export_file(shape=shape, fname=path.join(r"..", "things", r"debug_thumb_connector_shape"))
walls_shape = case_walls(side=side)
if debug_exports:
export_file(shape=walls_shape, fname=path.join(r"..", "things", r"debug_walls_shape"))
+
s2 = union([walls_shape])
s2 = union([s2, *screw_insert_outers(side=side)])
@@ -4059,46 +3841,92 @@ def model_side(side="right"):
if show_caps:
shape = add([shape, ball])
+ main_shape = shape
+
+ #BUILD THUMB
+
+ thumb_shape = thumb(side=side)
+ if debug_exports:
+ export_file(shape=thumb_shape, fname=path.join(r"..", "things", r"debug_thumb_shape"))
+ thumb_connector_shape = thumb_connectors(side=side)
+ if debug_exports:
+ export_file(shape=thumb_connector_shape, fname=path.join(r"..", "things", r"debug_thumb_connector_shape"))
+
+ thumb_wall_shape = thumb_walls(side=side)
+ thumb_wall_shape = union([thumb_wall_shape, *thumb_screw_insert_outers(side=side)])
+ thumb_connection_shape = thumb_connection(side=side)
+
+
+ if debug_exports:
+ thumb_test = union([thumb_shape, thumb_connector_shape, thumb_wall_shape, thumb_connection_shape])
+ export_file(shape=thumb_test, fname=path.join(r"..", "things", r"debug_thumb_test_{}_shape".format(side)))
+
+ thumb_section = union([thumb_shape, thumb_connector_shape, thumb_wall_shape, thumb_connection_shape])
+ thumb_section = difference(thumb_section, [union(thumb_screw_insert_holes(side=side))])
+
+ has_trackball = False
if ('TRACKBALL' in thumb_style) and (side == ball_side or ball_side == 'both'):
tbprecut, tb, tbcutout, sensor, ball = generate_trackball_in_cluster()
+ has_trackball = True
+ thumb_section = difference(thumb_section, [tbprecut])
+ thumb_section = union([thumb_section, tb])
+ thumb_section = difference(thumb_section, [tbcutout])
+ thumb_section = union([thumb_section, sensor])
- shape = difference(shape, [tbprecut])
- # export_file(shape=shape, fname=path.join(save_path, config_name + r"_test_1"))
- shape = union([shape, tb])
- # export_file(shape=shape, fname=path.join(save_path, config_name + r"_test_2"))
- shape = difference(shape, [tbcutout])
- # export_file(shape=shape, fname=path.join(save_path, config_name + r"_test_3a"))
- # export_file(shape=add([shape, sensor]), fname=path.join(save_path, config_name + r"_test_3b"))
- shape = union([shape, sensor])
-
- if show_caps:
- shape = add([shape, ball])
block = box(350, 350, 40)
block = translate(block, (0, 0, -20))
- shape = difference(shape, [block])
+ main_shape = difference(main_shape, [block])
+ thumb_section = difference(thumb_section, [block])
+
+
+
+ if separable_thumb:
+ thumb_section = difference(thumb_section, [main_shape])
+ if show_caps:
+ thumb_section = add([thumb_section, thumbcaps(side=side)])
+ if has_trackball:
+ thumb_section = add([thumb_section, ball])
+ else:
+ main_shape = union([main_shape, thumb_section])
+ if show_caps:
+ main_shape = add([main_shape, thumbcaps(side=side)])
+ if has_trackball:
+ main_shape = add([main_shape, ball])
if show_caps:
- shape = add([shape, thumbcaps(side=side)])
- shape = add([shape, caps()])
+ main_shape = add([main_shape, caps()])
if side == "left":
- shape = mirror(shape, 'YZ')
+ main_shape = mirror(main_shape, 'YZ')
+ thumb_section = mirror(thumb_section, 'YZ')
- return shape
+ return main_shape, thumb_section
# NEEDS TO BE SPECIAL FOR CADQUERY
def baseplate(wedge_angle=None, side='right'):
if ENGINE == 'cadquery':
# shape = mod_r
- shape = union([case_walls(side=side), *screw_insert_outers(side=side)])
+ shape = union([
+ case_walls(side=side),
+ *screw_insert_outers(side=side),
+ thumb_walls(side=side),
+ *thumb_screw_insert_outers(side=side),
+ ])
# tool = translate(screw_insert_screw_holes(side=side), [0, 0, -10])
tool = screw_insert_all_shapes(screw_hole_diameter/2., screw_hole_diameter/2., 350, side=side)
for item in tool:
item = translate(item, [0, 0, -10])
shape = difference(shape, [item])
+ tool = thumb_screw_insert(screw_hole_diameter/2., screw_hole_diameter/2., 350, side=side)
+ for item in tool:
+ item = translate(item, [0, 0, -10])
+ shape = difference(shape, [item])
+
+
+
shape = translate(shape, (0, 0, -0.0001))
square = cq.Workplane('XY').rect(1000, 1000)
@@ -4161,7 +3989,9 @@ def baseplate(wedge_angle=None, side='right'):
shape = union([
case_walls(side=side),
- *screw_insert_outers(side=side)
+ *screw_insert_outers(side=side),
+ thumb_walls(side=side),
+ *thumb_screw_insert_outers(side=side),
])
tool = translate(union(screw_insert_screw_holes(side=side)), [0, 0, -10])
@@ -4175,16 +4005,18 @@ def baseplate(wedge_angle=None, side='right'):
def run():
- mod_r = model_side(side="right")
+ mod_r, tmb_r = model_side(side="right")
export_file(shape=mod_r, fname=path.join(save_path, config_name + r"_right"))
+ export_file(shape=tmb_r, fname=path.join(save_path, config_name + r"_thumb_right"))
base = baseplate(side='right')
export_file(shape=base, fname=path.join(save_path, config_name + r"_right_plate"))
export_dxf(shape=base, fname=path.join(save_path, config_name + r"_right_plate"))
if symmetry == "asymmetric":
- mod_l = model_side(side="left")
+ mod_l, tmb_l = model_side(side="left")
export_file(shape=mod_l, fname=path.join(save_path, config_name + r"_left"))
+ export_file(shape=tmb_l, fname=path.join(save_path, config_name + r"_thumb_left"))
base_l = mirror(baseplate(side='left'), 'YZ')
export_file(shape=base_l, fname=path.join(save_path, config_name + r"_left_plate"))
diff --git a/src/generate_configuration.py b/src/generate_configuration.py
index 1fb89bf..dfd5c67 100644
--- a/src/generate_configuration.py
+++ b/src/generate_configuration.py
@@ -52,18 +52,41 @@ shape_config = {
##############################
# THUMB PARAMETERS
##############################
+
# 'DEFAULT' 6-key, 'MINI' 5-key, 'CARBONFET' 6-key, 'MINIDOX' 3-key, 'TRACKBALL_ORBYL', 'TRACKBALL_CJ'
- 'thumb_style': 'CARBONFET',
+ 'thumb_style': 'TRACKBALL_ORBYL',
'default_1U_cluster': True, # only used with default, makes top right thumb cluster key 1U
# Thumb key size. May need slight oversizing, check w/ caps. Additional spacing will be automatically added for larger keys.
'minidox_Usize': 1.6,
# Thumb plate rotations, anything other than 90 degree increments WILL NOT WORK.
+
+ # Screw locations and extra screw locations for separable thumb, all from thumb origin
+ # Pulled out of hardcoding as drastic changes to the geometry may require fixes to the screw mounts.
+ # First screw in separable should be similar to the standard location as it will receive the same modifiers.
+ 'default_thumb_screw_xy_locations': [[-21, -58]],
+ 'default_separable_thumb_screw_xy_locations': [[-21, -58]],
+ 'mini_thumb_screw_xy_locations': [[-29, -52]],
+ 'mini_separable_thumb_screw_xy_locations': [[-29, -52], [-62, 10], [12, -25]],
+ 'minidox_thumb_screw_xy_locations': [[-37, -34]],
+ 'minidox_separable_thumb_screw_xy_locations': [[-37, -34], [-62, 12], [10, -25]],
+ 'carbonfet_thumb_screw_xy_locations': [[-48, -37]],
+ 'carbonfet_separable_thumb_screw_xy_locations': [[-48, -37], [-52, 10], [12, -35]],
+ 'orbyl_thumb_screw_xy_locations': [[-53, -60]],
+ 'orbyl_separable_thumb_screw_xy_locations': [[-53, -60], [-67, 10], [8, -40]],
+ 'tbcj_thumb_screw_xy_locations': [[-40, -75]],
+ 'tbcj_separable_thumb_screw_xy_locations': [[-40, -75], [-63, 10], [15, -40]],
+
'thumb_plate_tr_rotation': 0.0, # Top right plate rotation tweaks as thumb cluster is crowded for hot swap, etc.
'thumb_plate_tl_rotation': 0.0, # Top left plate rotation tweaks as thumb cluster is crowded for hot swap, etc.
'thumb_plate_mr_rotation': 0.0, # Mid right plate rotation tweaks as thumb cluster is crowded for hot swap, etc.
'thumb_plate_ml_rotation': 0.0, # Mid left plate rotation tweaks as thumb cluster is crowded for hot swap, etc.
'thumb_plate_br_rotation': 0.0, # Bottom right plate rotation tweaks as thumb cluster is crowded for hot swap, etc.
'thumb_plate_bl_rotation': 0.0, # Bottom right plate rotation tweaks as thumb cluster is crowded for hot swap, etc.
+ ##############################
+ # EXPERIMENTAL
+
+ 'separable_thumb': True, #creates a separable thumb section with additional screws to hold it down. Only attached at base.
+ ##############################
###################################
## Trackball in Wall ##
@@ -88,8 +111,10 @@ shape_config = {
'tbjs_key_diameter': 70,
# Offsets are per key and are applied before rotating into place around the ball
# X and Y act like Tangential and Radial around the ball
- 'tbjs_translation_offset': (0, 0, 10), # applied to the whole assy
- 'tbjs_rotation_offset': (0, 0, 0), # applied to the whole assy
+ # 'tbjs_translation_offset': (0, 0, 10), # applied to the whole assy
+ # 'tbjs_rotation_offset': (0, 10, 0), # applied to the whole assy
+ 'tbjs_translation_offset': (0, 0, 2), # applied to the whole assy
+ 'tbjs_rotation_offset': (0, -8, 0), # applied to the whole assy
'tbjs_key_translation_offsets': [
(0.0, 0.0, -3.0-5),
(0.0, 0.0, -3.0-5),
@@ -438,4 +463,8 @@ def save_config():
if __name__ == '__main__':
- save_config() \ No newline at end of file
+ save_config()
+
+ ## HERE FOR QUICK TESTING, SHOULD BE COMMENTED ON COMMIT
+ # from dactyl_manuform import *
+ # run() \ No newline at end of file
diff --git a/src/run_config.json b/src/run_config.json
index 3b1da65..54c20bb 100644
--- a/src/run_config.json
+++ b/src/run_config.json
@@ -23,15 +23,128 @@
"web_thickness": 4.0,
"post_size": 0.1,
"post_adj": 0,
- "thumb_style": "CARBONFET",
+ "thumb_style": "TRACKBALL_ORBYL",
"default_1U_cluster": true,
"minidox_Usize": 1.6,
+ "default_thumb_screw_xy_locations": [
+ [
+ -21,
+ -58
+ ]
+ ],
+ "default_separable_thumb_screw_xy_locations": [
+ [
+ -21,
+ -58
+ ]
+ ],
+ "mini_thumb_screw_xy_locations": [
+ [
+ -29,
+ -52
+ ]
+ ],
+ "mini_separable_thumb_screw_xy_locations": [
+ [
+ -29,
+ -52
+ ],
+ [
+ -62,
+ 10
+ ],
+ [
+ 12,
+ -25
+ ]
+ ],
+ "minidox_thumb_screw_xy_locations": [
+ [
+ -37,
+ -34
+ ]
+ ],
+ "minidox_separable_thumb_screw_xy_locations": [
+ [
+ -37,
+ -34
+ ],
+ [
+ -62,
+ 12
+ ],
+ [
+ 10,
+ -25
+ ]
+ ],
+ "carbonfet_thumb_screw_xy_locations": [
+ [
+ -48,
+ -37
+ ]
+ ],
+ "carbonfet_separable_thumb_screw_xy_locations": [
+ [
+ -48,
+ -37
+ ],
+ [
+ -52,
+ 10
+ ],
+ [
+ 12,
+ -35
+ ]
+ ],
+ "orbyl_thumb_screw_xy_locations": [
+ [
+ -53,
+ -60
+ ]
+ ],
+ "orbyl_separable_thumb_screw_xy_locations": [
+ [
+ -53,
+ -60
+ ],
+ [
+ -67,
+ 10
+ ],
+ [
+ 8,
+ -40
+ ]
+ ],
+ "tbcj_thumb_screw_xy_locations": [
+ [
+ -40,
+ -75
+ ]
+ ],
+ "tbcj_separable_thumb_screw_xy_locations": [
+ [
+ -40,
+ -75
+ ],
+ [
+ -63,
+ 10
+ ],
+ [
+ 15,
+ -40
+ ]
+ ],
"thumb_plate_tr_rotation": 0.0,
"thumb_plate_tl_rotation": 0.0,
"thumb_plate_mr_rotation": 0.0,
"thumb_plate_ml_rotation": 0.0,
"thumb_plate_br_rotation": 0.0,
"thumb_plate_bl_rotation": 0.0,
+ "separable_thumb": true,
"trackball_in_wall": false,
"tbiw_ball_center_row": 0.2,
"tbiw_translational_offset": [
@@ -64,11 +177,11 @@
"tbjs_translation_offset": [
0,
0,
- 10
+ 2
],
"tbjs_rotation_offset": [
0,
- 0,
+ -8,
0
],
"tbjs_key_translation_offsets": [
@@ -327,20 +440,31 @@
"external_holder_width": 28.75,
"external_holder_xoffset": -5.0,
"external_holder_yoffset": -4.5,
- "pcb_mount_ref_y_offset": -5,
+ "pcb_mount_ref_offset": [
+ 0,
+ -5,
+ 0
+ ],
"pcb_holder_size": [
34.6,
7,
4
],
- "pcb_holder_x_offset": 8.9,
- "pcb_usb_hole_x_offset": 15,
- "pcb_usb_hole_z_offset": 4.5,
+ "pcb_holder_offset": [
+ 8.9,
+ 0,
+ 0
+ ],
"pcb_usb_hole_size": [
7.5,
10.0,
4
],
+ "pcb_usb_hole_offset": [
+ 15,
+ 0,
+ 4.5
+ ],
"wall_thinner_size": [
34,
7,
@@ -350,7 +474,11 @@
3,
20
],
- "trrs_z_offset": 1.5,
+ "trrs_offset": [
+ 0,
+ 0,
+ 1.5
+ ],
"pcb_screw_hole_size": [
0.5,
10