This commit is contained in:
breitenbach76 2026-05-28 15:50:08 +02:00
commit c87b0b1775
23 changed files with 2658 additions and 0 deletions

View file

@ -0,0 +1,35 @@
# 3D-Druck — Übersicht
Alles, was der 3D-Druck-Producer braucht, um die haptischen Spielelemente zu
fertigen. Großflächige Grafik (Aufdrucke, Beschriftungen) wird **nicht** gedruckt,
sondern als Aufkleber/Print-Layout aufgebracht — die 3D-Teile liefern Form,
Verankerung und Steckmechanik.
## Inhalt dieses Ordners
| Datei | Zweck |
|-------|-------|
| [`materialliste.md`](materialliste.md) | Alle Bauteile mit Maßen, Mengen, Material- und Druckempfehlung |
| [`visual-prompts_3d-producer.md`](visual-prompts_3d-producer.md) | Bild-Prompts als Orientierungs-Renderings für den Producer |
| [`board-layout.svg`](board-layout.svg) | Maßstäbliche Layout-Skizze des gesamten Boards (exakt 40 Tiles, Sequenz, Loop) |
| `board-layout.png` | PNG-Vorschau der Layout-Skizze |
| [`gen_board_layout.py`](gen_board_layout.py) | Generator-Skript für die Layout-Skizze (bei Änderungen erneut ausführen) |
| [`openscad/`](openscad/) | Parametrische Modelle (OpenSCAD) der Schlüsselteile zum direkten Slicen |
## Grundsätzliche Design-Entscheidungen
- **Modulares Tile-System** statt eines großen Boards — jedes Teil passt auf ein übliches Druckbett (≥ 200 × 200 mm).
- **Lineare Bahn** (kein Ring) — Tiles werden zu einer durchgehenden Linie aneinandergereiht, bei Platzmangel mäandrierend.
- **Eine standardisierte Verankerung** (Ø 50 mm Rundsockel) für *alle* Plättchen und für den Action-Stein → Teile sind austauschbar.
- **Steckverbindungen** (Puzzle-Tabs) zwischen Tiles, damit die Bahn stabil zusammenhält und flexibel gelegt werden kann.
- **Materialempfehlung:** PLA für Tiles/Plättchen/Gates (formstabil, günstig), PLA + Gewichtseinlage (M8-Mutter) für den Action-Stein (Standfestigkeit mit aufrechter Karte).
## Drucker-Annahmen
- Bauraum mind. 220 × 220 × 220 mm.
- Düse 0,4 mm, Schichthöhe 0,2 mm.
- Beschriftungen werden als **vertiefte Gravur** (negativ, 0,61,0 mm tief) modelliert, alternativ als aufgeklebtes Label.
> Alle Maße sind ein **Start-Spec** und vor der Serienfertigung an einem
> Funktionsmuster zu prüfen (insb. Passung Sockel↔Plättchen↔Stein und
> Kippstabilität des Steins mit Karte).

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

View file

