// Station-Puck (= Gate-Puck) — runde Station mit 7 Figurenplaetzen + Etikettenmulde
// SLC-Workshop Tabletop · Einheiten: mm
// EIN Modell fuer die ganze Bahn: 37x in Phasenfarbe (Stationen) + 3x in Rot (Gates).
// Unterschied Station/Gate = nur Filamentfarbe + aufgeklebtes Etikett (ID bzw. G1/G2/G3).
//
// Aufbau (von aussen nach innen):
//   - Aussenrand Ø100, ~5 mm breit, bleibt auf voller Hoehe
//   - leichte Einbuchtung (Spielflaeche) innerhalb des Rands
//   - Ring aus 7 Figurenmulden (Sockel Ø20 wird REINGESTELLT, daher Ø22)
//   - Mitte: flache Mulde fuer ein rundes Etikett Ø37
//
// KEINE Magnete / keine Kopplung: Pucks werden lose zur Bahn ausgelegt.
// Beschriftung: KEINE Gravur. ID/Phasenfarbe via Etikett Ø37 in der Mitte.

/* [Puck] */
puck_d      = 100;   // Aussendurchmesser
puck_h      = 6;     // Gesamthoehe
edge_cham   = 1;     // Fase obere Aussenkante (Optik/Griff)

/* [Rand + Einbuchtung] */
rim_w       = 5;     // Randbreite (bleibt auf voller Hoehe)
recess_dep  = 1.2;   // Tiefe der Einbuchtung (Spielflaeche)

/* [Figurenplaetze] — Sockel Ø20 wird reingestellt */
spot_count  = 7;     // Anzahl Standmulden im Ring
spot_d      = 22;    // Mulden-Ø (Sockel Ø20 + Luft -> reinstellbar)
spot_dep    = 1.5;   // Tiefe der Standmulde (zusaetzlich zur Einbuchtung)
spot_ring_r = 33;    // Radius des Mulden-Kreises (Mitte-Mitte)
spot_lead   = 0.8;   // Einfuehr-Fase oben an der Mulde

/* [Etikettenmulde Mitte] — rundes Etikett Ø37 */
label_d     = 37.5;  // Mulden-Ø (Etikett Ø37 + 0,5 Spiel); Puck-Rand bleibt sichtbar
label_dep   = 0.3;   // flach: Etikett sitzt plan + kantengeschuetzt

$fn = 96;

// abgeleitet
play_d    = puck_d - 2*rim_w;       // Spielflaeche Ø90
play_z    = puck_h - recess_dep;    // Hoehe der eingebuchteten Spielflaeche (4.8)

// --- Grundkoerper mit gefaster Oberkante ------------------------------------
module puck_blank() {
    hull() {
        cylinder(d = puck_d - 2*edge_cham, h = puck_h);
        cylinder(d = puck_d, h = puck_h - edge_cham);
    }
}

// --- eine Figurenmulde mit Einfuehr-Fase ------------------------------------
module figure_spot() {
    z0 = play_z - spot_dep;
    union() {
        translate([0, 0, z0]) cylinder(d = spot_d, h = spot_dep + 0.1);
        translate([0, 0, play_z - spot_lead])
            cylinder(d1 = spot_d, d2 = spot_d + 2*spot_lead, h = spot_lead + 0.1);
    }
}

module puck() {
    difference() {
        puck_blank();
        // Einbuchtung / Spielflaeche
        translate([0, 0, play_z]) cylinder(d = play_d, h = recess_dep + 0.1);
        // 7 Figurenmulden im Ring
        for (i = [0 : spot_count - 1]) {
            a = 360/spot_count * i;
            translate([spot_ring_r*cos(a), spot_ring_r*sin(a), 0]) figure_spot();
        }
        // Etikettenmulde Mitte
        translate([0, 0, play_z - label_dep]) cylinder(d = label_d, h = label_dep + 0.1);
    }
}

puck();

echo(puck_d = puck_d, puck_h = puck_h, spielflaeche = play_d,
     figurenplaetze = spot_count, spot_d = spot_d, etikett_mulde = label_d);
