This commit is contained in:
breitenbach76 2026-06-09 12:52:46 +02:00
parent 61b6ec23eb
commit 96b86ce340
6 changed files with 117 additions and 170 deletions

View file

@ -25,13 +25,13 @@ Er dient als **Maß-Referenz** und liefert per Render eine **saubere, neutrale V
## Spec (Maße — der „Vertrag", gilt in jedem Tool)
| Element | Wert |
|---|---|
| Board | **rund Ø208 × 14 mm**, Rand gefast |
| Board | **rund Ø260 × 14 mm**, Rand gefast |
| Mittelmulde (Chip) | Ø **50** × Tiefe **2,2** mm (+ Greifkerbe Ø14) |
| Figuren-Sockel | **10×** Ø **32,8** × Tiefe **2,0** mm (Figuren-Sockel Ø32 + Spiel) |
| Sockel-Ring-Radius | 72 mm; 4 Sektoren über **Lücken** getrennt |
| Sektoren | **4 gleich große 90°-Sektoren**, symmetrisches **Kreuz** (Trennlinien bei 0/90/180/270); Sockel je Sektor gleichmäßig verteilt; Ring-Radius 88 mm |
| RACI-Verteilung | **R 3 · A 1 · C 4 · I 2** (= 10) |
| Labels | RESPONSIBLE/ACCOUNTABLE/CONSULTED/INFORMED **gleich groß**; Phasenname (z. B. **DESIGN**) in der Chip-Mulde |
| Action-Card-Halter | Steh-Schlitz **63 × 7 mm, 15 mm tief**, ~12° nach hinten geneigt (Karte 60 × 90), oben |
| Action-Card-Halter | Steh-Schlitz **70 × 5 mm, ~27 mm tief** (fast volle Höhe), ~12° geneigt (Karte 60 × 90), oben |
| Druck | **6×** je Phasenfarbe (Design/Transition/Operation/Support/Review + Gate-Rot) |
## Ehrliche Einordnung

View file

