eps = 0.01; infty = 100; wall = 1; slot_off_x = 8; slot_off_y = 8; slot_l = 30; slot_depth_front = 6; slot_depth_rear = 2; hole_h = 20; hole_d = 1.5; hole_step = 1.8*hole_d; n_holes = 3; base_angle = 5; hole_side = 2*wall; module horn() { difference() { hull() { // base rotate([0, 0, base_angle]) { translate([slot_off_x, slot_depth_front-eps, 0]) cube([eps, eps, wall]); translate([slot_off_x + slot_l - eps, slot_depth_rear-eps, 0]) cube([eps, eps, 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); } } // slot rotate([0, 0, base_angle]) hull() { translate([slot_off_x, 0, 0]) cube([eps, slot_depth_front, wall]); translate([slot_off_x + slot_l - eps, 0, 0]) cube([eps, slot_depth_rear, wall]); } } horn();