nozzle: large-format sizes 1.0-2.0 mm, and a nozzle guide -- the same scaling rule (a 2.0 nozzle builds a 5 mm wall); layer height stays capped at 0.6

From Per Hjort's #210, which took nozzles up to 3 mm (2.0 here, see the review fix). Layer height stays at
0.6: the gap, flanges and pad are fixed heights tuned for thin layers. The
guide (docs/NOZZLE.md, adapted from #210's) lists the widths per size, the
limits (thicker walls fit fewer places) and what to check in the slicer. 0.4 is
unchanged (sweep vs main: no mesh changed).

Co-authored-by: Per Hjort <35040883+HjortCreations@users.noreply.github.com>
This commit is contained in:
matthewtrahanandPer Hjort authored and Matthew Trahan committed 2026-10-14 12:30:30 -05:00
1 parent e15f31548e
commit e44cb1d846
6 files changed
+76 -2

No files matched your search

+7
View File
@@ -49,6 +49,13 @@ the way up (auto, or click an upright side in Draw), STL, 3MF and STEP import, S
Still open: scale-aware fin profiles, and the bed pad on tilted exports.
### Nozzle size and wall lines
Set **Nozzle** (0.2–3.0 mm) to your printer's nozzle and the support widths follow it;
**Wall lines** (2 / 4 / 6 / 8) makes walls, wedges and sway braces thicker for tall parts.
The contact tip and tines stay one line wide either way. See
[the nozzle guide](docs/NOZZLE.md) for the sizes and what to check in the slicer.
### Sway braces for tall parts
**Full brace depth** is an optional checkbox under Sway. It starts off, keeping
+4 -1
View File
@@ -314,7 +314,7 @@ nor the Draw worker/CPU changes.
## Nozzle size — `web/nozzle.js`
Every width above is for a **0.4 mm nozzle**. The site's Nozzle field (0.2 / 0.25 /
0.4 / 0.6 / 0.8, default 0.4) scales them by `k = nozzle / 0.4`:
0.4 / 0.6 / 0.8, and 1.0-3.0 for large-format printers after #210; default 0.4) scales them by `k = nozzle / 0.4`:
| width | 0.4 | rule | 0.6 | 0.8 | 0.2 |
|---|---|---|---|---|---|
@@ -328,6 +328,9 @@ One-line features (tines, tip) follow the nozzle both ways. The structural width
only grow: a finer nozzle doesn't make a free-standing wall stiffer. Heights (tine
height, gaps, pad) follow the layer height, not the nozzle. 0.4 is the tuned
geometry, unchanged. The other sizes are this scaling rule, not printed coupons.
**Large nozzles** (1.0–3.0) follow the same rule: a 2.0 nozzle builds a 5 mm wall and
a 3 mm tip. Layer height stays capped at 0.6: the gap, the flanges and the pad are fixed
heights tuned for thin layers, and a 0.2 mm gap disappears into a 1 mm layer.
The plugins build at 0.4 for now. Tine reach (`PROP.tineReach`
0.5) is NOT scaled by the nozzle: at 0.8 the contact tip's half-width (0.6) passes it, so how far a
0.8 tine stands proud of the tip is unprinted. The comb's scan step follows the tine
+40
View File
@@ -0,0 +1,40 @@
# Nozzle size and wall lines
Adapted from Per Hjort's nozzle-profile guide (#210).
Set **Setup → Nozzle** to your printer's nozzle diameter, and pick **Walls → Wall lines**
for how thick the supports should be. The Walls summary shows the wall thickness.
## What changes
Every support width was tuned on a 0.4 mm nozzle: a 1.0 mm wall (two 0.5 mm lines), a
0.6 mm contact tip, 0.5 mm tines. A different nozzle scales them by `nozzle / 0.4`:
| | 0.4 | 0.6 | 0.8 | 1.0 | 2.0 | 3.0 |
|---|---|---|---|---|---|---|
| wall, 2 lines | 1.0 | 1.5 | 2.0 | 2.5 | 5.0 | 7.5 |
| contact tip | 0.6 | 0.9 | 1.2 | 1.5 | 3.0 | 4.5 |
| tine | 0.5 | 0.75 | 1.0 | 1.25 | 2.5 | 3.75 |
- A **smaller** nozzle (0.2, 0.25) narrows the tip and tines, so they leave a smaller mark.
Walls, wedges and braces never get thinner than the 0.4 numbers.
- **Wall lines** multiplies the walls, wedges and braces: 4 lines is twice the wall, 8 is
four times. The tip and tines stay one line, so the supports break off the same way.
- Heights don't follow the nozzle. Tines are one layer tall, set by **Layer height**.
## Limits
- **Layer height goes up to 0.6 mm.** The breakaway gap, the feet and the bed pad are
tuned for thin layers; thicker layers need those to scale first.
- **Thicker walls fit fewer places.** A big nozzle or 8 lines can leave a tight overhang
without a wall; the readout lists what's left unsupported.
- The plugins build 0.4 / 2 lines for now (the PrusaSlicer and Onshape plugins take a nozzle).
## Check in the slicer
Sizes other than 0.4 / 2 lines follow these rules but haven't been print-tested. After slicing:
- the walls slice as solid perimeters with no gaps down the middle
- each tine shows as one line on one layer, touching the part
- there's a visible gap layer between each wall top and the part
- first layers: feet and pad stick and stay separate from the part
+16
View File
@@ -129,3 +129,19 @@ Deno.test('wall lines: a squat brim stays under half the row spacing', () => {
} finally { applyNozzle(0.4); applyWallLines(2); }
});
// Large-format nozzles (after #210): the same rule, up to 3 mm.
Deno.test('nozzle: large-format sizes scale like the rest, up to 3 mm', () => {
const base = knobs();
try {
applyNozzle(2.0);
assertClose(prop.PROP.th, base.th * 5, 1e-9, 'wall at 2.0');
assertClose(prop.PROP.tineW, base.tineW * 5, 1e-9, 'tine at 2.0');
applyNozzle(3.0);
assertClose(prop.PROP.tip, base.tip * 7.5, 1e-9, 'tip at 3.0');
applyNozzle(3.5);
assertClose(prop.PROP.tip, base.tip * 7.5, 1e-9, 'a 3.5 nozzle was taken');
const v4 = volumeAt(0.4), v20 = volumeAt(2.0);
assert(v20 > v4 * 2, `2.0 nozzle built ${v20.toFixed(0)} mm3 vs 0.4's ${v4.toFixed(0)}`);
} finally { applyNozzle(0.4); }
});
+8
View File
@@ -231,6 +231,14 @@
<option value="0.4" selected>0.4</option>
<option value="0.6">0.6</option>
<option value="0.8">0.8</option>
<option value="1.0">1.0</option>
<option value="1.2">1.2</option>
<option value="1.4">1.4</option>
<option value="1.6">1.6</option>
<option value="1.8">1.8</option>
<option value="2.0">2.0</option>
<option value="2.5">2.5</option>
<option value="3.0">3.0</option>
</select>
</label>
<label class="fld">
+1 -1
View File
@@ -39,7 +39,7 @@ export let wallLines = 2;
/** Scale the support widths for this nozzle diameter (mm). Junk is ignored. */
export function applyNozzle(d) {
if (!Number.isFinite(d) || d < 0.1 || d > 1.2) return;
if (!Number.isFinite(d) || d < 0.1 || d > 3) return;
nozzle = d;
rescale();
}