bherbruck
13aac4296d
Keep prepared assembly geometry through selection changes
2026-10-11 21:59:33 -04:00
bherbruck
400f200efa
Speed up cold document geometry rebuilds
2026-10-11 20:22:19 -04:00
bherbruck
4e39869023
Merge pull request #179 from tbreckle/fix/177-centerline-to-construction
...
fix(sketch): a centerline can be switched straight to construction
2026-10-11 16:46:04 -04:00
bherbruck
af536a7907
Rename displayed product to SolidCraft and add header bug reporting
2026-10-11 16:16:48 -04:00
bherbruck
ef8f6ca6f9
fix: restore shell and cut wall topology in 0.2.1
2026-10-11 15:17:05 -04:00
tbreckle
6dc6372b13
fix(sketch): a centerline can be switched straight to construction
...
sketch.construction set `construction` but left `centerline` on, so the
curve stayed a centerline (drawn dash-dot, still marked as an axis) until
it was first switched back to normal. Making a curve construction now
clears its centerline flag, mirroring sketch.centerline.
2026-10-11 20:40:21 +02:00
lillith
1adb2cd69f
fix: accept two line picks for sketch coincidence
2026-10-11 20:34:04 +02:00
bherbruck
d9d4dd262d
Merge pull request #155 from EmDecay/fix/147-input-channel-caps
...
fix: cap control requests and refuse file reads that never end
2026-10-11 12:39:09 -04:00
bherbruck
2f78d3ef81
Merge pull request #149 from jyviko/fix/join-merges-met-bodies
...
Join merges every body the tool meets
2026-10-11 11:36:27 -04:00
Matt
b2cf19c9fb
fix: cap control requests and refuse file reads that never end
...
The control channel read each request with no length cap, so a client sending
gigabytes without a newline made the server thread allocate until the process
was killed. Read lines against the 16 MiB cap the MCP server already uses, now
one shared constant, answer a longer one with an error and close; close a
connection after eight lines that are not JSON, serve at most sixteen
connections at once, and run at most sixty-four queued requests per frame so a
flood cannot starve drawing.
Every file command checked the size with the metadata and then read to the end.
A character device such as /dev/zero reports a length of 0, so the cap passed
and the read was unbounded; a FIFO blocked the calling thread, which over the
control channel is the thread drawing the window. vfs::read now takes the
caller's cap, refuses anything that is not a regular file before opening it,
re-checks on the handle to close the window between the two, and reads no more
than the cap plus the byte that proves it was exceeded. Callers pass the limits
they already had, and the recovery read and the CLI's own reads go through it
too. `solvecraft-cli eval /dev/zero` and a FIFO now fail at once instead of
never returning.
Fixes #147
Co-Authored-By: Claude Opus 5 <[email protected] >
(cherry picked from commit 4156e8acd11c90c435a54a3b0ccc59991db71b12)
2026-10-11 08:22:07 -07:00
bherbruck
ab05b24dee
Prepare 0.2.0 usability release and refresh desktop demo
2026-10-11 10:55:55 -04:00
Iraklis Kourtis and Claude Opus 5.5
8a38a7354c
fix: join merges every body the tool meets
...
A Join unioned its tools into the first target only, leaving other target
bodies the tool overlapped or touched as separate, interpenetrating bodies.
Each tool now merges with every target it meets (shared material or face
contact, tested on the operands' boundaries) into one body under the first
one's name; absorbed bodies are removed and their threads follow. A tool that
meets no target still joins the first target as a separate lump. Sheet metal
and mesh bodies are never absorbed.
Co-Authored-By: Claude Opus 5.5 <[email protected] >
Claude-Session: https://claude.ai/code/session_01J53sR6gEaVt56soFDpTck8
2026-10-11 10:41:48 -04:00
bherbruck
0167c358bb
Merge upstream profile picks and flush-pad fixes with adaptive identities
2026-10-11 09:43:16 -04:00
bherbruck
4e595deff2
feat: preserve adaptive sketch profiles and curved modeling workflows
2026-10-11 09:06:25 -04:00
CypherNaugh_0x
4c466466a2
Merge origin/main into feat/profiles-by-curve-ids
2026-10-11 14:53:08 +02:00
bherbruck
6cbcf5c823
Merge pull request #125 from CypherNaught-0x/fix/model-render-section
...
Model renders show an active section with capped cut faces
2026-10-11 08:34:20 -04:00
bherbruck
b02c5c01f9
Merge pull request #123 from CypherNaught-0x/feat/sketch-tools-return-ids
...
Sketch commands return the ids of the geometry they create
2026-10-11 08:17:05 -04:00
bherbruck
736730c398
Merge pull request #122 from CypherNaught-0x/fix/loft-section-order
...
A loft gives the same body whatever the order of its sections
2026-10-11 07:57:49 -04:00
CypherNaugh_0x
4667c3a600
Fix sketch re-export ordering for rustfmt
2026-10-11 13:57:06 +02:00
CypherNaugh_0x
680c82365e
Merge remote-tracking branch 'origin/main' into feat/sketch-tools-return-ids
...
# Conflicts:
# crates/engine/src/cmd/sketch_modify.rs
2026-10-11 13:30:48 +02:00
CypherNaugh_0x
79753040d5
Merge upstream and update curved-cut regression for fallback diagnostics
2026-10-11 13:25:06 +02:00
bherbruck
7e4dd4fd66
Merge pull request #121 from CypherNaught-0x/fix/fillet-keeps-dimensions
...
Fillet and chamfer keep the dimensions of the corner they replace on a virtual sharp corner
2026-10-11 07:12:48 -04:00
CypherNaugh_0x
5a2174899f
Merge remote-tracking branch 'origin/main' into fix/model-render-section
...
# Conflicts:
# crates/ui-egui/src/viewport.rs
2026-10-11 13:12:20 +02:00
bherbruck
f9d61590f3
Merge pull request #120 from CypherNaught-0x/feat/timeline-inspect
...
timeline.inspect shows a feature's editable fields; the timeline.edit format is documented
2026-10-11 07:11:49 -04:00
CypherNaugh_0x
b93d4905ac
Merge remote-tracking branch 'origin/main' into feat/sketch-tools-return-ids
...
# Conflicts:
# crates/engine/src/cmd/mod.rs
# crates/engine/src/cmd/sketch.rs
# crates/engine/src/cmd/sketch_create.rs
# crates/engine/src/cmd/sketch_modify.rs
# crates/engine/src/lib.rs
# docs/book/src/guide/sketching.md
2026-10-11 13:07:50 +02:00
CypherNaugh_0x
184e301c46
Merge remote-tracking branch 'origin/main' into feat/profiles-by-curve-ids
...
# Conflicts:
# crates/doc/src/lib.rs
# crates/sketch/src/lib.rs
2026-10-11 13:07:46 +02:00
CypherNaugh_0x
3dc0a6024e
Merge remote-tracking branch 'origin/main' into fix/loft-section-order
...
# Conflicts:
# crates/engine/src/cmd/features_more_tests.rs
2026-10-11 13:03:56 +02:00
CypherNaugh_0x
21e0e99c86
Model renders (screenshot with source model, ui.render) show the section the window shows: the CPU renderer drew the cut face on the far walls at their own depth in a plain grey hatch, so the inside of the body, its edges and the grid showed through it and the cut barely read as a section, it had no outline, perspective views cut along a curve, and an open Section Analysis dialog's preview (or a sketch's Slice) was ignored. The cut face now writes the section plane's depth where it is the visible surface (the CPU counterpart of the viewport's stencil cap), takes the viewport's cap tint and hatch, the cut outline is drawn (section_segments moved from the UI to engine::view and shared), world positions and lines are clipped perspective-correctly, and ui.render in the app uses the viewport's section plane
2026-10-11 12:23:57 +02:00
CypherNaugh_0x
cc22672041
Sketch commands return the ids of the points, curves, constraints and dimensions they create as created: {points, curves, constraints, dimensions}, worked out in Session::execute from the sketch before and after, so a script can dimension and constrain new geometry right away; ids stay stable and are not reused after a delete (undo rewinds the counters with the design). The MCP execute tool describes the field
2026-10-11 12:23:57 +02:00
CypherNaugh_0x
adb1e5fec5
timeline.inspect returns a feature's definition in the shape timeline.edit's set takes, so agents no longer guess field names: timeline.edit had no documented format ({"extent": {"distance": …}} worked, but only by trying). The new read-only command (feature: id or name) returns type, definition (the editable fields and their current values; bookkeeping and large payloads such as sketch geometry and imported STEP text are left out and listed under omitted), inputs (label, parameter name, expression, unit) and the feature's error and warning. timeline.edit's params doc points to it, and the book's Solid features chapter documents the edit format with the fields of the common features. Tests: inspect, edit by the field names it shows, inspect again (extrude, fillet, sketch); no undo step; hostile feature arguments are refused
2026-10-11 12:23:30 +02:00
CypherNaugh_0x
c67ad22129
A sketch fillet keeps the dimensions of the corner it rounds: filleting the corner of a spout (a vertical riser and a horizontal top, the top's length dimensioned to the corner and the corner's height from the origin) dropped the height dimension with the corner point and left the length on the shortened straight part, so the top came out a fillet radius too long. Like Fusion, a corner that dimensions or constraints measure to now stays as a virtual sharp corner, a free point held on both curves' extensions (two point-on-curve constraints), with those dimensions kept and a line length to the corner turned into a distance from the line's far end to it; chamfers do the same. sketch.fillet and the chamfers report virtual_corners and moved_to_virtual_corner, and the viewport draws a virtual corner as an open square with dashed extension lines from the curves. Tests: the spout keeps its 80 x 100 size and both dimensions still drive it, the virtual corner survives save/load and undo/redo, a fillet with nothing on its corner leaves no point behind, and nearly straight or folded corners with dimensions never panic
2026-10-11 12:23:22 +02:00
CypherNaugh_0x
2406957039
A loft gives the same body whatever the order of its sections: the ruled side faces were parameterised from the first section to the last, and a loft cut that touches the body along an edge (a fall lofted from a shelled basin's whole outline down to a drain pad) worked for one order and failed for the other, with an Option::unwrap() panic inside the kernel's intersection or "shell not oriented and closed" from the planar fallback. The loft now builds its sections in one canonical order (first-to-last step with a positive largest component), so either order gives the same, working body. Tests: the basin fall cut, joined and as a new body in both orders and with the pad in every corner (engine), and the kernel loft's volume and cut in both orders, including large-below and planes facing down
2026-10-11 12:23:22 +02:00
bherbruck
a6bb8fc924
feat: stabilize face attachments and closed spline workflows
2026-10-11 05:32:46 -04:00
CypherNaugh_0x
5073f5dd72
A failed boolean no longer blames "coincident faces on curved bodies" whatever the cause: the exact polygon fallback runs after any failed B-rep boolean (faces that touch, or cross at a shallow angle) and takes planar faces only, but its refusal named coincident faces and curved bodies regardless. It now says which operand is in the way and why: "the tool has 2 curved faces (cylinder)" (kinds: cylinder, cone, sphere, torus, freeform), a face that could not be meshed, a planar face whose mesh is not flat, or a mesh too detailed. Test: planar_fallback_names_the_curved_faces
2026-10-11 10:25:10 +02:00
CypherNaugh_0x
848e7aec0e
feat: pick sketch profiles by their bounding curve ids so features keep the same region when parameters move the geometry, matching curves cut into pieces, refusing ambiguous or missing picks instead of taking another region, and storing point picks by curves
2026-10-11 10:17:25 +02:00
bherbruck
c1d819f235
feat: preserve body history and placed modelling workflows
...
Record ownership transfers in the timeline so earlier Join/Cut membership,
world placement, machining data and styles survive component moves, edits,
independent copying, undo and reopening. Preserve pending positions in history
snapshots and keep constructor transfers ordered during feature redefinition.
Retain shallow sheet pockets and exact planar intersection islands through
unfold/refold, with depth-aware flat previews and DXF export. Store explicit
3D wire coordinate spaces and migrate known legacy provenance without moving
saved points or analytic fits.
Infer unique eligible cylindrical Emboss targets, align Revolve manipulators
with actual extent geometry, and discard obsolete preview errors after input
correction. Certify constructed and immutable imported face styles using exact
source metadata while preserving legacy face names. Upgrade designs to format10
with bounded validation and geometry-preserving legacy migration.
2026-10-11 03:59:12 -04:00
bherbruck
0398a813c8
feat: strengthen sketches, feature editing, and independent assemblies
2026-10-11 02:44:31 -04:00
bherbruck
07932d0f42
feat: preserve modeling intent across sketches, assemblies, and fabrication
...
Persist typed sketch dimensions and bounded ordered configuration rules in format 8. Use exact occurrence paths and source identity for editing, movement, appearance, and mass. Preserve sheet material regions through cutting, folding, and exact DXF export; retain nested cavities and material islands.
Validation: cargo xtask ci passed, including 368 engine tests, 178 UI tests, 68 UI scenarios, 136 kernel tests, and the 10-crate wasm check. Actual preview workflows and legacy format-7 origin-corner reopening were inspected.
2026-10-11 01:28:01 -04:00
bherbruck
d71bdb78ec
feat: strengthen modeling, configuration, and assembly workflows
...
Preserve linked sketch identities through deterministic face projection and resizing. Fix origin-corner picking, persistent inline navigation, appearance editing, configuration styles, component properties, contact sweeps, sheet exports, analytic STEP offsets, and bounded rolling-ball fit accuracy.
Validated with full cargo xtask ci, native workflow screenshots, repeated enclosure replays, and analytic geometry regressions.
2026-10-11 00:37:26 -04:00
bherbruck
fc8b71956c
fix: reject planar joins that displace original faces
2026-10-10 22:53:44 -04:00
bherbruck
c1b6478ab5
fix: join additive extrusions and merge coplanar faces
2026-10-10 21:31:19 -04:00
bherbruck
4b7e1d317d
fix: load designs off-thread and cache recent thumbnails as PNGs
2026-10-10 20:55:14 -04:00
bherbruck
13dd4566ce
Merge pull request #102 from CypherNaught-0x/fix/chamfer-sloped-rims
...
Fix chamfers on sloped end faces and enforce rim clearance
2026-10-10 19:28:48 -04:00
CypherNaugh_0x
e575bded0e
Fix construction-plane references in mirror, section, and sketches ( #99 )
...
Accept construction planes by name or feature ID, preserve parametric mirror references, and reject invalid plane inputs. Retain both mirror-plane and primitive-point regression test modules after resolving the conflict with main.
Validation: cargo xtask ci passed, including 282 engine tests, 138 UI tests, 62 UI scenarios, and WebAssembly.
2026-10-10 19:20:51 -04:00
CypherNaugh_0x
15bb64c2ab
Reject chamfer extensions beyond trimmed rim faces
2026-10-11 00:50:20 +02:00
bherbruck
feaed2e3f6
Merge pull request #97 from CypherNaught-0x/fix/dimension-measured-after-solve
...
sketch.dimension reports the measured value after solving
2026-10-10 18:49:25 -04:00
CypherNaugh_0x
c61b77613a
solid.cylinder, box, sphere, torus and coil place by expressions: base, corner and center take numbers or length expressions per coordinate ("basin_width/2", "10 mm") and follow parameter changes, renames and component frames; before, a point that was not three plain numbers (or an unreadable axis) was silently replaced by the origin (or Z). The features now store the point as expressions (plain numbers still saved as numbers, so existing designs read and write the same) and evaluate it on every recompute; an unreadable or out-of-range point or axis is refused with an error. Tests: primitive points take expressions, follow parameters, renames and a moved component, and bad points are refused
2026-10-10 18:37:22 -04:00
CypherNaugh_0x
9c6f9410d2
Fix equal-distance chamfers on sloped end faces
2026-10-11 00:30:28 +02:00
CypherNaugh_0x
ade30e9c4e
Merge origin/main (with #86 ): sketch.dimension reports the solved value in the dimension's unit; the spout test expects the solved 30 and 60 degrees
2026-10-11 00:13:51 +02:00
CypherNaugh_0x
9c09e82cff
sketch.dimension reports measured on the solved sketch: it reported the value the geometry had before the new dimension was solved, so dimensioning a 99.84 mm trough line to 100 answered measured: 99.84 and looked like the dimension had not taken. The command now measures the new dimension again once the sketch is solved (driven dimensions too), through a new solvecraft_sketch::measure_dimension that shares the solver's own measuring. Tests: lengths, a driven distance and a diameter report their solved values
2026-10-11 00:01:19 +02:00