This commit is contained in:
breitenbach76 2026-06-02 15:14:08 +02:00
parent 223a6738c6
commit c9b03a94dc
10 changed files with 283 additions and 304 deletions

View file

@ -9,8 +9,8 @@ Parametrische Quellmodelle der Schlüsselteile. In [OpenSCAD](https://openscad.o
| `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 mit 4 Rollen-Standfeldern + Kartenschlitz |
| `sor-tile.scad` | SOR-Sonder-Tile (Gremium): Gate-Eingang, Chip/„Gremium"-Mitte, Figuren-Ring |
| `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 |
## Serienfertigung der Scheiben

View file

@ -0,0 +1,106 @@
// 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);

View file

@ -1,81 +1,53 @@
// Gate-Tor mit Rollen-Steckplaetzen und Kartenschlitz
// 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 = 90; // lichte Weite
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
/* [Fuesse] */
foot_w = 60;
foot_d = 30;
foot_h = 4;
/* [Rollen-Standfelder] (keine Loecher — Figuren werden gestellt) */
spot_d = 18; // Durchmesser der Standflaeche-Markierung (Sockel Ø20)
spot_count = 4; // 4 Pflicht-Figuren
spot_depth = 0.6; // Gravurtiefe (reine Markierung)
/* [Kartenschlitz oben] */
card_w = 65;
card_w = 65; // Gate-Beschreibungskarte 60 mm + Spiel
card_t = 3;
card_depth = 10;
/* [Stecksockel-Zapfen (links/rechts) — stecken in die SOR-Tile-Loecher] */
tenon_d = 10; // Zapfen-Durchmesser (Tile-Loch 10,4)
tenon_h = 5; // Zapfen-Laenge
tenon_dx = 51; // halber Abstand = Pfostenmitte (opening_w/2 + post_w/2)
$fn = 48;
/* [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)
total_w = opening_w + 2*post_w;
total_h = opening_h + top_h + foot_h;
$fn = 48;
total_w = opening_w + 2*post_w; // 92 -> passt auf das 100er Gate-Tile
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]);
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 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 stand_spots() {
// Flache Standfeld-Markierungen entlang der Vorderkante der Fuesse
spacing = (opening_w + post_w) / (spot_count - 1);
for (i = [0 : spot_count - 1])
translate([-(opening_w + post_w)/2 + i*spacing, foot_d/2 - spot_d, foot_h - spot_depth])
cylinder(d = spot_d, h = spot_depth + 0.1);
}
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 (links/rechts) zum Einstecken ins SOR-Tile
// 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);
}
// Tor inkl. Kartenschlitz
// Bogen inkl. Kartenschlitz
difference() {
translate([0,0,foot_h]) arch();
translate([0,0,foot_h]) card_slot();
}
// Fuesse + Stecksockel-Zapfen, inkl. Rollen-Standfelder (flache Markierung)
difference() {
union() { feet(); tenons(); }
stand_spots();
arch();
card_slot();
}
// Stecksockel-Zapfen
tenons();
echo(total_w = total_w, opening_w = opening_w, tenon_dx = tenon_dx);

View file

@ -1,108 +0,0 @@
// SOR-Sonder-Tile (Gremium) Service Operations Runde
// SLC-Workshop Tabletop · Einheiten: mm
// Die SOR ist kein Einzel-Figur, sondern ein Gremium -> eigenes Tile:
// - Gate-Tor wird am Eingang (Vorderkante) installiert: steckt mit 2 Zapfen
// (links/rechts) in die Gate-Stecksockel -> steht stabil.
// - Mitte: "SOR" eingraviert (kein Chip mehr).
// - rundherum: Standfelder fuer die teilnehmenden Figuren (gestellt, kein Pin)
/* [Tile] */
tile_size = 120; // etwas groesser als Standardtile (Platz fuer Ring + Gate)
tile_height = 6;
corner_r = 4;
/* [Mitte: Gravur] */
use_chip = false; // false: "SOR" eingraviert (Standard) · true: Chip-Mulde Ø30
chip_d = 30;
chip_recess_d = 0.6; // Spielpassung (nur falls use_chip)
chip_depth = 1.5;
gremium_text = "SOR"; // Gravur in der Mitte
gremium_size = 18;
gremium_depth = 0.8;
/* [Ring aus Standfeldern] */
ring_count = 6; // Plaetze fuer Gremiums-Figuren rund um die Mitte
ring_d = 90; // Kreisdurchmesser, auf dem die Standfelder liegen
spot_d = 18; // Standfeld-Durchmesser (Sockel Ø20)
spot_depth = 0.6; // Gravurtiefe (Markierung, kein Loch)
/* [Gate-Eingang an der Vorderkante] */
gate_seat_w = 116; // Breite der Aufsetzflaeche fuer das Gate (Fuesse 2x60)
gate_seat_d = 30; // Tiefe (= Gate-Fusstiefe)
gate_seat_depth = 1.5; // flache Mulde, in der die Gate-Fuesse stehen
gate_label = "EINGANG";
gate_label_size = 6;
gate_label_depth= 0.8;
/* [Gate-Stecksockel: Gate-Tor steckt mit 2 Zapfen (links/rechts) ein] */
gate_peg_d = 10.4; // Loch (Zapfen Ø10 + 0,4 Passung)
gate_peg_depth = 5; // Lochtiefe (Tile ist 6 dick)
gate_peg_dx = 51; // halber Zapfen-Abstand (= Gate-Pfostenmitte)
/* [Puzzle-Tab am Eingang -> Anschluss an die Bahn] */
tab_w = 12; tab_d = 6;
$fn = 96;
module rounded_square(s, r, h) {
linear_extrude(h) offset(r) offset(-r) square([s, s], center=true);
}
module ring_spots() {
for (i = [0 : ring_count - 1]) {
a = 360/ring_count * i;
x = (ring_d/2) * cos(a);
y = (ring_d/2) * sin(a);
translate([x, y, tile_height - spot_depth])
cylinder(d = spot_d, h = spot_depth + 0.1);
}
}
module center_feature() {
if (use_chip) {
// Mulde fuer den Entscheidungs-Chip
translate([0, 0, tile_height - chip_depth])
cylinder(d = chip_d + chip_recess_d, h = chip_depth + 0.1);
} else {
// "Gremium" eingraviert
translate([0, 0, tile_height - gremium_depth])
linear_extrude(gremium_depth + 0.1)
text(gremium_text, size = gremium_size,
halign = "center", valign = "center");
}
}
module gate_entrance() {
// flache Mulde an der Vorderkante (Suedkante), in die die Gate-Fuesse gestellt werden
translate([0, -tile_size/2 + gate_seat_d/2, tile_height - gate_seat_depth])
cube([gate_seat_w, gate_seat_d, gate_seat_depth + 0.1], center = true);
// Beschriftung "SOR" an der Vorderkante
translate([0, -tile_size/2 + gate_seat_d + gate_label_size, tile_height - gate_label_depth])
linear_extrude(gate_label_depth + 0.1)
text(gate_label, size = gate_label_size, halign = "center", valign = "center");
}
module gate_pegs() {
// 2 Loecher fuer die Gate-Zapfen (links/rechts) an der Vorderkante
for (x = [-1, 1])
translate([x*gate_peg_dx, -tile_size/2 + gate_seat_d/2, tile_height - gate_peg_depth])
cylinder(d = gate_peg_d, h = gate_peg_depth + 0.1);
}
module sor_tile() {
difference() {
union() {
rounded_square(tile_size, corner_r, tile_height);
// Puzzle-Tab am Eingang (Suedkante) zum Anschluss an die Bahn
translate([0, -tile_size/2 - tab_d, 0])
cube([tab_w, tab_d*2, tile_height]);
}
center_feature();
ring_spots();
gate_entrance();
gate_pegs();
}
}
sor_tile();
echo(tile_size = tile_size, ring_count = ring_count, use_chip = use_chip);