88 Commits
Author SHA1 Message Date
matthewtrahan 0dc152dc10 ui text review fixes -- Cutouts sit below the Tines section, not under Placement (the Tines section comes between them); German Draw note reads 'Klicken Sie auf zwei Punkte' 2026-10-18 22:29:01 -05:00
matthewtrahan 610ec33b8c ui text: Draw's instructions and the Calibrate menu say what the panel shows now -- Draw's mode note and the static hint said click a face (Draw takes two points, and a language switch put the old hint back over the live one); the Calibrate rows and docs/CALIBRATION.md pointed at Clearances / Walls sections that no longer exist (Support gap is under Printer, Pad gap and Wide-face coverage under More settings, Cutouts under Placement). Five translations; the old hint's dead keys go 2026-10-18 22:29:01 -05:00
matthewtrahan 54c79acc85 spec: ticked Auto can hold less than unticked on a part whose curves clash (lamp shade X30 -2.1%), kept forced 2026-10-17 20:33:56 -05:00
matthewtrahan b9beb8c721 curved walls: review fixes -- a traced group's other regions count as served where its walls reach their own faces (they read bare and drew last-resort walls), and a group's wall within a foot + 1 mm of a wall an earlier group swapped in is dropped (stacked surfaces met 0.15-0.43 mm apart on the bean on its side); the spec names the limits (shallow bands give stubs, one bend swaps a whole group) 2026-10-17 20:33:56 -05:00
matthewtrahan 5d5debaa1e curved walls: on a jagged overhang the curves trace each region grown across the slivers around it (regions whose growth meets trace and race as one), read the slope over 2 mm, and seed lines until they reach the red themselves -- coffee bean X-45 0 -> 8 curves (held 1305 -> 2674 mm2), on its side X90 10 -> 30 curves with the Auto fill 40 -> 21 walls, and Full keeps them; a second race after the unticked one, so ticking changes nothing where no wall bends 2026-10-17 20:33:56 -05:00
matthewtrahan 1be63f6d53 curved walls: review fixes -- the 1% slack only when the ticked Full build has a curve (all-straight downhill walls are judged strictly), the readout's line doesn't claim the straight walls hold more (grip or a wedge can decide), and the spec gives the real build-time cost 2026-10-17 16:27:50 -05:00
matthewtrahan b4e7c31eb6 curved walls: in Full coverage the curves stay only if they hold within 1% of the straight build, grip no higher and keep every wedge -- they broke up the fill's rows (coffee bean on its side held 2-5% less); spiral and bust keep theirs 2026-10-17 16:27:50 -05:00
matthewtrahan 78381dd6d0 walls: a wall too low for its neck narrows its body instead of squeezing the neck flat -- at 8 wall lines a 1.5 mm wall's shoulder leant 28deg, an overhang on the wall's own side (local issue 044); 2-line walls unchanged (864/864 sweep identical), same walls and tines at 0.4x8 and 1.2x4 2026-10-17 13:52:49 -05:00
matthewtrahan 2cf5110efb curved walls: review fixes -- Auto's curve fill says the overhang it couldn't reach (and a capped fill), as Full coverage does; the spec names the gaps ticking leaves (no downhill judge, neighbours unfilled, a forced swap may grip higher) 2026-10-17 09:51:28 -05:00
matthewtrahan 8ad059484e web: Curved walls' tooltip says it's forced, and the readout counts the walls its fill added in Auto apart from Full coverage's line; spec row for the Auto fill 2026-10-17 09:51:28 -05:00
matthewtrahan 999efd5849 curved walls: forced -- ticked, every region tries downhill walls and a region whose walls bend past 10 deg always swaps to them; no whole-build judge; in Auto the fill pass walls what the curves left bare (8 real organic parts: 4 -> 44 bending walls, held never below unticked) 2026-10-17 09:51:28 -05:00
matthewtrahan 0d9e2e9243 curved walls: review fixes -- judged against the unticked build, the bend read over 3 mm of line with the extremes trimmed, an empty region still needs RACE_ABS 2026-10-17 09:51:28 -05:00
matthewtrahan 26c3b3b5c3 engine: curved walls (#25) -- with opts.curvedWalls, a region whose downhill walls bend past 20 deg swaps when they hold as much, at any weight; unset, the race is unchanged 2026-10-17 09:51:28 -05:00
matthewtrahan 0ee58da580 pins: a Vertical (resin) tine direction -- pins stand up from each wall top across the gap and 0.3 mm into the part, and a wall on the part welds its foot, since a resin print peels each layer off the vat and its supports must be attached (#309); off by default, 864/864 sweep cases byte-identical 2026-10-17 09:47:53 -05:00
matthewtrahan 04e3ee7168 tall ribs: a plan grid of ~1 mm support pieces for the clash check -- fill's 3D box grid cost 4 s on bigplate Y35 (now 0.2 s, same 210 ribs); spec + tests README 2026-10-16 14:31:03 -05:00
matthewtrahan 0bea7ad741 pad: review fixes -- a coarse block whose fan folds over (near the oval's tips: reversed facets lying on the top, which closed/oriented checks pass) is meshed fine, its hub is its corners' mean; a Custom pad thinner than half a layer marks the triangles its ramp follows
Reviewer fuzz (210 random boxes, Light/Custom, layers 0.08-0.4, gaps, grips, margins): every slice now equals the full 0.1 mm grid's at 13 heights, no folds, no open edges; 30 cases folded before. Main's band scan was itself coarse in a few places (tips, thin Custom pads), so a few golden slices move to the full grid's.
2026-10-15 14:30:23 -05:00
matthewtrahan bb649270a7 pad: the Light/Custom pad is 0.1 mm only in the 1.2 mm blocks the part comes near -- every column shared one set of rows, so one dip near the rim made a 128 mm figure's pad 2M cells in Suggest (RangeError at 4x); now 19k, and every slice is the same segments as before
Fine blocks keep the full grid's nodes and diagonals, and the rim keeps every node, so the pad's sections at ten heights match main segment for segment (cube X20-45, Light/Custom, 0.12-0.28 layers; man bust, buster, Isaac). A coarse block beside a fine one fans from its centre through the shared nodes, so there are no T-junctions. A coarser grid was the other option and was dropped: at a 0.3 mm cell the gap closes to 0.080 mm at a cube's corners. Goldens re-recorded: only the pad's triangles changed.
2026-10-15 14:30:23 -05:00
matthewtrahan 2cfd7c607d tines: review fix -- the spec says how much solid a moved end ran through apart from how far it came in 2026-10-14 13:42:33 -05:00
matthewtrahan f4e286aae5 tines: an end stops at the first solid -- the far probe (2x the reach) passed a part thinner than it and ran the tine through, and bisected back from a piece beyond a thin near one (cone/needle/tube X40: tine corners 0.3-0.5 mm into a thin edge at 0.2 layers); where the walk finds nothing the end is unchanged to the bit 2026-10-14 13:42:33 -05:00
matthewtrahan 6c3860ad79 wedges: review fixes -- the test walks each wedge's tines back from its end (36-vert chunks ran misaligned past the blade and missed a quarter of portal's), and the spec's count is portal's real 41 -> 42 2026-10-14 13:15:08 -05:00
matthewtrahan 97c6c65b30 wedges: tines follow the layer height -- a wedge's tines were always 0.2 tall with the 0.2 reach, a third of a 0.6 layer, which the slicer drops or merges (portal X45 at 0.6: 32 tines, now 0.6 tall) 2026-10-14 13:15:08 -05:00
matthewtrahanandPer Hjort 813a01f537 nozzle: a free edge's outermost row steps in as the tip widens -- at 2.0 the 3 mm tip and its 2.5 mm tines hung 1.2 mm past a cube's side (X30), tabs out of the wall instead of under the part
Co-authored-by: Per Hjort <35040883+HjortCreations@users.noreply.github.com>
2026-10-14 12:30:30 -05:00
matthewtrahanandPer Hjort 877111da59 nozzle: review fixes -- the tine reach grows past a wider contact tip (sphere at 45deg: 6 tines at 2.0, now 26; 30 at 0.4), walls stop at 6 mm so a row never fuses, nozzles to 2.0
The reach is measured from the wall's centre, so a tip wider than 0.4's 0.6
swallowed the 0.5 reach and a curved underside lost its tines; the extra
half-tip is added to it (0.15 at 0.6, 0.3 at 0.8, 1.2 at 2.0; 0.4 and finer
unchanged). A wall over 6 mm -- half the 12 mm row spacing -- fused rows into
one block (3.0 x 8 lines: 6.7 kg on a 252 g plate), so walls and wedges cap
there, the page offers only the Wall lines that fit the nozzle, and the
nozzle stops at 2.0 (2.5's two-line wall is already 6.25). tests: every
offered nozzle x lines stays under half the row spacing; the sphere keeps 70%
of its 0.4 tines at 2.0 with nothing inside the part.

Co-authored-by: Per Hjort <35040883+HjortCreations@users.noreply.github.com>
2026-10-14 12:30:30 -05:00
matthewtrahanandPer Hjort e44cb1d846 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>
2026-10-14 12:30:30 -05:00
matthewtrahan e15f31548e tines: review fixes -- the reach multiplier stops at 3x (a slicer plugin's own layer height can pass the site's 0.6), and a test that a 0.6-layer tine's snapped top is clear of the part at its mid-layer 2026-10-14 09:32:07 -05:00
matthewtrahan 9d4a0eeddc tines: the reach follows the layer height -- at a fixed 0.5 mm a thick layer found no solid under a shallow underside and built every wall there with no tines
The reach probe sits at the tine's mid-height, half a layer under the
underside, so it only finds solid when reach * tan(slope) > layer / 2: the
cutoff was ~17deg at 0.3 mm layers, ~22 at 0.4, ~31 at 0.6. The M4 front
upright had 223 tines at 0.2, 117 at 0.4, 53 at 0.6; buster upright none at
0.4. The reach now keeps the 0.2 layer's ratio (tineReach * max(1, layer/0.2)):
228 / 220 and 15 / 10. 0.2 and thinner are unchanged (sweep vs main: no mesh
changed). Found checking #210's large nozzles: not the nozzle, the layer.
tests: a tilted block at 20 and 30deg gets as many tines at 0.3/0.4/0.6 as at 0.2.
2026-10-14 09:32:07 -05:00
matthewtrahanandPer Hjort e40a63341f nozzle: a Wall lines setting (2/4/6/8) -- thicker walls, wedges and braces for a tall part or a big printer; the tip and tines stay one line
From Per Hjort's nozzle profiles (#210), ported onto web/nozzle.js. Lines
multiply the structural widths (wall, wedge; a brace rib is never thinner than
the wall). The feet move out with the wall's face, and a neck into the tip that
would lean flatter than 55deg gets the height to stand at 55. 2 lines is the
tuned wall: sweep vs main unchanged (no mesh changed). A thicker wall fits fewer
places, so a tight part can lose a wall or two at 8 lines; the readout reports
them. A setting of the part (undoable, saved with a session), sent to the Worker
in opts.tunables.wallLines. The plugins build 2 lines.

Co-authored-by: Per Hjort <35040883+HjortCreations@users.noreply.github.com>
2026-10-14 08:41:44 -05:00
matthewtrahan cb460b96ce spec: downhill walls -- seeds, stops, the race and the whole-build check (#25) 2026-10-13 16:24:35 -05:00
matthewtrahan 854da684f8 nozzle: a printer setting -- remembered across visits and re-applied on reload, so a soft reload no longer built 0.4 under a 0.8 dropdown; brace rib growth scales too
A saved session leaves the nozzle alone, like the build volume. SWAY.thPerMm
grows with the rib widths so a brace reaches thMax at the same height. FIN-SPEC
notes what stays unscaled (tine reach) and the 0.2 comb losing a tine or two.
2026-10-13 13:21:17 -05:00
matthewtrahan b99d60ce2b nozzle: a Nozzle size field that scales the support widths -- every width was a 0.4 nozzle's, so a 0.6 or 0.8 dropped the tines or laid the wall as one line
Tines and the contact tip scale by nozzle/0.4 both ways; the wall, wedge and
sway brace rib only grow (a finer nozzle doesn't stiffen a free-standing wall).
Heights stay on the layer height. 0.4 is unchanged (sweep vs main: identical).
The Worker gets it in opts.tunables.nozzle; the plugins stay at 0.4 for now.
2026-10-13 13:21:17 -05:00
Per Hjort a5170233d9 Allow optional Sway depth beyond the existing 60 mm cap (#241) 2026-10-13 07:38:43 -05:00
Matthew Trahanandmatthewtrahan a59fb2ba6d Interface material: wall crests + tines as their own 3MF object for a toolchanger (#21) (#205)
* engine: interface crest (GitHub #21) -- with PROP.iface on, every wall (prop, part-attached, squat, Draw/fill, wedge blade) splits 0.6 mm under its top into body + crest, the crest and the tine comb tagged (v[3] = 1) so triRanges/removal/Worker are untouched; the 3MF writer's separate form writes the tagged triangles as a third object, '<name> interface', in register; off (the default) is byte-identical

* site: Interface material switch (Walls) -- the crest and tines show purple and export as their own 3MF object, for a toolchanger's second filament (PETG under PLA); reaches the Worker via tunables and Draw on the page; re-import still pre-selects the part; German strings; plugins leave it out (one body to the host)

* engine: interface crest review fixes -- sway brace tines are interface too (Auto and Draw); the crest is one trapezoid on the taper line, so no section has a collinear corner (zero-area cap triangles); Interface material is in the undo history; FIN-SPEC lists what is not split yet (sway rib edge, a part-standing wall's foot, a wedge whose contact steps straight up) (review)

* site: the interface is a part of the supports object, not its own -- an object starting in mid-air is refused by Orca ('empty first layer'); as the supports' second component it stands on the plate with them and takes its own filament per part

* engine: interface crest modes -- 'flat' (the default when on) crests a wall station only under an underside within 10deg of level, a full-width (th) 0.6 mm block with no tip taper, tines left in the body; 'all' crests every wall top and the tines as before. A 35deg cube's print with the crest everywhere couldn't lay PETG on the narrow PLA tip through every layer; PETG interfaces are used on flat undersides. Off stays byte-identical (sweep vs main)

* site: Interface material is a dropdown (Off / Flat contacts / Everywhere); the readout says when it is on and no wall got a crest; German strings

* engine: interface modes review fixes -- cutouts under a flat crest keep their old ceiling (holeTop: the taper start, not the crest's cut), so the split loses no plastic (lbracket Y8 lattice lost 4.6%); the crest's part reference is set only while the crest is on and dropped after each build; the readout's 'no flat contacts' note counts walls only (not the pad) and only in Flat contacts; tests: flat mode with lattice/diamond cutouts, mixed flat/tilted walls, squat walls (review)

* engine: the interface crest is one layer of the print (PROP.ifaceLayers 1, the Layer height field, as the tines), not a fixed 0.6 mm -- one tool change each way per flat contact instead of three; tooltip and FIN-SPEC say so; tests: the crest is one 0.2 / 0.3 mm layer

---------

Co-authored-by: matthewtrahan <mathyout@pm.me>
2026-10-09 22:00:37 -05:00
matthewtrahan 435a768c03 FIN-SPEC: joined walls and ties -- 55deg struts 1.2 mm deep, walls >= 8 mm tall 2-12 mm apart, two ties each, up to 70% of the lower wall 2026-10-08 18:24:49 -05:00
matthewtrahan 72fc4d1a20 brace: a rib keeps sideClear off the part past its tip -- checked only out to the tip, a flange stopped 0.05 mm from a part resting on the plate beyond it (review); not behind the stem, which is the wall's own body (padding it refused every rib on Isaac's right-hand wall, 0.6 mm off the boot). FIN-SPEC gets a Wall ribs table (rise 50%, minReach 1.5 mm are the new print numbers); fill stats count them as ribs, not braces 2026-10-08 13:42:39 -05:00
matthewtrahan 8de23702ca calibration: cutout coupon -- five tall ledges, the site's Auto walls under each at one Cutouts style (none, diamond, triangle, arch, lattice); support volume 100 / 78 / 78 / 66 / 67 %; coupon.js's closed check refuses only odd edge counts (a cut wall's solids share edges); docs, Calibrate row, German (print files after the separate-object coupon writer lands) 2026-10-07 11:14:18 -05:00
matthewtrahan 97abff4637 calibration: bore v2 -- a second set of 3/5/8/12 mm bores (X) whose walls run ACROSS the bore, three Draw walls each (shaped to the bore, they slide out along it), beside the Auto walls along it (A); letters on top; nothing touches the part; docs, Calibrate row (39 min, 18 g) and German updated 2026-10-07 10:42:15 -05:00
matthewtrahan aa8cc934fc calibration: the torture test is renamed the Sampler (folder, files, menu row, docs, German 'Musterstück'); its 3MF and STL keep their meshes, only the names inside change 2026-10-07 10:23:43 -05:00
matthewtrahan 2e3c15c2c8 calibration: torture print result (pretty solid; a few drooping layers on the ball, the table's underside rougher near the spine); the locked one-object copy is dropped now the site exports only the separate form 2026-10-07 10:23:43 -05:00
matthewtrahan 2caed75fc6 calibration: torture test exports supports as their own object (torture-coupon.3mf; the one-object file stays as -locked), rebuilt on main's fill pass (44 walls, must-hold 100 %); first-draft print logged; table flagged as the wall-direction weak spot 2026-10-07 10:23:43 -05:00
matthewtrahan 335f62a5ab calibration: torture test -- one part with ramps, ball, thin ledge, table, mushroom, cave, sideways holes and an arch, built in Full coverage at the defaults (must-hold 95 %); coupon.py label() for its raised angle / hole sizes 2026-10-07 10:23:43 -05:00
matthewtrahan 357375ca01 site: Calibrate menu -- the test prints (angle, gap, grip, pad, bore) as downloads, laid out like Plugins, each row with its print time and filament (PrusaSlicer's default Core One PLA profile, sliced by prototype/calibration/estimate.py), the setting it tunes and how to read it; files served from web/calibration/, pinned to the coupons' print/ files by tests/calibrate.test.js; German strings 2026-10-07 09:25:16 -05:00
matthewtrahan 35e54adf9b calibration: angle labels drop the ° (its ring is under two beads); doc slips -- which coupons keep dots, gap's docstring, coupon.py's header (review) 2026-10-06 14:14:52 -05:00
matthewtrahan 0688100212 calibration: every coupon still waiting on a print shows its value instead of dots -- angle (10°-40°), gap (0.2/0.4/0.6), span (0-100%), pad (0-0.3), bore (3-12), short (length x height), lip (0.1-6); angle ramps 14 mm wide and short's roots 15 mm so the text fits; tine/slender/foot keep their as-printed dots; pad 3MF re-packed deflated 2026-10-06 14:14:52 -05:00
matthewtrahan 9978cfce54 calibration: coupon.py label() raises the rung's setting as text; the grip coupon's ledges read OFF / LIGHT / MID / FIRM instead of dots 2026-10-06 07:52:35 -05:00
matthewtrahan 85a742a239 calibration: grip guide says what to do when even the firm walls lean (review) 2026-10-06 07:52:35 -05:00
matthewtrahan e7e3c4d404 calibration: grip coupon -- four 30 deg ledges, three 23 mm walls each, at Tines off / Tine grip light / middle / firm (0 / 5 / 7 / 11 tines a wall), the user-facing tine coupon; on the all-coupons plate, in CALIBRATION.md 2026-10-06 07:52:35 -05:00
matthewtrahan 7ef4cfa4e5 engine: a low-edge row is blocked by any row that can build within a brim width, behind the edge too (a tilted cube at X60Z30 got a second squat wall 1.6 mm from main's, one fused slab); only rows in the low band itself don't count; test pins no fused squat brims on the slab and that cube (review) 2026-10-05 10:49:39 -05:00
matthewtrahan 92bf9d1e6c engine: a near-flat underside that sinks to the plate gets a row at the edge of its low band (a curved face on the bed: the rows' pitch put the nearest at 16-23 mm, and at the default coverage one side of a DRO housing's bowed back got none) -- added beside the layout, never moved; sweep 858/864 byte-identical, the 6 changed all gain a squat wall 2026-10-05 10:49:39 -05:00
matthewtrahan c818c1ee84 draw: a squat brim is probed at its top plus the gap, not mid-height (torus: a dipping underside put its corner 0.06 mm in the part); FIN-SPEC says a squat wall on the part needs just over 1 mm of room, as floorLine reads it (review) 2026-10-04 14:09:50 -05:00
matthewtrahan 54e02ee141 draw: lines down to 2 mm, and squat walls when no full wall fits -- on the part with 0.6 mm of room, on the plate (only over clear plate) as a brimmed stem; tried after both full walls fail, so every line that built before builds the same (local issue 011) 2026-10-04 14:09:50 -05:00