1
0
Fork 0
mirror of https://github.com/imjasonh/terraform-playground synced 2026-07-08 07:44:57 +00:00

Thicker panels (default 12mm) and deeper notch (0.4mm web) for rigid panels with easy-bend hinges

Co-authored-by: Jason Hall <imjasonh@users.noreply.github.com>
This commit is contained in:
Cursor Agent 2026-06-15 00:58:05 +00:00
parent 79ec64d4c9
commit a8d9599e98
No known key found for this signature in database
5 changed files with 15 additions and 12 deletions

View file

@ -81,11 +81,11 @@ sudo apt-get install openscad # or https://openscad.org
## Usage ## Usage
```bash ```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 uv run generate.py
# pick your own size/depth and also render an STL # 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 # split into smaller pieces (≤ 20 faces each) for easier printing/handling
uv run generate.py --max-faces-per-piece 20 --stl uv run generate.py --max-faces-per-piece 20 --stl
@ -102,8 +102,8 @@ slice and print.
| Flag | Default | Meaning | | Flag | Default | Meaning |
|---|---|---| |---|---|---|
| `--edge` | `30` | edge length of every polygon (mm) — sets overall size | | `--edge` | `30` | edge length of every polygon (mm) — sets overall size |
| `--depth` / `--thickness` | `3` | plate depth / material thickness `T` (mm) | | `--depth` / `--thickness` | `12` | plate depth / material thickness `T` (mm) — thick, rigid panels |
| `--web` | `0.6` | living-hinge web left at the top of each groove (mm) | | `--web` | `0.4` | living-hinge web left at the top of each groove (mm), ~12 print layers |
| `--slack` | `6` | extra fold opening added to every groove (degrees) | | `--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) | | `--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 | | `--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. 1. **Orientation:** print the plate **inner (grooved) side down** on the bed.
Every bevel wall is within ~`γ` of vertical (< ~20°), so the grooves are Every bevel wall is within ~`γ` of vertical (< ~20°), so the grooves are
self-supporting — **no support material needed**. self-supporting — **no support material needed**.
2. **Material:** PLA/PETG work. The `web` is a living hinge: with a single fold 2. **Material:** PLA/PETG work. The default `--web 0.4` (≈12 layers at a
it survives easily. For repeated folding or brittle filament, increase 0.2 mm layer height) leaves a thin, easy-to-bend living hinge between the
`--web`, or reduce it toward ~0.4 mm for an easier fold. 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 3. **Fold** each hinge until the groove walls meet (or until the faces look
right). The grooves are valley folds toward the inner side. 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). 4. **Glue** the 59 seams (and the hinge grooves, if you want a rigid result).

View file

@ -32,9 +32,9 @@ def main(argv=None):
ap.add_argument("--edge", type=float, default=30.0, ap.add_argument("--edge", type=float, default=30.0,
help="edge length of every polygon, mm (default 30)") help="edge length of every polygon, mm (default 30)")
ap.add_argument("--depth", "--thickness", dest="depth", type=float, ap.add_argument("--depth", "--thickness", dest="depth", type=float,
default=3.0, help="plate depth / thickness, mm (default 3)") default=12.0, help="plate depth / thickness, mm (default 12)")
ap.add_argument("--web", type=float, default=0.6, ap.add_argument("--web", type=float, default=0.4,
help="living-hinge web thickness at the top, mm (default 0.6)") help="living-hinge web thickness at the top, mm (default 0.4)")
ap.add_argument("--slack", type=float, default=6.0, ap.add_argument("--slack", type=float, default=6.0,
help="extra fold opening added to every groove, deg (default 6)") help="extra fold opening added to every groove, deg (default 6)")
ap.add_argument("--over", type=float, default=0.4, ap.add_argument("--over", type=float, default=0.4,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Before After
Before After

View file

@ -42,8 +42,8 @@ import numpy as np
@dataclass @dataclass
class FoldParams: class FoldParams:
edge_mm: float = 30.0 # length of every polygon edge edge_mm: float = 30.0 # length of every polygon edge
thickness_mm: float = 3.0 # plate depth (T) thickness_mm: float = 12.0 # plate depth (T): thick, rigid panels
web_mm: float = 0.6 # living-hinge thickness left at the top 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) slack_deg: float = 6.0 # extra opening added to every fold (more room)
over_mm: float = 0.4 # run grooves slightly past each vertex 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 eps_mm: float = 0.05 # cut a hair below the bed for clean booleans