Spaces:
Sleeping
Sleeping
Commit History
-
Adjustable Pressure Increase Per Layer option, snapped to tenths
New "Pressure Increase Per Layer (psi)" number input to the right of the ramp and pressure-variable checkboxes (default 0.1). Feeds increase_pressure_per_layer in both pressure formats: variable-mode ramp expressions become pressureN + step*k and numeric mode bakes the same steps. The ramp-ceiling warning computes with the chosen step. Values snap to the tenths place (the regulator's serial protocol encodes pressure x 10) via an explicit change handler that rewrites the input in place — gr.Number's precision= rounds before the handler sees the value, which left stale text in the box, so it is deliberately not used. The option joins the staleness fingerprint and the settings export/import round trip. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>fb202c1
-
Editable pressure variable in G-code files, with a fallback checkbox
Pressure-owning files now start with a hand-editable variable line ({preset}{aux_command}globals().update(pressureN = X)) that every pressure command references — the preset is setpress(pressureN) and each ramp step is round(min(pressureN + k, 100), 1) — so a print's pressure can be changed by editing one number in the file, no regeneration needed. The line's shape is dictated by the TCode host: {aux_command} keeps it off the motion timeline (routing is by substring), presets are exec'd as one list literal so only expressions survive, and the name is per-port because all files share one exec namespace. An "Editable Pressure Variable" checkbox (on by default) falls back to the plain numeric format in case a host cannot run the variable form; it participates in the staleness banner and settings export/import. Verified against a simulation of TCode.py's routing/exec pipeline, including hand-edit rebasing and multi-port independence. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>ff64d30
-
Split progress, Undo Delete, slice-on-demand preview, assembly rotation note; drop two repair buttons
- Splitting reports live per-shape slicing progress (and Generate G-Code's slicing phase now shows per-shape progress too). - Undo Delete: every delete pushes a snapshot (settings, slices, and G-code included; last 10) and one click restores the removed shape. - Regenerate Preview slices the SELECTED shape on demand (plus its nozzle-group assembly mates, which share one Z grid), so the sliced-layer preview works before any G-code has been generated. - Rotating an assembly member now notes that rotations turn about the group's combined center - apply the same angle to every part to turn the assembly as one unit. - Removed the Sync Uploaded STLs and Assign Unique Valves buttons: the uploader auto-syncs, and unique-valve assignment is automatic for new shapes and split pieces (the assign_unique_valves logic stays, tested, in case the button is ever wanted back). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>35f548a -
UI audit fixes: safe split defaults, spacing-table ghosts, rotation marker, split options in export
- Split Starting Nozzle / Starting Valve default to the next numbers past everything in use, refresh on every table change, and re-bump after each split - a default split can no longer land pieces on another shape's nozzle (silently forming a multi-material assembly) or reuse its valves. - The ghost-row pass now covers the Advanced Grid Spacing table, and the rule is stronger for both tables: when any live (button-wrapped) rows exist, every outer-copy row is a render leftover - which also removes stale rows whose pair/shape no longer exists (e.g. the self-paired "Nozzle 2 -> Nozzle 2" leftover). - Rotated shapes are marked at the START of the STL cell ("↻90° name"). Display-only: reading the table back strips the marker, and the group summaries ignore it. - Save/Load Settings now includes the Multi-Nozzle Split geometry options (columns, rows, both interlocks, row-overlap direction, overlap depth). Starting nozzle/valve stay auto-computed. Co-Authored-By: Claud…a57b56b -
Rotate All Shapes button; Keep Proportions no longer rewrites the typed value
- Rotate All Shapes: applies the same absolute angle to every uploaded shape at once, each carrying its own configured dimensions through the turn (split pieces are skipped with a note). The per-shape rotation core is factored into _apply_rotation_to_record, shared by the single-shape and rotate-all paths. - Keep Proportions fix: entering a dimension (e.g. 25) no longer snaps back (e.g. to 25.1). A fresh edit now anchors on the edited axis, full stop - the odd-one-out ratio heuristic could misfire on rounded rows (equal X/Y originals agree with each other while a small axis whose rounded value lands back on its original reads as ratio 1.0) and rewrite the value the user just typed on the echo round. Echoes now count as converged when the row recomputes to ITSELF from its last anchor, which is the rounding-aware replacement for exact-ratio equality; the heuristic remains only as a fallback for rows with no edit history. Co-Authored-By: Claude Fable 5 <noreply@…f97d164
-
Spirals start at the bottom; lead-in always finishes next to the print start
- Both spirals now start printing at the BOTTOM of the shape and work upward, like the other raster patterns: the rectangular spiral runs the bottom edge first (mirrored walk), and each circle-spiral revolution starts/ends at the circle's lowest point (ring jumps happen there too). A below-the-shape lead-in therefore lands directly under the spiral's start, matching the other print paths. - The purge patch always finishes at the corner nearest the toolpath start, whatever the line count's parity: across-the-approach strokes print the farthest line first and step back TOWARD the shape, and the zigzag starts from whichever end makes the last stroke land on the start corner. The return is one short straight travel through the clearance lane - the primed nozzle no longer takes a long detour (or finishes far from the print) on odd line counts or below+horizontal patches. - New tests: spirals' first print and toolpath origin sit at the shape's lowest line; a geometr…cc79beb -
Shape rotation: spin a shape on the bed to print it in any direction
- Rotate (°) input + Apply Rotation in the Selected Shape Preview accordion: spins the selected shape about Z (around its center) before slicing. Dimensions reset to the rotated bounding box; the 3D and sliced-layer previews show the rotated shape; entering 0 clears it. - The engine (rotate_mesh + slice_stl_to_layers rotation params) supports full X/Y/Z rotations - the UI exposes only the bed spin for now, via a thin wrapper, so tilts are a small follow-up when needed. - Rotation is part of the slice fingerprint (auto re-slice on the next generation) and the stale-G-code banner, and rides along in settings export/import (with the rotated originals). - Multi-material assembly parts rotate about the group's combined center, so equal rotations turn the whole assembly as one rigid unit. - Split pieces are derived geometry: rotating them is refused with a hint to rotate the source shape and re-split. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>810dafa
-
Contour Order option: trace outlines before or after each layer's infill
- New Contour Order dropdown in the Generate G-Code options: "After infill" (default, unchanged behavior) or "Before infill", which traces each layer's contours right after the Z lift and runs the raster afterwards. - The same order drives every shape, so shared reference motion stays in sync across parallel heads (verified: identical path lengths and endpoints with contours first). - Included in the stale-G-code fingerprint and the settings export/import round trip. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>4df575e
-
Auto Align: grid layout with rigid assembly block, no overlaps, centered pieces
- Auto Align Split Parts now computes explicit positions and encodes them into the spacing table: each run of split siblings is placed as ONE rigid block at its exact world offsets, and every other shape flows into the split's grid arrangement, pushed sideways until it clears everything already placed (default spacings as the margins). New grid rows start below the true lowest edge of all placed parts, so no shape can ever land inside the assembly - fixing the overlaps that appeared whether the pieces came before or after the other shapes. - The pair-gap table is solved by inverting the layout's chaining math (rounding compensated pair-to-pair), so the rendered layout reproduces the computed positions exactly. - Split pieces now center their nominal cell on the shared motion's common center (grid-snapped) instead of anchoring at the frame corner: material sits in the middle of the print path, removing the one-sided travel, while seams keep their exact one-fil pi…52d8525 -
Overlapping Rows interlock, overlap size + direction options, auto-align on generate
- Overlapping Rows: each interior split cut becomes a comb within every layer - alternate raster rows (riding the shared scanline grid, one band per row) reach past the seam in opposite directions so neighbouring pieces interlock like fingers; the phase flips per layer so teeth also interlock in Z. Exact tiling: no gaps, no double-print. - Row Overlap Direction: comb only the column seams (X), only the row seams (Y), or both. - Overlap (mm) input sets the depth of both the row and layer interlocks (blank/0 = one filament width), auto-capped so comb boundaries can never cross. - Generate G-Code now runs Auto Align Split Parts automatically when the table holds split pieces, before the parallel re-render - the Visualization tab comes up already reassembled. No-op for unsplit tables. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>a63a4fc
-
Pressure cap + tenths, recency port sync, ghost-row hiding, Enter commits cell edits
- Clamp pressure to 0-100 psi (MAX_PRESSURE_PSI) and round to tenths in the table, port sync, presets, and the per-layer ramp; warn when a ramp would hit the ceiling mid-print. - Port-pressure sync now follows the most recently edited member (edit stamps), matching how Keep Proportions follows the latest dimension edit. - Hide stale duplicate table rows left over by Gradio's double render so group/port summaries never count ghosts. - Fix Enter in a table cell not applying the edit: Gradio's Enter handler reads the editor from its els registry, which the duplicate table copy clobbers, so the typed value was dropped until a click outside. Intercept Enter in capture phase and commit through the blur path instead, then close the cell with a synthetic Escape. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>83af5eb
-
Settings save/load, Multi-Material Demo sample set, generation progress
- Save / Load Settings accordion: Export writes every per-shape table setting plus all generation options as a small JSON keyed by STL filename; Import applies them to the loaded shapes by filename (duplicates in order), restores the generation options, and lists exported files not yet uploaded. Split pieces are derived geometry and do not round-trip - Multi-Material Demo sample set: checkerboard cube, wrapped egg, and space helmet (two STLs each, LFS-tracked); loading it groups each model's parts onto a shared nozzle - three assemblies in one click, every part with its own valve - Fixed the long-standing re-sync identity bug the demo set exposed: Gradio re-uploads files under temp-cache paths, so path-only matching treated every re-synced shape as brand-new - wiping nozzle/valve assignments and creating the phantom duplicate rows. Records now match by filename when the path differs - Generate G-Code reports live progress (slicing, reference build, then shape-…3f75aff -
Sweep buffer input, lead-in line direction, readable pressure commands
Generate G-Code options: - Sweep Buffer (mm) input next to the raster pattern: the valve-settle travel before/after each raster line (was hardcoded to one fil_width; 0 disables it). Applies to the axis rasters and both woodpiles; the same value drives every shape so the shared motion stays in sync - Lead In Line Direction dropdown (Auto/Horizontal/Vertical) decouples the purge strokes' direction from the patch position: e.g. a patch BELOW the shape can now print HORIZONTAL strokes. Auto keeps the historical toward-the-shape behavior byte-for-byte. Across-oriented lines step further away from the shape, and the return route still exits past the wet patch and comes home on virgin ground. "Lead In Direction" renamed to "Lead In Position"; clearance/length inputs gained hint text (clearance IS the distance from the shape) - Both new options join the stale-G-code fingerprint G-code output: - Every pressure command now uses the readable eval(setpress(...)) / eval(toggl…6353562
-
Stale-G-code banner, per-port pressure ownership, undo stack, auto-render
G-code generation: - Pressure commands are written ONCE PER PORT: the first shape on each serial port owns the preset, toggle, per-layer ramp, and closing toggle; port-mates' files carry no serial commands at all (valve commands stay per shape). The print host compiles every file onto one timeline, and duplicated toggles flipped the regulator on/off/on - Dropped the legacy valve-100 init/close loop: no more WAGO_ValveCommands(100, 0) or duplicate own-valve closes - The generation status leads with the shared print path length and a time estimate at the Visualization tab's nozzle speed Guardrails: - Stale-G-code banner above the Generate button: every generated file carries a settings fingerprint, and any table or option change after generation (or a shape added without a file) raises the warning until regeneration; reverting the change clears it - Fixed a latent re-sync bug the banner exposed: _records_from_files dropped path_origin (breaking Auto Align after an up…ab2d2fa -
Drop raster lines no head prints from the shared motion; {preset} markers
Infill motion optimization: - Lines that NO shape dispenses on are dropped from the motion instead of swept valve-off: each grid line survives if ANY shape's infill pattern prints it, and every shape receives the same combined fraction list, so the shared motion stays identical across heads. All shapes at 50% halve the path (measured 49.6%); mixed 50/75/50 drops only lines all three skip (72.7%); any shape at 100% keeps every line. Solo shapes bound their own motion the same way - Circle spiral: rings nobody prints drop out; perimeter walls always stay (they always dispense). Rectangular spiral keeps its full continuous walk - removing an interior loop would break the spiral into disconnected rectangles - Engine default is safe: shared-motion callers that do not pass motion_infill_fractions get unrestricted motion, so heads can never desynchronize by accident (the app always passes the list) Aerotech host compatibility: - The two pressure-setup header lines now c…67c2359
-
Show nozzle/port groups in the table, valve warnings, print time estimate
Shape Settings table (client-side, restyled on every re-render): - Rows sharing a nozzle get a per-group tint + accent stripe, and a summary under the table names each assembly - Shapes sharing a Port get a matching underline on their Pressure and Port cells plus a subdued summary line with the shared pressure (one regulator per serial port) - Valve cells used by more than one shape turn red with a warning line; new shapes default to their own unused valve number (was: always 4) - The row scanner deduplicates by Shape number and prefers the live (drag-drop-wrapped) table copy: Gradio renders rows in two tables and the outer one can hold a STALE leftover of a previous render, which duplicated group names and flagged phantom valve conflicts (also the long-standing "stray duplicate row" artifact). Observer watches the body (the container node is replaced on hydration) and debounces with setTimeout (rAF never fires in hidden tabs) - Header wrapping breaks only at spaces…84c7b5c
-
Slim the Shape Settings table: tenths dimensions, short headers, no Flip Z
- X/Y/Z display AND store to the tenths place. Stored values must round exactly like the display: the table's .change echo re-applies what is shown, so unrounded storage made every echo look like a fresh edit. Originals round too (a pristine row's ratios must be exactly 1), and edit detection compares against the displayed value - otherwise legacy noisy extents (32.99557) flagged phantom edits that mis-anchored the Keep Proportions rescale and reverted the user's real edit - Headers "Target X (mm)" -> "X (mm)" (Y/Z alike) - Flip Z column and its slicing plumbing removed (orientation belongs in the STL); the engine's flip_z/z_flip_mid parameters stay. Slice-params fingerprint changed, so existing sessions re-slice once - Narrow fixed column widths + two-line header wrapping via CSS; Color cell drops a legacy 170px min-width (old swatch strip). The table now fits a 1280px viewport with no horizontal scroll (1650px -> 1188px) Co-Authored-By: Claude Fable 5 <noreply@an…09c5dff -
Merge slicing into one tab and one button: Generate G-Code slices, Split slices
- The Shapes & Slicing and Generate G-Code tabs are one "Shapes & G-Code" tab: upload, table, split and preview accordions, then the generation options, button, downloads, and G-code preview in one flow (the app is now two tabs: Shapes & G-Code, Visualization) - The Slice Shapes button is gone. Generate G-Code slices every shape from the current table settings before writing G-code, and Split Selected Shape into Grid Pieces slices before splitting (same shared Z-grid group plans), so the whole workflow is one button - two with a split. The layer preview and split-source refreshes moved from the old slice chain onto the generate and split chains - Status texts that pointed at the removed button/tabs reworded; README updated Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>c1a6699 -
Sync pressure per port, merge visualization tabs, move Nozzle Spacing accordion
Shape Settings: - Pressure is a PORT property (one regulator per serial port): editing a pressure updates every shape on that port, moving a shape onto a port adopts that port's pressure, and newly added shapes join at their port's existing pressure. Runs in the table normalizer with the same convergence rules as the nozzle-group scale propagation (unambiguous source or no-op), so stale .change echoes cannot ping-pong values - Removed the "Use 75% 3D Model Opacity" checkbox; the 3D preview always renders at full opacity Visualization (one tab, was two): - The G-Code Visualization and Parallel Printing Visualization tabs are merged. One source radio defaults to "Parallel print (all shapes)"; picking a single generated shape or "Upload G-Code file" switches to the single-tool-path view - Travel/print opacity sliders moved above the render buttons (they only apply at render time) - Per-view color pickers removed: a generated shape renders in its Shape Settings color…6041550
-
Add Download All zip, sliced-layer preview; always-on shared motion and G1 moves
Generate G-Code tab: - New "Download All (.zip)" button next to the individual G-code file list; the zip is rebuilt wherever the file list refreshes (generate, delete, split, sync) and hides when nothing is generated. Name- colliding entries get a _2 suffix instead of overwriting - G-code files are named <shape>_gcode.txt (SnakePath dropped), so individual and zipped downloads carry the shape's name - Shared reference motion is always on: the checkbox is gone and every generation rebuilds the combined outline at the current fil width - forgetting it silently produced non-parallel G-code - Constant speed is always on: the all-G1 checkbox is gone; every move is emitted as G1 and the valve commands mark print vs travel Shapes & Slicing tab: - Sliced Layer Preview next to the 3D viewer: a layer slider through the selected shape's polygon outlines drawn in its print color. Shapes sharing the nozzle (assemblies, split cell-mates) are drawn together at the same Z, dimmer …8f71a0b
-
Keep circle-spiral rings uniform in parallel prints, drop PathOrigin from G-code
Circle spiral under shared reference motion: - A shape's outer ring is now always the outermost GRID ring that fits inside its material - the off-grid edge-hugging wall could land within half a bead of the grid ring below it (visibly too-close lines) while the graze suppression swallowed the next ring out (a visibly skipped line). Everything stays on the uniform one-fil grid; the rim sits at most half a bead further in at unlucky dimensions (contour tracing covers it flush when needed) - Radius-window graze suppression replaced by a minimum-dispense-length rule (1.5 fil): it killed real corner/lobe fill on squares and triangles (crescent voids mid-shape), because a radius rule cannot tell a grazing ring from corner fill - run length can. Boundary flicker prints sub-bead dashes (closed), fill arcs are far longer (kept); motion is untouched so parallel heads stay in sync G-code output: - The "; PathOrigin X.. Y.." header is no longer written: generated files cont…4b11c98 -
Add Simple Shapes sample set, fix parallel circle-spiral edges, align spiral loops
Samples & UI: - Sample Set dropdown under Load Sample STLs: Standard Shapes (pyramid, rounded cube, half sphere) or the new Simple Shapes (circle, square, triangle - flat 20x20x2 test pieces, bundled via Git LFS) - Nozzle Spacing column/row gaps default to 5 mm Rectangular spiral: - Loops are anchored to the shape frame's family, not each layer's own material bounds: layers with smaller footprints (e.g. the flag's arms-only first layer) used to spiral at their own offsets, leaving walls visibly out of line; outer loops that cannot touch a layer's material are skipped instead of traveled Circle spiral under shared reference motion: - Rings centre on the reference ALIGN centre (where every shape's centre is placed) instead of the union bbox centre, and whole-shape centering no longer snaps to the fil grid - shapes are exactly concentric with the ring set - Every shape's own wall radius joins the ONE shared ring set (all heads travel all walls, each dispenses only it…49307ad
-
Sync multi-material assemblies in the table, add Flip Z, fix split seam gaps
Shape Settings table: - Dimension edits on a multi-material group member (shapes sharing a nozzle) propagate the per-axis scale factor (target/original) to every member in both scaling modes, so assemblies scale as one unit; members are scaled about the group's shared corner so parts stay assembled - Moving a shape onto another nozzle makes it adopt that group's scale - New Flip Z checkbox column prints a shape the other way up (mirrored about its Z midplane); any assembly member's Flip Z flips the whole group about the shared midplane - for models authored face-down, like the Maryland flag whose arms otherwise print first instead of last - Keep Proportions fixed: Dataframe emits no .input for cell edits, so the normalizer is back on .change with a server-side idempotence guard (converges in two rounds instead of a minute-long re-anchoring storm); anchoring now comes from the row's own ratios (odd factor out), which is immune to stale event echoes that used to rever…8478b27
-
Add multi-material assemblies, fix slicing of multi-body STLs, improve circle spiral
Multi-material printing (STLs sharing a nozzle number): - Shapes on one nozzle are detected as one assembly: sliced on a shared Z grid (empty lower layers for parts that start higher) and aligned as one rigid unit at their modeled positions via a shared group frame - Contour tracing skips material-to-material interfaces (within half a bead, covering fit-tolerance gaps) - only the assembly's true outer surface is traced, like split-piece seam exclusion - Multi-Nozzle Split treats a group as one shape: all materials clipped by the same cell grid, cell-mates share a nozzle, each piece keeps its own valve; split source dropdown warns before a group split Slicer fixes for multi-body STLs (Maryland flag, checkerboard cubes): - Watertight bodies slice per-body and union (interpenetrating stripe prisms no longer XOR into holes); inverted bodies subtract as cavities - Non-watertight fragments section together as one remainder mesh, so shredded topology (T-vertices) still recons…c7f0b44
-
Show palette color names in the Shape Settings Color column
Colors display and parse as friendly names (Orange, Blue, Green, Red, Purple, Pink, Teal, Black) instead of hex codes; matching is case-insensitive, raw hex still works, and unrecognized text keeps the previous color. Gradio dataframes cannot host in-cell dropdowns, so a fixed name palette is the closest equivalent. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>ff58e99 -
Step circle spiral by whole rings and make lead-in per shape
- Circle spiral prints concentric circles: each revolution holds a constant radius (smooth walls) and steps inward by exactly one fil width; the step segments and the final dive to the centre travel with the valve shut, including step pieces clipped by the material boundary at the edges - Lead-in gains a direction option (Left/Right/Up/Down) and a return route that exits the patch laterally and comes home through the clearance lane, never dragging the primed nozzle across the wet purge lines - For grid splits the lead-in clearance auto-extends by the assembly's remaining extent along the purge axis, so under shared reference motion every nozzle's purge patch lands clear of the whole assembled part - Lead-in is now controlled solely by a per-shape "Lead In" column in Shape Settings (opt-in): unchecked heads traverse the shared patch valve-off to stay in sync, or skip it entirely when printing without shared motion; the global checkbox is replaced by an always-availab…b8e790e
-
Add 45-degree woodpile raster and seam-free split contours
- Grid-split pieces store contour paths clipped from the PARENT outline, so contour tracing never runs along the cut seams between sibling pieces: edge pieces trace open arcs of the true outer surface, fully interior pieces trace nothing, and holes inside one piece stay closed rings; the contour printer approaches an open arc's nearer end and does not close it - New "45-degree Woodpile" raster: the sweep rotates 45 degrees per layer (0/45/90/135), reusing the axis raster in a rotated frame anchored to the shared scan frame so buffers, valve gating, infill selection, and seam grid continuity all carry over to the diagonal layers - Rename patterns to "90 deg Woodpile raster" / "45 deg Woodpile raster" Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>859a75d
-
Improve parallel printing: shared contours, exact auto-align, infill %
- Contour tracing under reference motion: every head traces every traced shape's contour on one identical path, valve open only on its own outline - Auto Align Split Parts computes exact per-connection gaps from PathOrigin anchors written into each G-code file (works for all raster patterns, reference motion, and overlapping-layer splits; sets grid dims from the split); grid controls listen on user input only so the first click sticks - Split pieces raster on the parent's scan grid (seams keep an exact one-fil pitch); cells are equal whole-fil multiples with blank boundary padding, and reference alignment snaps to the fil grid so nozzle spacing is uniform - New per-shape Infill % column: evenly-distributed lines (rings for spirals) skip dispensing while the motion path stays identical - Remove the redundant Custom Spacing mode; Advanced Grid Spacing table is always visible and its checkbox controls only whether it is used - Fix G-code corruption on curved shapes: coordi…4d202b8
-
Add vector G-code pipeline
29c82ca -
Got rid of the tiff file step
06dc0dc -
Add spiral raster patterns
1301164
-
Refine footprint raster starts and lead-in UI
c8d77be
-
Refine G-code startup and preview refresh
8c02eb4 -
Add lead-in and advanced split alignment controls
017ca97
-
Add safety buffer to Y and woodpile rasters
0a99fd0 -
Improve UI and add overlapping interlock
2bb6898
-
Add multi-nozzle shape splitting workflow
6b28240
-
Add Y-direction raster option
4f71a6a
-
Add woodpile raster pattern
aff1067 -
Infinite stls and nozzle spacing
270d866
-
Add nozzle spacing controls and visualization
bfab64c
-
User friendly scaling factors
f6a0b87 -
Initial ParallelPrint import
5a79264