@ -0,0 +1,310 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1936 816" font-family="Arial, Helvetica, sans-serif">
<rect x="0" y="0" width="1936" height="816" fill="#f7f7f5"/>
<defs><marker id="ah" markerWidth="9" markerHeight="9" refX="7" refY="3" orient="auto" markerUnits="strokeWidth"><path d="M0,0 L7,3 L0,6 Z" fill="#666"/></marker></defs>
<text x="30" y="44" font-size="26" font-weight="800" fill="#1a1a1a">Service-Lifecycle — Board-Layout (40 Tiles)</text>
<text x="30" y="68" font-size="14" fill="#555">37 Aktivitaeten + 3 Gates · 1 Tile = 100x100 mm · lineare Bahn, Sequenz links nach rechts</text>
<rect x="30" y="96" width="150" height="74" rx="9" fill="#2F80C9"/>
<text x="105.0" y="131.0" text-anchor="middle" font-size="17" font-weight="800" fill="#fff">DESIGN</text>
<text x="105.0" y="151.0" text-anchor="middle" font-size="12" fill="#fff">4 Tiles</text>
<circle cx="200" cy="133.0" r="9" fill="#f7f7f5"/>
<rect x="200" y="96" width="112" height="74" rx="9" fill="#e6eff8" stroke="#2F80C9" stroke-width="2"/>
<circle cx="312" cy="133.0" r="8" fill="#2F80C9"/>
<circle cx="218" cy="114" r="7" fill="none" stroke="#2F80C9" stroke-width="1.5"/>
<text x="256.0" y="126" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">ds_01</text>
<text x="256.0" y="148" text-anchor="middle" font-size="10" fill="#333">Eigenschaften definieren</text>
<line x1="320" y1="133.0" x2="326" y2="133.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="328" cy="133.0" r="9" fill="#f7f7f5"/>
<rect x="328" y="96" width="112" height="74" rx="9" fill="#e6eff8" stroke="#2F80C9" stroke-width="2"/>
<circle cx="440" cy="133.0" r="8" fill="#2F80C9"/>
<circle cx="346" cy="114" r="7" fill="none" stroke="#2F80C9" stroke-width="1.5"/>
<text x="384.0" y="126" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">ds_02</text>
<text x="384.0" y="148" text-anchor="middle" font-size="10" fill="#333">Komponenten designen</text>
<line x1="448" y1="133.0" x2="454" y2="133.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="456" cy="133.0" r="9" fill="#f7f7f5"/>
<rect x="456" y="96" width="112" height="74" rx="9" fill="#e6eff8" stroke="#2F80C9" stroke-width="2"/>
<circle cx="568" cy="133.0" r="8" fill="#2F80C9"/>
<circle cx="474" cy="114" r="7" fill="none" stroke="#2F80C9" stroke-width="1.5"/>
<text x="512.0" y="126" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">ds_03</text>
<text x="512.0" y="148" text-anchor="middle" font-size="10" fill="#333">Vorgehen beschreiben</text>
<line x1="576" y1="133.0" x2="582" y2="133.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="584" cy="133.0" r="9" fill="#f7f7f5"/>
<rect x="584" y="96" width="112" height="74" rx="9" fill="#e6eff8" stroke="#2F80C9" stroke-width="2"/>
<circle cx="696" cy="133.0" r="8" fill="#2F80C9"/>
<circle cx="602" cy="114" r="7" fill="none" stroke="#2F80C9" stroke-width="1.5"/>
<text x="640.0" y="126" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">ds_04</text>
<text x="640.0" y="148" text-anchor="middle" font-size="10" fill="#333">Implementierung vorbereiten</text>
<path d="M 640.0 170 V 193.0 H 256.0 V 214" fill="none" stroke="#999" stroke-width="2.2" stroke-dasharray="5 4" marker-end="url(#ah)"/>
<rect x="30" y="216" width="150" height="74" rx="9" fill="#E8893B"/>
<text x="105.0" y="251.0" text-anchor="middle" font-size="17" font-weight="800" fill="#fff">TRANSITION</text>
<text x="105.0" y="271.0" text-anchor="middle" font-size="12" fill="#fff">12 Tiles</text>
<circle cx="200" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="200" y="216" width="112" height="74" rx="9" fill="#E8893B" stroke="#E8893B" stroke-width="3"/>
<circle cx="312" cy="253.0" r="8" fill="#E8893B"/>
<path d="M 244.0 248 V 234 A 12 12 0 0 1 268.0 234 V 248" fill="none" stroke="#ffffff" stroke-width="3"/>
<text x="256.0" y="268" text-anchor="middle" font-size="14" font-weight="700" fill="#ffffff">tr_01</text>
<text x="256.0" y="283" text-anchor="middle" font-size="10.5" fill="#ffffff">Entw. / Konfig.?</text>
<line x1="320" y1="253.0" x2="326" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="328" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="328" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="440" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="346" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="384.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_02</text>
<text x="384.0" y="268" text-anchor="middle" font-size="10" fill="#333">Entwicklung koordinieren</text>
<line x1="448" y1="253.0" x2="454" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="456" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="456" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="568" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="474" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="512.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_03</text>
<text x="512.0" y="268" text-anchor="middle" font-size="10" fill="#333">Anwendungen entwickeln</text>
<line x1="576" y1="253.0" x2="582" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="584" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="584" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="696" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="602" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="640.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_04</text>
<text x="640.0" y="268" text-anchor="middle" font-size="10" fill="#333">Komponenten annehmen</text>
<line x1="704" y1="253.0" x2="710" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="712" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="712" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="824" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="730" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="768.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_05</text>
<text x="768.0" y="268" text-anchor="middle" font-size="10" fill="#333">Komponenten konfigurieren</text>
<line x1="832" y1="253.0" x2="838" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="840" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="840" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="952" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="858" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="896.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_06</text>
<text x="896.0" y="268" text-anchor="middle" font-size="10" fill="#333">Betriebsdoku erstellen</text>
<line x1="960" y1="253.0" x2="966" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="968" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="968" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="1080" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="986" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="1024.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_07</text>
<text x="1024.0" y="268" text-anchor="middle" font-size="10" fill="#333">Komponenten testen</text>
<line x1="1088" y1="253.0" x2="1094" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1096" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="1096" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="1208" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="1114" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="1152.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_08</text>
<text x="1152.0" y="268" text-anchor="middle" font-size="10" fill="#333">Formale Uebergabe</text>
<line x1="1216" y1="253.0" x2="1222" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1224" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="1224" y="216" width="112" height="74" rx="9" fill="#E8893B" stroke="#E8893B" stroke-width="3"/>
<circle cx="1336" cy="253.0" r="8" fill="#E8893B"/>
<path d="M 1268.0 248 V 234 A 12 12 0 0 1 1292.0 234 V 248" fill="none" stroke="#ffffff" stroke-width="3"/>
<text x="1280.0" y="268" text-anchor="middle" font-size="14" font-weight="700" fill="#ffffff">tr_09</text>
<text x="1280.0" y="283" text-anchor="middle" font-size="10.5" fill="#ffffff">Entry-Pruefung</text>
<line x1="1344" y1="253.0" x2="1350" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1352" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="1352" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="1464" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="1370" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="1408.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_10</text>
<text x="1408.0" y="268" text-anchor="middle" font-size="10" fill="#333">Ausrollen</text>
<line x1="1472" y1="253.0" x2="1478" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1480" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="1480" y="216" width="112" height="74" rx="9" fill="#fcf0e7" stroke="#E8893B" stroke-width="2"/>
<circle cx="1592" cy="253.0" r="8" fill="#E8893B"/>
<circle cx="1498" cy="234" r="7" fill="none" stroke="#E8893B" stroke-width="1.5"/>
<text x="1536.0" y="246" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">tr_11</text>
<text x="1536.0" y="268" text-anchor="middle" font-size="10" fill="#333">Aktivierung vorbereiten</text>
<line x1="1600" y1="253.0" x2="1606" y2="253.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1608" cy="253.0" r="9" fill="#f7f7f5"/>
<rect x="1608" y="216" width="112" height="74" rx="9" fill="#E8893B" stroke="#E8893B" stroke-width="3"/>
<circle cx="1720" cy="253.0" r="8" fill="#E8893B"/>
<path d="M 1652.0 248 V 234 A 12 12 0 0 1 1676.0 234 V 248" fill="none" stroke="#ffffff" stroke-width="3"/>
<text x="1664.0" y="268" text-anchor="middle" font-size="14" font-weight="700" fill="#ffffff">tr_12</text>
<text x="1664.0" y="283" text-anchor="middle" font-size="10.5" fill="#ffffff">Go-Live-Freigabe</text>
<path d="M 1664.0 290 V 313.0 H 256.0 V 334" fill="none" stroke="#999" stroke-width="2.2" stroke-dasharray="5 4" marker-end="url(#ah)"/>
<rect x="30" y="336" width="150" height="74" rx="9" fill="#5BAE5B"/>
<text x="105.0" y="371.0" text-anchor="middle" font-size="17" font-weight="800" fill="#fff">OPERATION</text>
<text x="105.0" y="391.0" text-anchor="middle" font-size="12" fill="#fff">7 Tiles</text>
<circle cx="200" cy="373.0" r="9" fill="#f7f7f5"/>
<rect x="200" y="336" width="112" height="74" rx="9" fill="#ebf5eb" stroke="#5BAE5B" stroke-width="2"/>
<circle cx="312" cy="373.0" r="8" fill="#5BAE5B"/>
<circle cx="218" cy="354" r="7" fill="none" stroke="#5BAE5B" stroke-width="1.5"/>
<text x="256.0" y="366" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">op_01</text>
<text x="256.0" y="388" text-anchor="middle" font-size="10" fill="#333">Early Life Support</text>
<line x1="320" y1="373.0" x2="326" y2="373.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="328" cy="373.0" r="9" fill="#f7f7f5"/>
<rect x="328" y="336" width="112" height="74" rx="9" fill="#ebf5eb" stroke="#5BAE5B" stroke-width="2"/>
<circle cx="440" cy="373.0" r="8" fill="#5BAE5B"/>
<circle cx="346" cy="354" r="7" fill="none" stroke="#5BAE5B" stroke-width="1.5"/>
<text x="384.0" y="366" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">op_02</text>
<text x="384.0" y="388" text-anchor="middle" font-size="10" fill="#333">Betriebs-Leitlinien</text>
<line x1="448" y1="373.0" x2="454" y2="373.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="456" cy="373.0" r="9" fill="#f7f7f5"/>
<rect x="456" y="336" width="112" height="74" rx="9" fill="#ebf5eb" stroke="#5BAE5B" stroke-width="2"/>
<circle cx="568" cy="373.0" r="8" fill="#5BAE5B"/>
<circle cx="474" cy="354" r="7" fill="none" stroke="#5BAE5B" stroke-width="1.5"/>
<text x="512.0" y="366" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">op_03</text>
<text x="512.0" y="388" text-anchor="middle" font-size="10" fill="#333">Laufender Betrieb</text>
<line x1="576" y1="373.0" x2="582" y2="373.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="584" cy="373.0" r="9" fill="#f7f7f5"/>
<rect x="584" y="336" width="112" height="74" rx="9" fill="#ebf5eb" stroke="#5BAE5B" stroke-width="2"/>
<circle cx="696" cy="373.0" r="8" fill="#5BAE5B"/>
<circle cx="602" cy="354" r="7" fill="none" stroke="#5BAE5B" stroke-width="1.5"/>
<text x="640.0" y="366" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">op_04</text>
<text x="640.0" y="388" text-anchor="middle" font-size="10" fill="#333">Ressourcen &amp; Budget</text>
<line x1="704" y1="373.0" x2="710" y2="373.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="712" cy="373.0" r="9" fill="#f7f7f5"/>
<rect x="712" y="336" width="112" height="74" rx="9" fill="#ebf5eb" stroke="#5BAE5B" stroke-width="2"/>
<circle cx="824" cy="373.0" r="8" fill="#5BAE5B"/>
<circle cx="730" cy="354" r="7" fill="none" stroke="#5BAE5B" stroke-width="1.5"/>
<text x="768.0" y="366" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">op_05</text>
<text x="768.0" y="388" text-anchor="middle" font-size="10" fill="#333">Services ueberwachen</text>
<line x1="832" y1="373.0" x2="838" y2="373.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="840" cy="373.0" r="9" fill="#f7f7f5"/>
<rect x="840" y="336" width="112" height="74" rx="9" fill="#ebf5eb" stroke="#5BAE5B" stroke-width="2"/>
<circle cx="952" cy="373.0" r="8" fill="#5BAE5B"/>
<circle cx="858" cy="354" r="7" fill="none" stroke="#5BAE5B" stroke-width="1.5"/>
<text x="896.0" y="366" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">op_06</text>
<text x="896.0" y="388" text-anchor="middle" font-size="10" fill="#333">Qualitaetsbericht</text>
<line x1="960" y1="373.0" x2="966" y2="373.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="968" cy="373.0" r="9" fill="#f7f7f5"/>
<rect x="968" y="336" width="112" height="74" rx="9" fill="#ebf5eb" stroke="#5BAE5B" stroke-width="2"/>
<circle cx="1080" cy="373.0" r="8" fill="#5BAE5B"/>
<circle cx="986" cy="354" r="7" fill="none" stroke="#5BAE5B" stroke-width="1.5"/>
<text x="1024.0" y="366" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">op_07</text>
<text x="1024.0" y="388" text-anchor="middle" font-size="10" fill="#333">Proaktive Problemerkennung</text>
<path d="M 1024.0 410 V 433.0 H 256.0 V 454" fill="none" stroke="#999" stroke-width="2.2" stroke-dasharray="5 4" marker-end="url(#ah)"/>
<rect x="30" y="456" width="150" height="74" rx="9" fill="#3FB5B5"/>
<text x="105.0" y="491.0" text-anchor="middle" font-size="17" font-weight="800" fill="#fff">SUPPORT</text>
<text x="105.0" y="511.0" text-anchor="middle" font-size="12" fill="#fff">11 Tiles</text>
<circle cx="200" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="200" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="312" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="218" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="256.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_01</text>
<text x="256.0" y="508" text-anchor="middle" font-size="10" fill="#333">Support-Leitlinien</text>
<line x1="320" y1="493.0" x2="326" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="328" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="328" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="440" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="346" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="384.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_02</text>
<text x="384.0" y="508" text-anchor="middle" font-size="10" fill="#333">Wissensdatenbank</text>
<line x1="448" y1="493.0" x2="454" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="456" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="456" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="568" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="474" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="512.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_03</text>
<text x="512.0" y="508" text-anchor="middle" font-size="10" fill="#333">Incidents/Requests verteilen</text>
<line x1="576" y1="493.0" x2="582" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="584" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="584" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="696" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="602" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="640.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_04</text>
<text x="640.0" y="508" text-anchor="middle" font-size="10" fill="#333">Requests bearbeiten</text>
<line x1="704" y1="493.0" x2="710" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="712" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="712" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="824" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="730" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="768.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_05</text>
<text x="768.0" y="508" text-anchor="middle" font-size="10" fill="#333">Incident 1st Level</text>
<line x1="832" y1="493.0" x2="838" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="840" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="840" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="952" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="858" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="896.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_06</text>
<text x="896.0" y="508" text-anchor="middle" font-size="10" fill="#333">Incident 2nd Level</text>
<line x1="960" y1="493.0" x2="966" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="968" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="968" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="1080" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="986" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="1024.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_07</text>
<text x="1024.0" y="508" text-anchor="middle" font-size="10" fill="#333">Record geloest</text>
<line x1="1088" y1="493.0" x2="1094" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1096" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="1096" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="1208" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="1114" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="1152.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_08</text>
<text x="1152.0" y="508" text-anchor="middle" font-size="10" fill="#333">Schliessen</text>
<line x1="1216" y1="493.0" x2="1222" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1224" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="1224" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="1336" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="1242" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="1280.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_09</text>
<text x="1280.0" y="508" text-anchor="middle" font-size="10" fill="#333">Problem Record anlegen</text>
<line x1="1344" y1="493.0" x2="1350" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1352" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="1352" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="1464" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="1370" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="1408.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_10</text>
<text x="1408.0" y="508" text-anchor="middle" font-size="10" fill="#333">Wiederk. Incidents -&gt; Problem</text>
<line x1="1472" y1="493.0" x2="1478" y2="493.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="1480" cy="493.0" r="9" fill="#f7f7f5"/>
<rect x="1480" y="456" width="112" height="74" rx="9" fill="#e7f6f6" stroke="#3FB5B5" stroke-width="2"/>
<circle cx="1592" cy="493.0" r="8" fill="#3FB5B5"/>
<circle cx="1498" cy="474" r="7" fill="none" stroke="#3FB5B5" stroke-width="1.5"/>
<text x="1536.0" y="486" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">sp_11</text>
<text x="1536.0" y="508" text-anchor="middle" font-size="10" fill="#333">RCA &amp; Workaround</text>
<path d="M 1536.0 530 V 553.0 H 256.0 V 574" fill="none" stroke="#999" stroke-width="2.2" stroke-dasharray="5 4" marker-end="url(#ah)"/>
<rect x="30" y="576" width="150" height="74" rx="9" fill="#8E63B5"/>
<text x="105.0" y="611.0" text-anchor="middle" font-size="17" font-weight="800" fill="#fff">REVIEW</text>
<text x="105.0" y="631.0" text-anchor="middle" font-size="12" fill="#fff">6 Tiles</text>
<circle cx="200" cy="613.0" r="9" fill="#f7f7f5"/>
<rect x="200" y="576" width="112" height="74" rx="9" fill="#f1ecf6" stroke="#8E63B5" stroke-width="2"/>
<circle cx="312" cy="613.0" r="8" fill="#8E63B5"/>
<circle cx="218" cy="594" r="7" fill="none" stroke="#8E63B5" stroke-width="1.5"/>
<text x="256.0" y="606" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">rv_01</text>
<text x="256.0" y="628" text-anchor="middle" font-size="10" fill="#333">Taktische RCA + KPIs</text>
<line x1="320" y1="613.0" x2="326" y2="613.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="328" cy="613.0" r="9" fill="#f7f7f5"/>
<rect x="328" y="576" width="112" height="74" rx="9" fill="#f1ecf6" stroke="#8E63B5" stroke-width="2"/>
<circle cx="440" cy="613.0" r="8" fill="#8E63B5"/>
<circle cx="346" cy="594" r="7" fill="none" stroke="#8E63B5" stroke-width="1.5"/>
<text x="384.0" y="606" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">rv_02</text>
<text x="384.0" y="628" text-anchor="middle" font-size="10" fill="#333">Performance &amp; Improvement</text>
<line x1="448" y1="613.0" x2="454" y2="613.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="456" cy="613.0" r="9" fill="#f7f7f5"/>
<rect x="456" y="576" width="112" height="74" rx="9" fill="#f1ecf6" stroke="#8E63B5" stroke-width="2"/>
<circle cx="568" cy="613.0" r="8" fill="#8E63B5"/>
<circle cx="474" cy="594" r="7" fill="none" stroke="#8E63B5" stroke-width="1.5"/>
<text x="512.0" y="606" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">rv_03</text>
<text x="512.0" y="628" text-anchor="middle" font-size="10" fill="#333">SOR Periodischer Review</text>
<line x1="576" y1="613.0" x2="582" y2="613.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="584" cy="613.0" r="9" fill="#f7f7f5"/>
<rect x="584" y="576" width="112" height="74" rx="9" fill="#f1ecf6" stroke="#8E63B5" stroke-width="2"/>
<circle cx="696" cy="613.0" r="8" fill="#8E63B5"/>
<circle cx="602" cy="594" r="7" fill="none" stroke="#8E63B5" stroke-width="1.5"/>
<text x="640.0" y="606" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">rv_04</text>
<text x="640.0" y="628" text-anchor="middle" font-size="10" fill="#333">Service Improvement</text>
<line x1="704" y1="613.0" x2="710" y2="613.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="712" cy="613.0" r="9" fill="#f7f7f5"/>
<rect x="712" y="576" width="112" height="74" rx="9" fill="#f1ecf6" stroke="#8E63B5" stroke-width="2"/>
<circle cx="824" cy="613.0" r="8" fill="#8E63B5"/>
<circle cx="730" cy="594" r="7" fill="none" stroke="#8E63B5" stroke-width="1.5"/>
<text x="768.0" y="606" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">rv_05</text>
<text x="768.0" y="628" text-anchor="middle" font-size="10" fill="#333">Redesign / Erweiterung</text>
<line x1="832" y1="613.0" x2="838" y2="613.0" stroke="#666" stroke-width="2.2" marker-end="url(#ah)"/>
<circle cx="840" cy="613.0" r="9" fill="#f7f7f5"/>
<rect x="840" y="576" width="112" height="74" rx="9" fill="#f1ecf6" stroke="#8E63B5" stroke-width="2"/>
<circle cx="952" cy="613.0" r="8" fill="#8E63B5"/>
<circle cx="858" cy="594" r="7" fill="none" stroke="#8E63B5" stroke-width="1.5"/>
<text x="896.0" y="606" text-anchor="middle" font-size="15" font-weight="700" fill="#1a1a1a">rv_06</text>
<text x="896.0" y="628" text-anchor="middle" font-size="10" fill="#333">Ausserbetriebnahme</text>
<path d="M 22 373.0 C 4 373.0, 4 493.0, 22 493.0" fill="none" stroke="#d23" stroke-width="2.6" marker-end="url(#ah)" marker-start="url(#ah)"/>
<text x="2" y="433.0" font-size="11" fill="#d23" transform="rotate(-90 8 433.0)" text-anchor="middle">Betriebs-Loop</text>
<line x1="958" y1="613.0" x2="1022" y2="613.0" stroke="#8E63B5" stroke-width="2.6" marker-end="url(#ah)"/>
<text x="1030" y="607.0" font-size="12.5" font-weight="700" fill="#8E63B5">zurueck in DPM</text>
<text x="1030" y="625.0" font-size="11" fill="#666">rv_05 Redesign / rv_06 Retirement</text>
<rect x="30" y="752" width="26" height="18" rx="4" fill="#E8893B"/>
<text x="64" y="766" font-size="12.5" fill="#333">Gate-Tile (Tor mit Rollen-Steckplaetzen)</text>
<rect x="360" y="752" width="26" height="18" rx="4" fill="#e6eff8" stroke="#2F80C9" stroke-width="2"/>
<text x="394" y="766" font-size="12.5" fill="#333">Aktivitaets-Tile (mit Verankerung fuer einseitiges Plaettchen)</text>
<text x="30" y="788" font-size="12.5" fill="#555">Breiteste Phase: 12 Tiles ~ 134 cm (bei 100 mm Tiles + 12 mm Verbinder). Bahn bei Platzmangel maeandrierend faltbar.</text>
</svg>

