// Aktiv-Feld — RACI-Flaeche (Figuren werden GESTELLT, nicht gesteckt)
// SLC-Workshop Tabletop · Einheiten: mm
// QUADRATISCHES 2x2-Zonenraster (wie die klassische RACI-Matrix):
//        R | A
//        --+--
//        C | I
// R/C/I haben je 4 Standflaechen (2x2). A hat GENAU EIN zentrales Standfeld
// (goldene RACI-Regel: genau eine Rolle ist Accountable).
// Standflaechen sind nur flache Gravur-Markierungen (keine Loecher).

/* [Platte] */
plate_thick  = 6;    // Dicke der Flaeche
corner_r     = 5;
plate_margin = 6;    // Rand aussen

/* [Standflaechen] (flache Markierung, kein Loch) — passend zum Sockel Ø20 */
spot_d     = 22;     // Durchmesser wie die Puck-Mulden (gleiche Ø20-Figuren stehen hier)
spot_depth = 0.6;    // Gravurtiefe
spot_pitch = 30;     // Mitte-zu-Mitte (mehr Luft zwischen den Standfeldern: ~8 mm)
a_spot_d   = spot_d; // A: GLEICHE Groesse wie die anderen — nur die Anzahl (genau 1) zaehlt

/* [Zonen] — [Label, cols, rows, gridX, gridY]; gridY 0 = oben */
zones    = [["R", 2, 2, 0, 0], ["A", 1, 1, 1, 0],
            ["C", 2, 2, 0, 1], ["I", 2, 2, 1, 1]];
n_cols   = 2;
n_rows   = 2;
cell_pad = 13;       // Rand um die Standflaechen im Feld
zone_gap = 6;        // Abstand zwischen den Feldern (dichter beieinander)

/* [Gravur] */
frame_w     = 1.5;   // Strichstaerke der Feld-Umrandung
frame_depth = 0.6;
label_size  = 8;     // Buchstabe sitzt in der Mittenluecke zwischen den 4 Feldern
label_depth = 0.8;

$fn = 48;

// --- abgeleitete Maße -------------------------------------------------------
// QUADRATISCHE Zellen (Buchstabe in der Mittenluecke, kein Extra-Streifen).
spots_span = (2 - 1) * spot_pitch;                 // 30 (2x2-Raster)
cell_w = spots_span + 2 * cell_pad;                // 56
cell_h = cell_w;                                   // 56 -> Platte wird quadratisch

plate_w = n_cols * cell_w + (n_cols - 1) * zone_gap + 2 * plate_margin;  // 130
plate_h = n_rows * cell_h + (n_rows - 1) * zone_gap + 2 * plate_margin;  // 130

function zone_cx(gx) =
    -plate_w/2 + plate_margin + cell_w/2 + gx * (cell_w + zone_gap);
function zone_cy(gy) =
     plate_h/2 - plate_margin - cell_h/2 - gy * (cell_h + zone_gap);

// --- Geometrie --------------------------------------------------------------
module rrect(l, w, h, r) {
    linear_extrude(h) offset(r) offset(-r) square([l, w], center = true);
}

module field_frame(cx, cy) {
    // eingravierte Umrandung -> grenzt den Bereich ab
    translate([cx, cy, plate_thick - frame_depth])
        linear_extrude(frame_depth + 0.1)
            difference() {
                square([cell_w, cell_h], center = true);
                square([cell_w - 2*frame_w, cell_h - 2*frame_w], center = true);
            }
}

module zone_marks(z) {
    lab = z[0]; nc = z[1]; nr = z[2];
    cx  = zone_cx(z[3]); cy = zone_cy(z[4]);
    if (lab == "A") {
        // genau EIN Standfeld in der Rasterposition RECHTS OBEN; Buchstabe mittig (wie R/C/I)
        translate([cx + spot_pitch/2, cy + spot_pitch/2, plate_thick - spot_depth])
            cylinder(d = a_spot_d, h = spot_depth + 0.1);
    } else {
        // 2x2 Standfelder zentriert
        for (c = [0 : nc - 1])
            for (r = [0 : nr - 1]) {
                sx = cx + (c - (nc - 1)/2) * spot_pitch;
                sy = cy + ((nr - 1)/2 - r) * spot_pitch;
                translate([sx, sy, plate_thick - spot_depth])
                    cylinder(d = spot_d, h = spot_depth + 0.1);
            }
    }
    // Buchstabe in der Mittenluecke (alle Zonen gleich)
    translate([cx, cy, plate_thick - label_depth])
        linear_extrude(label_depth + 0.1)
            text(lab, size = label_size, halign = "center", valign = "center");
}

module aktiv_feld() {
    difference() {
        rrect(plate_w, plate_h, plate_thick, corner_r);
        for (i = [0 : len(zones) - 1]) {
            z = zones[i];
            field_frame(zone_cx(z[3]), zone_cy(z[4]));
            zone_marks(z);
        }
    }
}

aktiv_feld();

echo(plate_w = plate_w, plate_h = plate_h, plate_thick = plate_thick);
