ImplicitCAD (ExtOpenSCAD) Cloud

//pulled from http://github.com/nathan7/nateplate/raw/master/nateplate.escad
//the nateplate v2 - the awesome Y axis for Prusa3
//Licensed GPLv2+ and CC-BY-SA - pick your poison
//(C) 2012 Nathan Zadoks

//parameters
$quality = 200;
r = 7.5;

cut_width = 0.005 * 25.4;

offsetx_hole = 209;
offsety_hole = 209;

offsetx_belt = 22;

hole_diam = 2.6;
hole_sides = 6;
hole_diam_threadless = 3;

ziptie_width = 6;
ziptie_thickness = 3;
ziptie_offset = 1;

xsize = offsetx_hole + r * 2;
ysize = offsety_hole + r * 2;

bearing_od = 15;
bearing_len = 24;
bearing_cutheight = 2.5;

offsetx_bearing = 110;
offsety_bearing = ysize / 3;

cutout_clip_depth = 30;
cutout_clip_width = 30;
cutout_clip_offset = ysize - 2 * cutout_clip_width * 1.5;

cutout_base = true; //for i2 compatibility

/* here be dragons */

//calculations
bearing_cutwidth = sin(acos(1 - (2 * bearing_cutheight) / bearing_od)) * bearing_od;

//singular parts
module ziptie() {
  square([ziptie_thickness - cut_width, ziptie_width - cut_width], center = true);
}

module bearing() {
  union() {
    square([bearing_cutwidth - cut_width, bearing_len - cut_width], r = 0, center = true);
    for (y = [-1, 1])
      translate([y * (bearing_cutwidth + ziptie_offset * 2 + ziptie_thickness), 0] / 2) ziptie();
  }
}

module hole() {
  circle(r = hole_diam / 2 / cos(pi / hole_sides) - cut_width / 2, $fn = hole_sides);
}

module belt_holes_i2() {
  for (x = [-1, 1]) for (y = [-1, 1])
    translate([x * 18, y * 20] / 2) hole();
}

module belt_holes_i3() {
  translate([0, -35 / 2]) union() {
    translate([-12, 0]) hole();
    translate([12, 0]) hole();
    translate([0, 35]) hole();
  }
}

module base_cutout() {
  square([offsetx_bearing + bearing_od, ysize - offsety_bearing - bearing_len - 2 * r], r = r, center = true);
}

module clip() {
  square([cutout_clip_depth * 2, cutout_clip_width], r = r, center = true);
}

module spacer() {
  difference() {
    circle(r = r);
    circle(r = hole_diam_threadless / 2 / cos(pi / hole_sides) - cut_width / 2, $fn = hole_sides);
  }
}

//part arrangements
module bearings() {
  for (x = [-1, 1]) for (y = [-1, 1])
    translate([offsetx_bearing * x, offsety_bearing * y] / 2) bearing();
}

module belt_holes() {
  union() {
    translate([offsetx_belt, 0]) union() {
      belt_holes_i2();
      belt_holes_i3();
    }
    belt_holes_i2();
  }
}

module bed_holes() {
  for (x = [-1, 1]) for (y = [-1, 1])
    translate([offsetx_hole * x, offsety_hole * y] / 2) hole();
}

module base_cutouts() {
  for (y = [-1, 1])
    translate([0, ysize * y] / 2) base_cutout();
}

module clips() {
  for (x = [-1, 1]) for (y = [-1, 1])
    translate([xsize * x, cutout_clip_offset * y] / 2) clip();
}

module spacers() {
  for (x = [-1, 1]) for (y = [-1, 1])
    translate([(xsize - cutout_clip_depth) * x, cutout_clip_offset * y] / 2) spacer();
}

//actual stuff
union() {
  //the nateplate itself
  difference() {
    difference(r = r) {
      square([xsize, ysize], r = r, center = true);
      clips();
      if (cutout_base)
        base_cutouts();
    }
    bearings();
    belt_holes();
    bed_holes();
  }
  //free fancy spacers
  spacers();
}

Console