--- /dev/null
+infty=200;
+eps=0.01;
+
+bar_diam = 20;
+body_h = 15;
+body_l = 100;
+
+wall = 1.5;
+
+spike_w = 1;
+spike_l = 2;
+
+module spike() {
+ hull() {
+ translate([-body_h/4, 0, -eps])
+ cube([body_h/2, bar_diam/2+wall/2, eps]);
+ translate([-spike_w/2, 0, -body_h/2])
+ cube([spike_w, 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 (x = [-37.5:15:37.5])
+ translate([x, 0, 0]) spike();
+ for (x = [-45:15:45])
+ translate([x, 0, 0]) scale([1, 1, -1]) 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 bottom
+ translate([-infty/2, -infty/2, body_h/2]) cube(infty);
+ // cut the bottom rear half
+ translate([-infty/2, -infty, -infty/2]) cube(infty);
+}