27 Commits

Author SHA1 Message Date
Bob
8ef5bad891 tweaks on mt3/hipro support 2022-02-22 00:04:21 -05:00
Bob
1a8dd314e4 Merge pull request #106 from mrebersv/master
Two new dishes; clone of MT3 profile; second HiPro clone with more accurate dishes
2022-02-21 16:36:24 -05:00
Bob
cc8892364c fix minkowski top_placement and additive artisans 2022-02-21 16:34:06 -05:00
Bob
1a10d1e5bc Merge pull request #124 from Michal-Szczepaniak/patch-1
Fix preonic_default example
2022-02-21 13:30:18 -05:00
Bob
41381ed376 Merge pull request #148 from rsheldiii/v2/propogate-stem-inner-slop
Correctly support $stem_inner_slop
2022-02-21 13:29:28 -05:00
Bob
08f17a4e1f add stem_inner_slop to all places where it is supposed to be 2022-02-21 13:28:36 -05:00
Bob
4766e3eca6 Merge pull request #117 from AberDerBart/master
Fix rounded_cherry stem to properly use $stem_inner_slop
2022-02-21 13:24:19 -05:00
Bob
19cdb2d9ae Merge pull request #145 from rsheldiii/dependabot/npm_and_yarn/copy-props-2.0.5
Bump copy-props from 2.0.4 to 2.0.5
2022-02-21 13:16:38 -05:00
Bob
75cfa2a856 Merge pull request #147 from rsheldiii/v2/offset-stem-support
V2: Make tine support work for offset stems, remove $extra_long_stem_support
2022-02-21 13:12:24 -05:00
Bob
4ba88df064 Merge pull request #49 from Xuis/InstructionsModification
Added clear instructions for line you should modify
2022-02-21 12:44:24 -05:00
Bob
315bc83039 Merge branch 'master' into InstructionsModification 2022-02-21 12:44:00 -05:00
dependabot[bot]
077de5ac87 Bump copy-props from 2.0.4 to 2.0.5
Bumps [copy-props](https://github.com/gulpjs/copy-props) from 2.0.4 to 2.0.5.
- [Release notes](https://github.com/gulpjs/copy-props/releases)
- [Changelog](https://github.com/gulpjs/copy-props/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gulpjs/copy-props/compare/2.0.4...2.0.5)

---
updated-dependencies:
- dependency-name: copy-props
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-02-21 17:27:07 +00:00
Michał Szczepaniak
38bfbfa61c Fix preonic_default example 2022-01-11 20:43:41 +01:00
Jonas Grosse-Holz
7ee9e61412 Fix rounded_cherry stem to properly use $stem_inner_slop 2021-09-27 20:45:47 +02:00
Matthew Ebersviller
1f1f6a62d2 Added deep_dish to matty3 profile 2021-07-21 11:52:19 -06:00
Matthew Ebersviller
fdce624cb1 Update squared_spherical.scad 2021-07-21 11:51:22 -06:00
Matthew Ebersviller
762e45ba3d Fixing 60% row offset the correct way 2021-07-21 09:48:08 -06:00
Matthew Ebersviller
d7ea2bf7cc Editing comment for clarity 2021-07-09 12:26:42 -06:00
Matthew Ebersviller
3fca4e26ca Merge branch 'master' of https://github.com/mrebersv/KeyV2 2021-07-09 12:23:37 -06:00
Matthew Ebersviller
cdf75654a6 fixing 60 percent layout
60 percent layout needed array of [0] for row 0 (Function keys).  Without it, every row was getting the wrong depth/angle.
2021-07-09 12:22:33 -06:00
Matthew Ebersviller
e7b92cf52b Update squared_scoop.scad
Fixed some formatting to be easier to read
2021-07-09 10:57:06 -06:00
mebers200
29f5cd2468 Fixing squared_scoop dish to work with keycaps other than 1u sizing 2021-07-09 10:41:34 -06:00
mebers200
d3c26dfaca fixing squared_spherical dish to work with all sizes 2021-07-09 10:22:03 -06:00
mebers200
13520c54e3 Adding new dishes, a profile clone of MT3 (Matty3), and a second HiPro clone with more accurate dishes. 2021-07-08 20:30:12 -06:00
Will Harris
c81889b298 removed more extraneous space for formatting 2020-06-12 16:18:06 -06:00
Will Harris
0a246489ec removed extra space 2020-06-12 16:14:55 -06:00
Will Harris
654874fb5f Added clear instructions to which line you should modify to generate a key
Addition to the README and a slight change in formatting to accommodate
the extra information
2020-06-12 16:07:31 -06:00
20 changed files with 351 additions and 99 deletions

View File

@@ -25,7 +25,19 @@ If you are technically inclined at all, this is definitely the best way to run t
First, you'll need OpenSCAD: http://www.openscad.org/downloads.html. I highly recommend installing the development snapshot, as they generally support more features and are relatively stable. Development snapshots are listed in their own section on the downloads page.
After you have openSCAD installed, you need to download the code and run it. running `git clone https://github.com/rsheldiii/KeyV2.git` if you have git, or downloading [this zip](https://github.com/rsheldiii/KeyV2/archive/master.zip) and extracting the directory should do it. Then all you need to do is open `keys.scad` with openSCAD and you are set! It is possible to edit this project with an external editor by checking off Design => 'Automatic Reload and Preview' in OpenSCAD.
After you have openSCAD installed, you need to download the code and run it. running `git clone https://github.com/rsheldiii/openSCAD-projects.git` if you have git, or downloading [this zip](https://github.com/rsheldiii/openSCAD-projects/archive/master.zip) and extracting the directory should do it.
To make your own key, all you need to do is open `keys.scad` with openSCAD and modify this line:
```
dcs_row(5) legend("⇪", size=9) key();
```
To be whatever you want. For example, this is for a ctrl key on an OEM keyboard:
```u(1.25) oem_row(3) legend("ctrl", size=4.5) key();```
It is possible to edit this project with an external editor by checking off Design => 'Automatic Reload and Preview' in OpenSCAD.
All examples below assume you are running the library on your computer with OpenSCAD.

View File

@@ -1,6 +1,5 @@
TODO:
* Make flat stem support default
* make flat inner shape default
* support repositioning to print on the back surface of the keycap
* implement regular polygon for skin extrusions
* switch to skin-shaped extrusions by default

View File

@@ -214,6 +214,12 @@ $3d_surface_step = 10;
// "flat" / "dished" / "disable"
$inner_shape_type = "flat";
// When sculpting sides using sculpted_square, how much in should the tops come
$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 width functions
module u(u=1) {
@@ -509,7 +515,6 @@ module g20_row(row=3, column = 0) {
children();
}
}
// my own measurements
module hipro_row(row=3, column=0) {
$key_shape_type = "sculpted_square";
@@ -518,7 +523,7 @@ module hipro_row(row=3, column=0) {
$width_difference = ($bottom_key_width - 12.3);
$height_difference = ($bottom_key_height - 12.65);
$dish_type = "spherical";
$dish_type = "squared scoop";
$dish_depth = 0.75;
$dish_skew_x = 0;
$dish_skew_y = 0;
@@ -550,6 +555,57 @@ module hipro_row(row=3, column=0) {
children();
}
}
// This is an imperfect attempt to clone the MT3 profile
module mt3_row(row=3, column=0, deep_dish=false) {
$key_shape_type = "sculpted_square";
$bottom_key_width = 18.35;
$bottom_key_height = 18.6;
$width_difference = ($bottom_key_width - 13.0);
$height_difference = ($bottom_key_height - 13.0);
$dish_type = "squared spherical";
$dish_depth = deep_dish ? 1.6 : 1.2;
$dish_skew_x = 0;
$dish_skew_y = 0;
$top_skew = 0;
$height_slices = 10;
$corner_radius = 1;
$more_side_sculpting_factor = 0.75;
$top_tilt_y = side_tilt(column);
extra_height = $double_sculpted ? extra_side_tilt_height(column) : 0;
if (row == 0){
// TODO I didn't change these yet
$total_depth = 14.7 + extra_height;
$top_tilt = -12.5;
children();
} else if (row == 1) {
$total_depth = 13.1 + extra_height;
$top_tilt = -6;
children();
} else if (row == 2) {
$total_depth = 10.7 + extra_height;
$top_tilt = -6;
children();
} else if (row == 3) {
$total_depth = 10.7 + extra_height;
$top_tilt = 6;
children();
} else if (row == 4){
$total_depth = 11.6 + extra_height;
$top_tilt = 12;
children();
} else if (row >= 5) {
$total_depth = 11.6 + extra_height;
$top_tilt = 0;
children();
} else {
children();
}
}
module grid_row(row=3, column = 0) {
$bottom_key_width = 18.16;
$bottom_key_height = 18.16;
@@ -787,6 +843,8 @@ module key_profile(key_profile_type, row, column=0) {
octagonal_row(row, column) children();
} else if (key_profile_type == "cherry") {
cherry_row(row, column) children();
} else if (key_profile_type == "mt3") {
mt3_row(row, column) children();
} else if (key_profile_type == "disable") {
children();
} else {
@@ -2104,19 +2162,11 @@ function skin_iso_enter_shape(size, delta, progress, thickness_difference) =
);
// rounded square shape with additional sculpting functions to better approximate
// When sculpting sides, how much in should the tops come
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;
// side sculpting functions
// bows the sides out on stuff like SA and DSA keycaps
function side_sculpting(progress) = (1 - progress) * side_sculpting_factor;
function side_sculpting(progress) = (1 - progress) * $side_sculpting_factor;
// makes the rounded corners of the keycap grow larger as they move upwards
function corner_sculpting(progress) = pow(progress, 2) * corner_sculpting_factor;
function corner_sculpting(progress) = pow(progress, 2) * $corner_sculpting_factor;
module sculpted_square_shape(size, delta, progress) {
width = size[0];
@@ -2141,7 +2191,7 @@ module sculpted_square_shape(size, delta, progress) {
offset(r = extra_corner_radius_this_slice, $fa=360/$shape_facets) {
offset(r = -extra_corner_radius_this_slice) {
side_rounded_square(square_size, r = more_side_sculpting_factor * progress);
side_rounded_square(square_size, r = $more_side_sculpting_factor * progress);
}
}
}
@@ -2196,7 +2246,7 @@ function skin_sculpted_square_shape(size, delta, progress, thickness_difference)
width - extra_width_this_slice - thickness_difference,
height - extra_height_this_slice - thickness_difference
]
) new_side_rounded_square(square_size, more_side_sculpting_factor * progress, extra_corner_radius_this_slice);
) new_side_rounded_square(square_size, $more_side_sculpting_factor * progress, extra_corner_radius_this_slice);
module side_rounded_square(size, r) {
@@ -3534,7 +3584,7 @@ module rounded_cherry_stem(depth, slop, throw) {
// inside cross
// translation purely for aesthetic purposes, to get rid of that awful lattice
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
}
// a safe theoretical distance between two vertices such that they don't collapse. hard to use
@@ -3734,7 +3784,7 @@ module box_cherry_stem(depth, slop, throw) {
}
// inside cross
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
}
module alps_stem(depth, slop, throw){
@@ -4098,12 +4148,12 @@ module brim_support(stem_type, stem_support_height, slop) {
}
}
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "rounded_cherry") {
difference() {
cylinder(d=$rounded_cherry_stem_d * 2, h=stem_support_height);
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "box_cherry") {
difference() {
@@ -4113,7 +4163,7 @@ module brim_support(stem_type, stem_support_height, slop) {
}
}
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "cherry_stabilizer") {
difference() {
@@ -4123,7 +4173,7 @@ module brim_support(stem_type, stem_support_height, slop) {
}
}
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if(stem_type == "choc") {
translate([-5.7/2,0,0]) linear_extrude(height=stem_support_height) {
@@ -4372,7 +4422,7 @@ module tines_support(stem_type, stem_support_height, slop) {
}
}
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "cherry_stabilizer") {
difference () {
@@ -4392,13 +4442,13 @@ module tines_support(stem_type, stem_support_height, slop) {
difference () {
centered_tines(stem_support_height);
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "rounded_cherry") {
difference () {
centered_tines(stem_support_height);
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "alps"){
centered_tines(stem_support_height);
@@ -4615,6 +4665,62 @@ module spherical_dish(width, height, depth, inverted){
}
}
}
module squared_spherical_dish(width, height, depth, inverted=false) {
chord = pow(pow(height / 2, 2) + pow(width / 2, 2),0.5);
direction = inverted ? -1 : 1;
r=max(height,width,chord) / 5;
// ^^^^^ Nothing special about this code to figure out r.
// I just modeled up 1u, 1.25u, 1.5u, 2u, 2.25u, and 2.75u
// keys and messed around until I came up with something that
// looked reasonable for all key sizes. This just seems to work
// well for all sizes
translate([-width / 2, -height / 2, 0 * direction]) {
resize([width, height, depth])
hull() {
cube([chord,chord,0.001]);
// Use something larger in this translate than -depth
// (like -chord) if you want more of a defined circle
// in the keywell
translate([chord/2, chord/2, -depth])
sphere(r=r, $fn=128);
}
}
}
module squared_scoop_dish(height, width, depth, r=0.5, inverted=false, num=4, den=5){
// changable numerator/denoninator on where to place the square's corners
// for example, num=2, den=3 means the dish will happen at 1/3 and 2/3 the
// width and the height. Defaults to 4/5. Customizable when calling
// this module
//
// This was initially intended for the scoop on the HiPro, since that's what
// it uses. Use "hipro_row()" if that's what you'd like. However, I do NOT
// know how close the inner square is for the HiPro keycaps. In fact, it could
// just be a sphere, in which the "squared spherical" scoop is more appropriate.
// If, however, it the "squared scoop" makes sense, you can adjust where the square
// lands with the num (numerator) and den (denominator) variables. For instance,
// "3" and "4" mean 3/4 of the width/height is where the flat part starts.
chord = pow(pow(height/2, 2) + pow(width/2, 2),0.5);
direction = inverted ? -1 : 1;
//This is the set of points to hull around for the scoop
points=[
[height/den - height/2, width/den - width/2, -chord],
[num*height/den - height/2, width/den - width/2, -chord],
[height/den - height/2, num*width/den - width/2, -chord],
[num*height/den - height/2, num*width/den - width/2, -chord]
];
resize([height,width,depth])
hull() {
shape_slice(1,0,0);
for(i=[0:len(points)-1]) {
translate(points[i])
sphere(r=r,$fn=64);
}
}
}
module flat_dish(width, height, depth, inverted){
cube([width + 100,height + 100, depth], center=true);
}
@@ -4792,11 +4898,9 @@ geodesic=false;
module dish(width, height, depth, inverted) {
if($dish_type == "cylindrical"){
cylindrical_dish(width, height, depth, inverted);
}
else if ($dish_type == "spherical") {
} else if ($dish_type == "spherical") {
spherical_dish(width, height, depth, inverted);
}
else if ($dish_type == "sideways cylindrical"){
} else if ($dish_type == "sideways cylindrical"){
sideways_cylindrical_dish(width, height, depth, inverted);
} else if ($dish_type == "old spherical") {
old_spherical_dish(width, height, depth, inverted);
@@ -4806,6 +4910,10 @@ module dish(width, height, depth, inverted) {
flat_dish(width, height, depth, inverted);
} else if ($dish_type == "disable") {
// else no dish
} else if ($dish_type == "squared spherical") {
squared_spherical_dish(width, height, depth, inverted=inverted);
} else if ($dish_type == "squared scoop") {
squared_scoop_dish(width, height, depth, inverted=inverted);
} else {
echo("WARN: $dish_type unsupported");
}
@@ -5089,13 +5197,13 @@ module linear_extrude_shape_hull(thickness_difference, depth_difference, extra_s
module hull_shape_hull(thickness_difference, depth_difference, extra_slices = 0) {
for (index = [0:$height_slices - 1 + extra_slices]) {
hull() {
shape_slice(index / $height_slices, thickness_difference, depth_difference);
shape_slice((index + 1) / $height_slices, thickness_difference, depth_difference);
placed_shape_slice(index / $height_slices, thickness_difference, depth_difference);
placed_shape_slice((index + 1) / $height_slices, thickness_difference, depth_difference);
}
}
}
module shape_slice(progress, thickness_difference, depth_difference) {
module placed_shape_slice(progress, thickness_difference, depth_difference) {
skew_this_slice = $top_skew * progress;
x_skew_this_slice = $top_skew_x * progress;
@@ -5106,20 +5214,24 @@ module shape_slice(progress, thickness_difference, depth_difference) {
translate([x_skew_this_slice, skew_this_slice, depth_this_slice]) {
rotate([tilt_this_slice,y_tilt_this_slice,0]){
linear_extrude(height = SMALLEST_POSSIBLE, scale = 1){
key_shape(
[
total_key_width(thickness_difference),
total_key_height(thickness_difference)
],
[$width_difference, $height_difference],
progress
);
}
shape_slice(progress, thickness_difference, depth_difference);
}
}
}
module shape_slice(progress, thickness_difference, depth_difference) {
linear_extrude(height = SMALLEST_POSSIBLE, scale = 1){
key_shape(
[
total_key_width(thickness_difference),
total_key_height(thickness_difference)
],
[$width_difference, $height_difference],
progress
);
}
}
// basic key shape, no dish, no inside
// which is only used for dishing to cut the dish off correctly
// $height_difference used for keytop thickness
@@ -6086,7 +6198,6 @@ module shape(thickness_difference, depth_difference=0){
}
}
// Not currently used due to CGAL errors. Rounds the shape via minkowski
module rounded_shape() {
color($primary_color) minkowski(){
// half minkowski in the z direction
@@ -6175,9 +6286,9 @@ module top_placement(depth_difference=0) {
top_tilt_by_height = -$top_tilt / $key_height;
top_tilt_y_by_length = $double_sculpted ? (-$top_tilt_y / $key_length) : 0;
minkowski_height = $rounded_key ? $minkowski_radius : 0;
// minkowski_height = $rounded_key ? $minkowski_radius : 0;
translate([$top_skew_x + $dish_skew_x, $top_skew + $dish_skew_y, $total_depth - depth_difference + minkowski_height/2]){
translate([$top_skew_x + $dish_skew_x, $top_skew + $dish_skew_y, $total_depth - depth_difference]){
rotate([top_tilt_by_height, top_tilt_y_by_length,0]){
children();
}
@@ -6297,7 +6408,9 @@ module outer_total_shape(inset=false) {
// takes all the bits and glues them together. requires configuration with special variables.
module key(inset=false) {
difference(){
outer_total_shape(inset);
outer_total_shape(inset) {
children();
};
if ($inner_shape_type != "disable") {
translate([0,0,-SMALLEST_POSSIBLE]) {
@@ -6519,7 +6632,13 @@ $3d_surface_step = 10;
// "flat" / "dished" / "disable"
$inner_shape_type = "flat";
key();
// When sculpting sides using sculpted_square, how much in should the tops come
$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();
}
if (!$using_customizer) {

View File

@@ -17,4 +17,4 @@ dcs_row(5) legend("⇪", size=9) key();
} */
// example layout
/* preonic_default("dcs"); */
/* preonic_default("dcs") key(); */

View File

@@ -4,6 +4,8 @@ include <dishes/cylindrical.scad>
include <dishes/old_spherical.scad>
include <dishes/sideways_cylindrical.scad>
include <dishes/spherical.scad>
include <dishes/squared_spherical.scad>
include <dishes/squared_scoop.scad>
include <dishes/flat.scad>
include <dishes/3d_surface.scad>
@@ -14,11 +16,9 @@ geodesic=false;
module dish(width, height, depth, inverted) {
if($dish_type == "cylindrical"){
cylindrical_dish(width, height, depth, inverted);
}
else if ($dish_type == "spherical") {
} else if ($dish_type == "spherical") {
spherical_dish(width, height, depth, inverted);
}
else if ($dish_type == "sideways cylindrical"){
} else if ($dish_type == "sideways cylindrical"){
sideways_cylindrical_dish(width, height, depth, inverted);
} else if ($dish_type == "old spherical") {
old_spherical_dish(width, height, depth, inverted);
@@ -28,6 +28,10 @@ module dish(width, height, depth, inverted) {
flat_dish(width, height, depth, inverted);
} else if ($dish_type == "disable") {
// else no dish
} else if ($dish_type == "squared spherical") {
squared_spherical_dish(width, height, depth, inverted=inverted);
} else if ($dish_type == "squared scoop") {
squared_scoop_dish(width, height, depth, inverted=inverted);
} else {
echo("WARN: $dish_type unsupported");
}

View File

@@ -0,0 +1,34 @@
module squared_scoop_dish(height, width, depth, r=0.5, inverted=false, num=4, den=5){
// changable numerator/denoninator on where to place the square's corners
// for example, num=2, den=3 means the dish will happen at 1/3 and 2/3 the
// width and the height. Defaults to 4/5. Customizable when calling
// this module
//
// This was initially intended for the scoop on the HiPro, since that's what
// it uses. Use "hipro_row()" if that's what you'd like. However, I do NOT
// know how close the inner square is for the HiPro keycaps. In fact, it could
// just be a sphere, in which the "squared spherical" scoop is more appropriate.
// If, however, it the "squared scoop" makes sense, you can adjust where the square
// lands with the num (numerator) and den (denominator) variables. For instance,
// "3" and "4" mean 3/4 of the width/height is where the flat part starts.
chord = pow(pow(height/2, 2) + pow(width/2, 2),0.5);
direction = inverted ? -1 : 1;
//This is the set of points to hull around for the scoop
points=[
[height/den - height/2, width/den - width/2, -chord],
[num*height/den - height/2, width/den - width/2, -chord],
[height/den - height/2, num*width/den - width/2, -chord],
[num*height/den - height/2, num*width/den - width/2, -chord]
];
resize([height,width,depth])
hull() {
shape_slice(1,0,0);
for(i=[0:len(points)-1]) {
translate(points[i])
sphere(r=r,$fn=64);
}
}
}

View File

@@ -0,0 +1,22 @@
module squared_spherical_dish(width, height, depth, inverted=false) {
chord = pow(pow(height / 2, 2) + pow(width / 2, 2),0.5);
direction = inverted ? -1 : 1;
r=max(height,width,chord) / 5;
// ^^^^^ Nothing special about this code to figure out r.
// I just modeled up 1u, 1.25u, 1.5u, 2u, 2.25u, and 2.75u
// keys and messed around until I came up with something that
// looked reasonable for all key sizes. This just seems to work
// well for all sizes
translate([-width / 2, -height / 2, 0 * direction]) {
resize([width, height, depth])
hull() {
cube([chord,chord,0.001]);
// Use something larger in this translate than -depth
// (like -chord) if you want more of a defined circle
// in the keywell
translate([chord/2, chord/2, -depth])
sphere(r=r, $fn=128);
}
}
}

View File

@@ -1,13 +1,13 @@
module hull_shape_hull(thickness_difference, depth_difference, extra_slices = 0) {
for (index = [0:$height_slices - 1 + extra_slices]) {
hull() {
shape_slice(index / $height_slices, thickness_difference, depth_difference);
shape_slice((index + 1) / $height_slices, thickness_difference, depth_difference);
placed_shape_slice(index / $height_slices, thickness_difference, depth_difference);
placed_shape_slice((index + 1) / $height_slices, thickness_difference, depth_difference);
}
}
}
module shape_slice(progress, thickness_difference, depth_difference) {
module placed_shape_slice(progress, thickness_difference, depth_difference) {
skew_this_slice = $top_skew * progress;
x_skew_this_slice = $top_skew_x * progress;
@@ -18,16 +18,20 @@ module shape_slice(progress, thickness_difference, depth_difference) {
translate([x_skew_this_slice, skew_this_slice, depth_this_slice]) {
rotate([tilt_this_slice,y_tilt_this_slice,0]){
linear_extrude(height = SMALLEST_POSSIBLE, scale = 1){
key_shape(
[
total_key_width(thickness_difference),
total_key_height(thickness_difference)
],
[$width_difference, $height_difference],
progress
);
}
shape_slice(progress, thickness_difference, depth_difference);
}
}
}
module shape_slice(progress, thickness_difference, depth_difference) {
linear_extrude(height = SMALLEST_POSSIBLE, scale = 1){
key_shape(
[
total_key_width(thickness_difference),
total_key_height(thickness_difference)
],
[$width_difference, $height_difference],
progress
);
}
}

View File

@@ -24,7 +24,6 @@ module shape(thickness_difference, depth_difference=0){
}
}
// Not currently used due to CGAL errors. Rounds the shape via minkowski
module rounded_shape() {
color($primary_color) minkowski(){
// half minkowski in the z direction
@@ -113,9 +112,9 @@ module top_placement(depth_difference=0) {
top_tilt_by_height = -$top_tilt / $key_height;
top_tilt_y_by_length = $double_sculpted ? (-$top_tilt_y / $key_length) : 0;
minkowski_height = $rounded_key ? $minkowski_radius : 0;
// minkowski_height = $rounded_key ? $minkowski_radius : 0;
translate([$top_skew_x + $dish_skew_x, $top_skew + $dish_skew_y, $total_depth - depth_difference + minkowski_height/2]){
translate([$top_skew_x + $dish_skew_x, $top_skew + $dish_skew_y, $total_depth - depth_difference]){
rotate([top_tilt_by_height, top_tilt_y_by_length,0]){
children();
}
@@ -235,7 +234,9 @@ module outer_total_shape(inset=false) {
// takes all the bits and glues them together. requires configuration with special variables.
module key(inset=false) {
difference(){
outer_total_shape(inset);
outer_total_shape(inset) {
children();
};
if ($inner_shape_type != "disable") {
translate([0,0,-SMALLEST_POSSIBLE]) {

View File

@@ -8,6 +8,7 @@ include <key_profiles/dsa.scad>
include <key_profiles/sa.scad>
include <key_profiles/g20.scad>
include <key_profiles/hipro.scad>
include <key_profiles/mt3.scad>
include <key_profiles/grid.scad>
include <key_profiles/regular_polygon.scad>
include <key_profiles/cherry.scad>
@@ -37,6 +38,8 @@ module key_profile(key_profile_type, row, column=0) {
octagonal_row(row, column) children();
} else if (key_profile_type == "cherry") {
cherry_row(row, column) children();
} else if (key_profile_type == "mt3") {
mt3_row(row, column) children();
} else if (key_profile_type == "disable") {
children();
} else {

View File

@@ -1,4 +1,3 @@
// my own measurements
module hipro_row(row=3, column=0) {
$key_shape_type = "sculpted_square";
@@ -7,7 +6,7 @@ module hipro_row(row=3, column=0) {
$width_difference = ($bottom_key_width - 12.3);
$height_difference = ($bottom_key_height - 12.65);
$dish_type = "spherical";
$dish_type = "squared scoop";
$dish_depth = 0.75;
$dish_skew_x = 0;
$dish_skew_y = 0;

51
src/key_profiles/mt3.scad Normal file
View File

@@ -0,0 +1,51 @@
// This is an imperfect attempt to clone the MT3 profile
module mt3_row(row=3, column=0, deep_dish=false) {
$key_shape_type = "sculpted_square";
$bottom_key_width = 18.35;
$bottom_key_height = 18.6;
$width_difference = ($bottom_key_width - 13.0);
$height_difference = ($bottom_key_height - 13.0);
$dish_type = "squared spherical";
$dish_depth = deep_dish ? 1.6 : 1.2;
$dish_skew_x = 0;
$dish_skew_y = 0;
$top_skew = 0;
$height_slices = 10;
$corner_radius = 1;
$more_side_sculpting_factor = 0.75;
$top_tilt_y = side_tilt(column);
extra_height = $double_sculpted ? extra_side_tilt_height(column) : 0;
if (row == 0){
// TODO I didn't change these yet
$total_depth = 14.7 + extra_height;
$top_tilt = -12.5;
children();
} else if (row == 1) {
$total_depth = 13.1 + extra_height;
$top_tilt = -6;
children();
} else if (row == 2) {
$total_depth = 10.7 + extra_height;
$top_tilt = -6;
children();
} else if (row == 3) {
$total_depth = 10.7 + extra_height;
$top_tilt = 6;
children();
} else if (row == 4){
$total_depth = 11.6 + extra_height;
$top_tilt = 12;
children();
} else if (row >= 5) {
$total_depth = 11.6 + extra_height;
$top_tilt = 0;
children();
} else {
children();
}
}

View File

@@ -17,5 +17,5 @@ include <../layout.scad>
];
module 60_percent_default(profile) {
layout(60_percent_default_layout, profile, 60_percent_legends) children();
layout(60_percent_default_layout, profile, 60_percent_legends, row_sculpting_offset=1) children();
}

View File

@@ -198,3 +198,10 @@ $3d_surface_step = 10;
// "flat" / "dished" / "disable"
$inner_shape_type = "flat";
// When sculpting sides using sculpted_square, how much in should the tops come
$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;

View File

@@ -1,18 +1,10 @@
// rounded square shape with additional sculpting functions to better approximate
// When sculpting sides, how much in should the tops come
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;
// side sculpting functions
// bows the sides out on stuff like SA and DSA keycaps
function side_sculpting(progress) = (1 - progress) * side_sculpting_factor;
function side_sculpting(progress) = (1 - progress) * $side_sculpting_factor;
// makes the rounded corners of the keycap grow larger as they move upwards
function corner_sculpting(progress) = pow(progress, 2) * corner_sculpting_factor;
function corner_sculpting(progress) = pow(progress, 2) * $corner_sculpting_factor;
module sculpted_square_shape(size, delta, progress) {
width = size[0];
@@ -37,7 +29,7 @@ module sculpted_square_shape(size, delta, progress) {
offset(r = extra_corner_radius_this_slice, $fa=360/$shape_facets) {
offset(r = -extra_corner_radius_this_slice) {
side_rounded_square(square_size, r = more_side_sculpting_factor * progress);
side_rounded_square(square_size, r = $more_side_sculpting_factor * progress);
}
}
}
@@ -92,7 +84,7 @@ function skin_sculpted_square_shape(size, delta, progress, thickness_difference)
width - extra_width_this_slice - thickness_difference,
height - extra_height_this_slice - thickness_difference
]
) new_side_rounded_square(square_size, more_side_sculpting_factor * progress, extra_corner_radius_this_slice);
) new_side_rounded_square(square_size, $more_side_sculpting_factor * progress, extra_corner_radius_this_slice);
module side_rounded_square(size, r) {

View File

@@ -16,12 +16,12 @@ module brim_support(stem_type, stem_support_height, slop) {
}
}
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "rounded_cherry") {
difference() {
cylinder(d=$rounded_cherry_stem_d * 2, h=stem_support_height);
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "box_cherry") {
difference() {
@@ -31,7 +31,7 @@ module brim_support(stem_type, stem_support_height, slop) {
}
}
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "cherry_stabilizer") {
difference() {
@@ -41,7 +41,7 @@ module brim_support(stem_type, stem_support_height, slop) {
}
}
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if(stem_type == "choc") {
translate([-5.7/2,0,0]) linear_extrude(height=stem_support_height) {

View File

@@ -47,7 +47,7 @@ module tines_support(stem_type, stem_support_height, slop) {
}
}
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "cherry_stabilizer") {
difference () {
@@ -67,13 +67,13 @@ module tines_support(stem_type, stem_support_height, slop) {
difference () {
centered_tines(stem_support_height);
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "rounded_cherry") {
difference () {
centered_tines(stem_support_height);
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
} else if (stem_type == "alps"){
centered_tines(stem_support_height);

View File

@@ -11,6 +11,6 @@ module box_cherry_stem(depth, slop, throw) {
}
// inside cross
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
}

View File

@@ -7,6 +7,6 @@ module rounded_cherry_stem(depth, slop, throw) {
// inside cross
// translation purely for aesthetic purposes, to get rid of that awful lattice
inside_cherry_cross(slop);
inside_cherry_cross($stem_inner_slop);
}
}

View File

@@ -445,12 +445,12 @@ copy-descriptor@^0.1.0:
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
copy-props@^2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe"
integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==
version "2.0.5"
resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.5.tgz#03cf9ae328d4ebb36f8f1d804448a6af9ee3f2d2"
integrity sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==
dependencies:
each-props "^1.3.0"
is-plain-object "^2.0.1"
each-props "^1.3.2"
is-plain-object "^5.0.0"
core-util-is@~1.0.0:
version "1.0.2"
@@ -538,7 +538,7 @@ duplexify@^3.6.0:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
each-props@^1.3.0:
each-props@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333"
integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==
@@ -1178,6 +1178,11 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
is-plain-object@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
is-relative@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"