| 1 | // PRUSA iteration3 |
| 2 | // Functions used in many files |
| 3 | // GNU GPL v3 |
| 4 | // Josef Průša <josefprusa@me.com> |
| 5 | // Václav 'ax' Hůla <axtheb@gmail.com> |
| 6 | // http://www.reprap.org/wiki/Prusa_Mendel |
| 7 | // http://github.com/prusajr/PrusaMendel |
| 8 | |
| 9 | |
| 10 | module nut(d,h,horizontal=true){ |
| 11 | cornerdiameter = (d / 2) / cos (180 / 6); |
| 12 | cylinder(h = h, r = cornerdiameter, $fn = 6); |
| 13 | if(horizontal){ |
| 14 | for(i = [1:6]){ |
| 15 | rotate([0,0,60*i]) translate([-cornerdiameter-0.2,0,0]) rotate([0,0,-45]) cube([2,2,h]); |
| 16 | } |
| 17 | } |
| 18 | } |
| 19 | |
| 20 | // Based on nophead research |
| 21 | module polyhole(d, h, center=false) { |
| 22 | n = max(round(2 * d),3); |
| 23 | rotate([0,0,180]) |
| 24 | cylinder(h = h, r = (d / 2) / cos (180 / n), $fn = n); |
| 25 | } |
| 26 | |
| 27 | // make it interchangeable between this and cylinder |
| 28 | module cylinder_poly(r, h, center=false){ |
| 29 | polyhole(d=r*2, h=h, center=center); |
| 30 | } |
| 31 | |
| 32 | module fillet(radius, height=100, $fn=16) { |
| 33 | //this creates acutal fillet |
| 34 | translate([-radius, -radius, -height/2-0.01]) |
| 35 | difference() { |
| 36 | cube([radius*2, radius*2, height+0.02]); |
| 37 | cylinder(r=radius, h=height+0.02, $fn=16); |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | |
| 42 | module cube_fillet(size, radius=-1, vertical=[3,3,3,3], top=[0,0,0,0], bottom=[0,0,0,0], center=false, $fn=0){ |
| 43 | // |
| 44 | if (center) { |
| 45 | cube_fillet_inside(size, radius, vertical, top, bottom, $fn); |
| 46 | } else { |
| 47 | translate([size[0]/2, size[1]/2, size[2]/2]) |
| 48 | cube_fillet_inside(size, radius, vertical, top, bottom, $fn); |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | module cube_negative_fillet(size, radius=-1, vertical=[3,3,3,3], top=[0,0,0,0], bottom=[0,0,0,0], $fn=0){ |
| 53 | |
| 54 | j=[1,0,1,0]; |
| 55 | |
| 56 | for (i=[0:3]) { |
| 57 | if (radius > -1) { |
| 58 | rotate([0, 0, 90*i]) translate([size[1-j[i]]/2, size[j[i]]/2, 0]) fillet(radius, size[2], $fn=$fn); |
| 59 | } else { |
| 60 | rotate([0, 0, 90*i]) translate([size[1-j[i]]/2, size[j[i]]/2, 0]) fillet(vertical[i], size[2], $fn=$fn); |
| 61 | } |
| 62 | rotate([90*i, -90, 0]) translate([size[2]/2, size[j[i]]/2, 0 ]) fillet(top[i], size[1-j[i]], $fn=$fn); |
| 63 | rotate([90*(4-i), 90, 0]) translate([size[2]/2, size[j[i]]/2, 0]) fillet(bottom[i], size[1-j[i]], $fn=$fn); |
| 64 | |
| 65 | } |
| 66 | } |
| 67 | |
| 68 | module cube_fillet_inside(size, radius=-1, vertical=[3,3,3,3], top=[0,0,0,0], bottom=[0,0,0,0], $fn=0){ |
| 69 | //makes CENTERED cube with round corners |
| 70 | // if you give it radius, it will fillet vertical corners. |
| 71 | //othervise use vertical, top, bottom arrays |
| 72 | //when viewed from top, it starts in upper right corner (+x,+y quadrant) , goes counterclockwise |
| 73 | //top/bottom fillet starts in dorection of Y axis and goes CCW too |
| 74 | |
| 75 | |
| 76 | if (radius == 0) { |
| 77 | cube(size, center=true); |
| 78 | } else { |
| 79 | difference() { |
| 80 | cube(size, center=true); |
| 81 | cube_negative_fillet(size, radius, vertical, top, bottom, $fn); |
| 82 | } |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | |
| 87 | module nema17(places=[1,1,1,1], size=15.5, h=10, holes=false, shadow=false, $fn=0){ |
| 88 | for (i=[0:3]) { |
| 89 | if (places[i] == 1) { |
| 90 | rotate([0, 0, 90*i]) translate([size, size, 0]) { |
| 91 | if (holes) { |
| 92 | rotate([0, 0, -90*i]) translate([0,0,-10]) screw(r=1.7, slant=false, head_drop=13, $fn=$fn, h=h+12); |
| 93 | } else { |
| 94 | rotate([0, 0, -90*i]) cylinder(h=h, r=5.5, $fn=$fn); |
| 95 | } |
| 96 | } |
| 97 | } |
| 98 | } |
| 99 | if (shadow != false) { |
| 100 | %translate ([0, 0, shadow+21+3]) cube([42,42,42], center = true); |
| 101 | } |
| 102 | } |
| 103 | |
| 104 | module screw(h=20, r=2, r_head=3.5, head_drop=0, slant=true, poly=false, $fn=0){ |
| 105 | //makes screw with head |
| 106 | //for substraction as screw hole |
| 107 | if (poly) { |
| 108 | cylinder_poly(h=h, r=r, $fn=$fn); |
| 109 | } else { |
| 110 | cylinder(h=h, r=r, $fn=$fn); |
| 111 | } |
| 112 | if (slant) { |
| 113 | translate([0, 0, head_drop-0.01]) cylinder(h=r_head, r2=0, r1=r_head, $fn=$fn); |
| 114 | } |
| 115 | |
| 116 | if (head_drop > 0) { |
| 117 | translate([0, 0, -0.01]) cylinder(h=head_drop+0.01, r=r_head, $fn=$fn); |
| 118 | } |
| 119 | } |
| 120 | |
| 121 | //cube_fillet([10,20,30], vertical=[3,2,0,0], top=[3,2,0,5], bottom=[3,2,0,5]); |
| 122 | //cube_fillet([10,20,30], radius=2, top=[7,2,7,2]); |