diff options
Diffstat (limited to 'src/dactyl_manuform.py')
-rw-r--r-- | src/dactyl_manuform.py | 1691 |
1 files changed, 1366 insertions, 325 deletions
diff --git a/src/dactyl_manuform.py b/src/dactyl_manuform.py index bb164b5..a04a291 100644 --- a/src/dactyl_manuform.py +++ b/src/dactyl_manuform.py @@ -1,6 +1,7 @@ import numpy as np from numpy import pi import os.path as path +import getopt, sys import json import os @@ -23,12 +24,23 @@ import generate_configuration as cfg for item in cfg.shape_config: locals()[item] = cfg.shape_config[item] -## LOAD RUN CONFIGURATION FILE AND WRITE TO ANY VARIABLES IN FILE. -with open('run_config.json', mode='r') as fid: - data = json.load(fid) +if len(sys.argv) <= 1: + print("NO CONFIGURATION SPECIFIED, USING run_config.json") + with open(os.path.join(r".", 'run_config.json'), mode='r') as fid: + data = json.load(fid) + +else: + ## CHECK FOR CONFIG FILE AND WRITE TO ANY VARIABLES IN FILE. + opts, args = getopt.getopt(sys.argv[1:], "", ["config="]) + for opt, arg in opts: + if opt in ('--config'): + with open(os.path.join(r"..", "configs", arg + '.json'), mode='r') as fid: + data = json.load(fid) + for item in data: locals()[item] = data[item] + # Really rough setup. Check for ENGINE, set it not present from configuration. try: print('Found Current Engine in Config = {}'.format(ENGINE)) @@ -39,9 +51,11 @@ except Exception: print('Setting Current Engine = {}'.format(ENGINE)) if save_dir in ['', None, '.']: - save_path = os.path.join(r"..", "things") + save_path = path.join(r"..", "things") + parts_path = path.join(r"..", "src", "parts") else: - save_path = os.path.join(r"..", "things", save_dir) + save_path = path.join(r"..", "things", save_dir) + parts_path = path.join(r"..", r"..", "src", "parts") ############################################### # END EXTREMELY UGLY BOOTSTRAP @@ -96,9 +110,12 @@ else: if 'HS_' in plate_style: symmetry = "asymmetric" - plate_file = path.join("..", "src", r"hot_swap_plate") + plate_file = path.join(parts_path, r"hot_swap_plate") plate_offset = 0.0 +if (trackball_in_wall or ('TRACKBALL' in thumb_style)) and not ball_side == 'both': + symmetry = "asymmetric" + mount_width = keyswitch_width + 2 * plate_rim mount_height = keyswitch_height + 2 * plate_rim mount_thickness = plate_thickness @@ -118,6 +135,8 @@ if oled_mount_type is not None and oled_mount_type != "NONE": left_wall_lower_y_offset = oled_left_wall_lower_y_offset left_wall_lower_z_offset = oled_left_wall_lower_z_offset + + cap_top_height = plate_thickness + sa_profile_key_height row_radius = ((mount_height + extra_height) / 2) / (np.sin(alpha / 2)) + cap_top_height column_radius = ( @@ -140,16 +159,6 @@ teensy_holder_width = 7 + teensy_pcb_thickness teensy_holder_height = 6 + teensy_width - -# wire_post_height = 7 -# wire_post_overhang = 3.5 -# wire_post_diameter = 2.6 -# -# screw_insert_height = 3.8 -# screw_insert_bottom_radius = 5.31 / 2 -# screw_insert_top_radius = 5.1 / 2 - - # save_path = path.join("..", "things", save_dir) if not path.isdir(save_path): os.mkdir(save_path) @@ -263,6 +272,38 @@ def single_plate(cylinder_segments=100, side="right"): return plate +def trackball_cutout(segments=100, side="right"): + shape = cylinder(trackball_hole_diameter / 2, trackball_hole_height) + return shape + +def trackball_socket(segments=100, side="right"): + # shape = sphere(ball_diameter / 2) + # cyl = cylinder(ball_diameter / 2 + 4, 20) + # cyl = translate(cyl, (0, 0, -8)) + # shape = union([shape, cyl]) + + tb_file = path.join(parts_path, r"trackball_socket_body_34mm") + tbcut_file = path.join(parts_path, r"trackball_socket_cutter_34mm") + sens_file = path.join(parts_path, r"trackball_sensor_mount") + senscut_file = path.join(parts_path, r"trackball_sensor_cutter") + + + # shape = import_file(tb_file) + # # shape = difference(shape, [import_file(senscut_file)]) + # # shape = union([shape, import_file(sens_file)]) + # cutter = import_file(tbcut_file) + + shape = import_file(tb_file) + sensor = import_file(sens_file) + cutter = import_file(tbcut_file) + cutter = union([cutter, import_file(senscut_file)]) + + # return shape, cutter + return shape, cutter, sensor + +def trackball_ball(segments=100, side="right"): + shape = sphere(ball_diameter / 2) + return shape ################ ## SA Keycaps ## @@ -312,8 +353,25 @@ def sa_cap(Usize=1): key_cap = translate(key_cap, (0, 0, 5 + plate_thickness)) + if show_pcbs: + key_cap = add([key_cap, key_pcb()]) + return key_cap +def key_pcb(): + shape = box(pcb_width, pcb_height, pcb_thickness) + shape = translate(shape, (0, 0, -pcb_thickness/2)) + hole = cylinder(pcb_hole_diameter/2, pcb_thickness+.2) + hole = translate(hole, (0, 0, -(pcb_thickness+.1)/2)) + holes = [ + translate(hole, (pcb_hole_pattern_width/2, pcb_hole_pattern_height/2, 0)), + translate(hole, (-pcb_hole_pattern_width / 2, pcb_hole_pattern_height / 2, 0)), + translate(hole, (-pcb_hole_pattern_width / 2, -pcb_hole_pattern_height / 2, 0)), + translate(hole, (pcb_hole_pattern_width / 2, -pcb_hole_pattern_height / 2, 0)), + ] + shape = difference(shape, holes) + + return shape ######################### ## Placement Functions ## @@ -548,20 +606,12 @@ def thumborigin(): origin[i] = origin[i] + thumb_offsets[i] if thumb_style == 'MINIDOX': - origin[1] = origin[1] - .4*(minidox_Usize-1)*sa_length + origin[1] = origin[1] - .4*(trackball_Usize-1)*sa_length return origin -def thumb_tr_place(shape): - debugprint('thumb_tr_place()') - shape = rotate(shape, [10, -15, 10]) - shape = translate(shape, thumborigin()) - shape = translate(shape, [-12, -16, 3]) - return shape - - -def thumb_tl_place(shape): +def default_thumb_tl_place(shape): debugprint('thumb_tl_place()') shape = rotate(shape, [7.5, -18, 10]) shape = translate(shape, thumborigin()) @@ -569,7 +619,14 @@ def thumb_tl_place(shape): return shape -def thumb_mr_place(shape): +def default_thumb_tr_place(shape): + debugprint('thumb_tr_place()') + shape = rotate(shape, [10, -15, 10]) + shape = translate(shape, thumborigin()) + shape = translate(shape, [-12, -16, 3]) + return shape + +def default_thumb_mr_place(shape): debugprint('thumb_mr_place()') shape = rotate(shape, [-6, -34, 48]) shape = translate(shape, thumborigin()) @@ -577,7 +634,7 @@ def thumb_mr_place(shape): return shape -def thumb_ml_place(shape): +def default_thumb_ml_place(shape): debugprint('thumb_ml_place()') shape = rotate(shape, [6, -34, 40]) shape = translate(shape, thumborigin()) @@ -585,7 +642,7 @@ def thumb_ml_place(shape): return shape -def thumb_br_place(shape): +def default_thumb_br_place(shape): debugprint('thumb_br_place()') shape = rotate(shape, [-16, -33, 54]) shape = translate(shape, thumborigin()) @@ -593,7 +650,7 @@ def thumb_br_place(shape): return shape -def thumb_bl_place(shape): +def default_thumb_bl_place(shape): debugprint('thumb_bl_place()') shape = rotate(shape, [-4, -35, 52]) shape = translate(shape, thumborigin()) @@ -601,63 +658,63 @@ def thumb_bl_place(shape): return shape -def thumb_1x_layout(shape, cap=False): +def default_thumb_1x_layout(shape, cap=False): debugprint('thumb_1x_layout()') if cap: shape_list = [ - thumb_mr_place(rotate(shape, [0, 0, thumb_plate_mr_rotation])), - thumb_ml_place(rotate(shape, [0, 0, thumb_plate_ml_rotation])), - thumb_br_place(rotate(shape, [0, 0, thumb_plate_br_rotation])), - thumb_bl_place(rotate(shape, [0, 0, thumb_plate_bl_rotation])), + default_thumb_mr_place(rotate(shape, [0, 0, thumb_plate_mr_rotation])), + default_thumb_ml_place(rotate(shape, [0, 0, thumb_plate_ml_rotation])), + default_thumb_br_place(rotate(shape, [0, 0, thumb_plate_br_rotation])), + default_thumb_bl_place(rotate(shape, [0, 0, thumb_plate_bl_rotation])), ] if default_1U_cluster: - shape_list.append(thumb_tr_place(rotate(rotate(shape, (0, 0, 90)), [0, 0, thumb_plate_tr_rotation]))) - shape_list.append(thumb_tr_place(rotate(rotate(shape, (0, 0, 90)), [0, 0, thumb_plate_tr_rotation]))) - shape_list.append(thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tl_rotation]))) + shape_list.append(default_thumb_tr_place(rotate(rotate(shape, (0, 0, 90)), [0, 0, thumb_plate_tr_rotation]))) + shape_list.append(default_thumb_tr_place(rotate(rotate(shape, (0, 0, 90)), [0, 0, thumb_plate_tr_rotation]))) + shape_list.append(default_thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tl_rotation]))) shapes = add(shape_list) else: shape_list = [ - thumb_mr_place(rotate(shape, [0, 0, thumb_plate_mr_rotation])), - thumb_ml_place(rotate(shape, [0, 0, thumb_plate_ml_rotation])), - thumb_br_place(rotate(shape, [0, 0, thumb_plate_br_rotation])), - thumb_bl_place(rotate(shape, [0, 0, thumb_plate_bl_rotation])), + default_thumb_mr_place(rotate(shape, [0, 0, thumb_plate_mr_rotation])), + default_thumb_ml_place(rotate(shape, [0, 0, thumb_plate_ml_rotation])), + default_thumb_br_place(rotate(shape, [0, 0, thumb_plate_br_rotation])), + default_thumb_bl_place(rotate(shape, [0, 0, thumb_plate_bl_rotation])), ] if default_1U_cluster: - shape_list.append(thumb_tr_place(rotate(rotate(shape, (0, 0, 90)), [0, 0, thumb_plate_tr_rotation]))) + shape_list.append(default_thumb_tr_place(rotate(rotate(shape, (0, 0, 90)), [0, 0, thumb_plate_tr_rotation]))) shapes = union(shape_list) return shapes -def thumb_15x_layout(shape, cap=False, plate=True): +def default_thumb_15x_layout(shape, cap=False, plate=True): debugprint('thumb_15x_layout()') if plate: if cap: shape = rotate(shape, (0, 0, 90)) - cap_list = [thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tl_rotation]))] - cap_list.append(thumb_tr_place(rotate(shape, [0, 0, thumb_plate_tr_rotation]))) + cap_list = [default_thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tl_rotation]))] + cap_list.append(default_thumb_tr_place(rotate(shape, [0, 0, thumb_plate_tr_rotation]))) return add(cap_list) else: - shape_list = [thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tl_rotation]))] + shape_list = [default_thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tl_rotation]))] if not default_1U_cluster: - shape_list.append(thumb_tr_place(rotate(shape, [0, 0, thumb_plate_tr_rotation]))) + shape_list.append(default_thumb_tr_place(rotate(shape, [0, 0, thumb_plate_tr_rotation]))) return union(shape_list) else: if cap: shape = rotate(shape, (0, 0, 90)) shape_list = [ - thumb_tl_place(shape), + default_thumb_tl_place(shape), ] - shape_list.append(thumb_tr_place(shape)) + shape_list.append(default_thumb_tr_place(shape)) return add(shape_list) else: shape_list = [ - thumb_tl_place(shape), + default_thumb_tl_place(shape), ] if not default_1U_cluster: - shape_list.append(thumb_tr_place(shape)) + shape_list.append(default_thumb_tr_place(shape)) return union(shape_list) @@ -695,51 +752,96 @@ def double_plate(): return union((top_plate, mirror(top_plate, 'XZ'))) -def thumbcaps(): - if thumb_style == "MINI": +def thumbcaps(side='right', style_override=None): + if style_override is None: + _thumb_style = thumb_style + else: + _thumb_style = style_override + + if _thumb_style == "MINI": return mini_thumbcaps() - elif thumb_style == "MINIDOX": + elif _thumb_style == "MINIDOX": return minidox_thumbcaps() - elif thumb_style == "CARBONFET": + elif _thumb_style == "CARBONFET": return carbonfet_thumbcaps() + + 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 tbcj_thumbcaps() + else: + return thumbcaps(side, style_override=other_thumb) + else: return default_thumbcaps() -def thumb(side="right"): - if thumb_style == "MINI": +def thumb(side="right", style_override=None): + if style_override is None: + _thumb_style = thumb_style + else: + _thumb_style = style_override + + if _thumb_style == "MINI": return mini_thumb(side) - elif thumb_style == "MINIDOX": + elif _thumb_style == "MINIDOX": return minidox_thumb(side) - elif thumb_style == "CARBONFET": + elif _thumb_style == "CARBONFET": return carbonfet_thumb(side) + + 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 tbcj_thumb(side) + else: + return thumb(side, style_override=other_thumb) + else: return default_thumb(side) -def thumb_connectors(): - if thumb_style == "MINI": +def thumb_connectors(side='right', style_override=None): + if style_override is None: + _thumb_style = thumb_style + else: + _thumb_style = style_override + + if _thumb_style == "MINI": return mini_thumb_connectors() - elif thumb_style == "MINIDOX": + elif _thumb_style == "MINIDOX": return minidox_thumb_connectors() - elif thumb_style == "CARBONFET": + 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 tbcj_thumb_connectors() + else: + return thumb_connectors(side, style_override=other_thumb) + else: return default_thumb_connectors() def default_thumbcaps(): - t1 = thumb_1x_layout(sa_cap(1), cap=True) + t1 = default_thumb_1x_layout(sa_cap(1), cap=True) if not default_1U_cluster: - t1.add(thumb_15x_layout(sa_cap(1.5), cap=True)) + t1.add(default_thumb_15x_layout(sa_cap(1.5), cap=True)) return t1 def default_thumb(side="right"): print('thumb()') - shape = thumb_1x_layout(rotate(single_plate(side=side), (0, 0, -90))) - shape = union([shape, thumb_15x_layout(rotate(single_plate(side=side), (0, 0, -90)))]) - shape = union([shape, thumb_15x_layout(double_plate(), plate=False)]) + shape = default_thumb_1x_layout(rotate(single_plate(side=side), (0, 0, -90))) + shape = union([shape, default_thumb_15x_layout(rotate(single_plate(side=side), (0, 0, -90)))]) + shape = union([shape, default_thumb_15x_layout(double_plate(), plate=False)]) return shape @@ -780,10 +882,10 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_tl_place(thumb_post_tr()), - thumb_tl_place(thumb_post_br()), - thumb_tr_place(web_post_tl()), - thumb_tr_place(web_post_bl()), + default_thumb_tl_place(thumb_post_tr()), + default_thumb_tl_place(thumb_post_br()), + default_thumb_tr_place(web_post_tl()), + default_thumb_tr_place(web_post_bl()), ] ) ) @@ -791,10 +893,10 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_tl_place(thumb_post_tr()), - thumb_tl_place(thumb_post_br()), - thumb_tr_place(thumb_post_tl()), - thumb_tr_place(thumb_post_bl()), + default_thumb_tl_place(thumb_post_tr()), + default_thumb_tl_place(thumb_post_br()), + default_thumb_tr_place(thumb_post_tl()), + default_thumb_tr_place(thumb_post_bl()), ] ) ) @@ -803,10 +905,10 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_br_place(web_post_tr()), - thumb_br_place(web_post_br()), - thumb_mr_place(web_post_tl()), - thumb_mr_place(web_post_bl()), + default_thumb_br_place(web_post_tr()), + default_thumb_br_place(web_post_br()), + default_thumb_mr_place(web_post_tl()), + default_thumb_mr_place(web_post_bl()), ] ) ) @@ -815,10 +917,10 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_br_place(web_post_tr()), - thumb_br_place(web_post_br()), - thumb_mr_place(web_post_tl()), - thumb_mr_place(web_post_bl()), + default_thumb_br_place(web_post_tr()), + default_thumb_br_place(web_post_br()), + default_thumb_mr_place(web_post_tl()), + default_thumb_mr_place(web_post_bl()), ] ) ) @@ -826,10 +928,10 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_bl_place(web_post_tr()), - thumb_bl_place(web_post_br()), - thumb_ml_place(web_post_tl()), - thumb_ml_place(web_post_bl()), + default_thumb_bl_place(web_post_tr()), + default_thumb_bl_place(web_post_br()), + default_thumb_ml_place(web_post_tl()), + default_thumb_ml_place(web_post_bl()), ] ) ) @@ -838,14 +940,14 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_br_place(web_post_tl()), - thumb_bl_place(web_post_bl()), - thumb_br_place(web_post_tr()), - thumb_bl_place(web_post_br()), - thumb_mr_place(web_post_tl()), - thumb_ml_place(web_post_bl()), - thumb_mr_place(web_post_tr()), - thumb_ml_place(web_post_br()), + default_thumb_br_place(web_post_tl()), + default_thumb_bl_place(web_post_bl()), + default_thumb_br_place(web_post_tr()), + default_thumb_bl_place(web_post_br()), + default_thumb_mr_place(web_post_tl()), + default_thumb_ml_place(web_post_bl()), + default_thumb_mr_place(web_post_tr()), + default_thumb_ml_place(web_post_br()), ] ) ) @@ -854,15 +956,15 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_tl_place(thumb_post_tl()), - thumb_ml_place(web_post_tr()), - thumb_tl_place(thumb_post_bl()), - thumb_ml_place(web_post_br()), - thumb_tl_place(thumb_post_br()), - thumb_mr_place(web_post_tr()), - thumb_tr_place(web_post_bl()), - thumb_mr_place(web_post_br()), - thumb_tr_place(web_post_br()), + default_thumb_tl_place(thumb_post_tl()), + default_thumb_ml_place(web_post_tr()), + default_thumb_tl_place(thumb_post_bl()), + default_thumb_ml_place(web_post_br()), + default_thumb_tl_place(thumb_post_br()), + default_thumb_mr_place(web_post_tr()), + default_thumb_tr_place(web_post_bl()), + default_thumb_mr_place(web_post_br()), + default_thumb_tr_place(web_post_br()), ] ) ) @@ -871,15 +973,15 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_tl_place(thumb_post_tl()), - thumb_ml_place(web_post_tr()), - thumb_tl_place(thumb_post_bl()), - thumb_ml_place(web_post_br()), - thumb_tl_place(thumb_post_br()), - thumb_mr_place(web_post_tr()), - thumb_tr_place(thumb_post_bl()), - thumb_mr_place(web_post_br()), - thumb_tr_place(thumb_post_br()), + default_thumb_tl_place(thumb_post_tl()), + default_thumb_ml_place(web_post_tr()), + default_thumb_tl_place(thumb_post_bl()), + default_thumb_ml_place(web_post_br()), + default_thumb_tl_place(thumb_post_br()), + default_thumb_mr_place(web_post_tr()), + default_thumb_tr_place(thumb_post_bl()), + default_thumb_mr_place(web_post_br()), + default_thumb_tr_place(thumb_post_br()), ] ) ) @@ -888,19 +990,19 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_tl_place(thumb_post_tl()), + default_thumb_tl_place(thumb_post_tl()), key_place(web_post_bl(), 0, cornerrow), - thumb_tl_place(thumb_post_tr()), + default_thumb_tl_place(thumb_post_tr()), key_place(web_post_br(), 0, cornerrow), - thumb_tr_place(web_post_tl()), + default_thumb_tr_place(web_post_tl()), key_place(web_post_bl(), 1, cornerrow), - thumb_tr_place(web_post_tr()), + 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), - thumb_tr_place(web_post_tr()), + default_thumb_tr_place(web_post_tr()), key_place(web_post_bl(), 2, lastrow), - thumb_tr_place(web_post_br()), + 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), @@ -916,19 +1018,19 @@ def default_thumb_connectors(): hulls.append( triangle_hulls( [ - thumb_tl_place(thumb_post_tl()), + default_thumb_tl_place(thumb_post_tl()), key_place(web_post_bl(), 0, cornerrow), - thumb_tl_place(thumb_post_tr()), + default_thumb_tl_place(thumb_post_tr()), key_place(web_post_br(), 0, cornerrow), - thumb_tr_place(thumb_post_tl()), + default_thumb_tr_place(thumb_post_tl()), key_place(web_post_bl(), 1, cornerrow), - thumb_tr_place(thumb_post_tr()), + default_thumb_tr_place(thumb_post_tr()), key_place(web_post_br(), 1, cornerrow), key_place(web_post_tl(), 2, lastrow), key_place(web_post_bl(), 2, lastrow), - thumb_tr_place(thumb_post_tr()), + default_thumb_tr_place(thumb_post_tr()), key_place(web_post_bl(), 2, lastrow), - thumb_tr_place(thumb_post_br()), + 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), @@ -1654,59 +1756,633 @@ def carbonfet_thumb_connectors(): return union(hulls) -########## -## Case ## -########## +############################ +# Trackball (Ball + 4-key) THUMB CLUSTER +############################ +def tbjs_thumb_position_rotation(): + rot = [10, -15, 5] + pos = thumborigin() + # Changes size based on key diameter around ball, shifting off of the top left cluster key. + shift = [-.9*tbjs_key_diameter/2+27-42, -.1*tbjs_key_diameter/2+3-20, -5] + for i in range(len(pos)): + pos[i] = pos[i] + shift[i] + tbjs_translation_offset[i] -def bottom_hull(p, height=0.001): - debugprint("bottom_hull()") - if ENGINE == 'cadquery': - shape = None - for item in p: - vertices = [] - verts = item.faces('<Z').vertices() - for vert in verts.objects: - v0 = vert.toTuple() - v1 = [v0[0], v0[1], -10] - vertices.append(np.array(v0)) - vertices.append(np.array(v1)) - - t_shape = hull_from_points(vertices) - - # t_shape = translate(t_shape, [0, 0, height / 2 - 10]) - - if shape is None: - shape = t_shape - - for shp in (*p, shape, t_shape): - try: - shp.vertices() - except: - 0 - shape = union([shape, hull_from_shapes((shape, t_shape))]) + for i in range(len(rot)): + rot[i] = rot[i] + tbjs_rotation_offset[i] - return shape + return pos, rot - else: - shape = None - for item in p: - proj = sl.projection()(p) - t_shape = sl.linear_extrude(height=height, twist=0, convexity=0, center=True)( - proj + +def tbjs_place(shape): + pos, rot = tbjs_thumb_position_rotation() + shape = rotate(shape, rot) + shape = translate(shape, pos) + return shape + + +def tbjs_thumb_tl_place(shape): + debugprint('thumb_tr_place()') + # Modifying to make a "ring" of keys + shape = rotate(shape, [0, 0, 0]) + t_off = tbjs_key_translation_offsets[0] + shape = rotate(shape, tbjs_key_rotation_offsets[0]) + 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): + debugprint('thumb_mr_place()') + shape = rotate(shape, [0, 0, 0]) + shape = rotate(shape, tbjs_key_rotation_offsets[1]) + t_off = tbjs_key_translation_offsets[1] + shape = translate(shape, (t_off[0], t_off[1]+tbjs_key_diameter/2, t_off[2])) + 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): + debugprint('thumb_br_place()') + + shape = rotate(shape, [0, 0, 180]) + shape = rotate(shape, tbjs_key_rotation_offsets[2]) + t_off = tbjs_key_translation_offsets[2] + shape = translate(shape, (t_off[0], t_off[1]+tbjs_key_diameter/2, t_off[2])) + 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 + + +def tbjs_thumb_bl_place(shape): + debugprint('thumb_bl_place()') + shape = rotate(shape, [0, 0, 180]) + shape = rotate(shape, tbjs_key_rotation_offsets[3]) + t_off = tbjs_key_translation_offsets[3] + shape = translate(shape, (t_off[0], t_off[1]+tbjs_key_diameter/2, t_off[2])) + 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])), + ]) + + +def tbjs_thumb_fx_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])), + ]) + +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), + ]) + + +def tbjs_thumbcaps(): + t1 = tbjs_thumb_1x_layout(sa_cap(1)) + # t1.add(tbjs_thumb_15x_layout(rotate(sa_cap(1), [0, 0, rad2deg(pi / 2)]))) + return t1 + + +def tbjs_thumb(side="right"): + shape = tbjs_thumb_fx_layout(rotate(single_plate(side=side), [0.0, 0.0, -90])) + shape = union([shape, tbjs_thumb_fx_layout(double_plate())]) + shape = union([shape, tbjs_thumb_1x_layout(single_plate(side=side))]) + + # shape = union([shape, trackball_layout(trackball_socket())]) + # shape = tbjs_thumb_1x_layout(single_plate(side=side)) + return shape + + +def tbjs_thumb_post_tr(): + debugprint('thumb_post_tr()') + return translate(web_post(), + [(mount_width / 2) - post_adj, ((mount_height/2) + adjustable_plate_size(trackball_Usize)) - post_adj, 0] + ) + + +def tbjs_thumb_post_tl(): + debugprint('thumb_post_tl()') + return translate(web_post(), + [-(mount_width / 2) + post_adj, ((mount_height/2) + adjustable_plate_size(trackball_Usize)) - post_adj, 0] + ) + + +def tbjs_thumb_post_bl(): + debugprint('thumb_post_bl()') + return translate(web_post(), + [-(mount_width / 2) + post_adj, -((mount_height/2) + adjustable_plate_size(trackball_Usize)) + post_adj, 0] + ) + + +def tbjs_thumb_post_br(): + debugprint('thumb_post_br()') + return translate(web_post(), + [(mount_width / 2) - post_adj, -((mount_height/2) + adjustable_plate_size(trackball_Usize)) + post_adj, 0] + ) + + +def tbjs_post_r(): + debugprint('tbjs_post_r()') + radius = ball_diameter/2 + ball_wall_thickness + ball_gap + return translate(web_post(), + [1.0*(radius - post_adj), 0.0*(radius - post_adj), 0] + ) + + +def tbjs_post_tr(): + debugprint('tbjs_post_tr()') + radius = ball_diameter/2+ball_wall_thickness + ball_gap + return translate(web_post(), + [0.5*(radius - post_adj), 0.866*(radius - post_adj), 0] + ) + + +def tbjs_post_tl(): + debugprint('tbjs_post_tl()') + radius = ball_diameter/2+ball_wall_thickness + ball_gap + return translate(web_post(), + [-0.5*(radius - post_adj), 0.866*(radius - post_adj), 0] + ) + + +def tbjs_post_l(): + debugprint('tbjs_post_l()') + radius = ball_diameter/2+ball_wall_thickness + ball_gap + return translate(web_post(), + [-1.0*(radius - post_adj), 0.0*(radius - post_adj), 0] + ) + +def tbjs_post_bl(): + debugprint('tbjs_post_bl()') + radius = ball_diameter/2+ball_wall_thickness + ball_gap + return translate(web_post(), + [-0.5*(radius - post_adj), -0.866*(radius - post_adj), 0] + ) + + +def tbjs_post_br(): + debugprint('tbjs_post_br()') + radius = ball_diameter/2+ball_wall_thickness + ball_gap + return translate(web_post(), + [0.5*(radius - post_adj), -0.866*(radius - post_adj), 0] + ) + + + +def tbjs_thumb_connectors(): + print('thumb_connectors()') + hulls = [] + + # bottom 2 to tb + hulls.append( + triangle_hulls( + [ + tbjs_place(tbjs_post_l()), + tbjs_thumb_bl_place(web_post_tl()), + tbjs_place(tbjs_post_bl()), + tbjs_thumb_bl_place(web_post_tr()), + tbjs_thumb_br_place(web_post_tl()), + tbjs_place(tbjs_post_bl()), + tbjs_thumb_br_place(web_post_tr()), + tbjs_place(tbjs_post_br()), + tbjs_thumb_br_place(web_post_tr()), + tbjs_place(tbjs_post_br()), + tbjs_thumb_mr_place(web_post_br()), + tbjs_place(tbjs_post_r()), + tbjs_thumb_mr_place(web_post_bl()), + tbjs_thumb_tl_place(web_post_br()), + tbjs_place(tbjs_post_r()), + tbjs_thumb_tl_place(web_post_bl()), + tbjs_place(tbjs_post_tr()), + key_place(web_post_bl(), 0, cornerrow), + tbjs_place(tbjs_post_tl()), + ] + ) + ) + + # bottom left + hulls.append( + triangle_hulls( + [ + tbjs_thumb_bl_place(web_post_tr()), + tbjs_thumb_br_place(web_post_tl()), + tbjs_thumb_bl_place(web_post_br()), + tbjs_thumb_br_place(web_post_bl()), + ] + ) + ) + + # bottom right + hulls.append( + triangle_hulls( + [ + tbjs_thumb_br_place(web_post_tr()), + tbjs_thumb_mr_place(web_post_br()), + tbjs_thumb_br_place(web_post_br()), + tbjs_thumb_mr_place(web_post_tr()), + ] + ) + ) + # top right + hulls.append( + triangle_hulls( + [ + tbjs_thumb_mr_place(web_post_bl()), + tbjs_thumb_tl_place(web_post_br()), + tbjs_thumb_mr_place(web_post_tl()), + tbjs_thumb_tl_place(web_post_tr()), + ] + ) + ) + + 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) + + + + + +############################ +# TRACKBALL THUMB CLUSTER +############################ + +# single_plate = the switch shape + +def tbcj_thumb_tr_place(shape): + shape = rotate(shape, [10, -15, 10]) + shape = translate(shape, thumborigin()) + shape = translate(shape, [-12, -16, 3]) + return shape + +def tbcj_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 tbcj_thumb_ml_place(shape): + shape = rotate(shape, [6, -34, 40]) + shape = translate(shape, thumborigin()) + shape = translate(shape, [-51, -25, -12]) + return shape + +def tbcj_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 tbcj_thumb_layout(shape): + return union([ + tbcj_thumb_tr_place(rotate(shape, [0, 0, thumb_plate_tr_rotation])), + tbcj_thumb_tl_place(rotate(shape, [0, 0, thumb_plate_tl_rotation])), + tbcj_thumb_ml_place(rotate(shape, [0, 0, thumb_plate_ml_rotation])), + tbcj_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)) + +def tbcj_edge_post(i): + shape = box(post_size, post_size, tbcj_thickness) + shape = oct_corner(i, tbcj_outer_diameter, shape) + return shape + +def tbcj_web_post(i): + shape = box(post_size, post_size, tbcj_thickness) + shape = oct_corner(i, tbcj_outer_diameter, shape) + return shape + +def tbcj_holder(): + center = box(post_size, post_size, tbcj_thickness) + + shape = [] + for i in range(8): + shape_ = hull_from_shapes([ + center, + tbcj_edge_post(i), + tbcj_edge_post(i + 1), + ]) + shape.append(shape_) + shape = union(shape) + + shape = difference( + shape, + [cylinder(tbcj_inner_diameter/2, tbcj_thickness + 0.1)] ) - t_shape = sl.translate([0, 0, height / 2 - 10])(t_shape) - if shape is None: - shape = t_shape - shape = sl.hull()(p, shape, t_shape) - return shape + 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) + return pos, rot + + +def tbcj_place(shape): + loc = np.array([-15, -60, -12]) + thumborigin() + shape = translate(shape, loc) + shape = rotate(shape, (0,0,0)) + return shape + +def tbcj_thumb(side="right"): + t = tbcj_thumb_layout(single_plate(side=side)) + tb = tbcj_place(tbcj_holder()) + return union([t, tb]) + +def tbcj_thumbcaps(): + t = tbcj_thumb_layout(sa_cap(1)) + return t + + +# TODO: VERIFY THEY CAN BE DELETED. THEY LOOK LIKE REPLICATES. +# 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 tbcj_thumb_connectors(): + hulls = [] -def left_key_position(row, direction, low_corner=False): + # Top two + hulls.append( + triangle_hulls( + [ + tbcj_thumb_tl_place(web_post_tr()), + tbcj_thumb_tl_place(web_post_br()), + tbcj_thumb_tr_place(web_post_tl()), + tbcj_thumb_tr_place(web_post_bl()), + ] + ) + ) + + # centers of the bottom four + hulls.append( + triangle_hulls( + [ + tbcj_thumb_bl_place(web_post_tr()), + tbcj_thumb_bl_place(web_post_br()), + tbcj_thumb_ml_place(web_post_tl()), + tbcj_thumb_ml_place(web_post_bl()), + ] + ) + ) + + # top two to the middle two, starting on the left + + hulls.append( + triangle_hulls( + [ + tbcj_thumb_tl_place(web_post_tl()), + tbcj_thumb_ml_place(web_post_tr()), + tbcj_thumb_tl_place(web_post_bl()), + tbcj_thumb_ml_place(web_post_br()), + tbcj_thumb_tl_place(web_post_br()), + tbcj_thumb_tr_place(web_post_bl()), + tbcj_thumb_tr_place(web_post_br()), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + tbcj_thumb_tl_place(web_post_tl()), + key_place(web_post_bl(), 0, cornerrow), + tbcj_thumb_tl_place(web_post_tr()), + key_place(web_post_br(), 0, cornerrow), + tbcj_thumb_tr_place(web_post_tl()), + 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), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + tbcj_place(tbcj_web_post(4)), + tbcj_thumb_bl_place(web_post_bl()), + tbcj_place(tbcj_web_post(5)), + tbcj_thumb_bl_place(web_post_br()), + tbcj_place(tbcj_web_post(6)), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + tbcj_thumb_bl_place(web_post_br()), + tbcj_place(tbcj_web_post(6)), + tbcj_thumb_ml_place(web_post_bl()), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + tbcj_thumb_ml_place(web_post_bl()), + tbcj_place(tbcj_web_post(6)), + tbcj_thumb_ml_place(web_post_br()), + tbcj_thumb_tr_place(web_post_bl()), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + tbcj_place(tbcj_web_post(6)), + tbcj_thumb_tr_place(web_post_bl()), + tbcj_place(tbcj_web_post(7)), + tbcj_thumb_tr_place(web_post_br()), + tbcj_place(tbcj_web_post(0)), + tbcj_thumb_tr_place(web_post_br()), + key_place(web_post_bl(), 3, lastrow), + ] + ) + ) + + return union(hulls) + + + +########## +## Case ## +########## + +def left_key_position(row, direction, low_corner=False, side='right'): debugprint("left_key_position()") pos = np.array( key_position([-mount_width * 0.5, direction * mount_height * 0.5, 0], 0, row) ) + if trackball_in_wall and (side == ball_side or ball_side == 'both'): + + if low_corner: + y_offset = tbiw_left_wall_lower_y_offset + z_offset = tbiw_left_wall_lower_z_offset + else: + y_offset = 0.0 + z_offset = 0.0 + + + return list(pos - np.array([ + tbiw_left_wall_x_offset_override, + -y_offset, + tbiw_left_wall_z_offset_override + z_offset + ])) + if low_corner: y_offset = left_wall_lower_y_offset z_offset = left_wall_lower_z_offset @@ -1717,9 +2393,9 @@ def left_key_position(row, direction, low_corner=False): return list(pos - np.array([left_wall_x_offset, -y_offset, left_wall_z_offset + z_offset])) -def left_key_place(shape, row, direction, low_corner=False): +def left_key_place(shape, row, direction, low_corner=False, side='right'): debugprint("left_key_place()") - pos = left_key_position(row, direction, low_corner=low_corner) + pos = left_key_position(row, direction, low_corner=low_corner, side=side) return translate(shape, pos) @@ -1822,11 +2498,11 @@ def right_wall(): for i in range(lastrow - 1): y = i + 1 - shape = union([shape,key_wall_brace( + shape = union([shape, key_wall_brace( lastcol, y - 1, 1, 0, web_post_br(), lastcol, y, 1, 0, web_post_tr() )]) - shape = union([shape,key_wall_brace( + shape = union([shape, key_wall_brace( lastcol, y, 1, 0, web_post_tr(), lastcol, y, 1, 0, web_post_br() )]) #STRANGE PARTIAL OFFSET @@ -1838,30 +2514,30 @@ def right_wall(): return shape -def left_wall(): +def left_wall(side='right'): print('left_wall()') shape = union([wall_brace( (lambda sh: key_place(sh, 0, 0)), 0, 1, web_post_tl(), - (lambda sh: left_key_place(sh, 0, 1)), 0, 1, web_post(), + (lambda sh: left_key_place(sh, 0, 1, side=side)), 0, 1, web_post(), )]) shape = union([shape, wall_brace( - (lambda sh: left_key_place(sh, 0, 1)), 0, 1, web_post(), - (lambda sh: left_key_place(sh, 0, 1)), -1, 0, web_post(), + (lambda sh: left_key_place(sh, 0, 1, side=side)), 0, 1, web_post(), + (lambda sh: left_key_place(sh, 0, 1, side=side)), -1, 0, web_post(), )]) for i in range(lastrow): y = i low = (y == (lastrow-1)) temp_shape1 = wall_brace( - (lambda sh: left_key_place(sh, y, 1,)), -1, 0, web_post(), - (lambda sh: left_key_place(sh, y, -1, low_corner=low)), -1, 0, web_post(), + (lambda sh: left_key_place(sh, y, 1, side=side)), -1, 0, web_post(), + (lambda sh: left_key_place(sh, y, -1, low_corner=low, side=side)), -1, 0, web_post(), ) temp_shape2 = hull_from_shapes(( key_place(web_post_tl(), 0, y), key_place(web_post_bl(), 0, y), - left_key_place(web_post(), y, 1), - left_key_place(web_post(), y, -1, low_corner=low), + left_key_place(web_post(), y, 1, side=side), + left_key_place(web_post(), y, -1, low_corner=low, side=side), )) shape = union([shape, temp_shape1]) shape = union([shape, temp_shape2]) @@ -1870,14 +2546,14 @@ def left_wall(): y = i + 1 low = (y == (lastrow-1)) temp_shape1 = wall_brace( - (lambda sh: left_key_place(sh, y - 1, -1)), -1, 0, web_post(), - (lambda sh: left_key_place(sh, y, 1)), -1, 0, web_post(), + (lambda sh: left_key_place(sh, y - 1, -1, side=side)), -1, 0, web_post(), + (lambda sh: left_key_place(sh, y, 1, side=side)), -1, 0, web_post(), ) temp_shape2 = hull_from_shapes(( key_place(web_post_tl(), 0, y), key_place(web_post_bl(), 0, y - 1), - left_key_place(web_post(), y, 1), - left_key_place(web_post(), y - 1, -1), + left_key_place(web_post(), y, 1, side=side), + left_key_place(web_post(), y - 1, -1, side=side), )) shape = union([shape, temp_shape1]) shape = union([shape, temp_shape2]) @@ -1911,108 +2587,314 @@ def front_wall(): return shape -def thumb_walls(): - if thumb_style == "MINI": + +def thumb_walls(side='right', style_override=None): + if style_override is None: + _thumb_style = thumb_style + else: + _thumb_style = style_override + + if _thumb_style == "MINI": return mini_thumb_walls() - if thumb_style == "MINIDOX": + elif _thumb_style == "MINIDOX": return minidox_thumb_walls() - elif thumb_style == "CARBONFET": + 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 tbcj_thumb_walls() + + else: + return thumb_walls(side, style_override=other_thumb) else: return default_thumb_walls() -def thumb_connection(): - if thumb_style == "MINI": - return mini_thumb_connection() - if thumb_style == "MINIDOX": - return minidox_thumb_connection() - elif thumb_style == "CARBONFET": - return carbonfet_thumb_connection() +def thumb_connection(side='right', style_override=None): + if style_override is None: + _thumb_style = thumb_style else: - return default_thumb_connection() + _thumb_style = style_override + + if _thumb_style == "MINI": + return mini_thumb_connection(side=side) + elif _thumb_style == "MINIDOX": + 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 tbcj_thumb_connection(side=side) + else: + return thumb_connection(side, style_override=other_thumb) + else: + return default_thumb_connection(side=side) + def default_thumb_walls(): print('thumb_walls()') # thumb, walls if default_1U_cluster: - shape = union([wall_brace(thumb_mr_place, 0, -1, web_post_br(), thumb_tr_place, 0, -1, web_post_br())]) + shape = union([wall_brace(default_thumb_mr_place, 0, -1, web_post_br(), default_thumb_tr_place, 0, -1, web_post_br())]) else: - shape = union([wall_brace(thumb_mr_place, 0, -1, web_post_br(), thumb_tr_place, 0, -1, thumb_post_br())]) - shape = union([shape, wall_brace(thumb_mr_place, 0, -1, web_post_br(), thumb_mr_place, 0, -1, web_post_bl())]) - shape = union([shape, wall_brace(thumb_br_place, 0, -1, web_post_br(), thumb_br_place, 0, -1, web_post_bl())]) - shape = union([shape, wall_brace(thumb_ml_place, -0.3, 1, web_post_tr(), thumb_ml_place, 0, 1, web_post_tl())]) - shape = union([shape, wall_brace(thumb_bl_place, 0, 1, web_post_tr(), thumb_bl_place, 0, 1, web_post_tl())]) - shape = union([shape, wall_brace(thumb_br_place, -1, 0, web_post_tl(), thumb_br_place, -1, 0, web_post_bl())]) - shape = union([shape, wall_brace(thumb_bl_place, -1, 0, web_post_tl(), thumb_bl_place, -1, 0, web_post_bl())]) + shape = union([wall_brace(default_thumb_mr_place, 0, -1, web_post_br(), default_thumb_tr_place, 0, -1, thumb_post_br())]) + shape = union([shape, wall_brace(default_thumb_mr_place, 0, -1, web_post_br(), default_thumb_mr_place, 0, -1, web_post_bl())]) + shape = union([shape, wall_brace(default_thumb_br_place, 0, -1, web_post_br(), default_thumb_br_place, 0, -1, web_post_bl())]) + shape = union([shape, wall_brace(default_thumb_ml_place, -0.3, 1, web_post_tr(), default_thumb_ml_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(default_thumb_bl_place, 0, 1, web_post_tr(), default_thumb_bl_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(default_thumb_br_place, -1, 0, web_post_tl(), default_thumb_br_place, -1, 0, web_post_bl())]) + shape = union([shape, wall_brace(default_thumb_bl_place, -1, 0, web_post_tl(), default_thumb_bl_place, -1, 0, web_post_bl())]) # thumb, corners - shape = union([shape, wall_brace(thumb_br_place, -1, 0, web_post_bl(), thumb_br_place, 0, -1, web_post_bl())]) - shape = union([shape, wall_brace(thumb_bl_place, -1, 0, web_post_tl(), thumb_bl_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(default_thumb_br_place, -1, 0, web_post_bl(), default_thumb_br_place, 0, -1, web_post_bl())]) + shape = union([shape, wall_brace(default_thumb_bl_place, -1, 0, web_post_tl(), default_thumb_bl_place, 0, 1, web_post_tl())]) # thumb, tweeners - shape = union([shape, wall_brace(thumb_mr_place, 0, -1, web_post_bl(), thumb_br_place, 0, -1, web_post_br())]) - shape = union([shape, wall_brace(thumb_ml_place, 0, 1, web_post_tl(), thumb_bl_place, 0, 1, web_post_tr())]) - shape = union([shape, wall_brace(thumb_bl_place, -1, 0, web_post_bl(), thumb_br_place, -1, 0, web_post_tl())]) + shape = union([shape, wall_brace(default_thumb_mr_place, 0, -1, web_post_bl(), default_thumb_br_place, 0, -1, web_post_br())]) + shape = union([shape, wall_brace(default_thumb_ml_place, 0, 1, web_post_tl(), default_thumb_bl_place, 0, 1, web_post_tr())]) + shape = union([shape, wall_brace(default_thumb_bl_place, -1, 0, web_post_bl(), default_thumb_br_place, -1, 0, web_post_tl())]) if default_1U_cluster: - shape = union([shape, wall_brace(thumb_tr_place, 0, -1, web_post_br(), (lambda sh: key_place(sh, 3, lastrow)), 0, -1, web_post_bl())]) + shape = union([shape, wall_brace(default_thumb_tr_place, 0, -1, web_post_br(), (lambda sh: key_place(sh, 3, lastrow)), 0, -1, web_post_bl())]) else: - shape = union([shape, wall_brace(thumb_tr_place, 0, -1, thumb_post_br(), (lambda sh: key_place(sh, 3, lastrow)), 0, -1, web_post_bl())]) + shape = union([shape, wall_brace(default_thumb_tr_place, 0, -1, thumb_post_br(), (lambda sh: key_place(sh, 3, lastrow)), 0, -1, web_post_bl())]) + + return shape + + +def default_thumb_connection(side='right'): + print('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, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), + default_thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + default_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, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), + default_thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + default_thumb_ml_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), + default_thumb_tl_place(thumb_post_tl()), + ] + ) + ]) # ) + + shape = union([shape, hull_from_shapes( + [ + left_key_place(translate(web_post(), wall_locate1(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), + default_thumb_tl_place(thumb_post_tl()), + ] + )]) + + shape = union([shape, hull_from_shapes( + [ + 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), + default_thumb_tl_place(thumb_post_tl()), + ] + )]) + + shape = union([shape, hull_from_shapes( + [ + default_thumb_ml_place(web_post_tr()), + default_thumb_ml_place(translate(web_post_tr(), wall_locate1(-0.3, 1))), + default_thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + default_thumb_ml_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), + default_thumb_tl_place(thumb_post_tl()), + ] + )]) return shape -def default_thumb_connection(): +def tbjs_thumb_connection(side='right'): print('thumb_connection()') # clunky bit on the top left thumb connection (normal connectors don't work well) + hulls = [] + hulls.append( + 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), + tbjs_place(tbjs_post_tl()), + ] + ) + ) + + hulls.append( + triangle_hulls( + [ + key_place(web_post_bl(), 0, cornerrow), + tbjs_thumb_tl_place(web_post_bl()), + key_place(web_post_br(), 0, cornerrow), + tbjs_thumb_tl_place(web_post_tl()), + key_place(web_post_bl(), 1, cornerrow), + 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), + tbjs_thumb_mr_place(web_post_tl()), + key_place(web_post_br(), 2, lastrow), + key_place(web_post_bl(), 3, lastrow), + tbjs_thumb_mr_place(web_post_tr()), + 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), + ] + ) + ) + shape = union(hulls) + return shape + + +def tbjs_thumb_walls(): + print('thumb_walls()') + # thumb, walls + shape = wall_brace( + tbjs_thumb_mr_place, .5, 1, web_post_tr(), + (lambda sh: key_place(sh, 3, lastrow)), 0, -1, web_post_bl(), + ) + shape = union([shape, wall_brace( + tbjs_thumb_mr_place, .5, 1, web_post_tr(), + tbjs_thumb_br_place, 0, -1, web_post_br(), + )]) + shape = union([shape, wall_brace( + tbjs_thumb_br_place, 0, -1, web_post_br(), + tbjs_thumb_br_place, 0, -1, web_post_bl(), + )]) + shape = union([shape, wall_brace( + tbjs_thumb_br_place, 0, -1, web_post_bl(), + tbjs_thumb_bl_place, 0, -1, web_post_br(), + )]) + shape = union([shape, wall_brace( + tbjs_thumb_bl_place, 0, -1, web_post_br(), + tbjs_thumb_bl_place, -1, -1, web_post_bl(), + )]) + + shape = union([shape, wall_brace( + tbjs_place, -1.5, 0, tbjs_post_tl(), + (lambda sh: left_key_place(sh, lastrow - 1, -1, side=ball_side, low_corner=True)), -1, 0, web_post(), + )]) + shape = union([shape, wall_brace( + tbjs_place, -1.5, 0, tbjs_post_tl(), + tbjs_place, -1, 0, tbjs_post_l(), + )]) + shape = union([shape, wall_brace( + tbjs_place, -1, 0, tbjs_post_l(), + tbjs_thumb_bl_place, -1, 0, web_post_tl(), + )]) + shape = union([shape, wall_brace( + tbjs_thumb_bl_place, -1, 0, web_post_tl(), + tbjs_thumb_bl_place, -1, -1, web_post_bl(), + )]) + + return shape + + +def tbcj_thumb_connection(side='right'): + # 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))), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), + default_thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + default_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(thumb_post_tl()), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), + default_thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + default_thumb_ml_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), + default_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(thumb_post_tl()), + left_key_place(translate(web_post(), wall_locate1(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), + default_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), + 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), - thumb_tl_place(thumb_post_tl()), + default_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(thumb_post_tl()), + default_thumb_ml_place(web_post_tr()), + default_thumb_ml_place(translate(web_post_tr(), wall_locate1(-0.3, 1))), + default_thumb_ml_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), + default_thumb_ml_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), + default_thumb_tl_place(web_post_tl()), ] )]) return shape +def tbcj_thumb_walls(): + shape = union([wall_brace(tbcj_thumb_ml_place, -0.3, 1, web_post_tr(), tbcj_thumb_ml_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(tbcj_thumb_bl_place, 0, 1, web_post_tr(), tbcj_thumb_bl_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(tbcj_thumb_bl_place, -1, 0, web_post_tl(), tbcj_thumb_bl_place, -1, 0, web_post_bl())]) + shape = union([shape, wall_brace(tbcj_thumb_bl_place, -1, 0, web_post_tl(), tbcj_thumb_bl_place, 0, 1, web_post_tl())]) + shape = union([shape, wall_brace(tbcj_thumb_ml_place, 0, 1, web_post_tl(), tbcj_thumb_bl_place, 0, 1, web_post_tr())]) + + corner = box(1,1,tbcj_thickness) + + points = [ + (tbcj_thumb_bl_place, -1, 0, web_post_bl()), + (tbcj_place, 0, -1, tbcj_web_post(4)), + (tbcj_place, 0, -1, tbcj_web_post(3)), + (tbcj_place, 0, -1, tbcj_web_post(2)), + (tbcj_place, 1, -1, tbcj_web_post(1)), + (tbcj_place, 1, 0, tbcj_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 mini_thumb_walls(): # thumb, walls shape = union([wall_brace(mini_thumb_mr_place, 0, -1, web_post_br(), mini_thumb_tr_place, 0, -1, mini_thumb_post_br())]) @@ -2031,12 +2913,12 @@ def mini_thumb_walls(): return shape -def mini_thumb_connection(): +def mini_thumb_connection(side='right'): # 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), mini_thumb_bl_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), mini_thumb_bl_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), ] @@ -2045,8 +2927,8 @@ def mini_thumb_connection(): 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), mini_thumb_bl_place(translate(web_post_tr(), wall_locate2(-0.3, 1))), mini_thumb_bl_place(translate(web_post_tr(), wall_locate3(-0.3, 1))), mini_thumb_tl_place(web_post_tl()), @@ -2056,10 +2938,10 @@ def mini_thumb_connection(): 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), - 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), + 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), mini_thumb_tl_place(web_post_tl()), ] )]) @@ -2067,8 +2949,8 @@ def mini_thumb_connection(): 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), + 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), mini_thumb_tl_place(web_post_tl()), ] @@ -2106,12 +2988,12 @@ def minidox_thumb_walls(): return shape -def minidox_thumb_connection(): +def minidox_thumb_connection(side='right'): # 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), minidox_thumb_bl_place(translate(minidox_thumb_post_tr(), wall_locate2(-0.3, 1))), minidox_thumb_bl_place(translate(minidox_thumb_post_tr(), wall_locate3(-0.3, 1))), ] @@ -2120,8 +3002,8 @@ def minidox_thumb_connection(): 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), minidox_thumb_ml_place(translate(minidox_thumb_post_tr(), wall_locate2(-0.3, 1))), minidox_thumb_ml_place(translate(minidox_thumb_post_tr(), wall_locate3(-0.3, 1))), minidox_thumb_tl_place(minidox_thumb_post_tl()), @@ -2131,10 +3013,10 @@ def minidox_thumb_connection(): 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), - 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), + 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), minidox_thumb_tl_place(minidox_thumb_post_tl()), ] )]) @@ -2142,8 +3024,8 @@ def minidox_thumb_connection(): 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), + 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()), @@ -2182,12 +3064,12 @@ def carbonfet_thumb_walls(): shape = union([shape, wall_brace(carbonfet_thumb_tr_place, 0, -1, web_post_br(), (lambda sh: key_place(sh, 3, lastrow)), 0, -1, web_post_bl())]) return shape -def carbonfet_thumb_connection(): +def carbonfet_thumb_connection(side='right'): # clunky bit on the top left thumb connection (normal connectors don't work well) shape = 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), carbonfet_thumb_bl_place(translate(thumb_post_tr(), wall_locate2(-0.3, 1))), carbonfet_thumb_bl_place(translate(thumb_post_tr(), wall_locate3(-0.3, 1))), ] @@ -2196,8 +3078,8 @@ def carbonfet_thumb_connection(): 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), carbonfet_thumb_bl_place(translate(thumb_post_tr(), wall_locate2(-0.3, 1))), carbonfet_thumb_bl_place(translate(thumb_post_tr(), wall_locate3(-0.3, 1))), carbonfet_thumb_ml_place(thumb_post_tl()), @@ -2207,10 +3089,10 @@ def carbonfet_thumb_connection(): 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), - 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), + 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), + left_key_place(translate(web_post(), wall_locate2(-1, 0)), cornerrow, -1, low_corner=True, side=side), + left_key_place(translate(web_post(), wall_locate3(-1, 0)), cornerrow, -1, low_corner=True, side=side), carbonfet_thumb_ml_place(thumb_post_tl()), ] )]) @@ -2218,8 +3100,8 @@ def carbonfet_thumb_connection(): 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), + 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), carbonfet_thumb_ml_place(thumb_post_tl()), ] @@ -2238,16 +3120,16 @@ def carbonfet_thumb_connection(): return shape -def case_walls(): +def case_walls(side='right'): print('case_walls()') return ( union([ back_wall(), - left_wall(), + left_wall(side=side), right_wall(), front_wall(), - thumb_walls(), - thumb_connection(), + thumb_walls(side=side), + thumb_connection(side=side), ]) ) @@ -2339,36 +3221,147 @@ external_start = list( def external_mount_hole(): print('external_mount_hole()') shape = box(external_holder_width, 20.0, external_holder_height+.1) + undercut = box(external_holder_width+8, 10.0, external_holder_height+8+.1) + shape = union([shape, translate(undercut,(0, -5, 0))]) + shape = translate(shape, ( external_start[0] + external_holder_xoffset, - external_start[1], + external_start[1] + external_holder_yoffset, external_holder_height / 2-.05, ) ) return shape -if oled_center_row is not None: +def generate_trackball(pos, rot): + + precut = trackball_cutout() + precut = rotate(precut, tb_socket_rotation_offset) + precut = translate(precut, tb_socket_translation_offset) + precut = rotate(precut, rot) + precut = translate(precut, pos) + + shape, cutout, sensor = trackball_socket() + + shape = rotate(shape, tb_socket_rotation_offset) + shape = translate(shape, tb_socket_translation_offset) + shape = rotate(shape, rot) + shape = translate(shape, pos) + + cutout = rotate(cutout, tb_socket_rotation_offset) + cutout = translate(cutout, tb_socket_translation_offset) + # cutout = rotate(cutout, tb_sensor_translation_offset) + # cutout = translate(cutout, tb_sensor_rotation_offset) + cutout = rotate(cutout, rot) + cutout = translate(cutout, pos) + + # Small adjustment due to line to line surface / minute numerical error issues + # Creates small overlap to assist engines in union function later + sensor = rotate(sensor, tb_socket_rotation_offset) + sensor = translate(sensor, tb_socket_translation_offset) + # sensor = rotate(sensor, tb_sensor_translation_offset) + # sensor = translate(sensor, tb_sensor_rotation_offset) + sensor = translate(sensor, (0, 0, .001)) + sensor = rotate(sensor, rot) + sensor = translate(sensor, pos) + + ball = trackball_ball() + ball = rotate(ball, tb_socket_rotation_offset) + ball = translate(ball, tb_socket_translation_offset) + ball = rotate(ball, rot) + ball = translate(ball, pos) + + # return precut, shape, cutout, ball + return precut, shape, cutout, sensor, ball + +def generate_trackball_in_cluster(): + if thumb_style == 'TRACKBALL_ORBYL': + pos, rot = tbjs_thumb_position_rotation() + elif thumb_style == 'TRACKBALL_CJ': + pos, rot = tbcj_thumb_position_rotation() + return generate_trackball(pos, rot) + + + +def tbiw_position_rotation(): base_pt1 = key_position( - list(np.array([-mount_width/2, 0, 0]) + np.array([0, (mount_height / 2), 0])), 0, oled_center_row-1 + list(np.array([-mount_width/2, 0, 0]) + np.array([0, (mount_height / 2), 0])), + 0, cornerrow - tbiw_ball_center_row - 1 ) base_pt2 = key_position( - list(np.array([-mount_width/2, 0, 0]) + np.array([0, (mount_height / 2), 0])), 0, oled_center_row+1 + list(np.array([-mount_width/2, 0, 0]) + np.array([0, (mount_height / 2), 0])), + 0, cornerrow - tbiw_ball_center_row + 1 ) base_pt0 = key_position( - list(np.array([-mount_width / 2, 0, 0]) + np.array([0, (mount_height / 2), 0])), 0, oled_center_row + list(np.array([-mount_width / 2, 0, 0]) + np.array([0, (mount_height / 2), 0])), + 0, cornerrow - tbiw_ball_center_row + ) + + left_wall_x_offset = tbiw_left_wall_x_offset_override + + tbiw_mount_location_xyz = ( + (np.array(base_pt1)+np.array(base_pt2))/2. + + np.array(((-left_wall_x_offset/2), 0, 0)) + + np.array(tbiw_translational_offset) ) - oled_mount_location_xyz = (np.array(base_pt1)+np.array(base_pt2))/2. + np.array(((-left_wall_x_offset/2), 0, 0)) + np.array(oled_translation_offset) - oled_mount_location_xyz[2] = (oled_mount_location_xyz[2] + base_pt0[2])/2 + # tbiw_mount_location_xyz[2] = (oled_translation_offset[2] + base_pt0[2])/2 angle_x = np.arctan2(base_pt1[2] - base_pt2[2], base_pt1[1] - base_pt2[1]) angle_z = np.arctan2(base_pt1[0] - base_pt2[0], base_pt1[1] - base_pt2[1]) + tbiw_mount_rotation_xyz = (rad2deg(angle_x), 0, rad2deg(angle_z)) + np.array(tbiw_rotation_offset) + + return tbiw_mount_location_xyz, tbiw_mount_rotation_xyz + +def generate_trackball_in_wall(): + pos, rot = tbiw_position_rotation() + return generate_trackball(pos, rot) - oled_mount_rotation_xyz = (rad2deg(angle_x), 0, -rad2deg(angle_z)) + np.array(oled_rotation_offset) -def oled_sliding_mount_frame(): +def oled_position_rotation(side='right'): + _oled_center_row = None + if trackball_in_wall and (side == ball_side or ball_side == 'both'): + _oled_center_row = tbiw_oled_center_row + _oled_translation_offset = tbiw_oled_translation_offset + _oled_rotation_offset = tbiw_oled_rotation_offset + + elif oled_center_row is not None: + _oled_center_row = oled_center_row + _oled_translation_offset = oled_translation_offset + _oled_rotation_offset = oled_rotation_offset + + if _oled_center_row is not None: + base_pt1 = key_position( + list(np.array([-mount_width/2, 0, 0]) + np.array([0, (mount_height / 2), 0])), 0, _oled_center_row-1 + ) + base_pt2 = key_position( + list(np.array([-mount_width/2, 0, 0]) + np.array([0, (mount_height / 2), 0])), 0, _oled_center_row+1 + ) + base_pt0 = key_position( + list(np.array([-mount_width / 2, 0, 0]) + np.array([0, (mount_height / 2), 0])), 0, _oled_center_row + ) + + if trackball_in_wall and (side == ball_side or ball_side == 'both'): + _left_wall_x_offset = tbiw_left_wall_x_offset_override + else: + _left_wall_x_offset = left_wall_x_offset + + oled_mount_location_xyz = (np.array(base_pt1)+np.array(base_pt2))/2. + np.array(((-_left_wall_x_offset/2), 0, 0)) + np.array(_oled_translation_offset) + oled_mount_location_xyz[2] = (oled_mount_location_xyz[2] + base_pt0[2])/2 + + angle_x = np.arctan2(base_pt1[2] - base_pt2[2], base_pt1[1] - base_pt2[1]) + angle_z = np.arctan2(base_pt1[0] - base_pt2[0], base_pt1[1] - base_pt2[1]) + if trackball_in_wall and (side == ball_side or ball_side == 'both'): + # oled_mount_rotation_xyz = (0, rad2deg(angle_x), -rad2deg(angle_z)-90) + np.array(oled_rotation_offset) + # oled_mount_rotation_xyz = (rad2deg(angle_x)*.707, rad2deg(angle_x)*.707, -45) + np.array(oled_rotation_offset) + oled_mount_rotation_xyz = (0, rad2deg(angle_x), -90) + np.array(_oled_rotation_offset) + else: + oled_mount_rotation_xyz = (rad2deg(angle_x), 0, -rad2deg(angle_z)) + np.array(_oled_rotation_offset) + + return oled_mount_location_xyz, oled_mount_rotation_xyz + +def oled_sliding_mount_frame(side='right'): mount_ext_width = oled_mount_width + 2 * oled_mount_rim mount_ext_height = ( oled_mount_height + 2 * oled_edge_overlap_end @@ -2444,6 +3437,8 @@ def oled_sliding_mount_frame(): shape = difference(shape, [conn_hole, top_hole, end_hole]) + oled_mount_location_xyz, oled_mount_rotation_xyz = oled_position_rotation(side=side) + shape = rotate(shape, oled_mount_rotation_xyz) shape = translate(shape, ( @@ -2464,7 +3459,7 @@ def oled_sliding_mount_frame(): return hole, shape -def oled_clip_mount_frame(): +def oled_clip_mount_frame(side='right'): mount_ext_width = oled_mount_width + 2 * oled_mount_rim mount_ext_height = ( oled_mount_height + 2 * oled_clip_thickness @@ -2500,6 +3495,8 @@ def oled_clip_mount_frame(): plate = translate(plate, (0., 0., -oled_thickness / 2.0)) shape = union([shape, plate]) + oled_mount_location_xyz, oled_mount_rotation_xyz = oled_position_rotation(side=side) + shape = rotate(shape, oled_mount_rotation_xyz) shape = translate(shape, ( @@ -2586,7 +3583,7 @@ def oled_clip(): return shape -def oled_undercut_mount_frame(): +def oled_undercut_mount_frame(side='right'): mount_ext_width = oled_mount_width + 2 * oled_mount_rim mount_ext_height = oled_mount_height + 2 * oled_mount_rim hole = box(mount_ext_width, mount_ext_height, oled_mount_cut_depth + .01) @@ -2600,6 +3597,8 @@ def oled_undercut_mount_frame(): undercut = translate(undercut, (0., 0., -oled_mount_undercut_thickness)) shape = difference(shape, [undercut]) + oled_mount_location_xyz, oled_mount_rotation_xyz = oled_position_rotation(side=side) + shape = rotate(shape, oled_mount_rotation_xyz) shape = translate(shape, ( oled_mount_location_xyz[0], @@ -2685,7 +3684,7 @@ def screw_insert_shape(bottom_radius, top_radius, height): return shape -def screw_insert(column, row, bottom_radius, top_radius, height): +def screw_insert(column, row, bottom_radius, top_radius, height, side='right'): debugprint('screw_insert()') shift_right = column == lastcol shift_left = column == 0 @@ -2727,7 +3726,7 @@ def screw_insert(column, row, bottom_radius, top_radius, height): ) elif shift_left: position = list( - np.array(left_key_position(row, 0)) + np.array(wall_locate3(-1, 0)) + np.array((shift_left_adjust,0,0)) + np.array(left_key_position(row, 0, side=side)) + np.array(wall_locate3(-1, 0)) + np.array((shift_left_adjust,0,0)) ) else: position = key_position( @@ -2749,7 +3748,7 @@ def screw_insert_thumb(bottom_radius, top_radius, height): position = list(np.array(position) + np.array([-29, -51, -16])) position[2] = 0 - if thumb_style == 'MINIDOX': + 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 @@ -2759,6 +3758,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() @@ -2769,15 +3772,15 @@ def screw_insert_thumb(bottom_radius, top_radius, height): shape = translate(shape, [position[0], position[1], height / 2]) return shape -def screw_insert_all_shapes(bottom_radius, top_radius, height, offset=0): +def screw_insert_all_shapes(bottom_radius, top_radius, height, offset=0, side='right'): print('screw_insert_all_shapes()') shape = ( - translate(screw_insert(0, 0, bottom_radius, top_radius, height), (0, 0, offset)), - translate(screw_insert(0, lastrow-1, bottom_radius, top_radius, height), (0, left_wall_lower_y_offset, offset)), - translate(screw_insert(3, lastrow, bottom_radius, top_radius, height), (0, 0, offset)), - translate(screw_insert(3, 0, bottom_radius, top_radius, height), (0,0, offset)), - translate(screw_insert(lastcol, 0, bottom_radius, top_radius, height), (0, 0, offset)), - translate(screw_insert(lastcol, lastrow-1, bottom_radius, top_radius, height), (0, 0, offset)), + translate(screw_insert(0, 0, bottom_radius, top_radius, height, side=side), (0, 0, offset)), + translate(screw_insert(0, lastrow-1, bottom_radius, top_radius, height, side=side), (0, left_wall_lower_y_offset, offset)), + translate(screw_insert(3, lastrow, bottom_radius, top_radius, height, side=side), (0, 0, offset)), + 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)), ) @@ -2786,20 +3789,21 @@ def screw_insert_all_shapes(bottom_radius, top_radius, height, offset=0): -def screw_insert_holes(): +def screw_insert_holes(side='right'): return screw_insert_all_shapes( - screw_insert_bottom_radius, screw_insert_top_radius, screw_insert_height+.02, offset=-.01 + screw_insert_bottom_radius, screw_insert_top_radius, screw_insert_height+.02, offset=-.01, side=side ) -def screw_insert_outers(): +def screw_insert_outers(side='right'): return screw_insert_all_shapes( screw_insert_bottom_radius + 1.6, screw_insert_top_radius + 1.6, screw_insert_height + 1.5, + side=side ) -def screw_insert_screw_holes(): - return screw_insert_all_shapes(1.7, 1.7, 350) +def screw_insert_screw_holes(side='right'): + return screw_insert_all_shapes(1.7, 1.7, 350, side=side) @@ -2828,9 +3832,9 @@ def wire_post(direction, offset): def wire_posts(): debugprint('wire_posts()') - shape = thumb_ml_place(wire_post(1, 0).translate([-5, 0, -2])) - shape = union([shape, thumb_ml_place(wire_post(-1, 6).translate([0, 0, -2.5]))]) - shape = union([shape, thumb_ml_place(wire_post(1, 0).translate([5, 0, -2]))]) + shape = default_thumb_ml_place(wire_post(1, 0).translate([-5, 0, -2])) + shape = union([shape, default_thumb_ml_place(wire_post(-1, 6).translate([0, 0, -2.5]))]) + shape = union([shape, default_thumb_ml_place(wire_post(1, 0).translate([5, 0, -2]))]) for column in range(lastcol): for row in range(lastrow - 1): @@ -2856,15 +3860,15 @@ def model_side(side="right"): 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() + 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() + 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()]) + s2 = union([s2, *screw_insert_outers(side=side)]) if controller_mount_type in ['RJ9_USB_TEENSY', 'USB_TEENSY']: s2 = union([s2, teensy_holder()]) @@ -2882,33 +3886,63 @@ def model_side(side="right"): if controller_mount_type in ['None']: 0 # do nothing, only here to expressly state inaction. - s2 = difference(s2, [union(screw_insert_holes())]) + s2 = difference(s2, [union(screw_insert_holes(side=side))]) shape = union([shape, s2]) if controller_mount_type in ['RJ9_USB_TEENSY', 'RJ9_USB_WALL']: shape = union([shape, rj9_holder()]) if oled_mount_type == "UNDERCUT": - hole, frame = oled_undercut_mount_frame() + hole, frame = oled_undercut_mount_frame(side=side) shape = difference(shape, [hole]) shape = union([shape, frame]) elif oled_mount_type == "SLIDING": - hole, frame = oled_sliding_mount_frame() + hole, frame = oled_sliding_mount_frame(side=side) shape = difference(shape, [hole]) shape = union([shape, frame]) elif oled_mount_type == "CLIP": - hole, frame = oled_clip_mount_frame() + hole, frame = oled_clip_mount_frame(side=side) shape = difference(shape, [hole]) shape = union([shape, frame]) + if trackball_in_wall and (side == ball_side or ball_side == 'both'): + tbprecut, tb, tbcutout, sensor, ball = generate_trackball_in_wall() + + 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]) + + if (trackball_in_wall or ('TRACKBALL' in thumb_style)) and (side == ball_side or ball_side == 'both'): + tbprecut, tb, tbcutout, sensor, ball = generate_trackball_in_cluster() + + 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]) if show_caps: - shape = add([shape, thumbcaps()]) + shape = add([shape, thumbcaps(side=side)]) shape = add([shape, caps()]) if side == "left": @@ -2918,17 +3952,17 @@ def model_side(side="right"): # NEEDS TO BE SPECIAL FOR CADQUERY -def baseplate(wedge_angle=None): +def baseplate(wedge_angle=None, side='right'): if ENGINE == 'cadquery': # shape = mod_r - shape = union([case_walls(), *screw_insert_outers()]) - # tool = translate(screw_insert_screw_holes(), [0, 0, -10]) - tool = screw_insert_all_shapes(screw_hole_diameter/2., screw_hole_diameter/2., 350) + shape = union([case_walls(side=side), *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]) - shape = translate(shape, (0, 0, -0.01)) + shape = translate(shape, (0, 0, -0.0001)) square = cq.Workplane('XY').rect(1000, 1000) for wire in square.wires().objects: @@ -2989,15 +4023,16 @@ def baseplate(wedge_angle=None): else: shape = union([ - case_walls(), - *screw_insert_outers() + case_walls(side=side), + *screw_insert_outers(side=side) ]) - tool = translate(union(screw_insert_screw_holes()), [0, 0, -10]) - + tool = translate(union(screw_insert_screw_holes(side=side)), [0, 0, -10]) + base = box(1000, 1000, .01) shape = shape - tool + shape = intersect(shape, base) - shape = translate(shape, [0, 0, -0.01]) + shape = translate(shape, [0, 0, -0.001]) return sl.projection(cut=True)(shape) @@ -3006,21 +4041,27 @@ def run(): mod_r = model_side(side="right") export_file(shape=mod_r, fname=path.join(save_path, config_name + r"_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") export_file(shape=mod_l, fname=path.join(save_path, config_name + r"_left")) + base_l = mirror(baseplate(side='left'), 'YZ') + export_file(shape=base_l, fname=path.join(save_path, config_name + r"_left_plate")) + export_dxf(shape=base_l, fname=path.join(save_path, config_name + r"_left_plate")) + else: export_file(shape=mirror(mod_r, 'YZ'), fname=path.join(save_path, config_name + r"_left")) + lbase = mirror(base, 'YZ') + export_file(shape=lbase, fname=path.join(save_path, config_name + r"_left_plate")) + export_dxf(shape=lbase, fname=path.join(save_path, config_name + r"_left_plate")) + - base = baseplate() - 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")) - lbase = mirror(base, 'YZ') - export_file(shape=lbase, fname=path.join(save_path, config_name + r"_left_plate")) - export_dxf(shape=lbase, fname=path.join(save_path, config_name + r"_left_plate")) if oled_mount_type == 'UNDERCUT': export_file(shape=oled_undercut_mount_frame()[1], fname=path.join(save_path, config_name + r"_oled_undercut_test")) @@ -3040,4 +4081,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() |