From b879c854ed9af2fc7227d15a4c464c3c47bc2755 Mon Sep 17 00:00:00 2001
From: Bob - Home - Windows <rsheldiii@gmail.com>
Date: Wed, 16 Aug 2017 01:59:19 -0400
Subject: [PATCH] got SA sculpting into variable, futzing with keysets sort of

---
 key.scad     | 34 +++++++++++++++++++++++-----------
 keys.scad    | 29 ++++++++++++++++++-----------
 keysets.scad | 40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 81 insertions(+), 22 deletions(-)
 create mode 100644 keysets.scad

diff --git a/key.scad b/key.scad
index e4d97ee..6f5bb48 100644
--- a/key.scad
+++ b/key.scad
@@ -16,14 +16,12 @@ brim_radius = 8;
 brim_depth = .3;
 //whether stabilizer connectors are enabled
 stabilizers = false;
-// stem offset in units NOT MM. for stepped caps lock basically
-stem_offset = 0;
 // font used for text
 font="Arial";
 // font size used for text
 font_size = 8;
 // whether or not to render fake keyswitches to check clearances
-clearance_check = true;
+clearance_check = false;
 
 /* [Key profile] */
 
@@ -78,9 +76,18 @@ text = "";
 inset_text = false;
 // radius of corners of keycap
 corner_radius = 1;
+
+
+
+/* [Fancy Bowed Sides] */
+
+
 // if you're doing fancy bowed keycap sides, this controls how many slices you take
 // default of 1 for no sampling, just top/bottom
 height_slices = 1;
+enable_side_sculpting = false;
+
+
 
 
 /* [Hidden] */
@@ -170,16 +177,19 @@ module shape_hull(thickness_difference, depth_difference, modifier){
 
 module shape_slice(index, total, thickness_difference, depth_difference, modifier) {
 	progress = index / (total);
+	extra_side_size =  $enable_side_sculpting ? abs(index - total)/4 : 0;
+	extra_corner_size = $enable_side_sculpting ? pow(progress, 2) : 0;
+
 	translate([
 		0,
 		$top_skew * progress,
 		($total_depth * modifier - depth_difference) * progress
 	]) rotate([-$top_tilt / $key_height * progress,0,0]){
 		roundedRect([
-			total_key_width()  - thickness_difference - (($width_difference - abs(index - total)/4)  * modifier * progress),
-			total_key_height() - thickness_difference - (($height_difference - abs(index - total)/4) * modifier * progress),
+			total_key_width()  - thickness_difference - (($width_difference - extra_side_size) * progress  * modifier),
+			total_key_height() - thickness_difference - (($height_difference - extra_side_size) * progress * modifier),
 			.001
-		],$corner_radius + (pow(progress, 2)));
+		],$corner_radius + extra_corner_size);
 	}
 }
 
@@ -322,6 +332,7 @@ module example_key(){
 	$inset_text = inset_text;
 	$corner_radius = corner_radius;
 	$height_slices = height_slices;
+	$enable_side_sculpting = enable_side_sculpting;
 
 	key();
 }
@@ -364,10 +375,11 @@ module fakeISOEnter(thickness_difference = 0){
         [unit(1.25) - t,      unit(1)  - t],
         [unit(1.25) - t,      unit(2)  - t],
         [         0 + t,      unit(2)  - t]
-    ]
-			offset(r=$corner_radius) {
-				polygon(points=pointArray);
-			}
+    ];
+
+		offset(r=$corner_radius) {
+			polygon(points=pointArray);
+		}
 }
 
 //corollary is shape_hull
@@ -382,6 +394,6 @@ module ISOEnterShapeHull(thickness_difference, depth_difference, modifier){
 	linear_extrude(height = height, scale = [width_scale, height_scale]) {
 
 		// TODO completely making up these numbers here
-		translate([unit(-.5), unit(-.9)]) fakeISOEnter();
+		translate([unit(-.5), unit(-.95)]) fakeISOEnter(thickness_difference);
 	}
 }
