From a8d9599e988514e72a1cdc37d08acf39f9acb3db Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 15 Jun 2026 00:58:05 +0000 Subject: [PATCH] Thicker panels (default 12mm) and deeper notch (0.4mm web) for rigid panels with easy-bend hinges Co-authored-by: Jason Hall --- snub-dodecahedron/README.md | 17 ++++++++++------- snub-dodecahedron/generate.py | 6 +++--- snub-dodecahedron/images/groove_profile.png | Bin 2582 -> 4562 bytes snub-dodecahedron/images/plate_3d.png | Bin 19235 -> 23109 bytes snub-dodecahedron/scadgen.py | 4 ++-- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/snub-dodecahedron/README.md b/snub-dodecahedron/README.md index edde09a..3b55a18 100644 --- a/snub-dodecahedron/README.md +++ b/snub-dodecahedron/README.md @@ -81,11 +81,11 @@ sudo apt-get install openscad # or https://openscad.org ## Usage ```bash -# default: 30 mm edges, 3 mm thick, single net, writes out/snub_net.scad + preview +# default: 30 mm edges, 12 mm thick, single net, writes out/snub_net.scad + preview uv run generate.py # pick your own size/depth and also render an STL -uv run generate.py --edge 35 --depth 4 --web 0.6 --slack 6 --stl +uv run generate.py --edge 35 --depth 14 --web 0.4 --slack 6 --stl # split into smaller pieces (≤ 20 faces each) for easier printing/handling uv run generate.py --max-faces-per-piece 20 --stl @@ -102,8 +102,8 @@ slice and print. | Flag | Default | Meaning | |---|---|---| | `--edge` | `30` | edge length of every polygon (mm) — sets overall size | -| `--depth` / `--thickness` | `3` | plate depth / material thickness `T` (mm) | -| `--web` | `0.6` | living-hinge web left at the top of each groove (mm) | +| `--depth` / `--thickness` | `12` | plate depth / material thickness `T` (mm) — thick, rigid panels | +| `--web` | `0.4` | living-hinge web left at the top of each groove (mm), ~1–2 print layers | | `--slack` | `6` | extra fold opening added to every groove (degrees) | | `--over` | `0.4` | run grooves this far past each vertex for a clean fold (mm) | | `--max-faces-per-piece` | — | split the net into pieces of at most N faces | @@ -117,9 +117,12 @@ slice and print. 1. **Orientation:** print the plate **inner (grooved) side down** on the bed. Every bevel wall is within ~`γ` of vertical (< ~20°), so the grooves are self-supporting — **no support material needed**. -2. **Material:** PLA/PETG work. The `web` is a living hinge: with a single fold - it survives easily. For repeated folding or brittle filament, increase - `--web`, or reduce it toward ~0.4 mm for an easier fold. +2. **Material:** PLA/PETG work. The default `--web 0.4` (≈1–2 layers at a + 0.2 mm layer height) leaves a thin, easy-to-bend living hinge between the + thick rigid panels. Set your slicer's layer height so the web is a whole + number of layers (e.g. 0.4 mm web at 0.2 mm layers). For repeated folding or + brittle filament, increase `--web`; for an even easier single fold, drop it + toward one layer. 3. **Fold** each hinge until the groove walls meet (or until the faces look right). The grooves are valley folds toward the inner side. 4. **Glue** the 59 seams (and the hinge grooves, if you want a rigid result). diff --git a/snub-dodecahedron/generate.py b/snub-dodecahedron/generate.py index 0bdf239..75cfc24 100644 --- a/snub-dodecahedron/generate.py +++ b/snub-dodecahedron/generate.py @@ -32,9 +32,9 @@ def main(argv=None): ap.add_argument("--edge", type=float, default=30.0, help="edge length of every polygon, mm (default 30)") ap.add_argument("--depth", "--thickness", dest="depth", type=float, - default=3.0, help="plate depth / thickness, mm (default 3)") - ap.add_argument("--web", type=float, default=0.6, - help="living-hinge web thickness at the top, mm (default 0.6)") + default=12.0, help="plate depth / thickness, mm (default 12)") + ap.add_argument("--web", type=float, default=0.4, + help="living-hinge web thickness at the top, mm (default 0.4)") ap.add_argument("--slack", type=float, default=6.0, help="extra fold opening added to every groove, deg (default 6)") ap.add_argument("--over", type=float, default=0.4, diff --git a/snub-dodecahedron/images/groove_profile.png b/snub-dodecahedron/images/groove_profile.png index ce85926b5124ebcbfd31c4c35830d4050cd76b0c..ee5cf110c3ab80901f4c179f4b1222562ee6f3a3 100644 GIT binary patch literal 4562 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 literal 19235 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 G-u_=V!zVES diff --git a/snub-dodecahedron/scadgen.py b/snub-dodecahedron/scadgen.py index b9d2947..e4b05f0 100644 --- a/snub-dodecahedron/scadgen.py +++ b/snub-dodecahedron/scadgen.py @@ -42,8 +42,8 @@ import numpy as np @dataclass class FoldParams: edge_mm: float = 30.0 # length of every polygon edge - thickness_mm: float = 3.0 # plate depth (T) - web_mm: float = 0.6 # living-hinge thickness left at the top + thickness_mm: float = 12.0 # plate depth (T): thick, rigid panels + web_mm: float = 0.4 # living-hinge thickness left at the top (~2 layers) slack_deg: float = 6.0 # extra opening added to every fold (more room) over_mm: float = 0.4 # run grooves slightly past each vertex eps_mm: float = 0.05 # cut a hair below the bed for clean booleans