@ -22,12 +22,12 @@ Single isolated 3D-printable board-game part, centered, filling ~80% of the fram
### B1) Objekt-Block — MIT Beschriftung
```
The object is a single ROUND flat disc board (thin: thickness ≈ 1/15 of its diameter), ~210 mm across, with a softly chamfered rim. KEEP PROPORTIONS ACCURATE. In the EXACT CENTER: one large recessed circular WELL whose diameter is about ONE QUARTER of the board; the word "DESIGN" is engraved on the FLOOR of this central well, centered (and nowhere else). Around the center: ONE ring of ten shallow identical circular sockets — each socket LARGE, about TWO-THIRDS the diameter of the central well — grouped into FOUR sectors separated by clear empty gaps: 3, 1, 4 and 2 sockets (total 10). The TOP edge has an upright thin rectangular CARD-HOLDER SLOT (empty, slightly tilted back); the single ACCOUNTABLE socket sits at the top, its label engraved directly BELOW the card-holder slot. All FOUR sector labels — RESPONSIBLE, ACCOUNTABLE, CONSULTED, INFORMED — engraved in the SAME small, subtle font size, each near its own sector. No other text anywhere. Empty board: no tokens, no figures, no card inserted.
The object is a single ROUND flat disc board (thin: thickness ≈ 1/15 of its diameter), ~210 mm across, with a softly chamfered rim. KEEP PROPORTIONS ACCURATE. In the EXACT CENTER: one large recessed circular WELL whose diameter is about ONE QUARTER of the board; the word "DESIGN" is engraved on the FLOOR of this central well, centered (and nowhere else). Around the center: ONE ring of ten shallow identical circular sockets — each socket LARGE, about TWO-THIRDS the diameter of the central well — arranged in FOUR EQUAL sectors forming a symmetric CROSS — straight radial divider lines at the 12, 3, 6 and 9 o'clock positions split the ring into four equal quarters; within each sector the sockets are spread EVENLY. Counts: upper-left 3 (RESPONSIBLE), upper-right 1 (ACCOUNTABLE), lower-right 4 (CONSULTED), lower-left 2 (INFORMED) — total 10; the whole layout looks perfectly symmetric. A thin rectangular CARD-HOLDER SLOT (~70 mm long, ~5 mm wide, recessed deep, empty, slightly tilted back) sits at the very TOP on the 12 o'clock divider line, in the gap between the two upper sectors; ACCOUNTABLE's label is engraved just below the slot. All FOUR sector labels — RESPONSIBLE, ACCOUNTABLE, CONSULTED, INFORMED — engraved in the SAME small, subtle font size, each near its own sector. No other text anywhere. Empty board: no tokens, no figures, no card inserted.
```
### B2) Objekt-Block — TEXTFREI (für Meshy; Schriften später im CAD)
```
The object is a single ROUND flat disc board (thin: thickness ≈ 1/15 of its diameter), ~210 mm across, with a softly chamfered rim. KEEP PROPORTIONS ACCURATE. In the EXACT CENTER: one large recessed circular WELL whose diameter is about ONE QUARTER of the board, smooth and blank inside. Around the center: ONE ring of ten shallow identical circular sockets — each socket LARGE, about TWO-THIRDS the diameter of the central well — grouped into FOUR sectors separated by clear empty gaps: 3, 1, 4 and 2 sockets (total 10). The TOP edge has an upright thin rectangular CARD-HOLDER SLOT (empty, slightly tilted back). Absolutely NO text, NO letters, NO numbers, NO engraved words or symbols anywhere — all surfaces completely blank. Empty board: no tokens, no figures, no card inserted.
The object is a single ROUND flat disc board (thin: thickness ≈ 1/15 of its diameter), ~210 mm across, with a softly chamfered rim. KEEP PROPORTIONS ACCURATE. In the EXACT CENTER: one large recessed circular WELL whose diameter is about ONE QUARTER of the board, smooth and blank inside. Around the center: ONE ring of ten shallow identical circular sockets — each socket LARGE, about TWO-THIRDS the diameter of the central well — arranged in FOUR EQUAL sectors forming a symmetric CROSS — straight radial divider lines at the 12, 3, 6 and 9 o'clock positions split the ring into four equal quarters; within each sector the sockets are spread EVENLY; counts 3, 1, 4 and 2 (total 10); perfectly symmetric layout. A thin rectangular CARD-HOLDER SLOT (~70 mm long, ~5 mm wide, recessed deep, empty, slightly tilted back) sits at the very TOP on the 12 o'clock divider line, between the two upper sectors. Absolutely NO text, NO letters, NO numbers, NO engraved words or symbols anywhere — all surfaces completely blank. Empty board: no tokens, no figures, no card inserted.
```
### Kamera-Zeilen (eine anhängen) — Multi-View-Set für Meshy

View file

