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