include t = 3; w = 5; r = 1; num = 3; // haczyk do przyczepienia hook_top = 17; hook_bottom = 20; hook_h = 30; hook_angle = 5; // atan((hook_bottom-hook_top)/hook_h); module hook() { fwd(hook_top + t/2) union() { cuboid([w, hook_top+t, t], rounding=r, anchor=TOP+FWD); rotate([90 - hook_angle,0,0]) cuboid([w, hook_h, t], rounding=r, anchor=TOP+BACK); } } // holder hold_h = 80; hold_d = 17; hold_hf = 90; // height front module holder() { diff("R") { cuboid([w,t,hold_h], anchor=TOP, rounding=r); down(hold_h) cuboid([w,hold_d,t], anchor=BOTTOM+FWD, rounding=r); down(hold_h) back(hold_d) cuboid([w,t,hold_hf], anchor=BOTTOM, rounding=r); tag("R") down(hold_h) back(hold_d/2) up(t*(2/3)) cuboid([10,w,10], anchor=BOTTOM); } } hold_w = 130; hold_side = 50; module crossbar() { down(hold_h) back(hold_d/2) up(t) diff("R") { cuboid([hold_w,w,t], anchor=BOTTOM, rounding=r); left(hold_w/2) cuboid([t,w,hold_side], anchor=BOTTOM, rounding=r); right(hold_w/2) cuboid([t,w,hold_side], anchor=BOTTOM, rounding=r); tag("R") left(hold_w/2) up(t/3) for(i = [1:num]) { right(hold_w/(num+1) * i) cuboid([w,10,10], anchor=TOP); } } } hook(); holder(); crossbar();