After

Width:  |  Height:  |  Size: 26 KiB

View file

@ -0,0 +1,202 @@
#!/usr/bin/env python3
"""Generiert die Board-Layout-Skizze (SVG) fuer den SLC-Workshop.
Lineares Phasen-Swimlane-Layout: jede Phase eine Zeile, Tiles links->rechts.
Exakt 40 Tiles (37 Aktivitaeten + 3 Gates). Reproduzierbar: bei Aenderungen
einfach erneut ausfuehren -> board-layout.svg.
"""
# (id, kurzname, is_gate)
PHASES = [
("DESIGN", "#2F80C9", [
("ds_01", "Eigenschaften definieren", False),
("ds_02", "Komponenten designen", False),
("ds_03", "Vorgehen beschreiben", False),
("ds_04", "Implementierung vorbereiten", False),
]),
("TRANSITION", "#E8893B", [
("tr_01", "Entw. / Konfig.?", True),
("tr_02", "Entwicklung koordinieren", False),
("tr_03", "Anwendungen entwickeln", False),
("tr_04", "Komponenten annehmen", False),
("tr_05", "Komponenten konfigurieren", False),
("tr_06", "Betriebsdoku erstellen", False),
("tr_07", "Komponenten testen", False),
("tr_08", "Formale Uebergabe", False),
("tr_09", "Entry-Pruefung", True),
("tr_10", "Ausrollen", False),
("tr_11", "Aktivierung vorbereiten", False),
("tr_12", "Go-Live-Freigabe", True),
]),
("OPERATION", "#5BAE5B", [
("op_01", "Early Life Support", False),
("op_02", "Betriebs-Leitlinien", False),
("op_03", "Laufender Betrieb", False),
("op_04", "Ressourcen & Budget", False),
("op_05", "Services ueberwachen", False),
("op_06", "Qualitaetsbericht", False),
("op_07", "Proaktive Problemerkennung", False),
]),
("SUPPORT", "#3FB5B5", [
("sp_01", "Support-Leitlinien", False),
("sp_02", "Wissensdatenbank", False),
("sp_03", "Incidents/Requests verteilen", False),
("sp_04", "Requests bearbeiten", False),
("sp_05", "Incident 1st Level", False),
("sp_06", "Incident 2nd Level", False),
("sp_07", "Record geloest", False),
("sp_08", "Schliessen", False),
("sp_09", "Problem Record anlegen", False),
("sp_10", "Wiederk. Incidents -> Problem", False),
("sp_11", "RCA & Workaround", False),
]),
("REVIEW", "#8E63B5", [
("rv_01", "Taktische RCA + KPIs", False),
("rv_02", "Performance & Improvement", False),
("rv_03", "SOR Periodischer Review", False),
("rv_04", "Service Improvement", False),
("rv_05", "Redesign / Erweiterung", False),
("rv_06", "Ausserbetriebnahme", False),
]),
]
# Layout-Parameter
TILE_W, TILE_H = 112, 74
GAP_X, GAP_Y = 16, 46
LABEL_W = 150
X0 = 30 + LABEL_W + 20
Y0 = 96
MAX_TILES = max(len(t) for _, _, t in PHASES)
WIDTH = X0 + MAX_TILES * (TILE_W + GAP_X) + 200
HEIGHT = Y0 + len(PHASES) * (TILE_H + GAP_Y) + 120
TILE_MM = 100 # ein Tile = 100x100 mm
def esc(s):
return s.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
def lighten(hexcol, f=0.85):
h = hexcol.lstrip("#")
r, g, b = int(h[0:2], 16), int(h[2:4], 16), int(h[4:6], 16)
r = int(r + (255 - r) * f)
g = int(g + (255 - g) * f)
b = int(b + (255 - b) * f)
return f"#{r:02x}{g:02x}{b:02x}"
def tile_svg(x, y, tid, name, color, is_gate):
fill = color if is_gate else lighten(color, 0.88)
stroke = color
sw = 3 if is_gate else 2
txtcol = "#ffffff" if is_gate else "#1a1a1a"
parts = []
# Puzzle-Notch links (Hintergrundfarbe), Bump rechts (Randfarbe)
parts.append(f'<circle cx="{x}" cy="{y+TILE_H/2}" r="9" fill="#f7f7f5"/>')
parts.append(f'<rect x="{x}" y="{y}" width="{TILE_W}" height="{TILE_H}" rx="9" '
f'fill="{fill}" stroke="{stroke}" stroke-width="{sw}"/>')
parts.append(f'<circle cx="{x+TILE_W}" cy="{y+TILE_H/2}" r="8" fill="{stroke}"/>')
if is_gate:
# kleiner Torbogen + GATE-Label
ax, ay = x + TILE_W/2, y + 14
parts.append(f'<path d="M {ax-12} {ay+18} V {ay+4} A 12 12 0 0 1 {ax+12} {ay+4} '
f'V {ay+18}" fill="none" stroke="#ffffff" stroke-width="3"/>')
parts.append(f'<text x="{x+TILE_W/2}" y="{y+TILE_H-22}" text-anchor="middle" '
f'font-size="14" font-weight="700" fill="{txtcol}">{esc(tid)}</text>')
parts.append(f'<text x="{x+TILE_W/2}" y="{y+TILE_H-7}" text-anchor="middle" '
f'font-size="10.5" fill="{txtcol}">{esc(name)}</text>')
else:
parts.append(f'<circle cx="{x+18}" cy="{y+18}" r="7" fill="none" '
f'stroke="{stroke}" stroke-width="1.5"/>') # Verankerung
parts.append(f'<text x="{x+TILE_W/2}" y="{y+30}" text-anchor="middle" '
f'font-size="15" font-weight="700" fill="{txtcol}">{esc(tid)}</text>')
parts.append(f'<text x="{x+TILE_W/2}" y="{y+52}" text-anchor="middle" '
f'font-size="10" fill="#333">{esc(name)}</text>')
return "\n".join(parts)
def arrow(x1, y1, x2, y2, color="#666", w=2.2):
return (f'<line x1="{x1}" y1="{y1}" x2="{x2}" y2="{y2}" stroke="{color}" '
f'stroke-width="{w}" marker-end="url(#ah)"/>')
svg = []
svg.append(f'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 {WIDTH} {HEIGHT}" '
f'font-family="Arial, Helvetica, sans-serif">')
svg.append(f'<rect x="0" y="0" width="{WIDTH}" height="{HEIGHT}" fill="#f7f7f5"/>')
svg.append('<defs><marker id="ah" markerWidth="9" markerHeight="9" refX="7" refY="3" '
'orient="auto" markerUnits="strokeWidth">'
'<path d="M0,0 L7,3 L0,6 Z" fill="#666"/></marker></defs>')
# Titel
svg.append(f'<text x="30" y="44" font-size="26" font-weight="800" fill="#1a1a1a">'
f'Service-Lifecycle — Board-Layout (40 Tiles)</text>')
svg.append(f'<text x="30" y="68" font-size="14" fill="#555">'
f'37 Aktivitaeten + 3 Gates · 1 Tile = {TILE_MM}x{TILE_MM} mm · '
f'lineare Bahn, Sequenz links nach rechts</text>')
row_y = {}
for ri, (pname, color, tiles) in enumerate(PHASES):
y = Y0 + ri * (TILE_H + GAP_Y)
row_y[pname] = y
# Phasen-Label
svg.append(f'<rect x="30" y="{y}" width="{LABEL_W}" height="{TILE_H}" rx="9" '
f'fill="{color}"/>')
svg.append(f'<text x="{30+LABEL_W/2}" y="{y+TILE_H/2-2}" text-anchor="middle" '
f'font-size="17" font-weight="800" fill="#fff">{esc(pname)}</text>')
svg.append(f'<text x="{30+LABEL_W/2}" y="{y+TILE_H/2+18}" text-anchor="middle" '
f'font-size="12" fill="#fff">{len(tiles)} Tiles</text>')
# Tiles
prev = None
for ti, (tid, name, is_gate) in enumerate(tiles):
x = X0 + ti * (TILE_W + GAP_X)
if prev is not None:
svg.append(arrow(prev + 8, y + TILE_H/2, x - 2, y + TILE_H/2))
svg.append(tile_svg(x, y, tid, name, color, is_gate))
prev = x + TILE_W
# Connector zur naechsten Phase (von letztem Tile runter zur naechsten Zeile Start)
if ri < len(PHASES) - 1:
lastx = X0 + (len(tiles) - 1) * (TILE_W + GAP_X) + TILE_W/2
ny = y + TILE_H + GAP_Y
svg.append(f'<path d="M {lastx} {y+TILE_H} V {y+TILE_H+GAP_Y/2} '
f'H {X0+TILE_W/2} V {ny-2}" fill="none" stroke="#999" '
f'stroke-width="2.2" stroke-dasharray="5 4" marker-end="url(#ah)"/>')
# Operation <-> Support Loop (links neben den Labels)
oy = row_y["OPERATION"] + TILE_H/2
sy = row_y["SUPPORT"] + TILE_H/2
svg.append(f'<path d="M 22 {oy} C 4 {oy}, 4 {sy}, 22 {sy}" fill="none" '
f'stroke="#d23" stroke-width="2.6" marker-end="url(#ah)" marker-start="url(#ah)"/>')
svg.append(f'<text x="2" y="{(oy+sy)/2}" font-size="11" fill="#d23" '
f'transform="rotate(-90 8 {(oy+sy)/2})" text-anchor="middle">Betriebs-Loop</text>')
# Exit nach Review (DPM-Ruecklauf)
ry = row_y["REVIEW"] + TILE_H/2
rx = X0 + (len(PHASES[-1][2]) - 1) * (TILE_W + GAP_X) + TILE_W
svg.append(arrow(rx + 6, ry, rx + 70, ry, color="#8E63B5", w=2.6))
svg.append(f'<text x="{rx+78}" y="{ry-6}" font-size="12.5" font-weight="700" '
f'fill="#8E63B5">zurueck in DPM</text>')
svg.append(f'<text x="{rx+78}" y="{ry+12}" font-size="11" fill="#666">'
f'rv_05 Redesign / rv_06 Retirement</text>')
# Legende / Massstab
ly = HEIGHT - 64
svg.append(f'<rect x="30" y="{ly}" width="26" height="18" rx="4" fill="#E8893B"/>')
svg.append(f'<text x="64" y="{ly+14}" font-size="12.5" fill="#333">Gate-Tile (Tor mit Rollen-Steckplaetzen)</text>')
svg.append(f'<rect x="360" y="{ly}" width="26" height="18" rx="4" fill="{lighten("#2F80C9",0.88)}" stroke="#2F80C9" stroke-width="2"/>')
svg.append(f'<text x="394" y="{ly+14}" font-size="12.5" fill="#333">Aktivitaets-Tile (mit Verankerung fuer einseitiges Plaettchen)</text>')
# Gesamtbreite-Hinweis
total_mm = MAX_TILES * (TILE_MM + 12)
svg.append(f'<text x="30" y="{HEIGHT-28}" font-size="12.5" fill="#555">'
f'Breiteste Phase: {MAX_TILES} Tiles ~ {total_mm/10:.0f} cm '
f'(bei {TILE_MM} mm Tiles + 12 mm Verbinder). Bahn bei Platzmangel maeandrierend faltbar.</text>')
svg.append('</svg>')
out = "board-layout.svg"
with open(out, "w", encoding="utf-8") as f:
f.write("\n".join(svg))
total = sum(len(t) for _, _, t in PHASES)
gates = sum(1 for _, _, t in PHASES for _, _, g in t if g)
print(f"geschrieben: {out}")
print(f"Tiles gesamt: {total} (Aktivitaeten: {total-gates}, Gates: {gates})")

