$fn = 100;

module support() {
    cube([3, 3, 20.5]);
    translate([0, 0, 17.5]) cube([3, 11, 3]);
}

module base() {
    cube([20, 20, 3]);
    translate([8.5, 0, 0]) support();
}

difference() {
    union() {
        base();

        translate([0, 20, 30]) rotate([180, 0, 0]) base();
    }
    translate([6, 7.5, 29]) linear_extrude(height=2) {
        text("TB", 5, "Figtree:style=Bold"); // initiales TB
    }
}

// https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/2D_to_3D_Extrusion#Mesh_Refinement_2
module chain_link(r, s, t, fn = 100) {
    // r = radius
    // s = size
    // t = tall
    union() {
        rotate_extrude(angle = 180, $fn = 100) translate([s, 0, 0]) circle(r = r, $fn = fn);
        translate([-s, 0, 0]) rotate([90, -36, 0]) cylinder(r = r, h = s * t, $fn = fn);
        translate([s, 0, 0]) rotate([90, 0, 0]) cylinder(r = r, h = s * t, $fn = fn);
        translate([0, -s * t, 0]) rotate_extrude(angle = -180, $fn = 100) translate([s, 0, 0]) circle(r = r, $fn = fn);
    }
}

module chain(r, s, t, l, fn = 100) {
    union() {
        for (i = [0:l]) {
            if (i % 2 == 0) {
                translate([0, -t * 1.2 * i, 0]) chain_link(r, s, t, fn);
            } else {
                translate([0, -t * 1.2 * i, 0]) rotate([0, 90, 0]) chain_link(r, s, t, fn);
            }
        }
    }
}

chain_r = .2;
chain_s = .6;
chain_t = 1.5;
chain_l_long = 13;
chain_l_short = 2;

//translate([1.5, 1.5, 31]) rotate([-90, 0, -45]) chain_link(.2, .6);

union() {
    translate([1.5, 1.5, 2.9]) rotate([-90, 0, -45]) chain(chain_r, chain_s, chain_t, chain_l_long, $fn);

    translate([18.5, 1.5, 2.9]) rotate([-90, 0, 45]) chain(chain_r, chain_s, chain_t, chain_l_long, $fn);

    translate([18.5, 18.5, 2.9]) rotate([-90, 0, -45]) chain(chain_r, chain_s, chain_t, chain_l_long, $fn);

    translate([1.5, 18.5, 2.9]) rotate([-90, 0, 45]) chain(chain_r, chain_s, chain_t, chain_l_long, $fn);

    translate([10, 10, 12.8]) rotate([-90, 0, 45]) chain(chain_r, chain_s, chain_t, chain_l_short, $fn);
}