Tile-Redesign: runder Puck statt eckigem Tile + Scheibe
- Neues puck.scad: Ø100, Rand 5mm + Einbuchtung, 7 Figurenmulden Ø22, Etikettenmulde Ø37,5 (Rundetikett Ø37). EIN Modell fuer die ganze Bahn (Station=Phasenfarbe, Gate=rot; Unterschied nur Filament + Etikett). - Entfernt: aktivitaets-tile, aktivitaets-plaque, gate-tile, gate-tor. Gate-Karte gestrichen (Logik via App + Entscheidungs-Chips). - Materialliste + READMEs (3d-druck, openscad) auf Puck-System umgestellt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
f122865b43
commit
efdd0e84c0
8 changed files with 224 additions and 376 deletions
|
|
@ -6,24 +6,49 @@ Parametrische Quellmodelle der Schlüsselteile. In [OpenSCAD](https://openscad.o
|
|||
|
||||
| Datei | Bauteil |
|
||||
|-------|---------|
|
||||
| `aktivitaets-tile.scad` | Phasen-Basistile (100×100, Verankerung Ø60, Puzzle-Tabs) |
|
||||
| `aktivitaets-plaque.scad` | Blanko-Scheibe (Ø60) für 60-mm-Rundaufkleber — keine Gravur |
|
||||
| `action-stein.scad` | Szenario-Träger mit Kartenschlitz + M8-Gewichtsaussparung |
|
||||
| `gate-tor.scad` | Gate-Tor (Bogen) mit Kartenschlitz + 2 Stecksockel-Zapfen |
|
||||
| `gate-tile.scad` | Gate-Tile (100×100, eigene Farbe): 8 Standfelder, Gate-Stecksockel, Entscheidungs-Icon |
|
||||
| `puck.scad` | **Station-/Gate-Puck** (Ø100, Rand + Einbuchtung, 7 Figurenmulden Ø22, Etikettenmulde Ø37,5) |
|
||||
| `action-stein.scad` | Szenario-Träger mit Kartenschlitz + M8-Gewichtsaussparung (Fuß bleibt **außerhalb** des Pucks) |
|
||||
| `aktiv-feld.scad` | RACI-Fläche (R · A · C · I) — bleibt als separates mobiles Board |
|
||||
|
||||
## Serienfertigung der Scheiben
|
||||
## Ein Puck für die ganze Bahn
|
||||
|
||||
`aktivitaets-plaque.scad` ist **blanko** — alle **37 Scheiben sind identisch**
|
||||
(einmal rendern, 37× drucken). Kein Text-Override, keine Serien-STLs mehr nötig.
|
||||
`puck.scad` ist **das einzige Bahn-Teil**. Station- und Gate-Puck sind **geometrisch
|
||||
identisch** — der Unterschied ist nur:
|
||||
|
||||
Die Beschriftung läuft über **60-mm-Rundaufkleber**: Ein kleines Skript liest die
|
||||
`service-lifecycle_*.yaml` und erzeugt einen **Aufkleberbogen** (ID + Kurzbezeichnung,
|
||||
Phasenfarbe) als PDF — analog zur Kartengenerierung. Vorteil: wiederverwendbar,
|
||||
korrigierbar, mehrsprachig.
|
||||
- **Filamentfarbe:** Station = Phasenfarbe (blau/orange/grün/teal/lila), Gate = **Rot**.
|
||||
- **Etikett:** Station = ID (`op_05`), Gate = `G1` / `G2` / `G3` + Entscheidungs-Icon.
|
||||
|
||||
→ **Einmal slicen, 40× drucken** (37 Phasen-Pucks + 3 Gate-Pucks). Keine Serien-STLs,
|
||||
keine Gravur, keine separaten Aktivitäts-Scheiben mehr.
|
||||
|
||||
## Beschriftung: Rundetiketten Ø37
|
||||
|
||||
Die Beschriftung läuft über **runde Etiketten Ø37** in der Mittenmulde (Ø37,5) —
|
||||
der Puck-Rand bleibt rundherum sichtbar:
|
||||
|
||||
- **Ablösbar bevorzugt** (korrigierbar/wiederverwendbar); Folie für mehr Abrieb.
|
||||
- **Hinweis:** Ø37 ist kein Avery-Standardmaß (Avery rund = 30/40). Bezugsquelle vor
|
||||
Kauf prüfen — ggf. anderer Hersteller oder selbst per Print-&-Cut schneiden.
|
||||
|
||||
Ein kleines Skript liest die `service-lifecycle_*.yaml` und erzeugt einen
|
||||
**Etikettenbogen** (ID + Phasenfarbe) — analog zur Kartengenerierung.
|
||||
Vorteil: wiederverwendbar, korrigierbar, mehrsprachig; die Pucks bleiben blanko.
|
||||
|
||||
## Ersetzte Modelle (entfernt)
|
||||
|
||||
Mit dem Wechsel auf den Puck sind weggefallen:
|
||||
`aktivitaets-tile.scad` (eckiges Tile), `aktivitaets-plaque.scad` (Ø60-Scheibe),
|
||||
`gate-tile.scad` (eckiges Gate-Tile) und `gate-tor.scad` (Torbogen + Gate-Karte).
|
||||
Begründung: Der Ø100-Puck vereint Station-Markierung, Figuren-Standorte und
|
||||
Beschriftung in **einem** Teil; die Gate-Karte ist durch App + Entscheidungs-Chips
|
||||
abgedeckt. (Historie in der Git-Geschichte.)
|
||||
|
||||
## Hinweise
|
||||
|
||||
- Gravur-Text bewusst kurz halten; lange Kurzbeschreibungen ggf. auf Label auslagern.
|
||||
- Umlaute in Gravuren je nach Font kritisch — im Zweifel `ae/oe/ue` verwenden (so in den Vorlagen).
|
||||
- Vor Serienstart **ein** Tile + Plättchen + Stein als Passungs-Funktionsmuster drucken.
|
||||
- **Figuren werden reingestellt:** Mulden Ø22 für Sockel Ø20, Tiefe 1,5 mm mit
|
||||
Einführ-Fase. 7 Mulden im Ring (r 33) — Abstand der Mulden ~6,6 mm.
|
||||
- **Etikettenmulde Ø37,5 × 0,3 mm** flach — Etikett sitzt plan, Rand schützt die
|
||||
Kante vorm Abpellen, Puck-Rand bleibt sichtbar (~3,3 mm zu den Figurenmulden).
|
||||
Maximal möglich wäre Ø40.
|
||||
- Vor Serienstart **ein** Puck + Figur + Etikett als Passungs-Funktionsmuster drucken
|
||||
(Sockel↔Mulde, Etikett↔Mulde).
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
// Aktivitaets-Scheibe — BLANKO Rundscheibe fuer 60-mm-Rundaufkleber
|
||||
// SLC-Workshop Tabletop · Einheiten: mm
|
||||
// Keine Gravur mehr: ID + Kurzbezeichnung kommen als 60-mm-Rundaufkleber auf die
|
||||
// plane Oberseite. Vorteil: wiederverwendbar (neu bekleben), mehrsprachig,
|
||||
// keine Serien-STLs noetig — alle 37 Scheiben sind identisch.
|
||||
|
||||
/* [Scheibe] */
|
||||
disc_d = 60; // Durchmesser (Verankerung 60 - Passung); passt zum 60-mm-Aufkleber
|
||||
disc_h = 4; // Dicke
|
||||
chamfer = 1; // Fase als Griffhilfe (oben + unten). Aufkleber Ø58 sitzt plan,
|
||||
// Ø60 ueberdeckt die obere Fase leicht.
|
||||
$fn = 96;
|
||||
|
||||
module disc_body() {
|
||||
// Scheibe mit beidseitiger Fase, plane Oberseite fuer den Aufkleber
|
||||
hull() {
|
||||
cylinder(d = disc_d - 2*chamfer, h = 0.01);
|
||||
translate([0,0,chamfer]) cylinder(d = disc_d, h = disc_h - 2*chamfer);
|
||||
translate([0,0,disc_h-0.01]) cylinder(d = disc_d - 2*chamfer, h = 0.01);
|
||||
}
|
||||
}
|
||||
|
||||
disc_body();
|
||||
|
|
@ -1,52 +0,0 @@
|
|||
// Phasen-Basistile mit zentraler Verankerung und Puzzle-Tabs
|
||||
// SLC-Workshop Tabletop · Einheiten: mm
|
||||
// Anpassen und mit OpenSCAD nach STL exportieren (F6 -> Export).
|
||||
|
||||
/* [Tile] */
|
||||
tile_size = 100; // Kantenlaenge
|
||||
tile_height = 6; // Dicke
|
||||
corner_r = 3; // Eckenradius
|
||||
|
||||
/* [Verankerung / Sockel] */
|
||||
socket_d = 60; // Durchmesser Vertiefung (nimmt Blanko-Scheibe Ø60 oder Action-Stein-Fuss auf)
|
||||
socket_depth = 4; // Tiefe
|
||||
fit_clear = 0.4; // Spielpassung
|
||||
|
||||
/* [Puzzle-Tabs] */
|
||||
tab_w = 12; // Breite
|
||||
tab_d = 6; // Tiefe (Ueberstand / Aussparung)
|
||||
tab_h = tile_height;
|
||||
$fn = 64;
|
||||
|
||||
module rounded_square(s, r, h) {
|
||||
linear_extrude(h)
|
||||
offset(r) offset(-r)
|
||||
square([s, s], center=true);
|
||||
}
|
||||
|
||||
module tab(positive=true) {
|
||||
// Tab ragt heraus (positive) oder wird ausgespart (negative)
|
||||
d = positive ? tab_d : tab_d + fit_clear;
|
||||
w = positive ? tab_w : tab_w + fit_clear;
|
||||
translate([0, 0, tab_h/2])
|
||||
cube([w, d*2, tab_h], center=true);
|
||||
}
|
||||
|
||||
module tile() {
|
||||
difference() {
|
||||
union() {
|
||||
rounded_square(tile_size, corner_r, tile_height);
|
||||
// Tabs an Nord- und Ost-Kante (positive)
|
||||
translate([0, tile_size/2, 0]) tab(true);
|
||||
translate([ tile_size/2, 0, 0]) rotate([0,0,90]) tab(true);
|
||||
}
|
||||
// Verankerung
|
||||
translate([0, 0, tile_height - socket_depth])
|
||||
cylinder(d = socket_d + fit_clear, h = socket_depth + 0.1);
|
||||
// Slots an Sued- und West-Kante (negative)
|
||||
translate([0, -tile_size/2, 0]) tab(false);
|
||||
translate([-tile_size/2, 0, 0]) rotate([0,0,90]) tab(false);
|
||||
}
|
||||
}
|
||||
|
||||
tile();
|
||||
|
|
@ -1,106 +0,0 @@
|
|||
// Gate-Tile — Gate-Position mit Figuren-Standfeldern + Entscheidungs-Icon
|
||||
// SLC-Workshop Tabletop · Einheiten: mm
|
||||
// Identische Außenmaße wie das Aktivitaets-Tile (100x100x6), aber EIGENE FARBE.
|
||||
// - 8 generische Standfelder (Ring) fuer die Figuren (Sockel Ø20)
|
||||
// - 2 Stecksockel: das Gate-Tor steckt mit 2 Zapfen ein
|
||||
// - Mitte: eingraviertes "Entscheidung"-Icon (3 Pfeile + Fragezeichen) — sonst KEINE Beschriftung
|
||||
// 3 Stueck: Gate 1, 2, 3 (Modell identisch; Unterschied nur Position/Karte).
|
||||
|
||||
/* [Tile] */
|
||||
tile_size = 100;
|
||||
tile_height = 6;
|
||||
corner_r = 3;
|
||||
|
||||
/* [Puzzle-Tabs] (wie Aktivitaets-Tile) */
|
||||
tab_w = 12;
|
||||
tab_d = 6;
|
||||
fit_clear = 0.4;
|
||||
|
||||
/* [Standfelder] — 8 Figuren (Sockel Ø20), generisch */
|
||||
spot_count = 8;
|
||||
ring_d = 62; // Kreisdurchmesser fuer die 8 Standfelder
|
||||
spot_d = 18; // Markierung (etwas < Sockel Ø20)
|
||||
spot_depth = 0.6;
|
||||
|
||||
/* [Gate-Stecksockel] — Gate-Tor steckt mit 2 Zapfen ein */
|
||||
gate_peg_d = 10.4; // Loch (Zapfen Ø10 + Passung)
|
||||
gate_peg_depth = 5;
|
||||
gate_peg_dx = 40; // halber Abstand (= Gate-Pfostenmitte)
|
||||
gate_peg_y = -tile_size/2 + 12; // nahe Eingangskante (Sued)
|
||||
|
||||
/* [Entscheidungs-Icon (Gravur Mitte)] */
|
||||
icon_depth = 0.6;
|
||||
|
||||
$fn = 64;
|
||||
|
||||
// --- Geometrie-Helfer -------------------------------------------------------
|
||||
module rounded_square(s, r, h) {
|
||||
linear_extrude(h) offset(r) offset(-r) square([s, s], center = true);
|
||||
}
|
||||
|
||||
module tab(positive = true) {
|
||||
d = positive ? tab_d : tab_d + fit_clear;
|
||||
w = positive ? tab_w : tab_w + fit_clear;
|
||||
translate([0, 0, tile_height/2]) cube([w, d*2, tile_height], center = true);
|
||||
}
|
||||
|
||||
module ring_spots() {
|
||||
for (i = [0 : spot_count - 1]) {
|
||||
a = 360/spot_count * i;
|
||||
translate([(ring_d/2)*cos(a), (ring_d/2)*sin(a), tile_height - spot_depth])
|
||||
cylinder(d = spot_d, h = spot_depth + 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
module gate_pegs() {
|
||||
for (x = [-1, 1])
|
||||
translate([x*gate_peg_dx, gate_peg_y, tile_height - gate_peg_depth])
|
||||
cylinder(d = gate_peg_d, h = gate_peg_depth + 0.1);
|
||||
}
|
||||
|
||||
// --- Entscheidungs-Icon: offener Ring + Fragezeichen + 3 Pfeile nach oben ----
|
||||
module arrow2d(ang, len, shaft_w = 1.8, head = 4) {
|
||||
rotate(ang) union() {
|
||||
translate([-shaft_w/2, 0]) square([shaft_w, len]);
|
||||
translate([0, len]) polygon([[-head/2, 0], [head/2, 0], [0, head]]);
|
||||
}
|
||||
}
|
||||
|
||||
module decision_icon() {
|
||||
// offener Ring (oben aufgeschnitten, damit die Pfeile austreten)
|
||||
difference() {
|
||||
circle(r = 12);
|
||||
circle(r = 9.5);
|
||||
translate([-7, 3]) square([14, 14]);
|
||||
}
|
||||
// Fragezeichen im Ring
|
||||
translate([0, -4]) text("?", size = 9, halign = "center", valign = "center");
|
||||
// drei Pfeile faechern nach oben (links / hoch / rechts)
|
||||
translate([0, 3]) {
|
||||
arrow2d(0, 9);
|
||||
arrow2d(38, 8);
|
||||
arrow2d(-38, 8);
|
||||
}
|
||||
}
|
||||
|
||||
// --- Tile ------------------------------------------------------------------
|
||||
module gate_tile() {
|
||||
difference() {
|
||||
union() {
|
||||
rounded_square(tile_size, corner_r, tile_height);
|
||||
translate([0, tile_size/2, 0]) tab(true); // Nord-Tab
|
||||
translate([ tile_size/2, 0, 0]) rotate([0,0,90]) tab(true); // Ost-Tab
|
||||
}
|
||||
// Slots Sued + West (Anschluss an die Bahn)
|
||||
translate([0, -tile_size/2, 0]) tab(false);
|
||||
translate([-tile_size/2, 0, 0]) rotate([0,0,90]) tab(false);
|
||||
// Standfelder + Gate-Stecksockel + Icon (alle als Gravur/Loch)
|
||||
ring_spots();
|
||||
gate_pegs();
|
||||
translate([0, 0, tile_height - icon_depth])
|
||||
linear_extrude(icon_depth + 0.1) decision_icon();
|
||||
}
|
||||
}
|
||||
|
||||
gate_tile();
|
||||
echo(tile_size = tile_size, standfelder = spot_count, ring_d = ring_d);
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
// Gate-Tor — Bogen, steckt mit 2 Zapfen in ein Gate-Tile (keine eigenen Fuesse)
|
||||
// SLC-Workshop Tabletop · Einheiten: mm
|
||||
// Die Figuren stehen auf dem GATE-TILE (nicht am Tor). Das Tor traegt oben eine
|
||||
// Gate-Beschreibungskarte; keine feste Gravur.
|
||||
|
||||
/* [Tor] */
|
||||
opening_w = 68; // lichte Weite (Action-Stein Ø59 + 60-mm-Karte passt durch)
|
||||
opening_h = 100; // lichte Hoehe
|
||||
thick = 8; // Materialstaerke (Tiefe)
|
||||
post_w = 12; // Pfostenbreite
|
||||
top_h = 14; // Hoehe des Querbalkens
|
||||
|
||||
/* [Kartenschlitz oben] */
|
||||
card_w = 65; // Gate-Beschreibungskarte 60 mm + Spiel
|
||||
card_t = 3;
|
||||
card_depth = 10;
|
||||
|
||||
/* [Stecksockel-Zapfen] — stecken in die Gate-Tile-Loecher (Ø10,4) */
|
||||
tenon_d = 10;
|
||||
tenon_h = 5;
|
||||
tenon_dx = 40; // halber Abstand = Pfostenmitte (opening_w/2 + post_w/2)
|
||||
|
||||
$fn = 48;
|
||||
total_w = opening_w + 2*post_w; // 92 -> passt auf das 100er Gate-Tile
|
||||
|
||||
module arch() {
|
||||
difference() {
|
||||
translate([-total_w/2, 0, 0]) cube([total_w, thick, opening_h + top_h]);
|
||||
translate([-opening_w/2, -0.1, 0]) cube([opening_w, thick + 0.2, opening_h]);
|
||||
}
|
||||
}
|
||||
|
||||
module card_slot() {
|
||||
translate([-card_w/2, thick/2 - card_t/2, opening_h + top_h - card_depth])
|
||||
cube([card_w, card_t, card_depth + 0.1]);
|
||||
}
|
||||
|
||||
module tenons() {
|
||||
// 2 Zapfen unter den Pfosten -> stecken ins Gate-Tile
|
||||
for (x = [-1, 1])
|
||||
translate([x*tenon_dx, thick/2, -tenon_h])
|
||||
cylinder(d = tenon_d, h = tenon_h + 0.1);
|
||||
}
|
||||
|
||||
// Bogen inkl. Kartenschlitz
|
||||
difference() {
|
||||
arch();
|
||||
card_slot();
|
||||
}
|
||||
// Stecksockel-Zapfen
|
||||
tenons();
|
||||
|
||||
echo(total_w = total_w, opening_w = opening_w, tenon_dx = tenon_dx);
|
||||
81
01_3D-Druck/openscad/puck.scad
Normal file
81
01_3D-Druck/openscad/puck.scad
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
// 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 Avery-Etikett Ø40 (Art. 5080 abloesbar)
|
||||
//
|
||||
// Beschriftung: KEINE Gravur. ID + Phasenfarbe via Avery-Etikett Ø40 in der Mitte
|
||||
// (wiederverwendbar/korrigierbar). Modell bleibt dadurch fuer alle 40 identisch.
|
||||
|
||||
/* [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() {
|
||||
// Boden der Mulde liegt spot_dep unter der Spielflaeche
|
||||
z0 = play_z - spot_dep;
|
||||
union() {
|
||||
translate([0, 0, z0]) cylinder(d = spot_d, h = spot_dep + 0.1);
|
||||
// Fase als Einfuehrhilfe oben
|
||||
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, spielflaeche = play_d, figurenplaetze = spot_count,
|
||||
spot_d = spot_d, ring_r = spot_ring_r, etikett_mulde = label_d);
|
||||
Loading…
Add table
Add a link
Reference in a new issue