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) ## Spec (Maße — der „Vertrag", gilt in jedem Tool)
| Element | Wert | | 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) | | Mittelmulde (Chip) | Ø **50** × Tiefe **2,2** mm (+ Greifkerbe Ø14) |
| Figuren-Sockel | **10×** Ø **32,8** × Tiefe **2,0** mm (Figuren-Sockel Ø32 + Spiel) | | 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) | | 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 | | 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) | | Druck | **6×** je Phasenfarbe (Design/Transition/Operation/Support/Review + Gate-Rot) |
## Ehrliche Einordnung ## 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 ### 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) ### 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 ### Kamera-Zeilen (eine anhängen) — Multi-View-Set für Meshy

View file

@ -7,30 +7,33 @@
import bpy, math, os import bpy, math, os
# ----------------------------- Parameter (mm) ----------------------------- # ----------------------------- 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 EDGE_BEVEL, EDGE_SEG = 1.6, 3
CHIP_D, CHIP_DEP = 50.0, 2.2 # Mittelmulde Ø50 (Chip) CHIP_D, CHIP_DEP = 50.0, 2.2 # Mittelmulde Ø50 (Chip)
NOTCH_D = 14.0 NOTCH_D = 14.0
SOCK_D, SOCK_DEP = 32.8, 2.0 # Figuren-Sockel Ø32 + 0,8 Spiel 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 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). # 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. # 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 = [ SECTORS = [
("RESPONSIBLE", 150, [118, 150, 182]), ("RESPONSIBLE", 135, [98, 135, 172]),
("ACCOUNTABLE", 66, [66]), ("ACCOUNTABLE", 45, [45]),
("CONSULTED", -34, [30, -2, -34, -66]), ("CONSULTED", -45, [-8, -33, -57, -82]),
("INFORMED", -118, [-102, -134]), ("INFORMED", -135, [-98, -172]),
] ]
DIVIDERS = [0, 90, 180, 270]
WORD_R = RING_R + SOCK_D/2 + 9 # Labels ausserhalb der Sockel WORD_R = RING_R + SOCK_D/2 + 9 # Labels ausserhalb der Sockel
WORD_SIZE, WORD_DEP = 6.0, 0.9 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 CARD_CY, CARD_BW, CARD_BD, CARD_BH = 116.0, 84.0, 22.0, 16.0
SLOT_W, SLOT_T, SLOT_DEPTH, SLOT_TILT = 63.0, 7.0, 15.0, 12.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 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.context.view_layer.objects.active = obj
bpy.ops.object.modifier_apply(modifier=m.name) 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: 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 = 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.data.extrude = dep + 1.5; t.data.align_x='CENTER'; t.data.align_y='CENTER'
t.rotation_euler = (0, 0, math.radians(rotz)) 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)), 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') 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 _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 = 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) 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 # Sektor-Labels (gleich gross): links/rechts vertikal, oben/unten waagerecht -> lesbar & passt
for name, wc, _ in SECTORS: for name, wc, _ in SECTORS:
c = math.cos(math.radians(wc)) rot = (wc - 90) if math.sin(math.radians(wc)) >= 0 else (wc + 90) # tangential, lesbar
rot = -90 if c > 0.7 else (90 if c < -0.7 else 0)
engrave(base, name, WORD_R*math.cos(math.radians(wc)), WORD_R*math.sin(math.radians(wc)), rot) engrave(base, name, WORD_R*math.cos(math.radians(wc)), WORD_R*math.sin(math.radians(wc)), rot)
# Phasenname unten im Innenkreis # Phasenname in die Chip-Mulde (Boden) graviert — durch den klaren Chip sichtbar
engrave(base, PHASE_NAME, DESIGN_POS[0], DESIGN_POS[1], 0, DESIGN_SIZE, DESIGN_DEP) engrave(base, PHASE_NAME, 0, 0, 0, DESIGN_SIZE, DESIGN_DEP, ztop=TOP - CHIP_DEP)
base.name = "RACI-Board" base.name = "RACI-Board"
try: bpy.ops.object.shade_auto_smooth(angle=math.radians(30)) 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.ops.object.light_add(type='AREA', location=(-140, -60, 180))
bpy.context.object.data.energy = 9000; bpy.context.object.data.size = 320 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.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 cam.data.lens = 50
con = cam.constraints.new('TRACK_TO'); con.target = tgt con = cam.constraints.new('TRACK_TO'); con.target = tgt
con.track_axis = 'TRACK_NEGATIVE_Z'; con.up_axis = 'UP_Y' 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 // RACI-Konsolen-Board (rund, B+ symmetrisch) SLC-Workshop Tabletop · mm
// Quadratisches Premium-Board: zentrale Acryl-Chip-Mulde (Stations-/Gate-ID), // Pendant zum Blender-Modell (../blender/raci-board.py). Gleiche Maße.
// 10 Figurenmulden im Ring, gruppiert in 4 RACI-Sektoren (R3 · A1 · C4 · I2), // Rund Ø260, Mittelmulde Ø50 (Chip), 10 Sockel Ø32,8 in 4 gleich grossen 90°-Sektoren
// erhabene Trennstege, gravierte Sektor-Buchstaben + Wörter, gravierte Rand-Linie, // (symmetrisches Kreuz, Trennlinien 0/90/180/270), R3·A1·C4·I2, Sockel je Sektor
// stehender Action-Card-Halter (60x90) hinten. // gleichmaessig verteilt; Phasenname (DESIGN) im Mulden-Boden; Card-Schlitz 70x5, tief.
// Druck: 6x in den Phasenfarben (5 Phasen + Gate-Rot). Einfarbig je Board (Filament).
/* [Board] */ /* [Board] */
board_w = 210; board_r = 130; // Aussenradius (Ø260)
board_d = 210; base_h = 14;
base_h = 10; edge_cham = 2; // Fase obere Aussenkante
corner_r = 8;
cut_corner = 22; // gefaste Ecke (vorne rechts), Optik
/* [Dial / Mitte] */ /* [Mittelmulde / Chip] */
dial_cx = 0; chip_d = 50;
dial_cy = -15; // Scheibe etwas nach vorn -> Platz fuer Card-Halter hinten chip_dep = 2.2;
chip_d = 40.6; // Acryl-Chip Ø40 + Spiel notch_d = 14;
chip_dep = 1.8; // Chip 2 mm steht ~0,2 vor (greifbar)
notch_r = 6; // Greifkerbe
/* [Sockel] — Figuren-Sockel Ø24,5 -> Mulde Ø25,3 */ /* [Sockel] — Figuren-Sockel Ø32 + Spiel */
sock_d = 25.3; sock_d = 32.8;
sock_dep = 1.5; sock_dep = 2.0;
sock_lead = 0.6; sock_lead = 0.8;
ring_R = 48; // Radius Sockelkreis (Mitte-Mitte) ring_r = 88;
/* [Sektor-Trennstege] */ /* [Sektoren] — Name, Wort-Mittenwinkel, Sockelwinkel (Grad, 90=oben) */
ridge_h = 2.6; // 4 gleich grosse 90°-Sektoren in den Diagonalen; Trennlinien-Kreuz bei 0/90/180/270.
ridge_w = 3.2; 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] */ /* [Gravur] */
let_size = 11; // grosse R/A/C/I word_size = 6; word_dep = 0.9;
let_dep = 0.9; word_r = ring_r + sock_d/2 + 9;
word_size = 5; // RESPONSIBLE ... design_size = 9; design_dep = 1.0;
word_dep = 0.7;
border_inset = 7;
border_w = 1.6;
border_dep= 0.7;
/* [Action-Card-Halter] (Karte 60x90, steht leicht nach hinten geneigt) */ /* [Action-Card-Halter] */
card_w = 84; // Plinthen-Breite card_cy = 116; card_bw = 84; card_bd = 22; card_bh = 16;
card_block_d = 22; slot_w = 70; slot_t = 5; slot_depth = 27; slot_tilt = 12;
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
$fn = 64; $fn = 128;
// 10 Sockel: Winkel ab oben (90°) im Uhrzeigersinn, 36° Schritt. // --- Grundkoerper (rund, Oberkante gefast) ---------------------------------
// Gruppen: A=[0] C=[1..4] I=[5,6] R=[7,8,9] module board_blank() {
function ang(i) = 90 - i*36; hull() {
GROUP_A = [0]; cylinder(r = board_r - edge_cham, h = base_h);
GROUP_C = [1,2,3,4]; cylinder(r = board_r, h = base_h - edge_cham);
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);
} }
} }
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() { module card_block() {
translate([0, card_cy, 0]) rrect(card_w, card_block_d, base_h + card_block_h, 4); translate([0, card_cy, (base_h + card_bh)/2])
} cube([card_bw, card_bd, base_h + card_bh], center = true);
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);
} }
// --- 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() { module raci_board() {
difference() { difference() {
union() { union() { board_blank(); card_block(); }
base_slab();
dividers();
card_block();
}
chip_well(); chip_well();
grooves(); for (s = SEC) for (a = s[2]) figure_socket(a);
for (i=[0:9]) figure_socket(ang(i)); for (a = DIV) divider(a);
// 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();
card_slot(); card_slot();
for (s = SEC) sector_label(s[0], s[1]);
design_label();
} }
} }
raci_board(); raci_board();
echo(board=[board_w, board_d, base_h], sockets=10, raci="R3 A1 C4 I2", echo(board_d = 2*board_r, base_h = base_h, chip = chip_d, sock = sock_d,
chip_well=chip_d, sock=sock_d); ring_r = ring_r, sockets = 10, card_slot = [slot_w, slot_t, slot_depth]);