eps = 0.01; infty = 200; // lid_diam = 40; // w/o the protrusions body_diam = 7; body_l = 110; body_h1 = 7; body_h2 = 12; wall = 4; w_to_h = 0.2; $fn = 128; module cyl_with_round_top(r, h, w_to_h) { cylinder(r = r, h = h); translate([0, 0, h]) scale([1, 1, w_to_h]) sphere(r = r); } module cyl4(r1, h1, d1, r2, h2, d2, w_to_h) { hull() { for (y = [-1, 1]) scale([1, y, 1]) translate([0, d1, 0]) cyl_with_round_top(r=r1, h=h1, w_to_h = w_to_h); for (y = [-1, 1]) scale([1, y, 1]) translate([0, d2, 0]) cyl_with_round_top(r=r2, h=h2, w_to_h = w_to_h); } } params = [ [7, body_h1, body_l/2], [11, body_h1 + 1*(body_h2-body_h1)/5, body_l/3], [14, body_h1 + 2*(body_h2-body_h1)/5, body_l/4], [19, body_h1 + 3*(body_h2-body_h1)/5, body_l/7], [22, body_h1 + 4*(body_h2-body_h1)/5, body_l/12], [26, body_h2, 0], ]; module body() { for (i = [0:len(params)-2]) { cyl4(params[i][0], params[i][1], params[i][2], params[i+1][0], params[i+1][1], params[i+1][2], w_to_h); } } difference() { body(); difference() { translate([0, 0, -eps]) cylinder(r1 = 43/2, r2 = 41/2, h = body_h2 + 44*w_to_h); for (angle = [0:360/30:360]) rotate([0, 0, angle]) hull() { translate([-43/2, 0, -2*eps]) cylinder(r=1.5, h=eps, $fn = 3); translate([-41/2, 0, body_h2+46*w_to_h+2*eps]) cylinder(r=1.5, h=eps, $fn = 3); } } }