Very pleased with how this turned out
Can you guess what it is before trying it?
leds = 8; //even number of leds across
border = 1;
base_top = 66;
base_height = 5;
base_bottom = base_top + base_height +base_height;
top_pipe = (base_top - (leds+1)*border) / leds;
base_pipe= (base_bottom - (leds+1)*border) / leds;
Faces = [
[0,1,2,3], // bottom
[4,5,1,0], // front
[7,6,5,4], // top
[5,6,2,1], // right
[6,7,3,2], // back
[7,4,0,3]]; // left
offset = [ for ( i = [0 : leds/2-1]) (i*(1/(leds/2)))*base_height ];
module gen(base,top,n,m) {
PipeXX = [
[ 0 , 0 , 0 ], //0
[ base , 0 , 0 ], //1
[ base , base , 0 ], //2
[ 0 , base , 0 ], //3
[ base_height-offset[n] , base_height-offset[m] , base_height ], //4
[ top+base_height-offset[n] , base_height-offset[m] , base_height ], //5
[ top+base_height-offset[n] , top+base_height-offset[m] , base_height ], //6
[ base_height-offset[n] , top+base_height-offset[m] , base_height ]]; //7
translate([(base+border)*n,(base+border)*m,0]) polyhedron( PipeXX, Faces );
}
module first_q () {
for ( i = [0 : leds/2-1] )
for ( j = [0 : leds/2-1] )
gen(base_pipe,top_pipe,j,i);
}
difference() {
gen(base_bottom,base_top,offset[0],offset[0]);
translate([border,border,0]) first_q();
translate([base_bottom-border,border,0]) mirror([1,0,0]) first_q();
translate([base_bottom-border,base_bottom-border,0]) mirror([1,0,0]) mirror([0,1,0]) first_q();
translate([border,base_bottom-border,0]) mirror([0,1,0]) first_q();
}