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 + bag_d/2 + 2*wall; screw_hole = 4; base_w = 2*wall; module hook() { difference() { union() { cylinder(r = bag_d/2 + wall, h = body_h, $fn = 128); cylinder(r = bag_d/2 + 2*wall, h = wall, $fn = 128); translate([-bag_d/2-2*wall, 0, 0]) cube([bag_d/2+wall, bag_d/2+wall, wall]); } 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]); /* translate([-bag_d/2, bag_d/2+wall, 0]) cube(bag_d); */ } } rotate([0, 0, 90+angle]) translate([bag_d/2+wall, 0, 0]) cylinder(r = wall, h = body_h, $fn = 32); } difference() { union() { translate([-bag_d/2-2*wall, bag_d/2, 0]) cube([body_l, 2*wall, body_h]); for (i = [0:bags-1]) translate([bag_dist*i, 0, 0]) hook(); } for (x = [0, body_l-bag_d - 4*wall]) translate([x, 0, body_h/2]) rotate([-90, 0, 0]) cylinder(r = screw_hole/2, h = bag_d, $fn = 6); }