And here is what I ended up with
OUTSIDE_DIAMETER = 45; WALL_HEIGHT = 5; INSIDE_DIAMETER = 13; module end_piece() { union() { difference() { cylinder(r=OUTSIDE_DIAMETER/2, h=WALL_HEIGHT); translate([0, 0, 3]) cylinder(r=(OUTSIDE_DIAMETER/2)-1.5, h=WALL_HEIGHT); } difference() { cylinder(r=INSIDE_DIAMETER/2, h=WALL_HEIGHT); translate([0, 0, 3]) cylinder(r=(INSIDE_DIAMETER/2)-1.5, h=WALL_HEIGHT); } for (i=[0:7]) { rotate([0, 0, i*45]) translate([INSIDE_DIAMETER, 0, 5/2]) cube([(OUTSIDE_DIAMETER - INSIDE_DIAMETER)/2, 1.5, WALL_HEIGHT], center = true); } } } module random_ikea_thing() { translate([0, 0, 17]) end_piece(); rotate([180, 0, 0]) end_piece(); cylinder(r=3, h = 17); translate([0, 0, (17/3) - (2.5/2)]) cylinder(r=4, h = 17/3); translate([0, 0, (17/3) - (2.5/2)]) cylinder(r=12.5, h = 2); translate([0, 0, (2*17/3) - (2.5/2)]) cylinder(r=12.5, h = 2); } random_ikea_thing();