diff options
Diffstat (limited to 'src/dactyl_manuform.py')
-rw-r--r-- | src/dactyl_manuform.py | 385 |
1 files changed, 381 insertions, 4 deletions
diff --git a/src/dactyl_manuform.py b/src/dactyl_manuform.py index 079ef6f..1c5960c 100644 --- a/src/dactyl_manuform.py +++ b/src/dactyl_manuform.py @@ -761,12 +761,16 @@ def thumbcaps(side='right', style_override=None): return minidox_thumbcaps() elif _thumb_style == "CARBONFET": return carbonfet_thumbcaps() - elif "TRACKBALL" in _thumb_style: + + elif "TRACKBALL" in _thumb_style: if (side == ball_side or ball_side == 'both'): if _thumb_style == "TRACKBALL_ORBYL": return tbjs_thumbcaps() + elif _thumb_style == "TRACKBALL_CJ": + return tb_thumbcaps() else: return thumbcaps(side, style_override=other_thumb) + else: return default_thumbcaps() @@ -783,13 +787,17 @@ def thumb(side="right", style_override=None): return minidox_thumb(side) elif _thumb_style == "CARBONFET": return carbonfet_thumb(side) - elif "TRACKBALL" in _thumb_style: + + elif "TRACKBALL" in _thumb_style: if (side == ball_side or ball_side == 'both'): if _thumb_style == "TRACKBALL_ORBYL": return tbjs_thumb(side) + elif _thumb_style == "TRACKBALL_CJ": + return tb_thumb(side) else: return thumb(side, style_override=other_thumb) - else: + + else: return default_thumb(side) @@ -805,12 +813,16 @@ def thumb_connectors(side='right', style_override=None): return minidox_thumb_connectors() elif _thumb_style == "CARBONFET": return carbonfet_thumb_connectors() + elif "TRACKBALL" in _thumb_style: if (side == ball_side or ball_side == 'both'): if _thumb_style == "TRACKBALL_ORBYL": return tbjs_thumb_connectors() + elif _thumb_style == "TRACKBALL_CJ": + return tb_thumb_connectors() else: return thumb_connectors(side, style_override=other_thumb) + else: return default_thumb_connectors() @@ -1740,6 +1752,360 @@ def carbonfet_thumb_connectors(): return union(hulls) +############################ +# TRACKBALL THUMB CLUSTER +############################ + +# single_plate = the switch shape + +def tb_thumb_tr_place(shape): + shape = rotate(shape, [10, -15, 10]) + shape = translate(shape, thumborigin()) + shape = translate(shape, [-12, -16, 3]) + return shape + +def tb_thumb_tl_place(shape): + shape = rotate(shape, [7.5, -18, 10]) + shape = translate(shape, thumborigin()) + shape = translate(shape, [-32.5, -14.5, -2.5]) + return shape + +def tb_thumb_ml_place(shape): + shape = rotate(shape, [6, -34, 40]) + shape = translate(shape, thumborigin()) + shape = translate(shape, [-51, -25, -12]) + return shape + +def tb_thumb_bl_place(shape): + shape = rotate(shape, [-4, -35, 52]) + shape = translate(shape, thumborigin()) + shape = translate(shape, [-56.3, -43.3, -23.5]) + return shape + +def tb_thumb_layout(shape): + return union([ + tb_thumb_tr_place(rotate(shape, [0, 0, thumb_plate_tr_rotation])), + tb_thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tl_rotation])), + tb_thumb_ml_place(rotate(shape, [0, 0, thumb_plate_ml_rotation])), + tb_thumb_bl_place(rotate(shape, [0, 0, thumb_plate_bl_rotation])), + ]) + + +#def oct_corner(i, radius, shape): +# i = (i+1)%8 +# +# points_x = [1, 2, 2, 1, -1, -2, -2, -1] +# points_y = [2, 1, -1, -2, -2, -1, 1, 2] +# +# return translate(shape, (points_x[i] * radius / 2, points_y[i] * radius / 2, 0)) + +import math +def oct_corner(i, diameter, shape): + radius = diameter / 2 + i = (i+1)%8 + + r = radius + m = radius * math.tan(math.pi / 8) + + points_x = [m, r, r, m, -m, -r, -r, -m] + points_y = [r, m, -m, -r, -r, -m, m, r] + + return translate(shape, (points_x[i], points_y[i], 0)) + +tb_inner_diameter = 42 +tb_thickness = 2 +tb_outer_diameter = 53 + +def trackball_edge_post(i): + shape = box(post_size, post_size, tb_thickness) + shape = oct_corner(i, tb_outer_diameter, shape) + return shape + +def trackball_web_post(i): + shape = box(post_size, post_size, tb_thickness) + shape = oct_corner(i, tb_outer_diameter, shape) + return shape + +def trackball_holder(): + center = box(post_size, post_size, tb_thickness) + + shape = [] + for i in range(8): + shape_ = hull_from_shapes([ + center, + trackball_edge_post(i), + trackball_edge_post(i+1), + ]) + shape.append(shape_) + shape = union(shape) + + shape = difference( + shape, + [cylinder(tb_inner_diameter/2, tb_thickness + 0.1)] + ) + + return shape + +def trackball_place(shape): + loc = np.array([-15, -60, -12]) + thumborigin() + shape = translate(shape, loc) + shape = rotate(shape, (0,0,0)) + return shape + +def tb_thumb(side="right"): + t = tb_thumb_layout(single_plate(side=side)) + tb = trackball_place(trackball_holder()) + return union([t, tb]) + +def tb_thumbcaps(): + t = tb_thumb_layout(sa_cap(1)) + return t + +def thumb_post_tr(): + return translate(web_post(), + [(mount_width / 2) - post_adj, ((mount_height/2) + double_plate_height) - post_adj, 0] + ) + + +def thumb_post_tl(): + return translate(web_post(), + [-(mount_width / 2) + post_adj, ((mount_height/2) + double_plate_height) - post_adj, 0] + ) + + +def thumb_post_bl(): + return translate(web_post(), + [-(mount_width / 2) + post_adj, -((mount_height/2) + double_plate_height) + post_adj, 0] + ) + + +def thumb_post_br(): + return translate(web_post(), + [(mount_width / 2) - post_adj, -((mount_height/2) + double_plate_height) + post_adj, 0] + ) + +def tb_thumb_connectors(): + hulls = [] + + # Top two + hulls.append( + triangle_hulls( + [ + tb_thumb_tl_place(web_post_tr()), + tb_thumb_tl_place(web_post_br()), + tb_thumb_tr_place(web_post_tl()), + tb_thumb_tr_place(web_post_bl()), + ] + ) + ) + + # centers of the bottom four + hulls.append( + triangle_hulls( + [ + tb_thumb_bl_place(web_post_tr()), + tb_thumb_bl_place(web_post_br()), + tb_thumb_ml_place(web_post_tl()), + tb_thumb_ml_place(web_post_bl()), + ] + ) + ) + + # top two to the middle two, starting on the left + + hulls.append( + triangle_hulls( + [ + tb_thumb_tl_place(web_post_tl()), + tb_thumb_ml_place(web_post_tr()), + tb_thumb_tl_place(web_post_bl()), + tb_thumb_ml_place(web_post_br()), + tb_thumb_tl_place(web_post_br()), + tb_thumb_tr_place(web_post_bl()), + tb_thumb_tr_place(web_post_br()), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + tb_thumb_tl_place(web_post_tl()), + key_place(web_post_bl(), 0, cornerrow), + tb_thumb_tl_place(web_post_tr()), + key_place(web_post_br(), 0, cornerrow), + tb_thumb_tr_place(web_post_tl()), + key_place(web_post_bl(), 1, cornerrow), + tb_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), + tb_thumb_tr_place(web_post_tr()), + key_place(web_post_bl(), 2, lastrow), + tb_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), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + trackball_place(trackball_web_post(4)), + tb_thumb_bl_place(web_post_bl()), + trackball_place(trackball_web_post(5)), + tb_thumb_bl_place(web_post_br()), + trackball_place(trackball_web_post(6)), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + tb_thumb_bl_place(web_post_br()), + trackball_place(trackball_web_post(6)), + tb_thumb_ml_place(web_post_bl()), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + tb_thumb_ml_place(web_post_bl()), + trackball_place(trackball_web_post(6)), + tb_thumb_ml_place(web_post_br()), + tb_thumb_tr_place(web_post_bl()), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + trackball_place(trackball_web_post(6)), + tb_thumb_tr_place(web_post_bl()), + trackball_place(trackball_web_post(7)), + tb_thumb_tr_place(web_post_br()), + trackball_place(trackball_web_post(0)), + tb_thumb_tr_place(web_post_br()), + key_place(web_post_bl(), 3, lastrow), + ] + ) + ) + + return union(hulls) + +def tb_thumb_walls(): + shape = union([wall_brace(tb_thumb_ml_place, -0.3, 1, web_post_tr(), tb_thumb_ml_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(tb_thumb_bl_place, 0, 1, web_post_tr(), tb_thumb_bl_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(tb_thumb_bl_place, -1, 0, web_post_tl(), tb_thumb_bl_place, -1, 0, web_post_bl())]) + shape = union([shape, wall_brace(tb_thumb_bl_place, -1, 0, web_post_tl(), tb_thumb_bl_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(tb_thumb_ml_place, 0, 1, web_post_tl(), tb_thumb_bl_place, 0, 1, web_post_tr())]) + + corner = box(1,1,tb_thickness) + + points = [ + (tb_thumb_bl_place, -1, 0, web_post_bl()), + (trackball_place, 0, -1, trackball_web_post(4)), + (trackball_place, 0, -1, trackball_web_post(3)), + (trackball_place, 0, -1, trackball_web_post(2)), + (trackball_place, 1, -1, trackball_web_post(1)), + (trackball_place, 1, 0, trackball_web_post(0)), + ((lambda sh: key_place(sh, 3, lastrow)), 0, -1, web_post_bl()), + ] + for i,_ in enumerate(points[:-1]): + (pa, dxa, dya, sa) = points[i] + (pb, dxb, dyb, sb) = points[i + 1] + + shape = union([shape, wall_brace(pa, dxa, dya, sa, pb, dxb, dyb, sb)]) + + return shape + +def tb_thumb_connection(): + # clunky bit on the top left thumb connection (normal connectors don't work well) + shape = union([bottom_hull( + [ + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True), + thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + thumb_ml_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), + ] + )]) + + shape = union([shape, + hull_from_shapes( + [ + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True), + thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + thumb_ml_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), + thumb_tl_place(web_post_tl()), + ] + ) + ]) # ) + + shape = union([shape, hull_from_shapes( + [ + left_key_place(translate(web_post(), wall_locate1(-1, 0)), cornerrow, -1, low_corner=True), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True), + thumb_tl_place(web_post_tl()), + ] + )]) + + shape = union([shape, hull_from_shapes( + [ + left_key_place(web_post(), cornerrow, -1, low_corner=True), + left_key_place(translate(web_post(), wall_locate1(-1, 0)), cornerrow, -1, low_corner=True), + key_place(web_post_bl(), 0, cornerrow), + thumb_tl_place(web_post_tl()), + ] + )]) + + shape = union([shape, hull_from_shapes( + [ + thumb_ml_place(web_post_tr()), + thumb_ml_place(translate(web_post_tr(), wall_locate1(-0.3, 1))), + thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + thumb_ml_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), + thumb_tl_place(web_post_tl()), + ] + )]) + + return shape ############################ # Trackball (Ball + 4-key) THUMB CLUSTER @@ -2297,10 +2663,14 @@ def thumb_walls(side='right', style_override=None): return minidox_thumb_walls() elif _thumb_style == "CARBONFET": return carbonfet_thumb_walls() + elif "TRACKBALL" in _thumb_style: if (side == ball_side or ball_side == 'both'): if _thumb_style == "TRACKBALL_ORBYL" : return tbjs_thumb_walls() + elif thumb_style == "TRACKBALL_CJ": + return tb_thumb_walls() + else: return thumb_walls(side, style_override=other_thumb) else: @@ -2318,10 +2688,13 @@ def thumb_connection(side='right', style_override=None): return minidox_thumb_connection(side=side) elif _thumb_style == "CARBONFET": return carbonfet_thumb_connection(side=side) + elif "TRACKBALL" in _thumb_style: if (side == ball_side or ball_side == 'both'): if _thumb_style == "TRACKBALL_ORBYL": return tbjs_thumb_connection(side=side) + elif thumb_style == "TRACKBALL_CJ": + return tb_thumb_connection(side=side) else: return thumb_connection(side, style_override=other_thumb) else: @@ -3364,6 +3737,10 @@ def screw_insert_thumb(bottom_radius, top_radius, height): 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 else: position = thumborigin() @@ -3683,4 +4060,4 @@ def run(): # base = baseplate() # export_file(shape=base, fname=path.join(save_path, config_name + r"_plate")) if __name__ == '__main__': - run()
\ No newline at end of file + run() |