/* * Copyright 2022 Thomas Buck - thomas@xythobuz.de * Philipp Schönberger - mail@phschoen.de * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * See . */ include ; include ; use ; use ; use ; use ; function switch_rc_point(switch_config, c, r, a, h, offset=[0,0,0]) = v_rot(switch_config[c][r][r_pos]) * (switch_point(a,h) + offset) + switch_config[c][r][t_pos]; function switch_bz(switch_config, c, r, a, h, offset=[0,-10,0]) = [ [ switch_rc_point(switch_config, c, r, a[0], h, [0,0,0]), switch_rc_point(switch_config, c, r, a[1], h, [0,0,0]), ], [ switch_rc_point(switch_config, c, r, a[0], h, offset), switch_rc_point(switch_config, c, r, a[1], h, offset), ], [ zero_axis("z", switch_rc_point(switch_config, c, r, a[0], h, offset), -20), zero_axis("z", switch_rc_point(switch_config, c, r, a[1], h, offset), -20) ], ]; function switch_bz_edge(switch_config, c, r, a, h, offset1=[0,-10,0],offset2=[0,-10,0]) = [ [ switch_rc_point(switch_config, c, r, a, h, $e*offset1), switch_rc_point(switch_config, c, r, a, h, 0*offset1), switch_rc_point(switch_config, c, r, a, h, $e*offset2), ], [ switch_rc_point(switch_config, c, r, a, h, offset1), switch_rc_point(switch_config, c, r, a, h, offset1+offset2), switch_rc_point(switch_config, c, r, a, h, offset2), ], [ zero_axis("z", switch_rc_point(switch_config, c, r, a, h, offset1), -20), zero_axis("z", switch_rc_point(switch_config, c, r, a, h, offset1+offset2), -20), zero_axis("z", switch_rc_point(switch_config, c, r, a, h, offset2), -20) ], ]; function switch_bz_between(switch_config, colums, rows, a, h, offset_bz=[2,0,0], offset_out=[0,-10,0]) = [ [ switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]-offset_bz), switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]), switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]+offset_bz), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]-offset_bz), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]+offset_bz), ], [ switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]-offset_bz+offset_out), switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]+offset_out), switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]+offset_bz+offset_out), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]-offset_bz+offset_out), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]+offset_out), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]+offset_bz+offset_out), ], [ zero_axis("z", switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]-offset_bz+offset_out), -20), zero_axis("z", switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]+offset_out), -20), zero_axis("z", switch_rc_point(switch_config, colums[0], rows[0], a[0], h, [0,0,0]+offset_bz+offset_out), -20), zero_axis("z", switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]-offset_bz+offset_out), -20), zero_axis("z", switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]+offset_out), -20), zero_axis("z", switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1], h, [0,0,0]+offset_bz+offset_out), -20), ], ]; function switch_line_connection(switch_config, colums, rows, a) = [ switch_rc_point(switch_config, colums[0], rows[0], a[0][0], "top", [0,0,0]), switch_rc_point(switch_config, colums[0], rows[0], a[0][1], "top", [0,0,0]), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1][1], "top", [0,0,0]), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1][0], "top", [0,0,0]), switch_rc_point(switch_config, colums[0], rows[0], a[0][0], "bot", [0,0,0]), switch_rc_point(switch_config, colums[0], rows[0], a[0][1], "bot", [0,0,0]), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1][1], "bot", [0,0,0]), switch_rc_point(switch_config, colums[len(colums) == 1 ? 0 : 1], rows[len(rows) == 1 ? 0 : 1], a[1][0], "bot", [0,0,0]), ]; function switch_line_connection_cross(switch_config, colums, rows, a,h,offset_bz=[2,0,0]) = [ switch_rc_point(switch_config, colums[0], rows[0], a[0][0], "top", [0,0,0]), switch_rc_point(switch_config, colums[0], rows[1], a[0][1], "top", [0,0,0]), switch_rc_point(switch_config, colums[1], rows[1], a[1][1], "top", [0,0,0]), switch_rc_point(switch_config, colums[1], rows[0], a[1][0], "top", [0,0,0]), switch_rc_point(switch_config, colums[0], rows[0], a[0][0], "bot", [0,0,0]), switch_rc_point(switch_config, colums[0], rows[1], a[0][1], "bot", [0,0,0]), switch_rc_point(switch_config, colums[1], rows[1], a[1][1], "bot", [0,0,0]), switch_rc_point(switch_config, colums[1], rows[0], a[1][0], "bot", [0,0,0]), ]; function reverse_bz(points) = [for(i = [len(points)-1:-1:0]) points[i], ]; switch_holder_plate(switch_config[0], 10); module switch_holder_plate(switch_config, w_extra) { t_step = 0.1; thickness = switch_holder_height+1; c_max=len(switch_config)-1; function r_max(c) = len(switch_config[c])-1; ctrl_pts_S = [ for(c=[0:c_max], r=[r_max(c)]) switch_bz(switch_config, c, r, ["SW","SE"], "top", [0,-w_extra,0]), ]; // North curve ctrl_pts_N = [ for(c=[0:c_max], r=[0]) switch_bz(switch_config, c, r, ["NE","NW"], "top", [0,w_extra,0]), ]; // West curve ctrl_pts_W = [ for(c=[0], r=[0:r_max(c)]) switch_bz(switch_config, c, r, ["NW","SW"], "top", [-w_extra,0,0]), ]; // East curve ctrl_pts_E = [ for(c=[c_max], r=[0:r_max(c)]) switch_bz(switch_config, c, r, ["SE","NE"], "top", [+w_extra,0,0]), ]; // edge ctrl_pts_EDGE = [ switch_bz_edge(switch_config, 0, r_max(0), "SW", "top", [-w_extra,0,0], [0,-w_extra,0]), switch_bz_edge(switch_config, c_max, 0, "NE", "top", [ w_extra,0,0], [0, w_extra,0]), reverse_bz(switch_bz_edge(switch_config, c_max, r_max(c_max), "SE", "top", [ w_extra,0,0], [0,-w_extra,0])), reverse_bz(switch_bz_edge(switch_config, 0, 0, "NW", "top", [-w_extra,0,0], [0, w_extra,0])), ]; // between the s curves // ctrl_pts_S_B = [ for(c=[0:c_max-1], r=[r_max(c)]) switch_bz_between(switch_config, [c, c+1], [r], ["SE","SW"], "top", [1,0,0], [0,-w_extra,0]), ]; // North curve between the keys ctrl_pts_N_B = [ for(c=[0:c_max-1], r=[0]) switch_bz_between(switch_config, [c+1,c], [r], ["NW","NE"], "top", [-1,0,0], [0,+w_extra,0]), ]; /* // West curve between the keys */ ctrl_pts_W_B = [ for(c=[0], r=[0:r_max(c)]) switch_bz_between(switch_config, [c], [r,r+1], ["SW","NW"], "top", [1,0,0], [-w_extra,0,0]), ]; /* // East curve between the keys */ ctrl_pts_E_B = [ for(c=[c_max], r=[0:r_max(c)]) switch_bz_between(switch_config, [c], [r+1,r], ["NE","SE"],"top",[1,0,0],[w_extra,0,0]), ]; // North-South between the keys ctrl_pts_NS_IN = [ for(c=[0:c_max], r=[0:r_max(c)-1]) switch_line_connection(switch_config, [c], [r,r+1], [ ["SW", "SE"], ["NW", "NE"], ], "top") ]; // East West between the keys ctrl_pts_EW_IN = [ for(c=[0:c_max-1], r=[0:r_max(c)]) switch_line_connection(switch_config, [c,c+1], [r], [["NE", "SE"],["NW", "SW"] ,], "top"), ]; // the cross section between 4 keys // // ctrl_pts_CROSS_IN = [ for(c=[0:c_max-1], r=[0:r_max(c)-1]) switch_line_connection_cross(switch_config, [c,c+1], [r,r+1], [["SE", "NE"],["SW", "NW"] ,]), ]; ctrl_pts = [ ctrl_pts_S , ctrl_pts_N, ctrl_pts_W, ctrl_pts_E, ctrl_pts_EDGE, ctrl_pts_S_B , ctrl_pts_N_B , ctrl_pts_W_B , ctrl_pts_E_B , ]; echo("ctrlptr sB",ctrl_pts_S_B); poly_pts = [ ctrl_pts_NS_IN, ctrl_pts_EW_IN, ctrl_pts_CROSS_IN, ]; for(c=[0:len(switch_config)-1], r=[0:len(switch_config[c])-1]) translate(switch_config[c][r][t_pos]) rotate(switch_config[c][r][r_pos]) { if($show_switches == true) switch(0, $show_keycaps ? switch_config[c][r][k_pos][0]: "none", switch_config[c][r][k_pos][1] ); if($show_switch_pcb == true) translate([0,0,-switch_holder_height-amoeba_royale_pcb_h-$c]) amoeba_royale_pcb(); switch_holder_with_cutouts(type="B"); } if($show_case == true) for(j=[0:len(ctrl_pts)-1]) { for(k=[0:len(ctrl_pts[j])-1]) { g_S = bezier_surface(t_step, ctrl_pts[j][k]); // g_S = sf_splines(t_step, ctrl_pts[j][k]); sf_thicken(g_S, thickness,"FORWARD"); //function_grapher(g_S,thickness,"FORWARD"); } } if($show_case_plate == true) for(j=[0:len(poly_pts)-1]) { for(k=[0:len(poly_pts[j])-1]) { all_cube_faces= [ [0,1,2,3], // bot [4,5,1,0], // front [7,6,5,4], // top [5,6,2,1], // right [6,7,3,2], // back [7,4,0,3], // left ]; polyhedron(poly_pts[j][k], all_cube_faces); } } // draw bezier_points //if($show_case_debug == true) %color("black") for(k=[0:len(ctrl_pts)-1]) for(i=[0:len(ctrl_pts[k])-1]) for(j=[0:len(ctrl_pts[k][i])-1]) for(l=[0:len(ctrl_pts[k][i][j])-1]) translate(ctrl_pts[k][i][j][l]) { //echo (ctrl_pts[k][i][j][l]); sphere(d=1); } if($show_case_debug == false) %color("blue") for(k=[0:len(poly_pts)-1]) for(i=[0:len(poly_pts[k])-1]) for(j=[0:len(poly_pts[k][i])-1]) translate(poly_pts[k][i][j]) { //echo (poly_pts[k][i][j][l]); sphere(d=1); } }