|
|
|
|
@@ -205,11 +205,7 @@ $warning_color = [1,0,0, 0.15];
|
|
|
|
|
$minkowski_facets = 30;
|
|
|
|
|
$shape_facets =30;
|
|
|
|
|
|
|
|
|
|
// 3d surface settings
|
|
|
|
|
// unused for now
|
|
|
|
|
$3d_surface_size = 100;
|
|
|
|
|
// resolution in each axis. 10 = 10 divisions per x/y = 100 points total
|
|
|
|
|
$3d_surface_step = 10;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// "flat" / "dished" / "disable"
|
|
|
|
|
$inner_shape_type = "flat";
|
|
|
|
|
@@ -220,6 +216,48 @@ $side_sculpting_factor = 4.5;
|
|
|
|
|
$corner_sculpting_factor = 1;
|
|
|
|
|
// When doing more side sculpting corners, how much extra radius should be added
|
|
|
|
|
$more_side_sculpting_factor = 0.4;
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// 3d surface settings
|
|
|
|
|
// unused for now
|
|
|
|
|
$3d_surface_size = 20;
|
|
|
|
|
// resolution in each axis. 10 = 10 divisions per x/y = 100 points total.
|
|
|
|
|
// 5 = 20 divisions per x/y
|
|
|
|
|
$3d_surface_step = 1;
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
sinusoidal_surface_distribution = function(dim,size) sin(dim) * size;
|
|
|
|
|
linear_surface_distribution = function(dim,size) sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
$surface_distribution_function = linear_surface_distribution;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
// $surface_function = function(x,y) 1;
|
|
|
|
|
cylindrical_surface = function(x,y) (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
spherical_surface = function(x,y) (1 - (x/$3d_surface_size)^2)^0.5 * (1 - (y/$3d_surface_size)^2)^0.5;
|
|
|
|
|
// looks a lot like mt3
|
|
|
|
|
quartic_surface = function(x,y) (1 - (x/$3d_surface_size)^4)^0.5 * (1 - (y/$3d_surface_size)^4)^0.5;
|
|
|
|
|
ripple_surface = function(x,y) cos((x^2+y^2)^0.5 * 50)/4 + 0.75;
|
|
|
|
|
rosenbrocks_banana_surface = function(x,y) (pow(1-(x/$3d_surface_size))^2 + 100 * pow((y/$3d_surface_size)-(x/$3d_surface_size)^2)^2)/200 + 0.1;
|
|
|
|
|
spike_surface = function(x,y) 1/(((x/$3d_surface_size)^2+(y/$3d_surface_size)^2)^0.5) + .01;
|
|
|
|
|
random_surface = function(x,y) sin(rands(0,90,1,x+y)[0]);
|
|
|
|
|
bumps_surface = function(x,y) sin(20*x)*cos(20*y)/3+1;
|
|
|
|
|
|
|
|
|
|
$surface_function = bumps_surface; // bumps_surface;
|
|
|
|
|
|
|
|
|
|
// ripples
|
|
|
|
|
/*
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* $
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* $surface_function = */
|
|
|
|
|
/* $surface_function = */
|
|
|
|
|
// key width functions
|
|
|
|
|
|
|
|
|
|
module u(u=1) {
|
|
|
|
|
@@ -570,7 +608,9 @@ module mt3_row(row=3, column=0, deep_dish=false) {
|
|
|
|
|
$dish_skew_y = 0;
|
|
|
|
|
$top_skew = 0;
|
|
|
|
|
$height_slices = 10;
|
|
|
|
|
$corner_radius = 1;
|
|
|
|
|
|
|
|
|
|
$corner_sculpting_factor = 2;
|
|
|
|
|
$corner_radius = 0.0125;
|
|
|
|
|
|
|
|
|
|
$more_side_sculpting_factor = 0.75;
|
|
|
|
|
|
|
|
|
|
@@ -818,7 +858,49 @@ module dss_row(n=3, column=0) {
|
|
|
|
|
$top_tilt = 8;
|
|
|
|
|
children();
|
|
|
|
|
}
|
|
|
|
|
}module asa_row(row=3, column = 0) {
|
|
|
|
|
$key_shape_type = "sculpted_square";
|
|
|
|
|
$bottom_key_height = 18.06;
|
|
|
|
|
$bottom_key_width = 18.05; // Default (R3)
|
|
|
|
|
$total_depth = 10.35; // Default (R3)
|
|
|
|
|
$top_tilt = 1.5; // Default (R3)
|
|
|
|
|
$width_difference = 5.05;
|
|
|
|
|
$height_difference = 5.56;
|
|
|
|
|
$dish_type = "spherical";
|
|
|
|
|
$dish_depth = 1.2;
|
|
|
|
|
$dish_skew_x = 0;
|
|
|
|
|
$dish_skew_y = 0;
|
|
|
|
|
$top_skew = 1.75;
|
|
|
|
|
$stem_inset = 1.2;
|
|
|
|
|
$height_slices = 10;
|
|
|
|
|
$corner_radius = 1;
|
|
|
|
|
|
|
|
|
|
// this is _incredibly_ intensive
|
|
|
|
|
//$rounded_key = true;
|
|
|
|
|
|
|
|
|
|
if (row == 1){
|
|
|
|
|
$bottom_key_width = 17.95;
|
|
|
|
|
$width_difference = 4.95;
|
|
|
|
|
$total_depth = 10.65;
|
|
|
|
|
$top_tilt = 7;
|
|
|
|
|
children();
|
|
|
|
|
} else if (row == 2) {
|
|
|
|
|
$bottom_key_width = 18.17;
|
|
|
|
|
$width_difference = 5.17;
|
|
|
|
|
$total_depth = 9.65;
|
|
|
|
|
$top_tilt = 3.25;
|
|
|
|
|
children();
|
|
|
|
|
} else if (row == 4){
|
|
|
|
|
$bottom_key_width = 18.02;
|
|
|
|
|
$width_difference = 5.02;
|
|
|
|
|
$total_depth = 11.9;
|
|
|
|
|
$top_tilt = 0.43;
|
|
|
|
|
children();
|
|
|
|
|
} else {
|
|
|
|
|
children();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// man, wouldn't it be so cool if functions were first order
|
|
|
|
|
module key_profile(key_profile_type, row, column=0) {
|
|
|
|
|
if (key_profile_type == "dcs") {
|
|
|
|
|
@@ -831,6 +913,8 @@ module key_profile(key_profile_type, row, column=0) {
|
|
|
|
|
dss_row(row, column) children();
|
|
|
|
|
} else if (key_profile_type == "sa") {
|
|
|
|
|
sa_row(row, column) children();
|
|
|
|
|
} else if (key_profile_type == "asa") {
|
|
|
|
|
asa_row(row, column) children();
|
|
|
|
|
} else if (key_profile_type == "g20") {
|
|
|
|
|
g20_row(row, column) children();
|
|
|
|
|
} else if (key_profile_type == "hipro") {
|
|
|
|
|
@@ -899,29 +983,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -1186,13 +1247,68 @@ module upside_down() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module sideways() {
|
|
|
|
|
$stem_support_type = "disable";
|
|
|
|
|
$key_shape_type = "flat_sided_square";
|
|
|
|
|
$dish_overdraw_width = abs(extra_keytop_length_for_flat_sides());
|
|
|
|
|
extra_y_rotation = atan2($width_difference/2,$total_depth);
|
|
|
|
|
extra_y_rotation = atan2($width_difference/2,$total_depth); // TODO assumes centered top
|
|
|
|
|
translate([0,0,cos(extra_y_rotation) * total_key_width()/2])
|
|
|
|
|
rotate([0,90 + extra_y_rotation ,0]) children();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* this is hard to explain. we want the angle of the back of the keycap.
|
|
|
|
|
* first we draw a line at the back of the keycap perpendicular to the ground.
|
|
|
|
|
* then we extend the line created by the slope of the keytop to that line
|
|
|
|
|
* the angle of the latter line off the ground is $top_tilt, and
|
|
|
|
|
* you can create a right triangle with the adjacent edge being $bottom_key_height/2
|
|
|
|
|
* raised up $total_depth. this gets you x, the component of the extended
|
|
|
|
|
* keytop slope line, and y, a component of the first perpendicular line.
|
|
|
|
|
* by a very similar triangle you get r and s, where x is the hypotenuse of that
|
|
|
|
|
* right triangle and the right angle is again against the first perpendicular line
|
|
|
|
|
* s is the opposite line in the right triangle required to find q, the angle
|
|
|
|
|
* of the back. if you subtract r from $total_depth plus y you can now use these
|
|
|
|
|
* two values in atan to find the angle of interest.
|
|
|
|
|
*/
|
|
|
|
|
module backside() {
|
|
|
|
|
$stem_support_type = "disable";
|
|
|
|
|
|
|
|
|
|
// $key_shape_type = "flat_sided_square";
|
|
|
|
|
|
|
|
|
|
a = $bottom_key_height;
|
|
|
|
|
b = $total_depth;
|
|
|
|
|
c = top_total_key_height();
|
|
|
|
|
|
|
|
|
|
x = (a / 2 - $top_skew) / cos(-$top_tilt) - c / 2;
|
|
|
|
|
y = sin(-$top_tilt) * (x + c/2);
|
|
|
|
|
r = sin(-$top_tilt) * x;
|
|
|
|
|
s = cos(-$top_tilt) * x;
|
|
|
|
|
|
|
|
|
|
q = atan2(s, (y + b - r));
|
|
|
|
|
|
|
|
|
|
translate([0,0,cos(q) * total_key_height()/2])
|
|
|
|
|
rotate([-90 - q, 0,0]) children();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// this is just backside with a few signs switched
|
|
|
|
|
module frontside() {
|
|
|
|
|
$stem_support_type = "disable";
|
|
|
|
|
|
|
|
|
|
// $key_shape_type = "flat_sided_square";
|
|
|
|
|
|
|
|
|
|
a = $bottom_key_height;
|
|
|
|
|
b = $total_depth;
|
|
|
|
|
c = top_total_key_height();
|
|
|
|
|
|
|
|
|
|
x = (a / 2 + $top_skew) / cos($top_tilt) - c / 2;
|
|
|
|
|
y = sin($top_tilt) * (x + c/2);
|
|
|
|
|
r = sin($top_tilt) * x;
|
|
|
|
|
s = cos($top_tilt) * x;
|
|
|
|
|
|
|
|
|
|
q = atan2(s, (y + b - r));
|
|
|
|
|
|
|
|
|
|
translate([0,0,cos(q) * total_key_height()/2])
|
|
|
|
|
rotate([90 + q, 0,0]) children();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// emulating the % modifier.
|
|
|
|
|
// since we use custom colors, just using the % modifier doesn't work
|
|
|
|
|
module debug() {
|
|
|
|
|
@@ -1216,7 +1332,14 @@ module auto_place() {
|
|
|
|
|
translate_u(x,-y) children(child_index);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
module arrows(profile, rows = [4,4,4,3]) {
|
|
|
|
|
|
|
|
|
|
// suggested settings for resin prints
|
|
|
|
|
module resin() {
|
|
|
|
|
$stem_slop = 0;
|
|
|
|
|
$stem_inner_slop = 0;
|
|
|
|
|
$stem_support_type = "disable";
|
|
|
|
|
children();
|
|
|
|
|
}module arrows(profile, rows = [4,4,4,3]) {
|
|
|
|
|
positions = [[0, 0], [1, 0], [2, 0], [1, 1]];
|
|
|
|
|
legends = ["←", "↓", "→", "↑"];
|
|
|
|
|
|
|
|
|
|
@@ -1300,29 +1423,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -1379,29 +1479,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -2314,29 +2391,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -3138,29 +3192,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -3328,29 +3359,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -3358,7 +3366,7 @@ function unit_length(length) = $unit * (length - 1) + 18.16;
|
|
|
|
|
|
|
|
|
|
// extra length to the vertical tine of the inside cherry cross
|
|
|
|
|
// splits the stem into halves - allows easier fitment
|
|
|
|
|
extra_vertical = 0.6;
|
|
|
|
|
extra_vertical = 100;
|
|
|
|
|
|
|
|
|
|
module inside_cherry_cross(slop) {
|
|
|
|
|
// inside cross
|
|
|
|
|
@@ -3439,29 +3447,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -3514,29 +3499,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -3544,7 +3506,7 @@ function unit_length(length) = $unit * (length - 1) + 18.16;
|
|
|
|
|
|
|
|
|
|
// extra length to the vertical tine of the inside cherry cross
|
|
|
|
|
// splits the stem into halves - allows easier fitment
|
|
|
|
|
extra_vertical = 0.6;
|
|
|
|
|
extra_vertical = 100;
|
|
|
|
|
|
|
|
|
|
module inside_cherry_cross(slop) {
|
|
|
|
|
// inside cross
|
|
|
|
|
@@ -3635,29 +3597,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -3710,29 +3649,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -3740,7 +3656,7 @@ function unit_length(length) = $unit * (length - 1) + 18.16;
|
|
|
|
|
|
|
|
|
|
// extra length to the vertical tine of the inside cherry cross
|
|
|
|
|
// splits the stem into halves - allows easier fitment
|
|
|
|
|
extra_vertical = 0.6;
|
|
|
|
|
extra_vertical = 100;
|
|
|
|
|
|
|
|
|
|
module inside_cherry_cross(slop) {
|
|
|
|
|
// inside cross
|
|
|
|
|
@@ -3849,29 +3765,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -3994,29 +3887,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -4069,29 +3939,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -4099,7 +3946,7 @@ function unit_length(length) = $unit * (length - 1) + 18.16;
|
|
|
|
|
|
|
|
|
|
// extra length to the vertical tine of the inside cherry cross
|
|
|
|
|
// splits the stem into halves - allows easier fitment
|
|
|
|
|
extra_vertical = 0.6;
|
|
|
|
|
extra_vertical = 100;
|
|
|
|
|
|
|
|
|
|
module inside_cherry_cross(slop) {
|
|
|
|
|
// inside cross
|
|
|
|
|
@@ -4237,29 +4084,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -4312,29 +4136,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -4342,7 +4143,7 @@ function unit_length(length) = $unit * (length - 1) + 18.16;
|
|
|
|
|
|
|
|
|
|
// extra length to the vertical tine of the inside cherry cross
|
|
|
|
|
// splits the stem into halves - allows easier fitment
|
|
|
|
|
extra_vertical = 0.6;
|
|
|
|
|
extra_vertical = 100;
|
|
|
|
|
|
|
|
|
|
module inside_cherry_cross(slop) {
|
|
|
|
|
// inside cross
|
|
|
|
|
@@ -4411,7 +4212,7 @@ module tines_support(stem_type, stem_support_height, slop) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2 vertical tines holding either side of the cruciform
|
|
|
|
|
for (x = [1.15, -1.15]) {
|
|
|
|
|
for (x = [2, -2]) {
|
|
|
|
|
translate([x,0,$stem_support_height / 2]) {
|
|
|
|
|
cube([
|
|
|
|
|
0.5,
|
|
|
|
|
@@ -4774,36 +4575,13 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
function unit_length(length) = $unit * (length - 1) + 18.16;
|
|
|
|
|
|
|
|
|
|
module 3d_surface(size=$3d_surface_size, step=$3d_surface_step, bottom=-SMALLEST_POSSIBLE){
|
|
|
|
|
function p(x, y) = [ x, y, max(0,surface_function(x, y)) ];
|
|
|
|
|
function p(x, y) = [ x, y, max(0,$surface_function(x, y)) ];
|
|
|
|
|
function p0(x, y) = [ x, y, bottom ];
|
|
|
|
|
function rev(b, v) = b ? v : [ v[3], v[2], v[1], v[0] ];
|
|
|
|
|
function face(x, y) = [ p(x, y + step), p(x + step, y + step), p(x + step, y), p(x + step, y), p(x, y), p(x, y + step) ];
|
|
|
|
|
@@ -4835,13 +4613,13 @@ module 3d_surface(size=$3d_surface_size, step=$3d_surface_step, bottom=-SMALLEST
|
|
|
|
|
polyhedron(points, faces, convexity = 8);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module polar_3d_surface(size=$3d_surface_size, step=$3d_surface_step, bottom=-SMALLEST_POSSIBLE){
|
|
|
|
|
module polar_3d_surface(size, step, bottom=-SMALLEST_POSSIBLE){
|
|
|
|
|
function to_polar(q, size) = q * (90 / size);
|
|
|
|
|
|
|
|
|
|
function p(x, y) = [
|
|
|
|
|
surface_distribution_function(to_polar(x, size), size),
|
|
|
|
|
surface_distribution_function(to_polar(y, size), size),
|
|
|
|
|
max(0,surface_function(surface_distribution_function(to_polar(x, size), size), surface_distribution_function(to_polar(y, size), size)))
|
|
|
|
|
$surface_distribution_function(to_polar(x, size), size),
|
|
|
|
|
$surface_distribution_function(to_polar(y, size), size),
|
|
|
|
|
max(0,$surface_function($surface_distribution_function(to_polar(x, size), size), $surface_distribution_function(to_polar(y, size), size)))
|
|
|
|
|
];
|
|
|
|
|
function p0(x, y) = [ x, y, bottom ];
|
|
|
|
|
function rev(b, v) = b ? v : [ v[3], v[2], v[1], v[0] ];
|
|
|
|
|
@@ -4875,8 +4653,8 @@ module polar_3d_surface(size=$3d_surface_size, step=$3d_surface_step, bottom=-SM
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// defaults, overridden in functions.scad
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// $surface_distribution_function = function(dim, size) sin(dim) * size;
|
|
|
|
|
// $surface_function = function(x,y) (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
|
|
|
|
|
module 3d_surface_dish(width, height, depth, inverted) {
|
|
|
|
|
echo(inverted ? "inverted" : "not inverted");
|
|
|
|
|
@@ -4884,9 +4662,11 @@ module 3d_surface_dish(width, height, depth, inverted) {
|
|
|
|
|
// it doesn't have to be dead reckoning for anything but sculpted sides
|
|
|
|
|
// we know the angle of the sides from the width difference, height difference,
|
|
|
|
|
// skew and tilt of the top. it's a pain to calculate though
|
|
|
|
|
scale_factor = 1.1;
|
|
|
|
|
scale_factor = 1.11;
|
|
|
|
|
// the edges on this behave differently than with the previous dish implementations
|
|
|
|
|
scale([width*scale_factor/$3d_surface_size/2,height*scale_factor/$3d_surface_size/2,depth]) rotate([inverted ? 0:180,0,180]) polar_3d_surface(bottom=-10);
|
|
|
|
|
scale([width*scale_factor/$3d_surface_size/2,height*scale_factor/$3d_surface_size/2,depth])
|
|
|
|
|
rotate([inverted ? 0:180,0,180])
|
|
|
|
|
polar_3d_surface(size=$3d_surface_size, step=$3d_surface_step, bottom=-10);
|
|
|
|
|
/* %scale([width*scale_factor/$3d_surface_size/2,height*scale_factor/$3d_surface_size/2,depth]) rotate([180,0,0]) polar_3d_surface(bottom=-10); */
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
@@ -4904,7 +4684,7 @@ module dish(width, height, depth, inverted) {
|
|
|
|
|
sideways_cylindrical_dish(width, height, depth, inverted);
|
|
|
|
|
} else if ($dish_type == "old spherical") {
|
|
|
|
|
old_spherical_dish(width, height, depth, inverted);
|
|
|
|
|
} else if ($dish_type == "3d_surface") {
|
|
|
|
|
} else if ($dish_type == "3d surface") {
|
|
|
|
|
3d_surface_dish(width, height, depth, inverted);
|
|
|
|
|
} else if ($dish_type == "flat") {
|
|
|
|
|
flat_dish(width, height, depth, inverted);
|
|
|
|
|
@@ -4966,29 +4746,6 @@ function vertical_inclination_due_to_top_tilt() = sin($top_tilt) * (top_total_ke
|
|
|
|
|
// I derived this through a bunch of trig reductions I don't really understand.
|
|
|
|
|
function extra_keytop_length_for_flat_sides() = ($width_difference * vertical_inclination_due_to_top_tilt()) / ($total_depth);
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
function surface_distribution_function(dim, size) = sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
function surface_function(x,y) = 1;
|
|
|
|
|
// cylindrical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
// spherical
|
|
|
|
|
function surface_function(x,y) = (sin(acos(x/$3d_surface_size))) * sin(acos(y/$3d_surface_size));
|
|
|
|
|
// ripples
|
|
|
|
|
/* function surface_function(x,y) = cos(pow(pow(x,2)+pow(y,2),0.5)*10)/4+0.75; */
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* function surface_function(x,y) = (pow(1-(x/100), 2) + 100 * pow((y/100)-pow((x/100),2),2))/200 + 0.1; */
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* function surface_function(x,y) = 1/(pow(pow(x,2)+pow(y,2),0.5)/100 + .01); */
|
|
|
|
|
/* function surface_function(x,y) = sin(rands(0,90,1,x+y)[0]); */
|
|
|
|
|
// adds uniform rounding radius for round-anything polyRound
|
|
|
|
|
function add_rounding(p, radius)=[for(i=[0:len(p)-1])[p[i].x,p[i].y, radius]];
|
|
|
|
|
// computes millimeter length from unit length
|
|
|
|
|
@@ -6624,11 +6381,7 @@ $warning_color = [1,0,0, 0.15];
|
|
|
|
|
$minkowski_facets = 30;
|
|
|
|
|
$shape_facets =30;
|
|
|
|
|
|
|
|
|
|
// 3d surface settings
|
|
|
|
|
// unused for now
|
|
|
|
|
$3d_surface_size = 100;
|
|
|
|
|
// resolution in each axis. 10 = 10 divisions per x/y = 100 points total
|
|
|
|
|
$3d_surface_step = 10;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// "flat" / "dished" / "disable"
|
|
|
|
|
$inner_shape_type = "flat";
|
|
|
|
|
@@ -6638,7 +6391,49 @@ $side_sculpting_factor = 4.5;
|
|
|
|
|
// When sculpting corners, how much extra radius should be added
|
|
|
|
|
$corner_sculpting_factor = 1;
|
|
|
|
|
// When doing more side sculpting corners, how much extra radius should be added
|
|
|
|
|
$more_side_sculpting_factor = 0.4; key();
|
|
|
|
|
$more_side_sculpting_factor = 0.4;
|
|
|
|
|
|
|
|
|
|
// 3d surface functions (still in beta)
|
|
|
|
|
|
|
|
|
|
// 3d surface settings
|
|
|
|
|
// unused for now
|
|
|
|
|
$3d_surface_size = 20;
|
|
|
|
|
// resolution in each axis. 10 = 10 divisions per x/y = 100 points total.
|
|
|
|
|
// 5 = 20 divisions per x/y
|
|
|
|
|
$3d_surface_step = 1;
|
|
|
|
|
|
|
|
|
|
// monotonically increasing function that distributes the points of the surface mesh
|
|
|
|
|
// only for polar_3d_surface right now
|
|
|
|
|
// if it's linear it's a grid. sin(dim) * size concentrates detail around the edges
|
|
|
|
|
sinusoidal_surface_distribution = function(dim,size) sin(dim) * size;
|
|
|
|
|
linear_surface_distribution = function(dim,size) sin(dim) * size;
|
|
|
|
|
|
|
|
|
|
$surface_distribution_function = linear_surface_distribution;
|
|
|
|
|
|
|
|
|
|
// the function that actually determines what the surface is.
|
|
|
|
|
// feel free to override, the last one wins
|
|
|
|
|
|
|
|
|
|
// debug
|
|
|
|
|
// $surface_function = function(x,y) 1;
|
|
|
|
|
cylindrical_surface = function(x,y) (sin(acos(x/$3d_surface_size)));
|
|
|
|
|
spherical_surface = function(x,y) (1 - (x/$3d_surface_size)^2)^0.5 * (1 - (y/$3d_surface_size)^2)^0.5;
|
|
|
|
|
// looks a lot like mt3
|
|
|
|
|
quartic_surface = function(x,y) (1 - (x/$3d_surface_size)^4)^0.5 * (1 - (y/$3d_surface_size)^4)^0.5;
|
|
|
|
|
ripple_surface = function(x,y) cos((x^2+y^2)^0.5 * 50)/4 + 0.75;
|
|
|
|
|
rosenbrocks_banana_surface = function(x,y) (pow(1-(x/$3d_surface_size))^2 + 100 * pow((y/$3d_surface_size)-(x/$3d_surface_size)^2)^2)/200 + 0.1;
|
|
|
|
|
spike_surface = function(x,y) 1/(((x/$3d_surface_size)^2+(y/$3d_surface_size)^2)^0.5) + .01;
|
|
|
|
|
random_surface = function(x,y) sin(rands(0,90,1,x+y)[0]);
|
|
|
|
|
bumps_surface = function(x,y) sin(20*x)*cos(20*y)/3+1;
|
|
|
|
|
|
|
|
|
|
$surface_function = bumps_surface; // bumps_surface;
|
|
|
|
|
|
|
|
|
|
// ripples
|
|
|
|
|
/*
|
|
|
|
|
// Rosenbrock's banana
|
|
|
|
|
/* $
|
|
|
|
|
// y=x revolved around the y axis
|
|
|
|
|
/* $surface_function = */
|
|
|
|
|
/* $surface_function = */ key();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!$using_customizer) {
|
|
|
|
|
|