ethan-s
4/23/2015 - 2:03 AM

lego_keycap.jscad

// dimensions Cherry MX connector
var c_corr = 0.4    // tolerance
var c_horiz = 1.1   // horizontal bar width
var c_vert = 1.0    // vertical bar width
var c_dia = 4       // cross width
var c_depth = 7     // connector depth
var c_space = 7     // height of hollow inside
var c_inset = 0.75  // distance connector start to keycap base
 
// stuff
 
var $fn = 64
 
function connector() {
  return difference(
    support(),
    plus()
  ).translate([0, 0, 0])
}
 
function plus() {
  return union(
    cube({ size: [c_vert+c_corr, c_dia+c_corr, c_depth-3], center: true }),
    cube({ size: [c_dia+c_corr, c_horiz+c_corr, c_depth-3], center: true })
  ).translate([0, 0, (c_depth-3)/2])
}
 
function support() {
  var width = top_y-2
  var depth = c_dia+c_corr
  return cube({ size: [width, depth-1, c_space+c_corr] })
    .subtract([
      rotate([0, 50, 0], 
        cube({size: [depth+5, depth, depth]})
      ).translate([-5, 0, 4]),
      mirror([1, 0, 0], rotate([0, 50, 0], 
        cube({size: [depth+5, depth, depth]})
      ).translate([-19, 0, 4]))
    ])
    .translate([-width/2, -(depth-1)/2, 0])
}
 
var base_w = 18
var top_y = 16
var dx = 2      // top sides are pushed to center
var dy = 1      // top is pushed back this far
 
var z_front = 6+2   // height at front edge
var z_back = 6+2  // height at back edge
 
var angle = Math.atan((z_front-z_back) / top_y)
 
/*
       ______
      /7   6/|
     /4___5/ |
    |  |___|_|
    | /3   |2/
    |/0___1|/
 
*/
 
function shell() {
  return polyhedron({
    points: [
      [ 0,          0,        0 ],
      [ base_w,     0,        0 ],
      [ base_w,     base_w,   0 ],
      [ 0,          base_w,   0 ],
      [ dx,         dy,       z_front ],
      [ base_w-dx,  dy,       z_front ],
      [ base_w-dx,  dy+top_y, z_back ],
      [ dx,         dy+top_y, z_back ]
    ],
    triangles: [
      [0,5,1], [0,4,5],
      [1,6,2], [1,5,6],
      [2,7,3], [2,6,7],
      [3,4,0], [3,7,4],
      [4,6,5], [4,7,6],
      [0,1,3], [1,2,3]
    ]
  }).translate([-base_w/2, -base_w/2, 0])
}
 
 
var FLU = 1.6 // Fundamental Lego Unit = 1.6 mm
var brick_width = 5*FLU
var brick_half = 2.5*FLU
var brick_height = 6*FLU
var wall_thickness = FLU
var stud_radius = 1.5 * FLU
var stud_height = FLU
var correction = 0.1
 
function stud() {
  return cylinder({ h: stud_height + correction, r: stud_radius })
}
 
function studs() {
  return union(
    stud().translate([brick_half, brick_half, -correction]),
    stud().translate([brick_half, -brick_half, -correction]),
    stud().translate([-brick_half, brick_half, -correction]),
    stud().translate([-brick_half, -brick_half, -correction])
  )
}
 
 
function cap() {
  return difference(
    shell(),
    shell().scale(0.88)
  )
}
 
 
function main() {
  return [
    cap(),
    connector(),
    studs().translate([0, 0, z_front])
  ]
}