201 Commits
Author SHA1 Message Date
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