beam_inter_distance=1500; board_height=18; beam_intra_distance=200; beam_height=2500; beam_radius=47.5/2; beam_top_r1=35/2; beam_top_r2=29/2; beam_top_h2=15; // TODO: measure h2/h3, values are guessed beam_top_r3=26/2; beam_top_h3=20; beam_top_h4=5; module triangulate(d) { children(); translate([d, 0, 0]) rotate(120) children(); rotate(60) translate([d, 0, 0]) rotate(180) children(); } module beam(include_struts=false) { triangulate(beam_intra_distance) union() { cylinder(r=beam_radius, h=beam_height); translate([0, 0, beam_height]) { cylinder(r1=beam_top_r1, r2=beam_top_r2, h=beam_top_h2); translate([0, 0, beam_top_h2]) cylinder(r1=beam_top_r2, r2=beam_top_r2, h=beam_top_h3); translate([0, 0, beam_top_h2 + beam_top_h3]) cylinder(r1=beam_top_r2, r2=beam_top_r3, h=beam_top_h4); } if (include_struts) for (i = [0:(2 * beam_intra_distance):(beam_height - 2*beam_intra_distance)]) translate([0, 0, i]) { rotate([45, 0, 90]) cylinder(r=beam_radius/3, h=beam_intra_distance * sqrt(2)); translate([0, 0, 2*beam_intra_distance]) rotate([135, 0, 90]) cylinder(r=beam_radius/3, h=beam_intra_distance * sqrt(2)); } } } module board() { hull() for (i = [0,1]) translate([i * (beam_inter_distance - 2 * beam_intra_distance), 0, 0]) rotate(i*120) triangulate(beam_intra_distance) cylinder(r=2*beam_radius, h=board_height); } module board_bottom() { color("lime") render() difference() { board(); translate([0, 0, -beam_height +board_height]) beam(false); } } module board_top() { color("green") render() difference() { board(); translate([beam_inter_distance - 3 * beam_intra_distance, 0, -beam_height]) beam(false); } } module printer() { triangulate(beam_inter_distance) { beam(include_struts=true); translate([0, 0, beam_height - board_height]) board_bottom(); translate([2 * beam_intra_distance, 0, beam_height]) board_top(); } } printer();