- puck.scad: zurueck auf 6 mm, Kopplungs-Flats + Magnettaschen raus -> runder Puck, wird lose zur Bahn ausgelegt. - phasen-ring.scad: Magnettaschen raus, 8 -> 6 mm (gleiche Hoehe wie Pucks), Segmente werden lose aneinandergelegt. - materialliste + READMEs nachgezogen (6 mm, keine Magnete, Magnet-Zeile/ Polaritaets-Hinweise entfernt). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
113 lines
4.3 KiB
OpenSCAD
113 lines
4.3 KiB
OpenSCAD
// Phasen-Ring — 5 Segmente (Donut) als SLC-Uebersicht, die auseinandergenommen
|
|
// die Phasen-KOEPFE der linearen Puck-Bahn bilden (Design-Segment = Start).
|
|
// SLC-Workshop Tabletop · Einheiten: mm
|
|
//
|
|
// - 1 Segment = 72°-Ringsegment in seiner Phasenfarbe (wie die Pucks).
|
|
// - Beschriftung GRAVIERT (nur 5 Stueck): Phasenname + Sublabel + einfaches Icon.
|
|
// - KEINE Magnete: Segmente werden lose aneinandergelegt (als Ring oder als
|
|
// Phasen-Koepfe entlang der Bahn).
|
|
//
|
|
// EXPORT: render_mode="single" + phase=0..4 -> ein Segment je Phase als STL.
|
|
// VORSCHAU: render_mode="ring" -> alle 5 farbig zusammengesetzt.
|
|
|
|
/* [Render] */
|
|
render_mode = "ring"; // "single" (Export) oder "ring" (Vorschau)
|
|
phase = 0; // 0 Design · 1 Transition · 2 Operation · 3 Support · 4 Review
|
|
|
|
/* [Ring-Geometrie] */
|
|
r_out = 90; // Aussenradius (Ø180)
|
|
r_in = 42; // Innenradius (Ø84)
|
|
seg_h = 6; // Dicke (wie die Pucks)
|
|
seg_ang = 72; // 360/5
|
|
gap_deg = 1.2; // kleiner Spalt zwischen Segmenten (Passung)
|
|
|
|
/* [Gravur] */
|
|
eng_depth = 0.8;
|
|
name_size = 7;
|
|
sub_size = 3.4;
|
|
|
|
$fn = 96;
|
|
|
|
// --- Phasendaten ------------------------------------------------------------
|
|
names = ["DESIGN", "TRANSITION", "OPERATION", "SUPPORT", "REVIEW"];
|
|
subs = ["Planung & Architektur", "Kontrollierte Ueberfuehrung",
|
|
"Stabiler laufender Betrieb", "Nutzeranfragen & Incidents",
|
|
"Continual Improvement"];
|
|
// Phasenfarben (nur Vorschau; im Druck = Filament)
|
|
pcol = [[0.16,0.44,0.69], [0.88,0.54,0.12], [0.23,0.62,0.29],
|
|
[0.12,0.62,0.62], [0.49,0.31,0.64]];
|
|
|
|
// --- Geometrie-Helfer -------------------------------------------------------
|
|
module ring_sector(a) {
|
|
// Ringsegment ueber Winkel a, Bisektor zeigt nach +Y (oben)
|
|
a0 = 90 - a/2;
|
|
a1 = 90 + a/2;
|
|
big = r_out + 10;
|
|
intersection() {
|
|
difference() { // Annulus
|
|
cylinder(r = r_out, h = seg_h);
|
|
translate([0,0,-0.5]) cylinder(r = r_in, h = seg_h + 1);
|
|
}
|
|
linear_extrude(seg_h) // Tortenstueck
|
|
polygon([[0,0],
|
|
[big*cos(a0), big*sin(a0)],
|
|
[big*cos(90), big*1.2],
|
|
[big*cos(a1), big*sin(a1)]]);
|
|
}
|
|
}
|
|
|
|
// --- Icons (einfache gravierte Glyphen, 2D) ---------------------------------
|
|
module icon(i) {
|
|
// zentriert um (0,0), ~14 mm
|
|
if (i == 0) // Design: Dokument
|
|
difference() {
|
|
square([10,13], center=true);
|
|
translate([2.5,5.5]) rotate(45) square([6,6]); // gefaltete Ecke
|
|
}
|
|
else if (i == 1) // Transition: Pfeil nach rechts
|
|
union() {
|
|
translate([-6,-1.6]) square([9,3.2]);
|
|
translate([3,0]) polygon([[0,-5],[6,0],[0,5]]);
|
|
}
|
|
else if (i == 2) // Operation: Zahnkranz (Ring)
|
|
difference() { circle(r=6.5); circle(r=3.2); }
|
|
else if (i == 3) // Support: Sprechblase
|
|
union() {
|
|
translate([0,1]) square([13,9], center=true);
|
|
translate([-4,-3.5]) polygon([[0,0],[5,0],[0,-4]]);
|
|
}
|
|
else // Review: Kreis-Pfeil (Loop)
|
|
union() {
|
|
difference() {
|
|
difference(){ circle(r=6.5); circle(r=3.8); }
|
|
translate([3,3]) square([8,8]); // Luecke oben rechts
|
|
}
|
|
translate([6.5,2]) polygon([[-2,0],[2,2],[2,-3]]); // Pfeilspitze
|
|
}
|
|
}
|
|
|
|
// --- ein Segment ------------------------------------------------------------
|
|
module phase_segment(idx) {
|
|
a = seg_ang - gap_deg;
|
|
difference() {
|
|
ring_sector(a);
|
|
// Gravur (oben)
|
|
translate([0,0,seg_h - eng_depth]) linear_extrude(eng_depth + 0.1) {
|
|
translate([0,82]) scale(0.9) icon(idx);
|
|
translate([0,66]) text(names[idx], size=name_size,
|
|
halign="center", valign="center");
|
|
translate([0,53]) text(subs[idx], size=sub_size,
|
|
halign="center", valign="center");
|
|
}
|
|
}
|
|
}
|
|
|
|
// --- Ausgabe ----------------------------------------------------------------
|
|
if (render_mode == "ring") {
|
|
for (i = [0:4])
|
|
color(pcol[i]) rotate([0,0, -i*72]) phase_segment(i);
|
|
} else {
|
|
color(pcol[phase]) phase_segment(phase);
|
|
}
|
|
|
|
echo(r_out=r_out, r_in=r_in, seg_h=seg_h, seg_ang=seg_ang);
|