View file

@ -0,0 +1,131 @@
# Materialliste — zu druckende Elemente
Stand: 2026-05-27 · Maße in mm · Mengen für **ein** Workshop-Set.
## Standard-Schnittstelle (für alle Teile gültig)
- **Verankerung (Sockel):** zylindrische Vertiefung **Ø 50 mm, Tiefe 4 mm**, mit
0,4 mm Spielpassung. Sowohl Aktivitätsplättchen als auch der Action-Stein-Fuß
passen hinein.
- **Tile-Steckverbindung:** Puzzle-Tab **12 mm breit, 6 mm tief**, mittig je Kante.
- **Figuren-Steckplatz:** Pin-Loch **Ø 4,2 mm, Tiefe 4 mm** (für Figuren-Pin Ø 4,0 mm).
Einheitlich am **Aktiv-Feld** und an den **Gate-Toren** — jede Figur passt überall.
---
## 1. Phasen-Basistiles (lineare Bahn)
| Merkmal | Wert |
|---------|------|
| Grundfläche | 100 × 100 × 6 mm |
| Verankerung | zentriert, Ø 50 × 4 mm |
| Kanten | Puzzle-Tabs (Tab/Slot abwechselnd) |
| Farbe | je Phase (blau/orange/grün/teal/lila) |
| Menge | **40** (eine je Lifecycle-ID: 37 Aktivitäten + 3 Gate-Positionen) |
| Material | PLA, Infill 15 % |
| Druckzeit | ~1,5 h/Tile |
> Tiles bleiben bewusst **clean** (nur Verankerung + Tabs). Die Rollen-Platzierung
> übernimmt das mobile **Aktiv-Feld** (Abschnitt 4a), das neben dem Action-Stein steht.
Alle Tiles sind **gerade** und werden zu einer **linearen Bahn** aneinandergereiht
(kein Ring). Bei Platzmangel kann die Bahn mäandrierend (Zeilenumbruch) gelegt
werden — die Puzzle-Tabs erlauben auch 90°-Ecken.
## 2. Aktivitätsplättchen (einseitig)
| Merkmal | Wert |
|---------|------|
| Form | Rundscheibe Ø 49 × 4 mm (passt in Verankerung) |
| Gravur | **einseitig: ID + Kurzbezeichnung** (z. B. `op_05 — Überwachen der Services`). Rückseite leer/Phasenfarbe — Erklärung liegt in der App |
| Griff | umlaufende Fase 1 mm zum leichten Herausnehmen |
| Menge | **37** (eine je Aktivität; an den 3 Gate-Positionen steht stattdessen ein Gate-Tor) |
| Material | PLA, je Phase eingefärbt (matcht Tile) |
> Plättchen bleibt entnehmbar: beim Bearbeiten herausnehmen und den Action-Stein
> in die Verankerung stellen („wir sind hier"). Die ausführliche Auflösung kommt
> über die Companion-App, nicht über eine Rückseiten-Gravur.
> Bei zu kleiner Schrift für Gravur: glatte Scheibe drucken + bedrucktes Label aufkleben.
## 3. Action-Stein (Szenario-Träger)
| Merkmal | Wert |
|---------|------|
| Fuß | Ø 49 × 5 mm (sitzt in Verankerung) |
| Körper | Zylinder Ø 35, Höhe 30 mm |
| Kartenschlitz | Breite 74 mm, Tiefe 4 mm, Höhe 25 mm (für Karte 70 mm breit) |
| Gewichtseinlage | Aussparung für M8-Mutter im Fuß (Kippschutz) |
| Stabilitäts-Option | zusätzlicher Standring Ø 70 mm, falls Karte zu kopflastig |
| Menge | **12** |
| Material | PLA, Infill ≥ 40 % + Metalleinlage |
## 4. Gate-Tore
| Merkmal | Wert |
|---------|------|
| Form | Bogen/Tor, lichte Weite 90 mm, Höhe 100 mm, Materialstärke 8 mm |
| Standfüße | 2 × Grundplatte 30 × 60 mm, überspannt 2 Tiles |
| Rollen-Steckplätze | Lochreihe **Ø 4,2 mm** an der Basis (für Figuren-Pin), 4 Plätze, Pitch 8 mm |
| Kartenschlitz | oben quer, Breite 65 mm, Tiefe 3 mm (Gate-Beschreibungskarte) |
| Gravur | „Gate 1/2/3" + Gate-Keeper |
| Menge | **3** |
| Material | PLA, Infill 20 % |
## 4a. Aktiv-Feld (RACI-Stecklochleiste)
Mobile Leiste, die **neben dem Action-Stein** steht und mit ihm weiterwandert.
Hier werden die je Aktivität beteiligten Rollen-Figuren nach **RACI** gesteckt —
RACI wird so **pro Schritt** sichtbar, ohne die Tiles zu verändern.
| Merkmal | Wert |
|---------|------|
| Grundkörper | ~86 × 26 × 6 mm (Länge ergibt sich aus den Zonen), Ecken r3 |
| Zonen | **R** (2 Plätze) · **A** (1 Platz) · **C** (3 Plätze) · **I** (3 Plätze) |
| Steckplätze | Ø 4,2 mm, Tiefe 4 mm, Pitch 8 mm (für Figuren-Pin Ø 4,0) |
| Gravur | Zonen-Buchstaben R / A / C / I vorne, Tiefe 0,8 mm |
| Menge | **1** (ggf. 2 bei parallelen Tischen) |
| Material | PLA, Infill 20 % |
> **A = genau 1 Platz** — bildet ab, dass je Aktivität genau eine Rolle
> *Accountable* ist (RACI-Regel aus `spm_rollen.yaml`). Nicht jeder Platz muss
> belegt sein; die Leiste ist großzügig ausgelegt.
> Optional: Rastnase, damit die Leiste an den Action-Stein-Fuß andockt.
## 5. Rollen-Figuren
| Merkmal | Wert |
|---------|------|
| Form | Schlanker Pöppel, Höhe ~22 mm, **Standfuß-Pin Ø 4,0 mm × 4 mm** (passt in Aktiv-Feld & Gate-Loch Ø 4,2) |
| Standfläche | schmal (~8 mm), damit mehrere Figuren in einer Zonen-Reihe nebeneinander stehen |
| Codierung | Farbe + Formvariante je Rollenkategorie |
| Menge | siehe `../02_Spielfiguren/` (Governance, Management, Teams) |
| Material | PLA, eingefärbt |
## 6. Entscheidungs-Chips (optional 3D statt Karte)
| Merkmal | Wert |
|---------|------|
| Form | Münze Ø 30 × 4 mm, Symbolgravur |
| Varianten | Go / Go mit Auflagen / Zurück / Ablehnung |
| Menge | je 3 |
| Material | PLA |
---
## Stückliste (Kurzfassung)
| Teil | Menge | Datei |
|------|------:|-------|
| Phasen-Basistile | 40 | `openscad/aktivitaets-tile.scad` |
| Aktivitätsplättchen | 37 | `openscad/aktivitaets-plaque.scad` |
| Action-Stein | 2 | `openscad/action-stein.scad` |
| Aktiv-Feld (RACI-Leiste) | 1 | `openscad/aktiv-feld.scad` |
| Gate-Tor | 3 | `openscad/gate-tor.scad` |
| Rollen-Figuren | ~20 | (Standard-Meeple-Modell + Einfärbung) |
| Entscheidungs-Chips | 12 | (einfache Münze + Gravur) |
## Hinweise für den Producer
- Toleranzen Sockel/Plättchen an **einem Probedruck** kalibrieren (Drucker-spezifisch).
- Gravurtiefe 0,61,0 mm; bei sehr kleiner Schrift Label-Variante wählen.
- Farbtrennung über Filamentwechsel je Phase, nicht über Lackierung (abriebfest).

View file

@ -0,0 +1,33 @@
# OpenSCAD-Modelle
Parametrische Quellmodelle der Schlüsselteile. In [OpenSCAD](https://openscad.org)
öffnen, Parameter im Customizer anpassen, mit **F6** rendern und über
*Datei → Export → STL* slicebereit exportieren.
| Datei | Bauteil |
|-------|---------|
| `aktivitaets-tile.scad` | Phasen-Basistile (100×100, Verankerung Ø50, Puzzle-Tabs) |
| `aktivitaets-plaque.scad` | Beidseitiges Aktivitätsplättchen (Ø49) — Text per Variable |
| `action-stein.scad` | Szenario-Träger mit Kartenschlitz + M8-Gewichtsaussparung |
| `gate-tor.scad` | Gate-Tor mit 4 Rollen-Steckplätzen + Kartenschlitz |
## Serienfertigung der Plättchen
`aktivitaets-plaque.scad` enthält den Text als Variablen (`front_id`,
`front_name`, `back_text`). Für alle 38 Aktivitäten empfiehlt sich ein kleines
Skript, das die Werte aus den `service-lifecycle_*.yaml` liest und je Aktivität
ein STL erzeugt (z.B. via OpenSCAD-Kommandozeile `-D` Parameter-Override):
```bash
openscad -o op_05.stl \
-D 'front_id="op_05"' \
-D 'front_name="Ueberwachen der Services"' \
-D 'back_text="..."' \
aktivitaets-plaque.scad
```
## 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.

View file

@ -0,0 +1,42 @@
// Action-Stein: Szenario-Traeger mit aufrechtem Kartenschlitz
// SLC-Workshop Tabletop · Einheiten: mm
/* [Fuss] */
foot_d = 49; // sitzt in Verankerung (Ø50)
foot_h = 5;
stand_ring = 70; // optionaler Standring fuer Kippstabilitaet
use_ring = true;
/* [Koerper] */
body_d = 35;
body_h = 30;
/* [Kartenschlitz] */
card_w = 74; // fuer Karte 70 mm breit
card_t = 4; // Schlitzdicke
card_h = 25; // Einstecktiefe
/* [Gewichtseinlage M8] */
nut_af = 13; // Schluesselweite M8-Mutter
nut_h = 6.5;
$fn = 96;
module base() {
if (use_ring)
cylinder(d = stand_ring, h = 2);
translate([0,0,0]) cylinder(d = foot_d, h = foot_h);
}
module body() {
translate([0,0,foot_h]) cylinder(d = body_d, h = body_h);
}
difference() {
union() { base(); body(); }
// Kartenschlitz (zentriert in X, durch den Koerperkopf)
translate([-card_w/2, -card_t/2, foot_h + body_h - card_h])
cube([card_w, card_t, card_h + 1]);
// Gewichtsaussparung im Fuss (Sechskant fuer M8-Mutter)
translate([0, 0, -0.1])
cylinder(d = nut_af / cos(30), h = nut_h, $fn = 6);
}

View file

@ -0,0 +1,77 @@
// Aktiv-Feld RACI-Stecklochleiste
// 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).
/* [Leiste] */
strip_w = 26; // Tiefe (zum Spieler)
strip_h = 6; // Dicke
corner_r = 3;
/* [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)
/* [Beschriftung] */
label_size = 7; // Buchstabengroesse
label_depth = 0.8; // Gravurtiefe
label_y = -8; // Position der Buchstaben (vorne, zum Spieler)
/* [Zonen] */
// [Label, Anzahl Steckplaetze] A bewusst nur 1 (genau eine Rolle accountable)
zones = [ ["R", 2], ["A", 1], ["C", 3], ["I", 3] ];
$fn = 48;
// --- Hilfsfunktionen -------------------------------------------------------
function zone_span(c) = (c - 1) * pin_pitch;
function sumspan(i = 0) =
i >= len(zones) ? 0 : zone_span(zones[i][1]) + sumspan(i + 1);
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);
}
module raci_strip() {
L = total_len();
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");
}
}
}
raci_strip();

