From cab17d08e9b6de8d8c1754b7b310789a40d37a05 Mon Sep 17 00:00:00 2001 From: luxick Date: Thu, 11 Jun 2026 17:00:04 +0200 Subject: [PATCH] Add latches to the lid --- Makefile | 2 +- README.md | 60 +++++++++++++--- docs/assembly.png | Bin 35148 -> 42025 bytes wargame_box.scad | 172 ++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 218 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 7baea9f..1dba9bf 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ SCAD = wargame_box.scad -PARTS = box lid insert +PARTS = box lid insert latch STLS = $(addprefix stl/,$(addsuffix .stl,$(PARTS))) all: $(STLS) diff --git a/README.md b/README.md index df5ab55..6ca4eeb 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ # Wargame Accessory Box & Dice Tray A parametric OpenSCAD box for carrying tabletop wargaming accessories. -Three printable parts: +Four printable parts: | Part | Purpose | |----------|--------------------------------------------------------------------| | `box` | Open tray. With the insert removed it doubles as a dice tray. | -| `lid` | Fully detachable friction-fit lid (no hinge to get in the way). | +| `lid` | Fully detachable lid, held shut by snap latches hinged on filament pins (or a classic friction fit). | +| `latch` | One-piece snap latch — print two per latch position. | | `insert` | Removable compartment tray for tokens, measuring tapes, etc. | ![Assembly](docs/assembly.png) @@ -19,14 +20,50 @@ the free space in your backpack — they are **outer** dimensions and measured space exactly. Pick what to render with the `part` variable (or the customizer): -`assembly` (exploded preview), `box`, `lid`, `insert`, `print`. +`assembly` (exploded preview), `box`, `lid`, `insert`, `latch`, `print`. Or export everything from the command line: ```sh -make # exports stl/box.stl, stl/lid.stl, stl/insert.stl +make # exports stl/box.stl, stl/lid.stl, stl/insert.stl, stl/latch.stl ``` +## The latch lid + +By default (`lid_style = "latch"`) the lid is held shut by snap +latches that hinge on short pieces of filament: + +* The **lid** carries pairs of lugs along its front and back edges. +* Each **latch** is a single printed part with a pivot barrel that + fits between a lug pair. Its window snaps over a chamfered catch + bar on the box wall; pull the flared tip outward to open. +* To assemble one latch: cut a ~23 mm piece of 1.75 mm filament, + slide it through lug → latch barrel → lug, and fix it with a drop + of glue **on the outer lug holes only** — the lug holes are sized + tight and the barrel hole loose, so the latch keeps pivoting + freely. Trim the pin flush. + +Tuning knobs (all per side unless noted): + +* `latches_per_side` — how many latches on each long wall + (default 2, evenly spread). +* `catch_proud` — how far the catch bar sticks out = how hard the + snap is (default 1.4 mm). +* `latch_play` — vertical play between latch and catch bar + (default 0.1 mm). Use a small negative value to preload the lid + shut. +* `filament_d` — hinge pin diameter, in case you want to use + 2.85 mm filament or a piece of wire instead. + +Note: lugs and latches stick out about 7 mm beyond the box on the +front and back, so allow `total_y + 14` of space in the backpack. +With latches doing the holding, a looser lip (`lid_clearance` around +0.3–0.4) makes the lid pleasant to take off. + +Prefer the original hinge-free push-fit lid? Set +`lid_style = "friction"` and you get the old behaviour, including +the thumb grooves for prying the lid off. + ## Configuring the insert layout Compartments are defined by the `layout` list, one entry per row @@ -55,10 +92,13 @@ of the automatic height and print two with different layouts. ## How the parts work together * The **lid** is a flat plate with a lip that plugs into the box opening. - `lid_clearance` (default 0.2 mm per side) controls the friction fit — - print a test fit and adjust for your printer/material. Shallow thumb - grooves on the box's front and back walls let you pry the lid off; they - do **not** pierce the wall, so the dice tray stays fully closed. + With the latch lid the lip just aligns the lid (and keeps tokens in + their compartments); with `lid_style = "friction"` it carries the + whole fit. `lid_clearance` (default 0.2 mm per side) controls how + snug it is — print a test fit and adjust for your printer/material. + In friction mode, shallow thumb grooves on the box's front and back + walls let you pry the lid off; they do **not** pierce the wall, so + the dice tray stays fully closed. * The **insert** sits below the lid's lip, so the lip also keeps loose tokens from jumping compartments in the bag. Finger notches on its short walls let you lift it straight out; then the empty box is your @@ -68,7 +108,9 @@ of the automatic height and print two with different layouts. ## Printing notes * No supports needed for any part. Print all parts flat side down - (the lid prints plate-down, lip up). + (the lid prints plate-down, lip and lugs up). The latch prints + standing on its flat side — that gives a clean pivot hole and puts + the layer lines along the strip, where the snap stress is. * PLA or PETG, 2–3 perimeters, ~10 % infill (the parts are mostly walls). * If the lid is too tight/loose, tune `lid_clearance` in steps of 0.05 mm. Same for the insert with `insert_clearance` (looser is fine there — diff --git a/docs/assembly.png b/docs/assembly.png index cdf99669f645082fb7833a0d16c427bb8caabb42..6ba8e212b80d2d4e5f4c627710ab7a4b86c172b4 100644 GIT binary patch literal 42025 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 literal 35148 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 diff --git a/wargame_box.scad b/wargame_box.scad index 31674bb..20d0b50 100644 --- a/wargame_box.scad +++ b/wargame_box.scad @@ -1,9 +1,11 @@ // ============================================================ // Wargame Accessory Box & Dice Tray // ------------------------------------------------------------ -// Three printable parts: +// Printable parts: // * box - open tray, doubles as a dice tray -// * lid - fully detachable friction-fit lid +// * lid - fully detachable lid, held shut by snap latches +// hinged on filament pins (or classic friction fit) +// * latch - one-piece snap latch (print 2 per latch position) // * insert - removable compartment tray (configurable layout) // // Set `part` below (or via customizer / -D on the CLI) to @@ -12,7 +14,7 @@ // ============================================================ /* [What to render] */ -part = "assembly"; // [assembly, box, lid, insert, print] +part = "assembly"; // [assembly, box, lid, insert, latch, print] /* [Outer dimensions (must fit the backpack)] */ // Total outer width (X), including walls @@ -39,16 +41,39 @@ tray_chamfer = 6; // Thickness of the flat lid plate lid_top = 2.4; // Height of the lip that plugs into the box opening -lip_h = 10; +lip_h = 5; // Lip wall thickness lip_t = 2.0; // Gap per side between lip and box wall. // Tune for your printer: smaller = tighter friction fit. +// With lid_style = "latch" the latches do the holding, so a +// looser 0.3 - 0.4 makes the lid easy to take off. lid_clearance = 0.20; // Thumb groove on the box's outer walls to pry the lid off -// (does NOT pierce the wall, dice tray stays closed) +// (friction lid only; latches replace it) thumb_grooves = true; +/* [Latches] */ +// How the lid is held shut. "latch": snap latches hinged on +// short pieces of filament (see README). "friction": original +// push fit. +lid_style = "latch"; // [latch, friction] +// Latches per long (front/back) wall, spread out evenly +latches_per_side = 2; +// Diameter of the filament used as hinge pin +filament_d = 1.75; +// Latch strip width +latch_w = 12; +// Latch strip thickness (thinner = softer snap) +latch_t = 2.0; +// Catch bar distance below the box rim +catch_drop = 14; +// Catch bar protrusion from the wall = snap engagement +catch_proud = 1.4; +// Vertical play between latch window and catch bar. +// Negative values preload the lid shut. +latch_play = 0.1; + /* [Insert] */ // Gap per side between insert and box wall insert_clearance = 0.40; @@ -103,6 +128,36 @@ ins_h = insert_h_override > 0 lip_x = inner_x - 2 * lid_clearance; // lid lip outer size lip_y = inner_y - 2 * lid_clearance; +// --- latch hinge internals --- +lug_w = 5; // lid lug width (each side) +hinge_gap = 0.4; // side play lug <-> latch +pin_boss_r = filament_d / 2 + 2.3; // lug / barrel outer radius +pin_standoff = pin_boss_r + 0.4; // pin axis to wall face +lug_hole_d = filament_d + 0.15; // tight: pin glued into lugs +barrel_hole_d = filament_d + 0.35; // loose: latch pivots freely +latch_gap = 0.4; // latch strip to wall face +bar_h = 2.8; // catch bar height +bar_rise = 1.2; // straight part below chamfer +window_rail = 3; // strip rails beside window +window_w = latch_w - 2 * window_rail; +bar_len = window_w - 0.8; +grip_l = 6; // thumb flare below window + +z_pin = box_h + lid_top - pin_boss_r; // hinge axis, lid closed +z_bar_top = box_h - catch_drop; +// latch window, measured down the strip from the pin axis +win_t1 = z_pin - z_bar_top - 0.4; +win_t2 = z_pin - z_bar_top + bar_h + latch_play; +latch_len = win_t2 + 4 + grip_l; // pin axis to latch tip + +function latch_pos_x() = + latches_per_side <= 0 ? [] + : [for (i = [1 : latches_per_side]) + total_x * i / (latches_per_side + 1)]; + +assert(lid_style != "latch" || z_pin - latch_len > 2, + "box too shallow for the latch: reduce catch_drop"); + // ------------------------------------------------------------ // Helpers // ------------------------------------------------------------ @@ -141,7 +196,7 @@ module box() { } if (tray_chamfer > 0) tray_chamfers(); } - if (thumb_grooves) + if (thumb_grooves && lid_style == "friction") for (m = [0, 1]) translate([total_x / 2, m == 0 ? -(14 - groove_depth) @@ -149,6 +204,25 @@ module box() { box_h - 16]) cylinder(h = 20, d = 28, $fn = 48); } + if (lid_style == "latch") + for (x0 = latch_pos_x()) { + translate([x0, 0, z_bar_top]) catch_bar(); + translate([x0, total_y, z_bar_top]) + mirror([0, 1, 0]) catch_bar(); + } +} + +// catch bar on the outer wall: origin on the wall face with the +// bar top at z = 0, protruding in -y. Chamfered on top so the +// latch rides over it, flat below so the latch can't cam out. +module catch_bar() { + translate([-bar_len / 2, 0, 0]) + rotate([90, 0, 90]) + linear_extrude(bar_len) + polygon([[0, 0], + [-catch_proud, -bar_h + bar_rise], + [-catch_proud, -bar_h], + [0, -bar_h]]); } module tray_chamfers() { @@ -203,6 +277,77 @@ module lid() { rbox(lip_x - 2 * lip_t, lip_y - 2 * lip_t, lip_h + 1, max(inner_r - lip_t, 0.1)); } + if (lid_style == "latch") + for (x0 = latch_pos_x()) { + translate([x0, 0, 0]) lug_pair(); + translate([x0, total_y, 0]) mirror([0, 1, 0]) lug_pair(); + } +} + +// ------------------------------------------------------------ +// Latch hardware +// ------------------------------------------------------------ +// One-piece snap latch hinged on a short piece of filament: the +// lid carries two lugs, the latch barrel sits between them, and +// the filament pin is glued into the (tighter) lug holes only, +// so the latch pivots freely. The window in the strip snaps +// over the catch bar on the box wall. + +// one lid lug, centered on x = 0 at the lid edge y = 0, hanging +// outward in -y. Modeled in lid print orientation, so the pin +// boss rests flat on the bed. +module lid_lug() { + difference() { + hull() { + translate([-lug_w / 2, -pin_standoff, pin_boss_r]) + rotate([0, 90, 0]) cylinder(r = pin_boss_r, h = lug_w); + translate([-lug_w / 2, 0, 0]) cube([lug_w, 2, lid_top]); + } + translate([-lug_w / 2 - 1, -pin_standoff, pin_boss_r]) + rotate([0, 90, 0]) cylinder(d = lug_hole_d, h = lug_w + 2); + } +} + +module lug_pair() { + off = latch_w / 2 + hinge_gap + lug_w / 2; + for (sx = [-1, 1]) translate([sx * off, 0, 0]) lid_lug(); +} + +// modeled flat: x = down the strip from the pin axis, y = away +// from the box wall, z = width. Prints standing on that flat +// face -> clean pivot hole and layer lines along the strip. +module latch() { + u0 = latch_gap; // inner face (toward the wall) + u1 = latch_gap + latch_t; // outer face + flare = 2.5; + difference() { + linear_extrude(latch_w) { + // pivot barrel + translate([0, pin_standoff]) circle(r = pin_boss_r); + polygon([ + [0, u0], + [latch_len - 2, u0], + [latch_len, u0 + 1.4], // tip chamfer, rides + [latch_len, u1 + flare], // over the catch bar + [latch_len - 2, u1 + flare], // thumb flare to open + [win_t2 + 4, u1], + [0, u1] + ]); + } + // pivot hole + translate([0, pin_standoff, -1]) + cylinder(d = barrel_hole_d, h = latch_w + 2); + // window that snaps over the catch bar + translate([win_t1, -1, window_rail]) + cube([win_t2 - win_t1, u1 + flare + 2, window_w]); + } +} + +// latch in closed/engaged position on the front wall (y = 0) +module placed_latch(x0) { + translate([x0, 0, z_pin]) + rotate([0, 0, 180]) rotate([0, 90, 0]) + translate([0, 0, -latch_w / 2]) latch(); } // ------------------------------------------------------------ @@ -263,14 +408,29 @@ module assembly() { color("LightGreen", 0.7) translate([0, total_y, box_h + ins_h + 25]) rotate([180, 0, 0]) translate([0, 0, -lid_top]) lid(); + // latches hang from the floating lid's lugs + if (lid_style == "latch") + color("Tomato") + translate([0, 0, ins_h + 25]) + for (x0 = latch_pos_x()) { + placed_latch(x0); + translate([0, total_y, 0]) + mirror([0, 1, 0]) placed_latch(x0); + } } if (part == "box") box(); else if (part == "lid") lid(); else if (part == "insert") insert(); +else if (part == "latch") latch(); else if (part == "print") { box(); translate([total_x + 15, 0, 0]) lid(); translate([0, total_y + 15, 0]) insert(); + if (lid_style == "latch" && latches_per_side > 0) + for (i = [0 : 2 * latches_per_side - 1]) + translate([total_x + 15 + pin_boss_r, + total_y + 15 + i * (2 * pin_boss_r + 4), 0]) + latch(); } else assembly();