infty = 100; eps = 0.01; wall = 0.6; // minimum wall d_x = 25; // inner diameter in the X axis y_scale = 0.5; // scale y/x height = 2.5; // height of the rim slot_w = 1.5; side_hole_d = 2.0; thin_wall = 1; lever_l = 45; lever_h = 15.5; foam_h = 3; module half(d_x, y_scale, height) { hull($fn = 128) { scale([1, (d_x*y_scale+height)/(d_x+height), 1]) cylinder(r = d_x/2 + height/2, h = eps); translate([0, 0, height/2]) scale([1, y_scale, 1]) cylinder(r = d_x/2, h = eps); } } module pulley(d_x, y_scale, height, center_hole_d) { difference() { union() { half(d_x, y_scale, height); translate([0, 0, height]) scale([1, 1, -1]) half(d_x, y_scale, height); // lever hull() { translate([-lever_h, 0, 0]) cube([lever_h, eps, thin_wall]); translate([-foam_h, -lever_l, 0]) cube([foam_h, eps, thin_wall]); } } translate([0, 0, -eps]) cylinder(r = center_hole_d/2, h = height + 2*eps); translate([-slot_w/2, d_x*y_scale/2, -eps]) cube([slot_w, height, height + 2*eps]); translate([0, center_hole_d/2 + (d_x*y_scale/2-center_hole_d/2)/2, -eps]) cylinder(r = side_hole_d/2, h = height + 2*eps); } } pulley(d_x = 30, y_scale = 0.4, height=3, center_hole_d = 2.5); // translate([0, 20, 0]) // pulley(d_x = 35, y_scale = 0.4, height=2.5, center_hole_d = 8);