View file

@ -0,0 +1,48 @@
// Beidseitiges Aktivitaetsplaettchen (Rundscheibe fuer Verankerung)
// SLC-Workshop Tabletop · Einheiten: mm
// Text per Variable setzen; fuer Serie ueber Skript je Aktivitaet generieren.
/* [Scheibe] */
disc_d = 49; // Durchmesser (Verankerung 50 - Passung)
disc_h = 4; // Dicke
chamfer = 1; // Fase als Griffhilfe
/* [Gravur] */
engrave_depth = 0.8;
front_id = "op_05";
front_name = "Ueberwachen der Services";
back_text = "Laufende Ueberwachung von Verfuegbarkeit, Leistung und Qualitaet des Service.";
font = "Liberation Sans:style=Bold";
$fn = 96;
module disc_body() {
// Scheibe mit beidseitiger Fase
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);
}
}
module front_engraving() {
translate([0, 6, disc_h - engrave_depth])
linear_extrude(engrave_depth + 0.1)
text(front_id, size=7, halign="center", font=font);
translate([0, -6, disc_h - engrave_depth])
linear_extrude(engrave_depth + 0.1)
text(front_name, size=3.2, halign="center", font=font);
}
module back_engraving() {
// gespiegelt, weil Rueckseite
mirror([1,0,0])
translate([0, 0, -0.1])
linear_extrude(engrave_depth + 0.1)
text(back_text, size=2.6, halign="center", font=font);
}
difference() {
disc_body();
front_engraving();
back_engraving();
}

