From 69af2b76200742c68d62aa4d8176009795cdf66f Mon Sep 17 00:00:00 2001 From: Joshua Shreve Date: Sun, 5 Sep 2021 12:42:29 -0400 Subject: 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. --- resources/multithumb_test.PNG | Bin 0 -> 73978 bytes src/dactyl_manuform.py | 518 ++++++++++++++---------------------------- src/generate_configuration.py | 37 ++- src/run_config.json | 144 +++++++++++- 4 files changed, 344 insertions(+), 355 deletions(-) create mode 100644 resources/multithumb_test.PNG diff --git a/resources/multithumb_test.PNG b/resources/multithumb_test.PNG new file mode 100644 index 0000000..7371b2c Binary files /dev/null and b/resources/multithumb_test.PNG 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), @@ -1695,28 +1609,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( [ @@ -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 -- cgit v1.2.3