eps = 0.01; infty = 300; wall = 2; bag_d = 50; angle = 150; body_h = 15; bag_dist = 1.2*bag_d; bags = 3; body_l = (bags-1)*bag_dist; screw_hole = 4; module hook() { difference() { cylinder(r = bag_d/2 + wall, h = body_h, $fn = 128); translate([0, 0, -eps]) { cylinder(r = bag_d/2, h = body_h + 2*eps, $fn = 128); translate([0, -bag_d, 0]) cube([bag_d, 2*bag_d, body_h + 2*eps]); rotate([0, 0, 90+angle]) cube([bag_d, bag_d, body_h + 2*eps]); } } rotate([0, 0, 90+angle]) translate([bag_d/2+wall, 0, 0]) cylinder(r = wall, h = body_h, $fn = 32); } difference() { union() { translate([0, bag_d/2, 0]) cube([body_l, wall, body_h]); for (i = [0:bags-1]) translate([bag_dist*i, 0, 0]) hook(); } for (x = [0, body_l-bag_d/2 - 2*wall]) translate([x, 0, body_h/2]) rotate([-90, 0, 0]) cylinder(r = screw_hole/2, h = bag_d, $fn = 6); }