View file

@ -0,0 +1,52 @@
// 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 = 50; // Durchmesser Vertiefung
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();

View file

@ -0,0 +1,70 @@
// Gate-Tor mit Rollen-Steckplaetzen und Kartenschlitz
// SLC-Workshop Tabletop · Einheiten: mm
/* [Tor] */
opening_w = 90; // lichte Weite
opening_h = 100; // lichte Hoehe
thick = 8; // Materialstaerke (Tiefe)
post_w = 12; // Pfostenbreite
top_h = 14; // Hoehe des Querbalkens
/* [Fuesse] */
foot_w = 60;
foot_d = 30;
foot_h = 4;
/* [Rollen-Steckplaetze] */
peg_d = 8.2; // Loch fuer Figuren-Pin (Ø7,5 + Passung)
peg_count = 4;
peg_depth = 6;
/* [Kartenschlitz oben] */
card_w = 65;
card_t = 3;
card_depth = 10;
$fn = 48;
total_w = opening_w + 2*post_w;
total_h = opening_h + top_h + foot_h;
module arch() {
difference() {
// Aussenkontur
translate([-total_w/2, 0, 0])
cube([total_w, thick, opening_h + top_h]);
// Oeffnung
translate([-opening_w/2, -0.1, 0])
cube([opening_w, thick + 0.2, opening_h]);
}
}
module feet() {
for (x = [-1, 1])
translate([x*(opening_w/2 + post_w/2) - foot_w/2, -(foot_d-thick)/2, 0])
cube([foot_w, foot_d, foot_h]);
}
module peg_holes() {
// Lochreihe entlang der Vorderkante der Fuesse
spacing = (opening_w + post_w) / (peg_count - 1);
for (i = [0 : peg_count - 1])
translate([-(opening_w + post_w)/2 + i*spacing, foot_d/2 - peg_d, foot_h])
rotate([180,0,0])
cylinder(d = peg_d, h = peg_depth);
}
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]);
}
// Tor inkl. Kartenschlitz
difference() {
translate([0,0,foot_h]) arch();
translate([0,0,foot_h]) card_slot();
}
// Fuesse inkl. Rollen-Steckplaetze
difference() {
feet();
peg_holes();
}

