update 01.06.2026

This commit is contained in:
breitenbach76 2026-06-01 14:19:10 +02:00
parent 7f1a09572e
commit 1af051990f
21 changed files with 1365 additions and 380 deletions

View file

@ -1,77 +1,98 @@
// Aktiv-Feld RACI-Stecklochleiste
// Aktiv-Feld RACI-Fläche (Figuren werden GESTELLT, nicht gesteckt)
// SLC-Workshop Tabletop · Einheiten: mm
// Steht NEBEN dem Action-Stein. Bei jeder Aktivitaet werden die beteiligten
// Rollen-Figuren nach RACI in die passende Zone gesteckt:
// R = Responsible · A = Accountable (genau 1) · C = Consulted · I = Informed
// Anpassen und mit OpenSCAD nach STL exportieren (F6 -> Export).
// Eine flache Platte mit 4 abgetrennten Bereichen R · A · C · I (gleich gross).
// 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).
/* [Leiste] */
strip_w = 26; // Tiefe (zum Spieler)
strip_h = 6; // Dicke
corner_r = 3;
/* [Platte] */
plate_thick = 5; // Dicke der Flaeche
corner_r = 4;
plate_margin = 5; // Rand aussen
/* [Steckplaetze] */
pin_hole_d = 4.2; // Loch fuer Figuren-Pin (Pin Oe 4,0 + Spiel)
pin_hole_depth = 4;
pin_pitch = 8; // Mitte-zu-Mitte innerhalb einer Zone
zone_gap = 10; // Luecke zwischen den Zonen
end_margin = 8; // Rand links/rechts
socket_y = 5; // Lochreihe nach hinten versetzt (weg von der Beschriftung)
/* [Standflaechen] (flache Markierung, kein Loch) */
spot_d = 8; // Durchmesser
spot_depth = 0.5; // Gravurtiefe
spot_pitch = 9; // Mitte-zu-Mitte im Raster (R/C/I)
grid_cols = 2; // Raster fuer R/C/I: 2 x 2 = 4 Standflaechen
grid_rows = 2;
a_spot_d = 11; // A: EIN groesseres zentrales Standfeld (genau 1 Figur)
/* [Beschriftung] */
label_size = 7; // Buchstabengroesse
label_depth = 0.8; // Gravurtiefe
label_y = -8; // Position der Buchstaben (vorne, zum Spieler)
/* [Bereiche / Zonen] — [Label, cols, rows]; A = 1x1 (goldene RACI-Regel) */
zones = [["R", 2, 2], ["A", 1, 1], ["C", 2, 2], ["I", 2, 2]];
cell_pad = 6; // Rand um die Standflaechen im Feld
label_h = 9; // Platz fuer den Buchstaben unten im Feld
zone_gap = 6; // Abstand zwischen den Feldern
/* [Zonen] */
// [Label, Anzahl Steckplaetze] A bewusst nur 1 (genau eine Rolle accountable)
zones = [ ["R", 2], ["A", 1], ["C", 3], ["I", 3] ];
/* [Gravur] */
frame_w = 1.2; // Strichstaerke der Feld-Umrandung
frame_depth = 0.6;
label_size = 7;
label_depth = 0.8;
$fn = 48;
// --- Hilfsfunktionen -------------------------------------------------------
function zone_span(c) = (c - 1) * pin_pitch;
// --- abgeleitete Maße -------------------------------------------------------
spots_span_x = (grid_cols - 1) * spot_pitch;
spots_span_y = (grid_rows - 1) * spot_pitch;
cell_w = spots_span_x + 2 * cell_pad; // 21
cell_h = spots_span_y + 2 * cell_pad + label_h; // 30
plate_w = len(zones) * cell_w + (len(zones) - 1) * zone_gap + 2 * plate_margin;
plate_h = cell_h + 2 * plate_margin;
function sumspan(i = 0) =
i >= len(zones) ? 0 : zone_span(zones[i][1]) + sumspan(i + 1);
function zone_cx(i) =
-plate_w/2 + plate_margin + cell_w/2 + i * (cell_w + zone_gap);
function total_len() =
end_margin * 2 + zone_gap * (len(zones) - 1) + sumspan();
// linker Startversatz der Zone idx (Summe vorheriger Zonen + Luecken)
function zone_offset(idx, i = 0, acc = 0) =
i >= idx ? acc
: zone_offset(idx, i + 1, acc + zone_span(zones[i][1]) + zone_gap);
// --- Geometrie -------------------------------------------------------------
module rounded_rect(l, w, h, r) {
linear_extrude(h)
offset(r) offset(-r)
square([l, w], center = true);
// --- Geometrie --------------------------------------------------------------
module rrect(l, w, h, r) {
linear_extrude(h) offset(r) offset(-r) square([l, w], center = true);
}
module raci_strip() {
L = total_len();
module field_frame(cx) {
// eingravierte Umrandung -> grenzt den Bereich ab
translate([cx, 0, 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(i) {
cx = zone_cx(i);
lab = zones[i][0];
nc = zones[i][1];
nr = zones[i][2];
if (lab == "A") {
// genau EIN zentrales Standfeld (goldene RACI-Regel)
translate([cx, label_h/2, plate_thick - spot_depth])
cylinder(d = a_spot_d, h = spot_depth + 0.1);
} else {
for (c = [0 : nc - 1])
for (r = [0 : nr - 1]) {
sx = cx + (c - (nc - 1)/2) * spot_pitch;
sy = label_h/2 + ((nr - 1)/2 - r) * spot_pitch;
translate([sx, sy, plate_thick - spot_depth])
cylinder(d = spot_d, h = spot_depth + 0.1);
}
}
// Buchstabe unten im Feld
translate([cx, -cell_h/2 + label_h/2, plate_thick - label_depth])
linear_extrude(label_depth + 0.1)
text(lab, size = label_size, halign = "center", valign = "center");
}
module aktiv_feld() {
difference() {
rounded_rect(L, strip_w, strip_h, corner_r);
for (idx = [0 : len(zones) - 1]) {
cnt = zones[idx][1];
sx = -L/2 + end_margin + zone_offset(idx);
// Steckplaetze der Zone
for (i = [0 : cnt - 1])
translate([sx + i * pin_pitch, socket_y, strip_h - pin_hole_depth])
cylinder(d = pin_hole_d, h = pin_hole_depth + 0.1);
// Zonen-Beschriftung (mittig unter den Loechern)
cx = sx + zone_span(cnt) / 2;
translate([cx, label_y, strip_h - label_depth])
linear_extrude(label_depth + 0.1)
text(zones[idx][0], size = label_size,
halign = "center", valign = "center");
rrect(plate_w, plate_h, plate_thick, corner_r);
for (i = [0 : len(zones) - 1]) {
field_frame(zone_cx(i));
zone_marks(i);
}
}
}
raci_strip();
aktiv_feld();
// Maße zur Info (Konsole): echo(plate_w, plate_h, plate_thick);
echo(plate_w = plate_w, plate_h = plate_h, plate_thick = plate_thick);