diff --git a/keys.scad b/keys.scad
index 4559d7e..f463042 100644
--- a/keys.scad
+++ b/keys.scad
@@ -6,17 +6,13 @@
 // special variables, but that's a limitation of SCAD we'll have to work around
 
 /* TODO:
- * make SA keycaps get more rounded the further up they are (like in real life)
- * make that rounding thing ^ only happen on certain keycaps via limiting the amount of slives we take to 2
- * can now measure keycaps very accurately. need to redo measurements: [x] SA [ ] DCS [ ] DSA [ ] OEM?
- * functions to control bowed edges? and bowed corners
- * bowed sides for SA? jebus
- * sideways cylindrical dish needs to be used for some spacebars but not others. currently none of them use it
- * Add inset stem to all profiles that need it
- * Pregenerated keysets for DCS (rounded tops too intense) [ ] 60% [ ] TKL [ ] full
  * Full experimental ISO enter
+ * can now measure keycaps very accurately. need to redo measurements: [x] SA [ ] DCS [ ] DSA [ ] OEM?
+ * Pregenerated keysets for DCS (rounded tops too intense) [ ] 60% [ ] TKL [ ] full
+ * Add inset stem to all profiles that need it (DCS?)
+ * generate dishes via math? kind of hard
+ * sideways cylindrical dish needs to be used for some spacebars but not others. currently none of them use it
  * customizer version where everything is copy/pasted in
- * I probably need to switch to surfaces for dishes don't I
  */
 
 use <key.scad>
@@ -114,6 +110,10 @@ module sa_row(n=1) {
   $dish_skew_y = 0;
   $top_skew = 0;
 	$height_slices = 10;
+	$enable_side_sculpting = true;
+	// might wanna change this if you don't minkowski
+	// do you even minkowski bro
+	$corner_radius = 0.01;
 
   if (n == 1){
     $total_depth = 14.89;
@@ -166,7 +166,9 @@ module fake_iso_enter() {
 	$dish_skew_y = 0;
 	$ISOEnter = true;
 
-  stabilized(vertical=true) children();
+  stabilized(vertical=true) {
+		children();
+	}
 }
 
 module brimmed() {
@@ -184,6 +186,11 @@ module inverted() {
   children();
 }
 
+module rotated() {
+	$stem_rotation = 90;
+	children();
+}
+
 module stabilized(mm=12, vertical = false) {
   if (vertical) {
     $connectors = [
@@ -361,4 +368,4 @@ module legend(text, inset=false) {
 /*
 sa_row(1) blank() key();*/
 
-blank() dishless() fake_iso_enter() cherry() key();
+/*blank() dishless() rounded() sa_row(1) blank() key();*/
diff --git a/keysets.scad b/keysets.scad
new file mode 100644
index 0000000..6dad782
--- /dev/null
+++ b/keysets.scad
@@ -0,0 +1,40 @@
+/*use <key.scad>*/
+include <keys.scad>
+
+//TODO duplicate def to not make this a special var. maybe not worth it
+unit = 19.05;
+
+// defaults
+$bottom_key_width = 18.16;
+$bottom_key_height = 18.16;
+$width_difference = 6;
+$height_difference = 4;
+$total_depth = 11.5;
+$top_tilt = -6;
+$top_skew = 1.7;
+$dish_type = 0;
+$dish_depth = 1;
+$dish_skew_x = 0;
+$dish_skew_y = 0;
+$key_length = 1;
+$key_height = 1;
+$has_brim = false;
+$inverted_dish = false;
+$connectors = [[0,0]];
+$ISOEnter = false;
+$rounded_key = false;
+$stem_profile = 0;
+$stem_inset = 0;
+$stem_rotation = 0;
+$text = "";
+$inset_text = false;
+$corner_radius = 1;
+$height_slices = 1;
+
+
+for (column = [1:15]){
+  for(row = [1:4]) {
+    echo(row);
+    translate_u(column, row) dishless() dcs_row(5-row)  blank() key();
+  }
+}