mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-06 20:02:16 +00:00
stack/render-11087
3063 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
1b55174743 |
Render: isolate lens saves and retain bounded previews
Save only lens parameters on existing CPU/GPU jobs while keeping unrelated draft settings dirty. Retain pinned checkpoints through preview and status, and release host-only snapshots outside the status lock. Use the admitted PNG bound for registered-executor checkpoint slots. Preserve executor work credits, final publication and regrade ownership. Add regression coverage and align help, translations and capability documentation. |
||
|
|
8829c1c3c5 | Render: restore saved shots, progressive images and exports | ||
|
|
a137f2d459 | Sketch Trim: keep the driving distance when trimming a line offset first (#11442) | ||
|
|
f87dd73661 |
Selection filter: from command search it offers Faces, Bodies, Components (#11505) (#11553)
* claim: #11505 * Selection filter: started from command search, it offers Faces, Bodies, Components (#11505) Command search ran select.filter with no parameters, which could only fail with "missing field `mode`". Started from the UI (command search, a shortcut, ui.start), it now opens its three modes as a menu with the current one marked, as View > Visual style and Navigation tool do (#8868). Programmatic calls keep their contract and open nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: thocsmith <193096300+thocsmith@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
af5644aee6 |
Ribbon: switch panel menus on hover after the first click (#11447) (#11713)
* claim: #11447 * Add an option to switch ribbon panel menus on hover * Update profile membership count for ribbon hover setting |
||
|
|
abeb232f17 |
Sketch Mirror: use an origin axis that is not in the sketch plane (#8201) (#12091)
* claim: #8201 * Sketch Mirror: use an origin axis that is not in the sketch plane (#8201) A sketch on a part face does not hold the world X, Y or Z axis, so Mirror refused the pick. It now mirrors about the axis's projection into the sketch plane and keeps that line linked as fixed reference geometry. An axis perpendicular to the plane stays refused because it has no line in the plane. The sketch's own X and Y axes keep working as before. |
||
|
|
5ab59e7c1b |
Assistant: DeepSeek and Qwen endpoint presets (#5016) (#5063)
Adds DeepSeek and Qwen presets to both endpoint protocols: OpenAI-compatible (api.deepseek.com, dashscope-intl compatible-mode/v1) and Anthropic-compatible (api.deepseek.com/anthropic, dashscope-intl apps/anthropic). Co-authored-by: Claude Code <noreply@anthropic.com> |
||
|
|
9a274f91df |
Planned bodies: smaller GPU chunks, and a chunk keeps its colours while they are unchanged (#5490)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
08fa042039 |
Dialogs: drag a value's label sideways to change it (#2217) (#9685)
* claim: #2217 * Dialogs: drag a value's label sideways to change it (#2217) A value row's label (expr_row, hint_row) now scrubs a literal value: about a hundredth of its size per point of drag, on that step's grid, Shift ten times finer, Ctrl/Cmd ten times coarser. The unit and decimal mark stay as typed, a size never turns negative, and expressions and parameters are left alone. The text changes as if typed, so previews follow and OK still makes one command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Label drag: measure from the press point, cap values, keep scrub kit-private Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
09bb8aaaf5 |
Revolve: an axis origin written as an expression is no longer read as zero (#10252)
* fix: Revolve axis origin takes expressions instead of silently zero - AxisRef::Line origin is a PointExpr evaluated with parameter values in the design unit (format note in pending) - An unreadable origin or dir is a BadParams error instead of (0, 0, 0) - Edit Feature keeps the saved expressions of an untouched origin or dir, for solid and surface revolves, in moved components too - Face role names stay stable with a parameter-driven axis * chore: Re-run PR checks after the description fix * fix: Edit Feature of a revolve maps nothing where nothing is placed - unplaced designs skip world_state and the pick table, as before the merge - the untouched-edit test checks that OK applied the edit (CodeRabbit) --------- Co-authored-by: P'tite Tête <asso@ptitetete.com> |
||
|
|
46edd8d749 |
Agent chat: Custom instructions in Preferences, added to the system note (#8220) (#11105)
* claim: #8220 * Agent chat: Custom instructions in Preferences, added to the system note (#8220) Preferences > AI gets a multi-line Custom instructions field, saved with the other AI preferences (agent_instructions, kept by page resets like other user-written text). The chat adds the text after its own system note when a session starts, by the routes #9811 set up: ACP session/new (the Claude adapter's _meta key, the standard systemPrompt field, the Antigravity key) and the system message or field of every API protocol. Connect and New chat set it, so an edit applies from the next chat and never changes the one running. Blank text adds nothing; at most 4000 characters are kept, in the field, over ui.agent_chat and from a hand- edited settings file. ui.agent_chat takes and reports `instructions`. * Custom instructions: typing in the field stays in the field The text area did not report itself to Preferences search as a key sink, so with the field focused, search took the typed characters and moved focus away. The field now notes the sink while it has focus, like the other preference fields, and the #8220 test types into it. --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> |
||
|
|
c5d3dabd1b |
Split Body: the tool face follows a parameter change (#11674) (#11699)
The tool face of Split Body is now a face pick: it is named when it is picked and found again by that name, as other face picks are, so a split by a rail's face follows the rail when a parameter moves it. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
92171bd79b |
Hole: a hole on a face that another part touches drills its own part, not the other one (#12066) (#12067)
* claim: #12066 * Hole: a hole on a face that another part touches drills its own part (#12066) A hole placed by position with no direction drills against the outward normal of the face at the point. That face was looked for on every body, so where another part touched the face at the hole, the part made first won. The hole then drilled away from the part `targets` named and cut only the tool's run-in pocket into it, without an error. A hole that names its bodies now goes by their faces wherever one of them passes through its position, when it is made (hole_direction_at) and when a design is evaluated (hole_dir_into_face). Saved holes whose direction leaves their own body's face there are mirrored into it, as format 18 does for a thin plate's far side; the pending format note records it. A hole whose bodies have no face at its position (placed on another part's face to drill the part behind it) goes by every body's faces, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PVKpSUSGYjbrBhfZGjqZEE --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
2ce55baba1 |
Dimensions: a radius leader and an aligned dimension's line reach their text (#12093)
The value text is drawn level, in an upright box, and the line runs through its middle. The layout stopped the line where the box's farthest corner reaches along it (half.x*|u.x| + half.y*|u.y|), not where the line leaves the box (min(half.x/|u.x|, half.y/|u.y|)). They agree only when the line is level or upright: at 45 degrees a radius leader stopped about 12 px short of its text, and an aligned dimension's line broke too wide around its value. One helper, box_exit, gives where the line leaves the box, for the radial leader, the linear break and the leader to a text pulled past the extension lines. Whether the text fits between the arrows still goes by the whole box. A text box that isn't finite counts as empty, and one larger than a sketch can be is held to MAX_COORD. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
2998d412b6 |
Primitives: clicking a pick field no longer jumps to the Diameter box (#10428) (#10536)
* claim: #10428 Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch> * Primitives: a pick field waits for its pick and says what it is for Clicking Face, Reference 1 or 2 in the Cylinder window, or Point in the Box, Sphere and Torus windows, and then clicking something the field does not take (empty space, the cylinder's own preview) gave the keyboard to Diameter, so the field no longer looked active and nothing said why the click picked nothing. A pick field clicked into now keeps the keyboard until a click picks something, and a click it does not take leaves a note under the form saying what the field is for. These fields also get their own tooltips: Face is the face or vertex the cylinder stands on, Reference 1 and 2 are straight edges of that face the distances below are measured from, and Point is a vertex, edge, face, sketch point or the origin whose point fills X, Y and Z. Fixes #10428 Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch> --------- Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch> |
||
|
|
2396b6be05 |
Hole: the drag handle looks like the Rest, Boss and Snap Fit handles (#6818) (#6819)
* claim: #6818 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Hole: the handle drawn with the shared marker (#6818) A Single hole's drag handle (Move holes by clicking or dragging) is drawn with the placement marker from place_gizmo/look.rs instead of its own ring and cross, so a hole and a Rest on the same model show one language for the same action. place_gizmo::marker is the one crate-visible door: it runs the marker's hover and drag motions under the handle's id and draws the crosshair, never dimmed. Hole keeps its snapping, the click that takes a hole out, its handle names and its hover text. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Hole: hole_handle removed (#6818) The shared marker draws the handle now; nothing else used it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Hole: the marker takes no colours it does not use (#6818) place_gizmo::marker took a &Tokens only to hand it to crosshair, which reads its colours itself, so the hole's show fetched tokens nothing read. The argument and that fetch go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Hole: a test sees the handle drawn as the shared marker (#6818) The hole tests found the handle by its published position, which the look does not change. This one reads what the frame paints round it: the white dot and four dashed arms at rest, no ring round the centre, arrowheads when pointed at, solid shafts while it drags. It fails with the old ring and cross back on the call line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Place handles: marker hover eases in 120 ms, drag in 220 ms (Refs #6818) The marker answered the pointer in 220 ms and a drag in 360 ms, which felt slow on review. Both stay in look.rs as the one place a later preference can read them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> |
||
|
|
3c1074cfc6 |
Timeline: moving a construction axis now updates the features that use it (#9544) (#9545)
* Evaluation: a construction axis moved past a feature makes it evaluate again (#9544) The state digest in a feature's cache key left out the construction geometry before it, and the context digest hashes construction features without their order. A feature started from the same key with or without the axis before it, so after a move it kept its old result, and a cached state restored whole brought back the construction list it was made with. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Evaluation: say plainly what an empty construction list hashes (#9544) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
c4a63a1d43 |
GPU path tracer: don't rerun a setup that crashed in the driver (#9236) (#9666)
* claim: #9236 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * GPU path tracer: don't rerun a setup that crashed in the driver (#9236) A driver that takes the process down while it compiles the path tracer (RADV on an RX 7600) is beyond error scopes and unwind guards. A running setup now keeps gpu-path-setup.json (its adapter key) in the settings folder, removed when the setup answers or the app closes normally. A launch that finds it for the same adapter leaves the setup failed with an explanation and a Try again button; CPU ray tracing stays available, and a driver update changes the key and so tries again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
2fdcc5ae49 |
Appearance: a picture of your own behind the model (#11353)
* Appearance: a picture of your own behind the model Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Background picture: a label that fits its row Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
4678a04827 |
Agents and scripts: the contact commands describe their exact parameters and reply (#11949) (#11950)
* claim: #11949 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Contact sets: input and output schemas for the seven contact commands (#11949) describe_command now gives the exact parameters and reply of contact.enable_sets, enable_all, disable_all, create, edit, list and check, and the warn and strict parameter checks use them. The handlers read their parameters from the raw JSON, so the contracts in schema/motion.rs read each key as its handler does, with its message: `occurrences` (OccurrenceKeys) and `set` are required in the schemas but left to the handlers' messages in the types, through a small `require` transform. The replies are built from typed values instead of json! literals, with the same JSON; the listed sets mirror the doc crate's ContactSet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
63ffadfebf |
Import: a curve that refers to itself is refused instead of overflowing the stack (#11893)
A 2D TRIMMED_CURVE in a pcurve read its basis straight through read_curve, past the depth check that only the cached entry points (curve_in, curve_2d, surface_in) made. A trimmed curve whose basis is itself, or a loop of two, recursed until the stack overflowed and the app closed. The depth check now sits in read_curve and read_surface, which every curve and surface read passes through, so any chain of references, a cycle included, ends at MAX_GEOM_DEPTH with an error that names the entity: "curve #9: definitions nested more than 12 deep, or referring to themselves". The other nested entities (surface, seam, intersection and bounded surface curves, pcurves, 3D offset curves, offset, trimmed, revolution and extrusion surfaces) already went through the checked entry points; they now share the one check. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
aee947f0f9 |
Sketch: hovering over a large sketch no longer slows down (#9614)
* claim: Sketch: keep profile outlines and trim/extend cuts between mouse moves * Sketch: keep profile outlines and trim/extend cuts between mouse moves Hovering a large sketch sampled every profile's loops into polylines for each point asked, and Trim/Extend intersected the hovered curve with every other curve on every mouse move. - Loop2::contains rejects points clearly outside a box from the loop's end and control points before sampling; Region2::outline samples the loops once (RegionOutline). Profile keeps both in OnceLocks and answers Profile::contains from them (viewport pick, profile_at_point, profile selection by points). Answers are unchanged: the box margin covers rounding, and non-finite values or negative conic weights skip the box. - sketch_modify splits the cuts on a curve (TrimHover) from choosing the piece around the cursor. The UI keeps one per sketch state and curve, and Extend's preview per sketch state, curve and growing end (afresh when the sketch has an infinite line). Plate with 400 circles (801 profiles), release, per mouse move: UI frame 5.19 -> 1.11 ms, with Trim 9.45 -> 1.50 ms; 30 lines x 30 splines: Trim piece 6.10 -> 0.0002 ms. Equivalence tests compare with the old answers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: keep the profile outline helpers in the sketch crate The outer loop's box, the clearly-outside test and the outline sampled once move from geom into crates/sketch/src/profiles.rs as private items built from geom's public types, so the PR leaves crates/geom untouched. Profile::contains answers exactly as before; the geom test moves to the sketch profile tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
ad56dd6a93 |
Box window: a picked point fills Corner and Center in the design's unit (#12051) (#12052)
* Box window: a picked point fills Corner and Center in the design's unit A vertex, edge or face picked into the Box window's Point input wrote its X, Y and Z as millimetre text whatever the design's length unit was, so an inch design showed "50.8 mm" where the other fields read inches. The fields now take the point through length_input::model, as Move and the Hole references do, so they read "2 in" there and stay "50.8 mm" in a millimetre design. The same applies to the Sphere and Torus centre. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Box window: a picked point reads to a millionth of the design's unit length_input::model divides without rounding, so a vertex at 38.1 mm read "1.5000000000000002 in" in an inch design. length_input::shown rounds to a millionth of the design's unit, as the millimetre text did before, and the test pins that case. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Box window: a picked point keeps the micrometre in every design unit length_input::shown rounds to a millionth of the design's unit, and the picked point's text is what OK sends, so in a metre design a vertex could move by up to half a millimetre. Document::design_length keeps the micrometre in every unit and still writes 38.1 mm as "1.5 in". The test now covers a metre design with a point that is not round in mm, and the Sphere and Torus centre. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
155387bac1 |
Sketch Trim: a cut on a shape's centre ends the piece there, with no second point (#12101) (#12103)
* Sketch Trim: a cut on a shape's centre ends the piece there, with no second point Trimming half of a center rectangle's diagonal left two points at the centre. Trim dropped the diagonal's Midpoint constraint and ended the kept half on a new point held only on the other diagonal, so the old centre was free and the new end slid along the other diagonal. Dragging a corner pulled them apart. A cut that lands on a point held at the middle of the trimmed line or of the cutter now ends the kept piece on that point. When the trimmed line held it, the Midpoint moves to the cutter if the point is the cutter's middle too (a rectangle's diagonals bisect each other), and otherwise the point is held on the cutter as a new end would be. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Trim: weld the cut end before a parallel distance moves onto it A distance between parallel lines that measured from the trimmed line's end moves to the kept piece's start. When that start is a cut welded to a centre point, the move named the new point, which the trim then removed along with the dimension. The weld now happens first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Trim: test that a parallel distance moves onto the welded centre Trimming the start half of a center rectangle's diagonal moves a distance to a parallel line onto the kept half's start, which is the centre. The test fails if the weld runs after that move: the dimension then names the cut point and is removed with it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Trim: the centre comment names the case that reaches it Only a line carries a Midpoint, so the comment's ellipse case could not reach this code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Trim: a crossing line whose middle is only near the cut gets no midpoint hold Trimming a line at its held midpoint moved that hold onto the cutter whenever the cutter's middle sat at the cut, so a crossing line that merely happened to have its middle there was tied to the point. The hold now moves only when the sketch makes the two lines diagonals of a parallelogram (each pair of opposite sides held parallel, horizontal or vertical), as a center rectangle's are; otherwise the point stays on the cutter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Trim: ask the solver whether a cutter's middle is held at a cut midpoint Moving a cut midpoint's hold onto the cutter only for a parallelogram of parallel, horizontal or vertical sides missed rectangles the sketch holds another way: with the bottom side held square to a side instead of horizontal, trimming a diagonal at the centre left the centre held only on the other diagonal, one degree of freedom freer than before. The hold now moves when the sketch already implies it, that is when adding it to the sketch as it was takes away no degree of freedom. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Trim: solve for the implied midpoint only when a cut lands on one Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
de1db6fb8c |
Parameters: reach the end of a long expression the same way on every OS in its test (#12104)
a_long_expression_opens_wide_while_edited_and_enter_applies_it moved the cursor to the end of the wrapped field with Ctrl+End. The control channel's cmd flag also sets ctrl, and on macOS egui treats Ctrl with End as an unhandled Emacs-style chord, so the cursor stayed where the click put it. The typed " * 2" did not land at the end, the parameter kept its old expression, and the test failed on macOS while it passed on Linux. The test now uses Command+Down with ctrl off, which egui maps to the end of the text on every platform. What the test checks is unchanged. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8fb046aaa8 |
Sketch: the whole sketch updates while you type a dimension's value (#11584) (#11585)
* claim: #11584 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: the sketch follows a dimension's value while it is typed (#11584) While a new dimension's value was typed, only the dimension moved: the sketch's curves, points, constraint glyphs and other dimensions stayed at the old size until Enter. The typed value was already solved in a scratch session; it is now solved in the frame it is typed, and the open sketch is drawn from that solve, for every kind of curve, within the display cache's limits per sketch. Esc draws the design again. Picking and snapping of curves and points stay on the design, and no hover highlight of the design is painted while a value is typed. A value that does not solve keeps the last one that did. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: the sketch scene follows each solve of a typed value, not its address (#11584) The sketch scene was keyed on the preview's address, which a later solve can have once the drawn one is freed; the scene would then stay at the old value. Each solve now has a number, and the scene is keyed on it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: while a value is typed, no design profile is lit over the sketch, and its curves are sampled before its fills (#11584) The profile under the pointer was lit where the design has it, over the sketch drawn at the typed value; it is no longer, and the highlight is built again when the value is let go. The typed sketch's profiles were sampled before its curves from the one budget, so a sketch whose fills used it up lost its curves; the curves now go first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: a selected profile is not lit over the sketch while a value is typed either (#11584) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: the view goes to the typed preview only once a value is typed (#11584) A picked dimension's value box opened with a draft that is the design as it is, and the view already treated it as the typed preview: the profile under the pointer, the selection and the hover went dark before anything was typed. The preview now starts with the first key, completion or reference. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: a reference picked into the value is solved at once (#11584) The overlays read the preview before the editor solves a changed value, so for the click's frame they drew the solve before the reference. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: a selected sketch curve is not lit where the design has it while a value is typed (#11584) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: the pointer's x, y readout is not drawn while a value is typed, as the hover is not (#11584) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: curvature combs, the design's teeth, are not drawn while a value is typed (#11584) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: while a value is typed only the open sketch loses its hover and profile highlights; other sketches keep theirs (#11584) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
7b31c0567b |
Sketch Transform: turn and scale about a picked point, such as a rectangle's corner (#11718) (#11797)
* claim: #11718 * Sketch Transform: turn and scale about a picked point, such as a rectangle's corner (#11718) The Transform window turned and scaled the picked entities only about the middle of their box. It now has a Center field, as Move does. A sketch point picked there is the point Scale and Angle work about, and Position moves it. The box, its corner handles and the knob in the view follow the same pivot. With Center empty, Transform works as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Transform: a click on a corner picks it as Center while Center waits for a pick (#11718) The rectangle corner the issue wants to turn about sits under the box's corner handle, so a click there started a scale. While the Center field waits for a pick, the box's handles leave clicks to the sketch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Transform: the handles work again once Center has its point (#11718) Center is the window's last field, so a pick there left it active, and the box's handles stayed off until another field was clicked. They are now off only while Center is empty and waiting for its pick. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
5efdd52854 |
Ribbon: a tool pinned into the Finish Sketch group shows pressed (#12049) (#12050)
* Ribbon: a tool pinned into the Finish Sketch group shows pressed The Finish Sketch and Finish Editing groups never drew the pressed state for any of their buttons, so a drawing tool dragged into them (the group at the ribbon's right edge takes drops) looked like a one-shot action while it ran. Only Finish, Cancel and Finish Edit are now left out of the pressed state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ribbon: test that Finish, Cancel and Finish Edit stay plain under a press None of the three runs as a tool or leaves a dialog behind, so a press is the one way they could light up. The tests now press each one and fail if any of them is dropped from the exclusion. Finish Edit is pressed and released in the edit-in-place test, so the release is also the click that finishes the edit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ribbon: Finish with AutoConstrain stays plain under a press like Finish Finish with AutoConstrain belongs to the Finish Sketch group and ends the sketch like Finish, but it was not in the list of buttons left out of the pressed state, so once pinned as a button it lit while the pointer was held on it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
61ada52984 |
Reuse unchanged imported meshes during joint motion (#5476) (#5480)
* perf(mesh): reuse imported contents and display triangles * fix(viewport): preserve reference mesh detail and glass fallback * fix(viewport): preserve small faded mesh ordering without OIT |
||
|
|
6578d591ac |
control::execute: check the undo depth before placing the world for the first-body fit (#5940)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
d9421bf2ca |
Browser: an option to start folders closed and open rows only on request (#8768) (#8771)
* claim: #8768 * feat: Browser folders start closed and find a body only when asked, behind a preference Preferences › Layout › Browser rows start closed (`browser_rows_start_closed`, off by default) starts the Browser's folders closed, and placements too whatever "Components start open" (#9274) says. Rows then open with their arrow, Expand All or Find in Browser, which opens just the rows down to its body and closes again the ones the last find opened. A body picked in the 3D view leaves the Browser as it is, and only the body Find in Browser found has the rows above it marked, so a large assembly's placements are not named again after each edit. With the preference off, folders start open, placements start as "Components start open" says, and a pick in the 3D view opens the Browser down to its body, as on main. Find in Browser looks the body's placement up once and opens its rows before drawing, instead of each row testing the revealed path while it is drawn. * Browser tests: read the row order from the Browser's content frame Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: bherbruck <brennen.herbruck@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
774c45a512 |
Dynamics: rigid-body solver core with joints, gravity and springs (#9719) (#9721)
* claim: #9719 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dynamics: rigid-body solver core with joints, gravity and springs (#9719) A new L1 crate, solidcraft-dynamics (geom only): rigid bodies in maximal coordinates, joint constraint equations with analytic Jacobians for rigid, revolute, slider, cylindrical, planar and ball joints, gravity, linear spring-dampers and constant loads; the index-1 equations of motion solved through a rank-revealing Schur complement (repeated joint equations are solved, not refused); RK4 and Dormand-Prince 5(4) with position and velocity projection; joint values, rates, reactions and energies at every output sample; caps on bodies, joints, rows, steps and samples; Result errors only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dynamics: take Vec3 from the record crate after the layer split, refresh the lock file Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
315d8cfeb7 |
fix: sketch.intersect keeps a small round between short walls (#9962)
- section() kept the loose fit whenever it had fewer curves, even when it had merged 2 mm walls and an R2 round into one R2.85 arc that misses the walls, leaving the outline open - The tight fit is now also kept when the loose one strays from the exact crossings (on planes and rulings) and the tight one does not; capped work, other curves count as near - Test: a box with R2 corner rounds and four tapered grooves stopping 2 mm short, cut at Y=20 Co-authored-by: P'tite Tête <asso@ptitetete.com> |
||
|
|
3aee35fe01 |
Web app: keep unsaved work in the browser instead of the leave-page box (#10220) (#10221)
* claim: #10220 * Web app: keep unsaved work in the browser instead of the leave-page box (#10220) A new preference, off by default, on Preferences > General > Saving (web app only): "Keep unsaved work in this browser instead of asking when the tab closes". With it on, each open design with unsaved changes keeps a copy in the browser's private storage (keep-<page>-<design>.sc/.json), written once the design has been still for 0.8 s (at most 4 s after the first change it lacks) and again on pagehide or when the page is hidden. While every copy is current, beforeunload doesn't ask. A copy goes when its design is saved, closed, or the preference is turned off. The next visit offers the copies newer than their design's last save in SolidCraft's own window, "Restore unsaved design: <name>, changed <time>?", one window for several, with Restore, Open saved version, and Discard. A page holds a Web Lock while it runs, so another open tab's copies are never offered or removed. With the preference off, the single autosave and the browser's prompt work exactly as before. * Web app: the restore window comes from the UI kit's recovery module (#10220) The kit's text and divider helpers are private to the UI crate, so the "Restore unsaved design?" window moves to recovery_ui (browser_copies_window), beside the desktop recovery window, and the web shell only maps its answer. Also keeps the window handle for the page listeners instead of using the one moved into the app. * Web app: restore window buttons sit in one row (#10220) * Web app: keep unsaved work and still ask, unless told not to (#10220) Keeping a copy in the browser no longer replaces the browser's leave-page box by itself. A second option, shown once work is kept and on by default, leaves the box in place; off, the box appears only while a copy isn't current. * Web app: kept-copy review fixes (#10220) A failed write of a kept copy waits 30 s before the next try, a recovery copy is dropped only after the remembered saved file has opened, the preference is documented under its current label, and the ui.prefs list is sorted again. |
||
|
|
5562d9c6c8 |
Quick-access bar: pin ribbon commands to the application bar (#10223) (#10224)
* claim: #10223 * Quick-access bar: pin ribbon commands to the application bar (#10223) A command's menu (a ribbon button, a section drop-down row or a command search result) has Add to Quick Access: the command's own icon joins the application bar after Save, Undo and Redo. A click starts it as its ribbon button does, a drag along the bar reorders the buttons, and the button's menu has Remove from Quick Access. Empty, and so not drawn, by default; it holds up to 24 commands. The list is kept with the toolbar's customisations (`quick_access` in the toolbar's saved document), so it is saved, exported with the keyboard shortcuts and carried by settings profiles. * Quick access: a pinned family variant no longer replaces the ribbon choice A quick-access click now starts the pinned command with start_pinned, so it starts exactly that command and leaves the sketch family remembered choice (the main ribbon button) unchanged. |
||
|
|
d16496e057 |
Navigation: honor reverse zoom for mouse drags (#10354) (#10365)
* claim: #10354 * fix(ui): honor reverse zoom for mouse drags |
||
|
|
0690ee5875 |
Web app: run as a modelling editor inside another page that keeps the design files (#8517) (#11273)
* claim: #8517 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * web: editing embed for host pages (?embed=editor, #8517) A host page that keeps the files itself and frames SolidCraft for modelling needs the modelling UI without the application chrome. `?embed=editor` runs the web app as such an embed: - no application bar (logo, File menu, document tabs, update, help, report a bug) and no start page; the layout is docked; - the ribbon, browser, timeline and properties stay; Ctrl+Z and Ctrl+Y still undo and redo; - Ctrl+N, Ctrl+O, Ctrl+S, Ctrl+W and Ctrl+, are left to the host; - nothing is kept in the browser (no stored designs, autosave, recovery prompt, preferences or leave-page prompt), as with the existing viewer embed. The existing `?embed&open=` viewer embed is unchanged. SolveApp gets one flag, `embed_editor`, for desktop and test hosts too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * control: document.export / document.import / document.saved for a host (#8517) An editing embed's host keeps the design itself. Three control methods (window.solidcraft.request in the browser; the desktop control channel too; not the agent chat's, whose method list is unchanged): - `document.export` -> {name, revision, dirty, format: "json", text}: the active design as a `.json` design file holds it. `revision` is the one `document.revision` answers, so a host that follows the design compares one number. - `document.import {text, name?}`: replaces the active design with that text, timeline and parameters as saved, opened saved with a new `document_id`. It runs as a design opened in a tab of its own, with the old tab closed without asking, so whatever was open in the old design leaves with it. A text that does not read leaves the design as it was. Waits behind a file loading or a design change, as commands do, and evaluates on the window thread. - `document.saved {revision}`: the host saved that revision; refused when the design has changed since. They are control methods, not commands: they act on the app's open design. The browser API test gets a round trip through all three. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: aduijs <7501203+aduijs@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
1dd921fc52 |
Components: stop Capture All Positions from doubling moves (#11259) (#11364)
* Model cache: a body made by rounds keeps them, so a later round blends them the same after opening A design gave another body when opened from its model cache: the rounds a body was made of lived only in memory, so a later round at their mitre was built sequentially (or refused, as too large) after opening and blended with them when evaluated anew. The saved model now records, per kernel body made by rounds, the body they were made on (a place in the bodies, stored once though no state holds it) and the edges with their radii; reading it attaches them back down each chain, and a thinned model keeps those bodies with the bodies made from them. Model cache format 7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Tests: a corner patch of rounds 2/3/4 takes no more than the strips leave in its block three_rounds_at_a_corner bounded the patch's extra cut at 3 mm³ beyond the strips, a figure with no derivation; SMLib's all-at-once body at radii 2, 3, 4 takes 3.099 (V 7878.579574 against strips 7881.678). That body is the strips' outside the block its patch lies in: its rounds are the strips' cylinders ending at a's section y = rc, b's x = 20 − rc and c's rails where they meet a's and b's (the patch's four corners, now asserted), so the patch takes at most what the strips leave in that block (11.86 at 2/2/3, 32.69 at 2/3/4). The lower bound is that block; the upper one, at most the strips' volume, stays. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Tests: the io crate's hand-built saved models list their rounds, as format 7 records do Model cache format 7 ( |
||
|
|
1d387d3f21 |
Measure: the area of a curved face on the exact surface, not the display mesh (#9086) (#11486)
* Measure: the area of a curved face on the exact surface, not the display mesh (#9086) * Measure: a non-straight border edge leaves the band to the mesh; fix the Vec3 imports (#9086) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: bherbruck <brennen.herbruck@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
df4f9d3529 |
Inspect menu: Component Colors is a normal on/off item with a check mark (#11854)
* Inspect menu: Component Colors is a normal on/off item The Component Colors entry in Inspect > Check was labelled "Enable Component Colors" and swapped to "Disable Component Colors" with a different icon while on. It is now labelled "Component Colors" in both states, keeps one icon, and shows a check mark when on, like Draft Analysis and the other toggles beside it. The command id and parameters are unchanged. The now-unused "disable" strings and the colored_components_off icon are removed. Other languages' old "Enable ..." wording is dropped so they fall back to English until retranslated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keep the Component Colors label in the fully translated catalogs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Checkable menu rows tell screen readers whether they are on Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Georgian: Component Colors loses its Enable/Disable wording Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
ef2f485e15 |
Extend viewport AO to the existing virtual ground (#3413) (#11979)
* claim: #3413 * feat(gpu): extend viewport AO to the virtual ground * test(gpu): retain measured AO render attachments * perf: initialize ground AO pipeline with concurrent jobs * fix(gpu): size ground AO receiver for the current frame radius * fix(viewport): retain orbit caches when ground AO visibility changes |
||
|
|
07ef94e102 |
Hole: drill only the shown bodies when no target is picked (#7520) (#7562)
* claim: #7520 * Hole: drill only the shown bodies when no target is picked (#7520) A Hole that names no bodies drilled every body in its path, hidden ones too, and its dialog preview replaced the hidden bodies with drilled ones. Like a cut (#3961), it now takes the shown bodies of the active component as its participants while some are hidden, stored so showing the others later changes nothing. With nothing hidden, or everything, it still drills every body. Its face points are named on the bodies it drills first, so a hidden body's face in the same plane no longer takes the picked face's name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FN5eEMrqWWXqi65FcK8GXq * Hole: drill the picked body though it is hidden (#7520) Review on #7562: with the picked face's body hidden (picked through Select Other, or hidden while the dialog is open), the shown-bodies default left it out, so the hole drilled only shown bodies further along, or nothing, without a message. The body whose face holds the hole's position now joins the shown ones, unless a shown body has a face there too (a face shared by a shown and a hidden body is the shown one's, as a pick in the view takes it). The test also covers editing a hole made with nothing hidden while a body it drills is hidden: timeline.redefine stores participants only when the edit passes them, so the hole keeps its empty scope and the hidden body its bore. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EMbqRqYimvY26QzcvrojSC * Hole: test that a hole made with a body hidden replays the same (#7520) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Hole: follow the face-name lookup now returning a Result (#7520) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Hole: tests follow main's Vec3 and world_state (#7520) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Hole: format (#7520) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Hole: with every body hidden, drill them all as before (#7520) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: sascha2101 <221609842+sascha2101@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
02f276e296 |
Report a bug: limit answers by characters and show the room left (#7191) (#7196)
* claim: #7191 * Report a bug: limit answers by characters and show the room left (#7191) The answers were cut to 2,000 bytes, silently: 666 characters of Chinese or Japanese. They now keep 2,000 characters, as the text field's own limit counts them, in the form, in the report and in a crash draft. Under 200 characters left, an answer says how many there are. The report's budget grows so three full answers in any script still fit beside the technical details. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Report a bug: leave the crash draft's description as it was It is the app's own English text, well under the limit in bytes as in characters; leaving the line alone keeps it apart from #7189's change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Locales: Arabic and Hebrew for the new strings ar and he are complete catalogs on main now (#3458): every new message needs them. The pending-messages test compares right-to-left messages in display order once #7532 lands (#7527). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Locales: Vietnamese for the new strings Vietnamese became a complete catalog on main (#5823), so every new English message needs it too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
9602587b0d |
Navigation: a middle or right drag keeps the mode it started with (#9557) (#9592)
* Claim #9557 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Navigation: a middle or right drag keeps the mode it started with (#9557) The mode of a middle or right drag was worked out again from the keys held on every frame, so letting go of Shift partway through a Fusion Shift+middle orbit turned the rest of the drag into a pan. It is now taken when the drag starts and kept until its button is released, as a left drag with the mapping's keys already was. Preferences > Navigation > "A drag keeps the navigation it started with" (on) turns it off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
fc51df3b01 |
cadmpeg 0.6.7: FreeCAD placements, sphere faces and closed shells come in right (#10382)
Only the version moves: SolidCraft builds against 0.6.7 unchanged. 0.6.7 applies App::Part and link placements once, writes a sphere's seam ring as a valid loop, and indexes the lookups that made large assemblies slow to decode. Two real FreeCAD documents that 0.6.3 refused as invalid open with it. Claude-Session: https://claude.ai/code/session_01MvsHJx9gzG4447TABcpZFo Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8f4d7959df |
Agents and scripts: Parameter Sweep describes its exact parameters and reply (#10977) (#10978)
* claim: #10977 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Parameter Sweep: input and output schemas (#10977) inspect.parameter_sweep gets a typed contract and reply types in schema/parameter_sweep.rs and leaves unconverted.txt. Each key reads as the handler reads it, with its message; the reply is built from ParameterSweep and its item types, with the same JSON as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Parameter Sweep schema: a missing parameter reaches the handler's message Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * parameter_sweep schema: do not publish a null default on the required parameter Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
338fa197d3 |
Dimension text: round values to a step (#4896) (#11380)
* claim: #4896 * feat(doc): support dimension text rounding steps (#4896) |
||
|
|
727bb23c7e |
Section Analysis: a body standing on another keeps its own cap, also in CPU pictures (#4622)
Where one body stands on another (a post on a plate), the post's bottom, seen through the cut, and the plate's top are the same plane. In the CPU rasterizer (headless pictures without a GPU) the plate's top won that depth tie and showed through the post's cut. The cut now wins a tie by a few f32 steps (DEPTH_EPS). The viewport already draws this right since #6363 and #6728; a GPU regression test now covers it, both creation orders, orthographic and perspective, with both depth formats. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8d6c45f640 |
UI kit: one shared needs-attention mark, used by the agent chat's badge (no behaviour change) (#5424)
* UI kit: one shared needs-attention mark, used by the agent chat's badge The agent chat's "waiting" badge becomes `ui_kit::attention_mark` (a count, or a plain dot) in `ui_kit/attention.rs`, so other things that wait for the user (linked designs that changed, #5354) share one mark. The count is drawn exactly as before. No change in behaviour. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * UI kit: sort the attention re-export Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * ui_kit attention mark: take the corner inset from Tokens::space_3 The inset came from the agent chat panel as plain numbers, which font_sizes_and_dense_form_metrics_come_from_tokens refuses outside theme::Tokens (review on #5424). space_3 is 3.0, so nothing moves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Carel Theron <careltheron@Carels-MacBook-Pro.local> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
6d16fae4ed |
Render preview: extract the product scene only when what it shows changes (#7465)
The live product preview's signature included the session revision, which every command moves: a selection click extracted every body and built every product vertex again (118 ms on a 200-body assembly) before the key comparison skipped the upload. The signature is now the document and world state (held, so their addresses are not reused) and every input of body visibility, including hidden folders and the active sketch. Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> |