...
This commit is contained in:
parent
61b6ec23eb
commit
96b86ce340
6 changed files with 117 additions and 170 deletions
|
|
@ -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
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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]);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue