eps = 0.01; infty = 100; wall = 1; slot_off = 4; slot_l = 10; slot_depth = 2.5; side_w = 4; base_l = 4 + slot_l; hole_h = 10; hole_d = 1.5; hole_step = 1.5*hole_d; n_holes = 3; hole_side = 1.5*wall; module horn() { difference() { hull() { // base translate([slot_off, 0, 0]) cube([base_l, wall, wall]); for (y = [1:n_holes]) { translate([0, hole_h -(y-1)*hole_step, 0]) cylinder(r = hole_d/2 + hole_side, h = wall, $fn = 6); } } for (y = [1:n_holes]) { translate([0, hole_h -(y-1)*hole_step, -eps]) cylinder(r = hole_d/2, h = wall + 2*eps, $fn = 6); } } // side support translate([slot_off, 0, 0]) cube([base_l, wall, side_w]); // slot hull() { translate([slot_off + (base_l - slot_l)/2, -slot_depth/2, 0]) cube([slot_l, slot_depth/2, wall]); translate([slot_off + (base_l - slot_l)/2 + wall, -slot_depth, 0]) cube([slot_l - 2*wall, slot_depth/2+eps, wall]); } } for (x = [-1, 1]) scale([x, 1, 1]) translate([hole_side + hole_d/2 + 2*wall, 0, 0]) horn();