////////////////////////////////////////////////////////////////////////////
// Joukovsky Tower
// OpenSCAD
// Pere Hernàndez i Casellas
// 20211113
// GNU General Public License 3.0 http://www.gnu.org
///////////////////////////////////////////////////////////////////////////
$fn=60;

///////////////////////////////////////////////////////////////////////////
// Main parameters
///////////////////////////////////////////////////////////////////////////

// Foundation
rad0=10;
rad1=12.5; //Base radious
r_pile=1.0;
d0=35; // piles lenght
d1=8; // foundation thickness

// Terrain
color([0,1,0,0.1])
% cube([80,80,0.01], center = true);

// Main mast
rad2=7.5;
rad10=5.0;
d2=30; // main cone height
d3=50;
d4=10;
d5=50;
d6=10;
d7=50;
d8=10;
d9=50;
d10=10;
mh=d2+d3+d4+d5+d6+d7+d8+d9+d10;
echo("Max height", mh);

// Fairing parameters
rinc=0.2;
dd=20;
hd=3.5;

// Observatory
r_sphe=5.5;
s_sphe=sqrt(r_sphe*r_sphe-rad10*rad10);

// LEDs

rl1=0.15;
rl2=0.25;
dl1=0.1;
dl2=0.15;
sep1=0.2;

// Calculed values
zk=(rad10-rad2)/(mh-d2);
ak=atan((rad2-rad10)/(mh-d2));
z0=rad2-zk*d2;
rad3=z0+zk*(d2+d3);
rad4=z0+zk*(d2+d3+d4);
rad5=z0+zk*(d2+d3+d4+d5);
rad6=z0+zk*(d2+d3+d4+d5+d6);
rad7=z0+zk*(d2+d3+d4+d5+d6+d7);
rad8=z0+zk*(d2+d3+d4+d5+d6+d7+d8);
rad9=z0+zk*(d2+d3+d4+d5+d6+d7+d8+d9);
radtop=z0+zk*(mh);
echo("Rad top",radtop,rad3,rad9);

///////////////////////////////////////////////////////////////////////////
// Drawing the model
///////////////////////////////////////////////////////////////////////////

color([0.8,0.8,0.8]) {

// Foundation
    translate([0,0,-d1])
    cylinder(h=d1, r=rad1);
    // Piles
    for ( l=[0:30:360])
        rotate([0,0,l])
translate([rad0,0,-d1-d0])
    cylinder(h=d0, r=1);

// First cone
cylinder(h=d2,r1=rad1,r2=rad2);

// Second cone
translate([0,0,d2])
cylinder(h=mh-d2,r1=rad2,r2=rad10);

}

// Joukowsky fairing
// Level 2-3
 color([0.8,0.8,0.0]) {
    rotate([0,0,-2.5])
hull() {
translate([0,0,d2])
cylinder(h=d3,r1=rad2+rinc,r2=rad3+rinc);
translate([0,dd,d2-hd])
    rotate([4*ak,0,0])
cylinder(h=d3,r1=0.2,r2=0.2);
}
}
// Level 4-5
 color([0.8,0.8,0.0]) {
    rotate([0,0,0])
hull() {
translate([0,0,d2+d3+d4])
cylinder(h=d3,r1=rad4+rinc,r2=rad5+rinc);
translate([0,dd,d2+d3+d4-hd])
    rotate([4*ak,0,0])
cylinder(h=d3,r1=0.2,r2=0.2);
}
}
// Level 6-7
 color([0.8,0.8,0.0]) {
    rotate([0,0,5])
hull() {
translate([0,0,d2+d3+d4+d5+d6])
cylinder(h=d3,r1=rad6+rinc,r2=rad7+rinc);
translate([0,dd,d2+d3+d4+d5+d6-hd])
    rotate([4*ak,0,0])
cylinder(h=d3,r1=0.2,r2=0.2);
}
}
// Level 8-9
 color([0.8,0.8,0.0]) {
    rotate([0,0,10])
hull() {
translate([0,0,d2+d3+d4+d5+d6+d7+d8])
cylinder(h=d3,r1=rad8+rinc,r2=rad9+rinc);
translate([0,dd,d2+d3+d4+d5+d6+d7+d8-hd])
    rotate([4*ak,0,0])
cylinder(h=d3,r1=0.2,r2=0.2);
}
}

