eps = 0.01; infty = 100; wall = 1.2; thin_wall = 0.6; tube_d = 6 + 0.1; tube_zoff = 3; base_front = 15; base_rear = 25; base_w = base_front + base_rear; base_l = 15; tube_l = base_l/2; base_overhang = 0.9; // factor of base_front, base_r, base_l module body(tube_zoff) { // base // scale([1, base_l/base_w, 1]) // cylinder(r = base_w/2, h = thin_wall); translate([-base_rear, -base_l/2, 0]) cube([base_w, base_l, thin_wall]); // front diagonal supports for (y = [-1,1]) scale([1, y, 1]) hull() { translate([base_overhang*base_front-thin_wall/2, base_overhang*base_l/2-thin_wall/2, 0]) cylinder(r = thin_wall/2, h = thin_wall, $fn = 16); translate([0, tube_l/3-thin_wall/2, 0]) cylinder(r = thin_wall/2, h = tube_zoff + tube_d, $fn = 16); } // rear diagonal supports for (y = [-1,1]) scale([1, y, 1]) hull() { translate([-base_overhang*base_rear+thin_wall/2, base_overhang*base_l/2-thin_wall/2, 0]) cylinder(r = thin_wall/2, h = thin_wall, $fn = 16); translate([0, tube_l/3-thin_wall/2, 0]) cylinder(r = thin_wall/2, h = tube_zoff + tube_d, $fn = 16); } // under the tube supports for (y = [-1,1]) scale([1, y, 1]) hull() { translate([0, base_overhang*base_l/2, 0]) cylinder(r = thin_wall/2, h = thin_wall, $fn = 16); translate([-thin_wall/2, 0, 0]) cube([thin_wall, tube_l/2, tube_zoff]); } // side bottom tube supports for (x = [-1,1]) scale([x, 1, 1]) { translate([tube_d/2, -tube_l/2, 0]) cube([wall, tube_l, tube_zoff + tube_d/2]); translate([tube_d/2+wall, -wall, 0]) cube([wall, 2*wall, tube_zoff + tube_d/2]); } // upper cylinder clip translate([0, -tube_l/2, tube_d/2 + tube_zoff]) intersection() { rotate([-90, 0, 0]) union() { cylinder(r = tube_d/2 + wall, h = tube_l); translate([0, 0, tube_l/2 - wall]) cylinder(r = tube_d/2 + 2*wall, h = 2*wall); } translate([-tube_d/2-2*wall, 0, 0]) cube([tube_d + 4*wall, tube_l, tube_d]); } } module wing_tube_support(tube_zoff) { difference() { body(tube_zoff); // main tube translate([0, -base_l/2-eps, tube_d/2+tube_zoff]) rotate([-90, 0, 0]) cylinder(r = tube_d/2, h = base_l + 2*eps, $fn = 32); // upper clip translate([-infty/2, -infty/2, tube_zoff + 5*tube_d/6]) cube(infty); // front-side hole translate([0.7*base_front, 0, -eps]) scale([1, base_l/base_front, 1]) cylinder(r = base_front/5, h = thin_wall + 2*eps); // rear-side hole translate([-0.6*base_rear, 0, -eps]) scale([1, base_l/base_rear, 1]) cylinder(r = base_rear/4, h = thin_wall + 2*eps); } } for (q = [-1,1]) { scale([q, 1, 1]) translate([-base_front - 5, 0, 0]) { wing_tube_support(1.7); translate([0, -base_l -5, 0]) wing_tube_support(2.8); translate([0, base_l + 5, 0]) wing_tube_support(0.6); } }