Compare commits

...

2 Commits

Author SHA1 Message Date
Julien Calixte
d63a66f4cf docs(case): document the plan section and embed its render 2026-07-11 08:46:47 +02:00
Julien Calixte
e28a6a6d19 feat(case): add exploded horizontal plan section
New `show="plan"` lifts the deck/screen half off the cavity half so the
board layout reads at a glance — standoffs, corner posts, ports, and the
internal FPC clearance. Tunable via `plan_z` and `explode`.
2026-07-11 08:46:47 +02:00
3 changed files with 36 additions and 5 deletions

View File

@@ -41,7 +41,8 @@ openscad -o renders/assembled.png --imgsize=1100,825 --colorscheme=Tomorrow \
openscad -o body.stl -D 'show="body"' typoena-case.scad
```
`show` accepts `assembled` · `body` · `bracket` · `baseplate` · `print_plate`.
`show` accepts `assembled` · `body` · `bracket` · `baseplate` · `print_plate` ·
`section` (vertical cut) · `plan` (horizontal cut into the cavity).
## Dimensions
@@ -118,6 +119,13 @@ from below — far easier than fishing screws inside a shell.
![The baseplate — four standoffs for the ESP32 (centre) and two for the DESPI-C579 breakout (left, under the FPC exit); mount at the bench, then close from below](renders/baseplate.png)
Exploded horizontal section (`show="plan"`) — the deck/screen half lifts off
the cavity half so you see both at once: ESP32 standoffs centre, DESPI-C579
standoffs left under the FPC exit, the two back corner posts, and the three
port openings in the back wall.
![Exploded plan section: deck/screen half lifted above the cavity half — standoffs, corner posts, back-wall ports](renders/plan.png)
### Assembly order
1. Lay glass into the deck recess (from inside), add the foam gasket, screw the

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@@ -18,10 +18,11 @@
// "bracket" the screen retaining frame (print flat)
// "baseplate" the chassis / bottom cover (print flat)
// "print_plate" all printed parts laid out side by side
// "section" midline cross-section: how the screen is trapped
// "section" vertical cross-section: how the screen is trapped
// "plan" exploded horizontal section: deck lifted off the cavity
// ============================================================================
show = "section";
show = "plan";
$fn = 48;
// ---- body envelope --------------------------------------------------------
@@ -280,6 +281,14 @@ module placed_foam() {
on_deck() translate([screen_off, screen_cy+screen_off, -lip_t-G_t-foam_t])
color(C_foam) foam();
}
// full coloured assembly, reused by the exploded plan section
module plan_assembly() {
color(C_body) case_body();
ghost_screen();
placed_foam();
placed_bracket();
translate([0,0,-0.01]) color(C_plate) baseplate();
}
if (show == "assembled") {
color(C_body) case_body();
@@ -297,7 +306,7 @@ if (show == "assembled") {
translate([W+30, 0, 0]) color(C_plate) baseplate();
translate([W+30, D+30, foot_h]) color(C_bracket) bracket();
} else if (show == "section") {
// slice away the +X half: the cut face shows the screen clamp, and the
// VERTICAL slice (remove +X half): cut face shows the screen clamp, and the
// retained LEFT half exposes the internal FPC clearance behind the bezel
difference() {
union() {
@@ -309,4 +318,18 @@ if (show == "assembled") {
}
translate([W/2, -30, -70]) cube([W, D+60, 220]);
}
}
} else if (show == "plan") {
// HORIZONTAL slice at plan_z, shown EXPLODED: the bottom half (cavity —
// baseplate standoffs, corner posts, back-wall ports) stays put; the top
// half (deck, screen, bracket) lifts up so you see both sides of the cut.
plan_z = 30;
explode = 62;
intersection() { // bottom: the cavity
plan_assembly();
translate([-60, -60, plan_z-200]) cube([W+120, D+120, 200]);
}
translate([0, 0, explode]) intersection() { // top: the deck, lifted
plan_assembly();
translate([-60, -60, plan_z]) cube([W+120, D+120, 200]);
}
}