@ -7,30 +7,33 @@
import bpy, math, os
# ----------------------------- Parameter (mm) -----------------------------
R_BOARD, BASE_H = 104.0, 14.0
R_BOARD, BASE_H = 130.0, 14.0
EDGE_BEVEL, EDGE_SEG = 1.6, 3
CHIP_D, CHIP_DEP = 50.0, 2.2 # Mittelmulde Ø50 (Chip)
NOTCH_D = 14.0
SOCK_D, SOCK_DEP = 32.8, 2.0 # Figuren-Sockel Ø32 + 0,8 Spiel
RING_R = 72.0
RING_R = 88.0
PHASE_NAME, PHASE_COLOR = "DESIGN", (0.184, 0.502, 0.788, 1) # #2f80c9
# Sektor: Name, Label-Mittenwinkel, Sockel-Winkel (Grad; 90=oben, Top frei fuer Karte).
# Lücken zwischen den Sektoren (34-36°) > Lücken innerhalb (28°) -> Gruppen klar sichtbar.
# B+ : symmetrisches 90°-Kreuz (Trennlinien bei 0/90/180/270), Sektoren in den
# Diagonalen, Sockel je Sektor gleichmaessig ueber den Sektor verteilt. Karte oben.
SECTORS = [
("RESPONSIBLE", 150, [118, 150, 182]),
("ACCOUNTABLE", 66, [66]),
("CONSULTED", -34, [30, -2, -34, -66]),
("INFORMED", -118, [-102, -134]),
("RESPONSIBLE", 135, [98, 135, 172]),
("ACCOUNTABLE", 45, [45]),
("CONSULTED", -45, [-8, -33, -57, -82]),
("INFORMED", -135, [-98, -172]),
]
DIVIDERS = [0, 90, 180, 270]
WORD_R = RING_R + SOCK_D/2 + 9 # Labels ausserhalb der Sockel
WORD_SIZE, WORD_DEP = 6.0, 0.9
DESIGN_SIZE, DESIGN_DEP, DESIGN_POS = 9.0, 1.0, (0, -44)
DESIGN_SIZE, DESIGN_DEP, DESIGN_POS = 9.0, 1.0, (0, -48)
CARD_CY, CARD_BW, CARD_BD, CARD_BH = 82.0, 72.0, 20.0, 16.0
SLOT_W, SLOT_T, SLOT_DEPTH, SLOT_TILT = 63.0, 7.0, 15.0, 12.0
CARD_CY, CARD_BW, CARD_BD, CARD_BH = 116.0, 84.0, 22.0, 16.0
SLOT_W, SLOT_T, SLOT_DEPTH, SLOT_TILT = 70.0, 5.0, 27.0, 12.0 # tief bis ~3 mm vorm Boden
TOP = BASE_H
@ -72,9 +75,10 @@ def apply_bevel(obj, width=EDGE_BEVEL, seg=EDGE_SEG, ang=30):
bpy.context.view_layer.objects.active = obj
bpy.ops.object.modifier_apply(modifier=m.name)
def engrave(board, body, x, y, rotz=0, size=WORD_SIZE, dep=WORD_DEP):
def engrave(board, body, x, y, rotz=0, size=WORD_SIZE, dep=WORD_DEP, ztop=None):
z0 = (TOP if ztop is None else ztop) - dep
try:
bpy.ops.object.text_add(location=(x, y, TOP - dep))
bpy.ops.object.text_add(location=(x, y, z0))
t = bpy.context.object; t.data.body = body; t.data.size = size
t.data.extrude = dep + 1.5; t.data.align_x='CENTER'; t.data.align_y='CENTER'
t.rotation_euler = (0, 0, math.radians(rotz))
@ -101,7 +105,16 @@ for _, _, angles in SECTORS:
boolean(base, cyl(SOCK_D, 6, (RING_R*math.cos(math.radians(a)),
RING_R*math.sin(math.radians(a)), TOP - SOCK_DEP + 3)), 'DIFFERENCE')
# Action-Card-Schlitz (oben offen, 7 mm breit, 15 mm tief, leicht nach hinten geneigt)
# Sektor-Trennlinien — symmetrisches Kreuz (0/90/180/270), flach graviert
_di, _do = CHIP_D/2 + 5, RING_R + SOCK_D/2 + 6
for a in DIVIDERS:
g = cube(_do - _di, 2.6, 1.4, (0, 0, 0))
g.rotation_euler = (0, 0, math.radians(a))
g.location = (((_di+_do)/2)*math.cos(math.radians(a)),
((_di+_do)/2)*math.sin(math.radians(a)), TOP - 0.7)
boolean(base, g, 'DIFFERENCE')
# Action-Card-Schlitz (oben offen, 70x5 mm, tief bis ~3 mm vorm Boden, leicht geneigt)
_sb = BASE_H + CARD_BH - SLOT_DEPTH; _sh = SLOT_DEPTH + 20
slot = cube(SLOT_W, SLOT_T, _sh, (0, CARD_CY, _sb + _sh/2))
slot.rotation_euler = (math.radians(-SLOT_TILT), 0, 0); bpy.ops.object.transform_apply(rotation=True)
@ -114,12 +127,11 @@ boolean(base, rim, 'DIFFERENCE')
# Sektor-Labels (gleich gross): links/rechts vertikal, oben/unten waagerecht -> lesbar & passt
for name, wc, _ in SECTORS:
c = math.cos(math.radians(wc))
rot = -90 if c > 0.7 else (90 if c < -0.7 else 0)
rot = (wc - 90) if math.sin(math.radians(wc)) >= 0 else (wc + 90) # tangential, lesbar
engrave(base, name, WORD_R*math.cos(math.radians(wc)), WORD_R*math.sin(math.radians(wc)), rot)
# Phasenname unten im Innenkreis
engrave(base, PHASE_NAME, DESIGN_POS[0], DESIGN_POS[1], 0, DESIGN_SIZE, DESIGN_DEP)
# Phasenname in die Chip-Mulde (Boden) graviert — durch den klaren Chip sichtbar
engrave(base, PHASE_NAME, 0, 0, 0, DESIGN_SIZE, DESIGN_DEP, ztop=TOP - CHIP_DEP)
base.name = "RACI-Board"
try: bpy.ops.object.shade_auto_smooth(angle=math.radians(30))
@ -150,7 +162,7 @@ try:
bpy.ops.object.light_add(type='AREA', location=(-140, -60, 180))
bpy.context.object.data.energy = 9000; bpy.context.object.data.size = 320
bpy.ops.object.empty_add(location=(0, 0, 5)); tgt = bpy.context.object
bpy.ops.object.camera_add(location=(275, -345, 310)); cam = bpy.context.object
bpy.ops.object.camera_add(location=(330, -410, 370)); cam = bpy.context.object
cam.data.lens = 50
con = cam.constraints.new('TRACK_TO'); con.target = tgt
con.track_axis = 'TRACK_NEGATIVE_Z'; con.up_axis = 'UP_Y'

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1,016 KiB

After

Width:  |  Height:  |  Size: 1,021 KiB

Before After
Before After

View file

@ -1,172 +1,107 @@
// RACI-Konsolen-Board SLC-Workshop Tabletop · Einheiten: mm
// Quadratisches Premium-Board: zentrale Acryl-Chip-Mulde (Stations-/Gate-ID),
// 10 Figurenmulden im Ring, gruppiert in 4 RACI-Sektoren (R3 · A1 · C4 · I2),
// erhabene Trennstege, gravierte Sektor-Buchstaben + Wörter, gravierte Rand-Linie,
// stehender Action-Card-Halter (60x90) hinten.
// Druck: 6x in den Phasenfarben (5 Phasen + Gate-Rot). Einfarbig je Board (Filament).
// RACI-Konsolen-Board (rund, B+ symmetrisch) SLC-Workshop Tabletop · mm
// Pendant zum Blender-Modell (../blender/raci-board.py). Gleiche Maße.
// Rund Ø260, Mittelmulde Ø50 (Chip), 10 Sockel Ø32,8 in 4 gleich grossen 90°-Sektoren
// (symmetrisches Kreuz, Trennlinien 0/90/180/270), R3·A1·C4·I2, Sockel je Sektor
// gleichmaessig verteilt; Phasenname (DESIGN) im Mulden-Boden; Card-Schlitz 70x5, tief.
/* [Board] */
board_w = 210;
board_d = 210;
base_h = 10;
corner_r = 8;
cut_corner = 22; // gefaste Ecke (vorne rechts), Optik
board_r = 130; // Aussenradius (Ø260)
base_h = 14;
edge_cham = 2; // Fase obere Aussenkante
/* [Dial / Mitte] */
dial_cx = 0;
dial_cy = -15; // Scheibe etwas nach vorn -> Platz fuer Card-Halter hinten
chip_d = 40.6; // Acryl-Chip Ø40 + Spiel
chip_dep = 1.8; // Chip 2 mm steht ~0,2 vor (greifbar)
notch_r = 6; // Greifkerbe
/* [Mittelmulde / Chip] */
chip_d = 50;
chip_dep = 2.2;
notch_d = 14;
/* [Sockel] — Figuren-Sockel Ø24,5 -> Mulde Ø25,3 */
sock_d = 25.3;
sock_dep = 1.5;
sock_lead = 0.6;
ring_R = 48; // Radius Sockelkreis (Mitte-Mitte)
/* [Sockel] — Figuren-Sockel Ø32 + Spiel */
sock_d = 32.8;
sock_dep = 2.0;
sock_lead = 0.8;
ring_r = 88;
/* [Sektor-Trennstege] */
ridge_h = 2.6;
ridge_w = 3.2;
/* [Sektoren] — Name, Wort-Mittenwinkel, Sockelwinkel (Grad, 90=oben) */
// 4 gleich grosse 90°-Sektoren in den Diagonalen; Trennlinien-Kreuz bei 0/90/180/270.
SEC = [
["RESPONSIBLE", 135, [98, 135, 172]],
["ACCOUNTABLE", 45, [45]],
["CONSULTED", -45, [-8, -33, -57, -82]],
["INFORMED", -135, [-98, -172]],
];
DIV = [0, 90, 180, 270];
ridge_w = 2.6; ridge_dep = 1.4;
/* [Gravur] */
let_size = 11; // grosse R/A/C/I
let_dep = 0.9;
word_size = 5; // RESPONSIBLE ...
word_dep = 0.7;
border_inset = 7;
border_w = 1.6;
border_dep= 0.7;
word_size = 6; word_dep = 0.9;
word_r = ring_r + sock_d/2 + 9;
design_size = 9; design_dep = 1.0;
/* [Action-Card-Halter] (Karte 60x90, steht leicht nach hinten geneigt) */
card_w = 84; // Plinthen-Breite
card_block_d = 22;
card_block_h = 16;
card_cy = 78; // Position hinten
slot_w = 63; // Kartenbreite 60 + Spiel
slot_t = 4; // Kartendicke + Spiel
slot_tilt = 12; // Grad Neigung nach hinten
/* [Action-Card-Halter] */
card_cy = 116; card_bw = 84; card_bd = 22; card_bh = 16;
slot_w = 70; slot_t = 5; slot_depth = 27; slot_tilt = 12;
$fn = 64;
$fn = 128;
// 10 Sockel: Winkel ab oben (90°) im Uhrzeigersinn, 36° Schritt.
// Gruppen: A=[0] C=[1..4] I=[5,6] R=[7,8,9]
function ang(i) = 90 - i*36;
GROUP_A = [0];
GROUP_C = [1,2,3,4];
GROUP_I = [5,6];
GROUP_R = [7,8,9];
// Sektor-Mittenwinkel (fuer Buchstaben) und Grenzwinkel (fuer Trennstege)
A_mid = 90; C_mid = 0; I_mid = -108; R_mid = 162;
DIVIDERS = [72, -72, -144, 108];
module rrect(w, d, h, r) {
linear_extrude(h) offset(r) offset(-r) square([w, d], center=true);
}
module base_slab() {
difference() {
rrect(board_w, board_d, base_h, corner_r);
// gefaste Ecke vorne rechts
translate([board_w/2, -board_d/2, -1])
rotate([0,0,45]) cube([cut_corner, cut_corner, base_h+2], center=true);
// --- Grundkoerper (rund, Oberkante gefast) ---------------------------------
module board_blank() {
hull() {
cylinder(r = board_r - edge_cham, h = base_h);
cylinder(r = board_r, h = base_h - edge_cham);
}
}
module figure_socket(a, r=ring_R) {
x = dial_cx + r*cos(a); y = dial_cy + r*sin(a);
translate([x, y, base_h - sock_dep]) {
cylinder(d=sock_d, h=sock_dep + 0.2);
translate([0,0,sock_dep - sock_lead])
cylinder(d1=sock_d, d2=sock_d + 2*sock_lead, h=sock_lead + 0.1);
}
}
module chip_well() {
translate([dial_cx, dial_cy, base_h - chip_dep]) cylinder(d=chip_d, h=chip_dep + 0.2);
// Greifkerbe Richtung vorn
translate([dial_cx, dial_cy - chip_d/2, base_h - chip_dep])
cylinder(r=notch_r, h=chip_dep + 0.2);
}
module grooves() { // konzentrische Deko-Rillen im Innenfeld
for (rr = [23 : 2 : 34])
translate([dial_cx, dial_cy, base_h - 0.5])
linear_extrude(0.6)
difference() { circle(r=rr); circle(r=rr-0.8); }
}
module dividers() {
for (a = DIVIDERS) {
ri = chip_d/2 + 3; ro = ring_R + sock_d/2 + 4;
translate([dial_cx, dial_cy, base_h])
rotate([0,0,a])
translate([(ri+ro)/2, 0, ridge_h/2])
cube([ro-ri, ridge_w, ridge_h], center=true);
}
}
module letter(a, ch) {
rl = ring_R + 13;
x = dial_cx + rl*cos(a); y = dial_cy + rl*sin(a);
translate([x, y, base_h - let_dep])
linear_extrude(let_dep + 0.1)
text(ch, size=let_size, halign="center", valign="center",
font="DejaVu Sans:style=Bold");
}
module word(txt, x, y, rot) {
translate([x, y, base_h - word_dep])
rotate([0,0,rot])
linear_extrude(word_dep + 0.1)
text(txt, size=word_size, halign="center", valign="center");
}
module border_channel() {
translate([0,0, base_h - border_dep])
linear_extrude(border_dep + 0.1)
difference() {
offset(-border_inset) offset(corner_r) offset(-corner_r) square([board_w, board_d], center=true);
offset(-border_inset-border_w) offset(corner_r) offset(-corner_r) square([board_w, board_d], center=true);
}
}
module card_block() {
translate([0, card_cy, 0]) rrect(card_w, card_block_d, base_h + card_block_h, 4);
}
module card_slot() {
// oben offener Schlitz, leicht nach HINTEN geneigt; Boden bleibt ~3 mm stehen
translate([0, card_cy, 22])
rotate([-slot_tilt, 0, 0])
cube([slot_w, slot_t, 38], center=true);
translate([0, card_cy, (base_h + card_bh)/2])
cube([card_bw, card_bd, base_h + card_bh], center = true);
}
// --- Aussparungen ----------------------------------------------------------
module chip_well() {
translate([0, 0, base_h - chip_dep]) cylinder(d = chip_d, h = chip_dep + 0.1);
translate([0, -chip_d/2, base_h - chip_dep]) cylinder(d = notch_d, h = chip_dep + 0.1); // Greifkerbe
}
module figure_socket(a) {
x = ring_r*cos(a); y = ring_r*sin(a); z0 = base_h - sock_dep;
translate([x, y, z0]) {
cylinder(d = sock_d, h = sock_dep + 0.1);
translate([0,0,sock_dep - sock_lead]) cylinder(d1 = sock_d, d2 = sock_d + 2*sock_lead, h = sock_lead + 0.1);
}
}
module divider(a) { // flache Trennlinie (graviert)
di = chip_d/2 + 5; do = ring_r + sock_d/2 + 6; rmid = (di+do)/2;
translate([rmid*cos(a), rmid*sin(a), base_h - ridge_dep])
rotate([0,0,a])
linear_extrude(ridge_dep + 0.1) square([do-di, ridge_w], center = true);
}
module sector_label(txt, a) {
rot = (sin(a) >= 0) ? a - 90 : a + 90; // tangential, lesbar
translate([word_r*cos(a), word_r*sin(a), base_h - word_dep])
rotate([0,0,rot])
linear_extrude(word_dep + 0.1) text(txt, size = word_size, halign="center", valign="center");
}
module design_label() { // im Mulden-Boden
translate([0, 0, base_h - chip_dep - design_dep])
linear_extrude(design_dep + 0.1) text("DESIGN", size = design_size, halign="center", valign="center");
}
module card_slot() { // oben offen, tief, leicht nach hinten geneigt
sb = base_h + card_bh - slot_depth; sh = slot_depth + 20;
translate([0, card_cy, sb + sh/2]) rotate([-slot_tilt, 0, 0])
cube([slot_w, slot_t, sh], center = true);
}
// --- Zusammenbau -----------------------------------------------------------
module raci_board() {
difference() {
union() {
base_slab();
dividers();
card_block();
}
union() { board_blank(); card_block(); }
chip_well();
grooves();
for (i=[0:9]) figure_socket(ang(i));
// grosse Buchstaben
letter(A_mid, "A");
letter(C_mid, "C");
letter(I_mid, "I");
letter(R_mid, "R");
// Woerter
word("RESPONSIBLE", -ring_R-29, dial_cy+6, 90);
word("CONSULTED", ring_R+29, dial_cy+6, -90);
word("INFORMED", dial_cx, dial_cy - ring_R - 30, 0);
word("ACCOUNTABLE", dial_cx, card_cy - card_block_d/2 - 7, 0);
border_channel();
for (s = SEC) for (a = s[2]) figure_socket(a);
for (a = DIV) divider(a);
card_slot();
for (s = SEC) sector_label(s[0], s[1]);
design_label();
}
}
raci_board();
echo(board=[board_w, board_d, base_h], sockets=10, raci="R3 A1 C4 I2",
chip_well=chip_d, sock=sock_d);
echo(board_d = 2*board_r, base_h = base_h, chip = chip_d, sock = sock_d,
ring_r = ring_r, sockets = 10, card_slot = [slot_w, slot_t, slot_depth]);