1 module cartridge() 2 { 3 $fn = 50; 4 5 /* Rounding/fillet radius and additional margin of subtracted 6 material. The additional margin helps avoid geometry 7 problems. */ 8 9 rr = 1; 10 ro = rr; 11 extra = 0.1; 12 13 module fillet(r, h) { 14 translate([0, 0, -h/2]) 15 difference() { 16 cube([r + extra, r + extra, h]); 17 cylinder(r = r, h = h); 18 } 19 } 20 21 /* Cartridge dimensions. */ 22 23 width = 89.0; 24 height = 68.5; 25 depth = 16.5; 26 27 /* Details. */ 28 29 front_label_width = 83.0; 30 front_label_height = 46.0; 31 front_label_depth = 1.0; 32 front_label_offset_from_bottom = 19.5; 33 34 top_label_width = front_label_width; 35 top_label_height = 11.5; 36 top_label_depth = front_label_depth; 37 top_label_offset_from_front = 2.5; 38 39 groove_depth = 1.0; 40 41 /* Side thicknesses. */ 42 43 front = 2; 44 back = 3.5; 45 top = 3; 46 left = 2; 47 right = 2; 48 49 difference() { 50 51 /* The cartridge surfaces. */ 52 53 union() { 54 translate([0, -depth / 2 + front / 2, 0]) 55 cube([width, front, height], center = true); 56 translate([0, depth / 2 - back / 2, 0]) 57 cube([width, back, height], center = true); 58 translate([-width / 2 + left / 2, 0, 0]) 59 cube([left, depth, height], center = true); 60 translate([width / 2 - right / 2, 0, 0]) 61 cube([right, depth, height], center = true); 62 translate([0, 0, height / 2 - top / 2]) 63 cube([width, depth, top], center = true); 64 } 65 66 /* Label insets. */ 67 68 union() { 69 70 /* Front label. */ 71 72 translate([-front_label_width / 2, -depth / 2, 73 front_label_offset_from_bottom - height / 2]) 74 cube([front_label_width, front_label_depth, 75 front_label_height]); 76 77 /* Top label. */ 78 79 translate([-top_label_width / 2, 80 -depth / 2 + top_label_offset_from_front, 81 height / 2 - top_label_depth]) 82 cube([top_label_width, top_label_height, 83 top_label_depth]); 84 } 85 86 /* Top and side grooves. */ 87 88 union() { 89 90 /* Left groove. */ 91 92 translate([-width / 2 + groove_depth / 2, 0, 0]) 93 cube([groove_depth, groove_depth, height], center = true); 94 95 /* Right groove. */ 96 97 translate([width / 2 - groove_depth / 2, 0, 0]) 98 cube([groove_depth, groove_depth, height], center = true); 99 100 /* Top groove. */ 101 102 translate([0, 0, height / 2 - groove_depth / 2]) 103 cube([width, groove_depth, groove_depth], center = true); 104 } 105 106 /* Fillets to round off the edges. */ 107 108 union() { 109 110 /* Top left and right rounding. */ 111 112 translate([-width / 2 + ro, 0, height / 2 - ro]) 113 rotate([0, 0, 180]) 114 rotate([90, 0, 0]) 115 fillet(rr, depth); 116 translate([width / 2 - ro, 0, height / 2 - ro]) 117 rotate([90, 0, 0]) 118 fillet(rr, depth); 119 120 /* Top back and front rounding. */ 121 122 translate([0, depth / 2 - ro, height / 2 - ro]) 123 rotate([0, -90, 0]) 124 fillet(rr, width); 125 translate([0, -depth / 2 + ro, height / 2 - ro]) 126 rotate([0, 0, 180]) 127 rotate([0, -90, 0]) 128 fillet(rr, width); 129 130 /* Edge rounding. */ 131 132 translate([width / 2 - ro, depth / 2 - ro, 0]) 133 fillet(rr, height); 134 translate([-width / 2 + ro, depth / 2 - ro, 0]) 135 rotate([0, 0, 90]) 136 fillet(rr, height); 137 translate([-width / 2 + ro, -depth / 2 + ro, 0]) 138 rotate([0, 0, 180]) 139 fillet(rr, height); 140 translate([width / 2 - ro, -depth / 2 + ro, 0]) 141 rotate([0, 0, 270]) 142 fillet(rr, height); 143 } 144 } 145 } 146 147 cartridge(); 148