106 lines
3.6 KiB
OpenSCAD
106 lines
3.6 KiB
OpenSCAD
// 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);
|