infty=200; eps=0.01; bar_diam = 20; body_h = 7; body_l = 150; wall = 1.5; spike_w_bot = 1; spike_w_top = 6; spike_l = 5; spike_count = 8; spike_dist = body_l/(spike_count + 1); module spike() { hull() { translate([-spike_w_top/2, 0, body_h/2-eps]) cube([spike_w_top, bar_diam/2+wall/2, eps]); translate([-spike_w_bot/2, 0, -body_h/2]) cube([spike_w_bot, bar_diam/2 + wall + spike_l, eps]); } } difference() { union() { translate([-body_l/2, 0, 0]) rotate([0, 90, 0]) cylinder(r = bar_diam/2 + wall, h = body_l); for (i = [-spike_count/2:1:spike_count/2]) translate([i*spike_dist, 0, 0]) spike(); } // tube hole translate([-body_l/2-eps, 0, 0]) rotate([0, 90, 0]) cylinder(r = bar_diam/2, h = body_l + 2*eps); // cut the bottom translate([-infty/2, -infty/2, -infty-body_h/2]) cube(infty); // cut the top translate([-infty/2, -infty/2, body_h/2]) cube(infty); // cut the rear half translate([-infty/2, -infty, -infty/2]) cube(infty); }