matthewtrahan
64f7fb7d61
sway: review fixes -- the Tine contact offset field is gone (a positive offset lifts the tines off the part, zero meets it flush; the engine keeps its -0.01 default, the same output as main), Brace walls above starts at 5 cm, tests pin a full-height hand brace, the low-click reason and the cross ribs at the page's settings (two per brace over the start height, closed, clear of the part, no brace or tine lost), and the new and changed strings in de, nl, pt, ar and zh
2026-10-18 15:36:14 -05:00
909254
07e8807c4b
feat(sway): cap drawn braces at click height and add brace calibration
2026-10-18 15:36:14 -05:00
matthewtrahan
9e87d835ad
3mf: plate writer review fixes -- the one-model file pinned by sha-256 of main's output, tests for a PrusaSlicer 2 model beside a Bambu one (each assembly its own model's parts), paint on the second model alone, and the locked form's shared transform; the docs say the shift keeps the spacing and centres the footprint, not the spot it was laid out at
2026-10-18 14:21:49 -05:00
matthewtrahan
24e600a14f
3mf: several models in one file (writePlate3MF), for a plate of several -- each model keeps its own objects (part, supports, interface, slicer parts, colour table) in an id block past the one before, the slicer configs get an entry per model, and every item one shared bed shift so the arrangement opens as it stood; writeThreeMF is the one-model case and writes the same bytes as before (180 option combinations checked)
2026-10-18 14:21:49 -05:00
matthewtrahan
a4355969c7
fill: island starts LAST, once the red has its walls, with their own 20-wall budget past the caps -- taken in the same pass they cost the red room (Full scoreboard: snowman mini up -4.6, #18 X-90 -5.8 points); now the red builds exactly as main and the starts only add (no case loses; #18 Y+-45 +6.5, mumble up +0.8). #18 X45 16/16 held with 8 walls (was 16); #257 Y45 3/3. Test name's apostrophe broke the file
2026-10-18 09:05:08 -05:00
matthewtrahan
7edd5c2289
fill: Full coverage walls the island starts (041) -- each start's points join the leftover red as targets (1 mm2 a point, so one alone passes minGain), held only by a wall top within 2 mm under it (a layer that starts in midair can't bridge to a wall beside it), with lines over a group of starts at that reach; rows take the red only and lose to the patch lines if they leave more starts bare. buildFins finds the starts itself or takes opts.islands (the worker's topo has no vertex ids). #18 at X45: 4 -> 16 of 16 held; X-45 2 -> 13, Y45 1 -> 5, Y-45 0 -> 5 of 6. Auto sweep 864/864 identical
2026-10-18 09:05:08 -05:00
matthewtrahan
a0a400bcc2
islands: a start touching only amber (a sliver too small for a fin) counts -- a 2 x 2 mm peg end in midair got no fin and only 'may come out rough'; now a cone too (Matthew 2026-10-17). DRO housing: its two 3 mm pin ends under the top show
2026-10-18 09:05:08 -05:00
matthewtrahan
9132b1378f
islands: review fixes -- runs gathered only where no vertex is lower and the layer-below grid only in cells a start reaches (1.56M-face figure 300 -> 100 ms a pose), a walk past maxFaces still looks for the lower vertex, a long level edge keeps its two ends and a 32-point sample, the flat note stays blank mid-drag after a pose with islands, vid stays out of the worker messages; tests for the 2 mm merge, the area floor and a dimple in a steep wall (041)
2026-10-18 09:05:08 -05:00
matthewtrahan
bfd1506d8c
islands: find island starts -- a mesh low point (a vertex, or a level edge) whose faces point down, none red, joining nothing lower within a layer and with nothing within 0.3 mm in the layer below, cross-section >= 0.03 mm2 a layer up; starts within 2 mm merge (041). Not used yet. #18 at X45: 16 islands; #257 's corners found; 0 on the scanned and mini parts, under 35 ms
2026-10-18 09:05:08 -05:00
matthewtrahan
0183f00e5e
scale: review fixes -- the field applies on Enter or blur only (no spin buttons, no arrow-key steps: each was a whole reload), the floor is 10 % (below it a fine mesh's vertices merge in the 1 um weld), the factor is rounded to the 2 decimals shown, and a rescale drops the import note's 'restored N supports' (they went with the reload)
2026-10-17 21:09:43 -05:00
matthewtrahan
78d11700db
ui: Scale -- one uniform percent in the view toolbar beside Rotate; a new scale reloads the part at that size from the part as loaded (never compounded), keeps the pose, scales a 3MF's negative parts and modifiers about the same centre, and clears drawn walls, removed fins and undo as a new file does; the badge reads the percent while it isn't 100
2026-10-17 21:09:43 -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
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
708b2dfac9
walls: review fixes -- squat walls narrow too (a 1.2 mm squat wall at 8 lines leant 24deg), a cut wall's bands and strips keep to the narrowed body, and the clearance probe reads the body from the same rise the mesh does on a low tail (044)
2026-10-17 13:52:49 -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
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
d61a613cdb
remove fins: key review fixes -- an exact key wins (a #n twin's removal hid its first copy), older and unparseable keys match exactly only, and the net is across 0.4 / along 2.5 mm of the wall plus height within 0.35: a removed fin gone from the rebuild no longer hides the neighbour beside it (Full coverage fill walls sit 0.5 mm apart), at the cost of a few removals coming back (m4 X30 77/84)
2026-10-16 16:50:16 -05:00
matthewtrahan
da80a6eb48
remove fins: a removed fin stays removed when the support gap changes (045) -- its key matched exactly and held the wall top's z and height, which the gap moves, so 0.2 -> 0.3 brought every removed fin back; now a key takes the nearest fin of its kind and bearing within 1.5 mm (z only a tie-break, so stacked walls stay apart), and older saved keys still match
2026-10-16 16:50:16 -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
dfcaa5c1b9
tall ribs: walls over 10 cm get face ribs at the plate (Brace tall walls, on) -- a user: fins taller than 10 cm wobble; Auto, Full and Draw, last around every support, kept sideClear off the part and other supports
2026-10-16 14:31:03 -05:00
matthewtrahan
b65f156d27
tall coupon: review fixes -- the test pins where the face pairs land and a slim+tall wall (ends + a pair), the README says the site's Draw doesn't brace yet and a spine wobble isn't the wall's
2026-10-16 10:24:41 -05:00
matthewtrahan
ee78237579
tall coupon: plate walls 60-120 mm, bare vs face ribs rising 50 % / 80 % -- a user says fins over 10 cm wobble; BRACE.tallH (off) gives any wall over it a face rib pair every faceStep 30 mm
2026-10-16 10:24:41 -05:00
matthewtrahan
e700218b31
import: OBJ review fixes -- an inline # comment on a face line read as a vertex ref, a CR-only file's \ continuation wasn't joined, a big file split into millions of line strings (now one scan into growable typed arrays; a file past the string limit says so), and a 3MF's import note outlived the OBJ after it on a language switch
2026-10-16 10:00:56 -05:00
matthewtrahan
a704c9c1f6
import: OBJ files on the site -- a text reader (polygons fan, v/vt/vn and negative refs, o splits objects into the picker, groups and materials don't), sniffed by content like STL/3MF/STEP; no unit, read as mm
2026-10-16 10:00:56 -05:00
matthewtrahan
63610e2cd3
wedges: review fixes -- the clear check samples every 0.25 mm under the blade and along the run between stations (a 0.3 mm rib slipped between stations 1.5 mm apart; a wide blade's three rays left 3 mm gaps), counts a clearly down-facing surface deep under the top (bridge Y45: past the real face the plane-fit top rides over more of the part), keeps the longest run that still stands minH, and tests a vertical step's station itself
2026-10-16 09:30:01 -05:00
matthewtrahan
4546a10c3d
wedges: a wedge stands only where its column is clear of the part ( #254 ) -- a channel stood at 45deg got a wedge under its upper plate that ran straight through the lower one, fused into the part; a station with an up-facing surface under the blade's top is dropped and the wedge keeps its longest clear run
2026-10-16 09:30:01 -05:00
matthewtrahan
e5c6909be9
fill rows: review fixes -- rows kept only on no more red bare (the 0.5 mm2 tie let a minGain patch go), no double build under the sparse slider, the candidate rows read their own band (sorted by offset, not every point per row), the search budget shrinks past 250k faces, the field's docs say what it does (one heading, null = x), fill reports rowsLost/rowBuilds, an old session restores with Long walls off; tests: rows strictly beat the patch fill where they win, Plate only, sparse
2026-10-16 08:41:38 -05:00
matthewtrahan
88e7184976
tests: rows -- build on the L-bracket and tube at X40 and leave less bare, never more bare than the patch fill where they lose (wedge, ramp, torus, bar), outside the part and clear of every support, deterministic; the length field's calls
2026-10-16 08:41:38 -05:00
matthewtrahan
66a5e4c62a
export: the file name carries the nozzle and layer height the fins were built for ( #279 ) -- part-fins-0.6nozzle-0.24layer.3mf, so the slicer gets set to match: a 0.4 build sliced at 0.6 prints its walls as one line and drops tines between 0.24 layers
2026-10-15 21:04:59 -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
fe90b6c857
cutout: review fixes -- each strip piece grows by moving its edges out (0.4-0.6 eps, its own distance) and clipping to a line separating it from each nearby hole, in place of slab overlaps, corner slides and corner pulls: those left pieces non-convex (a folded cap, 68 faces turned inward on a lattice wall) and opened sub-micron gaps; now every piece is convex, none reaches into a hole or leaves a gap, and the test checks for inward faces too
2026-10-15 11:42:12 -05:00
matthewtrahan
cc2a75dd17
cutout: a cut wall's pieces overlap instead of sitting flush -- slabs stacked at a cut, bands ending on a post's cap, bands meeting where a short wall's zone closes, corners touching across a strip side all shared welded edges (4-6 faces to an edge), which slicers that weld by position report as non-manifold ( #223 : 951 on the cutout coupon); now none, same printed shape
2026-10-15 11:42:12 -05:00
matthewtrahan
c7d20908d7
surface: review fixes -- a NaN vertex (corrupt binary STL) gets a -Infinity floor, where a NaN floor unsorted the lists and the early exit returned 2 over a true 1; the test now warms each grid past the sort gate, so it checks the lowest-first path and not only the plain scan
2026-10-15 07:39:01 -05:00
matthewtrahan
cf0c950d1b
surface: the lowest-height lookup walks each cell lowest-first and stops once nothing left can reach below the best -- a tall column scanned every surface stacked above it; same minimum, bit for bit
2026-10-15 07:39:01 -05:00
matthewtrahan
98c0d5a94d
suggest: review fixes -- a ranking in flight is dropped (worker terminated) by whatever clears the list (new part, undo, reset), a message error falls back inline, and the test ranks a torus whose answer the gap really changes
2026-10-14 21:32:24 -05:00
matthewtrahan
0f9cd68cf5
suggest: rank in a Worker with the page's tunables -- a 250k-face figure froze the page for 14.5 s; now the longest frame is 17 ms and the ranking is the same, default or changed gap; inline when no Worker can run
2026-10-14 21:32:24 -05:00
matthewtrahan
6d4fbb26b7
3mf: review fixes -- a coloured part's material table and the first slicer part no longer share resource id 5 (the slicer parts start past it), and the bed shift counts the slicer parts so a modifier reaching past the part stays on the bed; pinned with the interface crest on, which all three slicers still read as one two-part supports object
2026-10-14 21:25:19 -05:00
matthewtrahan
2fac7171f7
export: a 3MF with a slicer's own parts goes out as the file had it -- the part uncut beside its negative parts, modifiers and blockers, posed with it, for the slicer to cut again ( #104 ); the fins and the saved session stay the cut part's, and opening the export here again cuts to the same part
2026-10-14 21:25:19 -05:00
matthewtrahan
2029c4b63a
3mf: a slicer's negative parts, modifiers and support blockers are written back beside the part, each its own kind with its settings verbatim ( #104 ) -- Bambu/Orca and PrusaSlicer 3 as one assembly named in both configs (each reads its own, checked with all three slicers' command lines), PrusaSlicer 2 as triangle ranges of one mesh; never into the object holding the fins, since a negative part cuts every part of its object
2026-10-14 21:25:19 -05:00
matthewtrahan
4dbb6fc094
cut: review fixes -- a cutter that will not load leaves the file open uncut with a note (and is retried next file) instead of refusing it, an inside-out negative is turned outward so it cuts rather than adds plastic, the shell/debris repair is for negatives only (the part is never changed without a word), and negatives that remove the whole part leave it uncut with a note
2026-10-14 20:21:26 -05:00
matthewtrahan
31228abb1d
cut: a slicer's negative parts are cut out of the part on import, so the fins are built for what prints ( #104 ) -- Manifold (manifold-3d 3.5.4, Apache-2.0, vendored, loaded only for a file with one); a scanned negative of closed shells plus sliver debris still cuts, a part or negative that is not a closed solid is said and left uncut; paint stays on the faces the cut leaves whole; the CLI bundle carries the WASM; the import note says how many were cut
2026-10-14 20:21:26 -05:00
matthewtrahan
f4166105e6
3mf negative parts: review fixes -- a PrusaSlicer 2 second instance (a wrapper over the first one's mesh) keeps its negative out (it read solid), a part placed twice is two extras rather than one merged shell, the CLI warns when it leaves one out, and a Bambu plate whose part ids collide is pinned
2026-10-14 20:21:26 -05:00
matthewtrahan
fd6c962820
3mf: PrusaSlicer 3's part types (PrusaSlicer3_project.json) are read too, and the three slicers' own files are pinned -- a cube with a negative cube saved by Bambu Studio, OrcaSlicer and PrusaSlicer 3, stripped to the model and the part-type config
2026-10-14 20:21:26 -05:00
matthewtrahan
b2bd24ef16
3mf: a slicer's negative parts, modifiers and support blockers/enforcers stay out of the part ( #104 ) -- Bambu/Orca model_settings.config subtypes and PrusaSlicer Slic3r_PE_model.config volume ranges are read, and each comes back by kind beside the part: a PrusaSlicer negative volume was read solid into the part, a Bambu one (type other) was dropped as unknown; the import note says they are not in the export yet
2026-10-14 20:21:26 -05:00
matthewtrahan
e2b8e846ba
weld: review fixes -- fold the hash's high bits into the slot (a power-of-two micron grid piled into a few slots, 45x slower), NaN_KEY before its use, the edge-case test covers +-Infinity and float32-huge
2026-10-14 15:45:24 -05:00