View file

@ -0,0 +1,125 @@
# Visual-Prompts für den 3D-Druck-Producer
Diese Prompts erzeugen **Orientierungs-Renderings** (kein Marketing-Bild),
die dem Producer Form, Proportion und Steckmechanik der Bauteile zeigen.
Empfohlen für Bildmodelle wie Nano Banana / Imagen. Englisch erzielt meist die
sauberste Geometrie; Beschriftungen bewusst sparsam halten.
> **Board-Layout:** linear (durchgehende Bahn), **kein Kreis**.
> **Wichtig:** die **einseitigen, entnehmbaren Aktivitätsplättchen** müssen
> sichtbar sein — einige liegen flach in der Verankerung (Code-Seite oben),
> einige sind herausgenommen und liegen daneben (Rückseite leer), sodass die
> **freie Verankerung** erkennbar ist (dort steht dann der Action-Stein).
> *(Stand v0.2-Renderings — Erklärung liegt inzwischen in der App, nicht auf der
> Rückseite; RACI-Aktiv-Feld + verschlankte Figuren sind hier noch nicht abgebildet.)*
---
## Prompt A — Bauteil-Übersicht (Exploded-Style)
```
Clean technical product render, neutral light-grey studio background, exploded
view of a set of 3D-printed tabletop game components in matte PLA. Show: a square
modular base tile (100x100mm) with puzzle-tab edges and a round centered recess;
a round single-sided insert disc that fits the recess (top face with a short
engraved code, plain back); a cylindrical game token
with a wide weighted base and a vertical card slot on top; a small upright
arch-shaped "gate" with peg holes at its base; a meeple figure with a round pin
foot. Parts floating slightly apart to show how they connect. Soft shadows,
isometric angle, high detail, dimension-focused, minimal text.
```
## Prompt B — Aktivitätsplättchen: einseitig & entnehmbar
```
Close-up technical render of round single-sided game discs in matte colored PLA,
each about 49mm diameter and 4mm thick with a chamfered edge for easy gripping.
Three discs shown: one sitting flush inside a square tile's round recess (top face
showing a short engraved activity code), one lifted out by fingers, and one lying
beside the tile with a plain blank back. The empty recess of one tile is clearly
visible (this is where the upright action token will stand). Emphasis on the
removable fit and the freed socket. Neutral grey background, soft studio light,
shallow depth of field, premium board-game component photography.
```
## Prompt C — Action-Stein im Detail
```
Close-up technical render of a single 3D-printed game token, matte white PLA.
Cylindrical body on a wide round base, with a vertical slot on top holding an
upright rectangular card. The base diameter is clearly wider than the body for
stability. The token stands inside a square tile's round recess (the same recess
that normally holds an activity disc). Quarter-section cutaway shows a hexagonal
cavity in the base for a metal weight. Neutral grey background, soft studio
lighting, isometric, emphasis on proportions and the card slot fit, no decorative
text.
```
## Prompt D — Gate-Tor mit Rollen-Steckplätzen
```
Technical product render of a small upright arch-shaped game piece in matte PLA,
like a doorway about 100mm tall with 90mm clear opening, 8mm thick. Two flat feet
at the base spanning two tiles of a straight track. A row of four small round holes
along the front base edge for inserting pin-footed figures. A thin horizontal slot
across the top of the arch holding a small reference card. A round-pin meeple figure
is inserted in one of the base holes. Neutral background, isometric, soft shadows,
focus on the peg-hole mechanism, minimal text.
```
## Prompt E — Tile-Steckmechanik (gerade Bahn)
```
Top-down and slight-angle technical render of four square modular game tiles
(matte PLA, different solid colors: blue, orange, green, teal) connected via
puzzle-tab edges into a STRAIGHT row / track. Each tile has a round recessed socket
in its center: two sockets hold flat round single-sided discs (engraved code on
top), one socket is empty showing the recess, one holds a small upright arch gate. Clean grey background, soft light, isometric, emphasis on how
tiles interlock into a straight line, minimal text.
```
## Prompt F — Komplettaufbau (Referenz für Proportionen)
```
Wide isometric technical render of a fully assembled LINEAR tabletop game on a
neutral surface: square color-coded tiles connected into a long straight track
left to right through five color zones (blue, orange, green, teal, purple); two of
the zones (green and teal) sit side by side with two curved arrows forming a small
loop between them; three upright arch gates stand on the track; small meeple figures
placed at the gates; round single-sided activity discs sit in the tile sockets with
a couple lifted out leaving empty sockets; one cylindrical token with an
upright card stands in a socket; at the right end two exit arrows lead off the board.
Matte PLA materials, soft studio lighting, clean and diagrammatic,
proportion-accurate, minimal text.
```
## Prompt G — Gesamtaufbau, 40 Einzeltiles (Tisch-Optik)
> Hinweis: Bild-KIs zählen nicht zuverlässig — die exakte Tile-Zahl ist über
> [`board-layout.svg`](board-layout.svg) garantiert. Dieser Prompt liefert die
> **Optik/Stimmung**, nicht die exakte Anzahl. Raster explizit vorgeben erhöht
> die Trefferquote.
```
Isometric high-angle photograph of a complete modular tabletop board on a large
wooden meeting table, spanning about 1.2 meters. The board is assembled from many
small individual square puzzle tiles interlocking via tab-and-slot edges; each tile
is one lifecycle step. Tiles are color-grouped into five phases laid out as fixed
grids: DESIGN (blue) 4 tiles, TRANSITION (orange) 12 tiles with three of them marked
by a small upright arch gate, OPERATION (green) 7 tiles, SUPPORT (teal) 11 tiles,
REVIEW (purple) 6 tiles. Each tile has a round recessed socket holding a flat
single-sided disc; a few discs are lifted out leaving empty sockets. Between the green and teal phases two curved arrows form a
small loop; two exit arrows leave the purple phase at the right. A cylindrical token
with an upright card stands in a socket at the start. A coffee mug and notebook give
scale. Soft daylight, matte PLA surfaces, clean modern design, large phase labels
only, minimal small text.
```
---
### Hinweise zum Einsatz
- Prompts AD sind **Bauteil-Referenzen** (für Fertigung), Prompt E zeigt die **Steckmechanik**, Prompt F den **Gesamtaufbau** (lineare Bahn).
- **Prompt B** zeigt die einseitigen, entnehmbaren Plättchen und die freigelegte Verankerung (dort steht der Action-Stein).
- Verbindliche Maße stehen in [`materialliste.md`](materialliste.md) und in den OpenSCAD-Modellen — die Bilder dienen nur der Orientierung, nicht als Maßvorlage.
- Bei unsauberer Geometrie: Anzahl beschriebener Teile pro Prompt reduzieren.