// Top observatory
color([0.8,0.8,1,0.15]) {
translate([0,0,mh+s_sphe])
% sphere(r=r_sphe);
}
// Railing
color([0,0,0.8])
translate([0,0,mh]) {
    translate([0,0,1.1]){
rotate_extrude(convexity = 10, $fn = 100)
translate([rad10-0.2, 0, 0])
circle(r = 0.025, $fn = 100);
    }
    for (m=[0:15:360])
        rotate([0,0,m])
    translate([rad10-0.2,0,0])
    cylinder(h=1.1,r=0.02);
}
// DRAW LEDS

// Red LED
translate([0,0,d2+d3+d4+d5+d6+d7+d8+d9]) {
    // Copy rings
    for (j = [1:1:9])
        translate([0,0,j]) {
    // Ring of LEDs
    for ( i = [0:15:360])
    rotate([0,0,i])
    translate([0,rad9+sep1,0])
rotate([-90,0,0]) {
cylinder(h=dl1,r=rl1);
translate([0,0,dl1])
cylinder(h=dl2, r1=rl1, r2=rl2);
translate([0,0,dl1+dl2])
color([1,0,0]) {
cylinder(h=0.04, r=rl2);
    translate([0,0,-1])
cylinder(h=1.0, r=0.05);
}
}
// Support
color([1,0,0])
rotate_extrude(convexity = 10, $fn = 100)
translate([rad9+sep1, 0, 0])
circle(r = 0.05, $fn = 100);
}
}

// Green LED
translate([0,0,d2+d3+d4+d5+d6+d7]) {
    // Copy rings
    for (j = [1:1:9])
        translate([0,0,j]) {
    // Ring of LEDs
    for ( i = [0:15:360])
    rotate([0,0,i])
    translate([0,rad7+sep1,0])
rotate([-90,0,0]) {
cylinder(h=dl1,r=rl1);
translate([0,0,dl1])
cylinder(h=dl2, r1=rl1, r2=rl2);
translate([0,0,dl1+dl2])
color([0,1,0]) {
cylinder(h=0.04, r=rl2);
    translate([0,0,-1])
cylinder(h=1.0, r=0.05);
}
}
// Support
color([0,1,0])
rotate_extrude(convexity = 10, $fn = 100)
translate([rad7+sep1, 0, 0])
circle(r = 0.05, $fn = 100);
}
}

// Yellow LED
translate([0,0,d2+d3+d4+d5]) {
    // Copy rings
    for (j = [1:1:9])
        translate([0,0,j]) {
    // Ring of LEDs
    for ( i = [0:15:360])
    rotate([0,0,i])
    translate([0,rad5+sep1,0])
rotate([-90,0,0]) {
cylinder(h=dl1,r=rl1);
translate([0,0,dl1])
cylinder(h=dl2, r1=rl1, r2=rl2);
translate([0,0,dl1+dl2])
color([1,1,0]) {
cylinder(h=0.04, r=rl2);
    translate([0,0,-1])
cylinder(h=1.0, r=0.05);
}
}
// Support
color([1,1,0])
rotate_extrude(convexity = 10, $fn = 100)
translate([rad5+sep1, 0, 0])
circle(r = 0.05, $fn = 100);
}
}

// Blue LED
translate([0,0,d2+d3]) {
    // Copy rings
    for (j = [1:1:9])
        translate([0,0,j]) {
    // Ring of LEDs
    for ( i = [0:15:360])
    rotate([0,0,i])
    translate([0,rad3+sep1,0])
rotate([-90,0,0]) {
cylinder(h=dl1,r=rl1);
translate([0,0,dl1])
cylinder(h=dl2, r1=rl1, r2=rl2);
translate([0,0,dl1+dl2])
color([0,0,1]) {
cylinder(h=0.04, r=rl2);
    translate([0,0,-1])
cylinder(h=1.0, r=0.05);
}
}
// Support
color([0,0,1])
rotate_extrude(convexity = 10, $fn = 100)
translate([rad3+sep1, 0, 0])
circle(r = 0.05, $fn = 100);
}
}

// Human body observatory
translate([0,0,mh])
scale([0.005,0.005,0.005])
rotate([0,0,-45])
rotate([90,0,0])
color([0.5,0.8,0])
import("man1.stl", convexity=3);

// Human body2 floor
translate([0,-17,0])
scale([0.005,0.005,0.005])
rotate([0,0,-45])
rotate([90,0,0])
color([0.0,0.8,0])
import("man1.stl", convexity=3);