mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-07 12:31:56 +00:00
f4d937d8a298f9bd930d8a430d82de2ec00e02bb
651 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
a5f7f5a921 |
Batch: consecutive parameter edits can rebuild the design once (#5822) (#5839)
* claim: #5822 * Batch: consecutive parameter edits can rebuild the design once (#5822) An agent's batch of parameter edits, one parameter per step, evaluated the design once per edit: an edit early in the timeline rebuilds nearly all of it, and 21 such edits ran for minutes. engine.batch and the MCP batch tool take coalesce_parameters (default false). With it, each run of consecutive plain parameter edits (parameters.change with only a name and an expression, or with changes) is set as one parameters.change {changes}: one rebuild for the run. Any other step ends a run, so later steps see the design up to date. Every step still gets its own result (coalesced: the run's length); the run is one undo step. A run whose combined edit is refused (a new parameter, which changes can't make; a bad expression) runs step by step, so a refused edit is still named by its own step. The app's off-thread evaluation computes the run the same way. The grouping is solidcraft_engine::batch_params, shared by both runners. 21 parameter edits on a plate with 21 extruded bosses (in-process MCP, ci profile): 40.1 s step by step, 3.5 s coalesced, the same volume. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Batch coalescing: say a run skips the states between its edits; test it against step by step (#5822) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
f7233c4418 |
Render: a preview setup with exposure renders and names what it leaves out (#5089) (#6073)
render.settings.set stores exposure_ev and the environment controls, but render.preflight and render.start refused any setup with them because the CPU image executor doesn't apply them, so such a setup could never render. The CPU executor now renders it and the replies list the left-out controls in ignored_controls. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
34e75979b2 |
Agent chat: hand WSL paths to agents started through wsl.exe (#5546) (#5549)
* claim: #5546 * Agent chat: hand WSL paths to agents started through wsl.exe (#5546) An ACP agent started through wsl.exe was handed the session's working folder and the solidcraft-app bridge's command as Windows paths, which it can't use: the Claude adapter refuses the session, and the bridge never starts. When the agent's program is wsl or wsl.exe, convert both to their WSL form (C:\Users\... -> /mnt/c/Users/...) before session/new, in the chat and in the Test button. The bridge still runs on Windows and reaches the app at 127.0.0.1. |
||
|
|
f01ef3c6aa |
Keep the Parameters window height stable when moved (#5078) (#5752)
* claim: #5078 * Keep the Parameters window height stable when moved (#5078) |
||
|
|
692265980b |
Identify commands beside the animated agent cursor (#622) (#6026)
* claim: #622 * fix(ui): identify commands during agent cursor animation |
||
|
|
d1ec8dfd5a |
Agent chat: a Mammouth AI preset for OpenAI-compatible endpoints (#5815) (#6082)
* Agent chat: a Mammouth AI preset for OpenAI-compatible endpoints (#5815) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Agent chat: the key test names the Mammouth AI URL too (#5815) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
5fa6361ff2 | Regenerate THIRD-PARTY-LICENSES.txt and docs/features.md [skip ci] | ||
|
|
1f93b6d39c |
Joint: use the picked straight edge as the motion axis (#5457) (#6086)
* claim: #5457 * fix: align new straight-edge joint snaps with the edge (#5457) |
||
|
|
9d226b3535 |
Sheet metal DXF: options to leave out the bend lines and to use one layer (#4314) (#6130)
sheet.export_dxf always wrote the dashed bend lines (BEND_UP, BEND_DOWN) and split the flat pattern over a layer for each role. A cutter that cuts every line it is given cut the bend lines too. bend_lines: false now leaves them out, and layers: single writes every entity on layer 0. The defaults keep today's output. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
b88673f366 |
Model cache: each sheet body is written once, not with every state (#6152)
* Test: a saved model keeps each sheet body once A sheet-metal design wrote its sheet bodies again with every later feature's state in the saved model: each feature that leaves the sheet alone (a box beside it) adds more than the whole sheet to the records. A design of many features after its sheet metal passed the cache's 32 MiB manifest limit that way and kept only some of its states (#3220). The test also opens the saved file and wants the sheets taken from it as evaluated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PsiqyXWBFGTCX9J51bhysc * Model cache: each sheet body is written once, not with every state Problem: a saved model writes every feature's state, and each state wrote its sheet bodies in full; most features leave the sheets as they were, so a sheet-metal design of many features repeated them over and over (a 280-feature part: 30.5 MB of manifest, 29.6 MB of it 69 distinct sheet records written 243 times). Past the manifest's 32 MiB limit the save thinned the cache (#3220) and opening evaluated the left-out features again, although the distinct data was small. Solution: the records keep a list of sheet bodies, each written once; a state names its sheets by their place in it, as it already does for bodies and sketches. A thinned model keeps the whole list and counts it once against its budget; the reader counts sheets with the bodies and sketches a state holds; the cache format is now /4 (an older cache is a miss). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PsiqyXWBFGTCX9J51bhysc --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
adbd2adf89 |
view.pick: map screenshot pixels to exact geometry (#6304) (#6329)
* claim: #6304 * view.pick: map screenshot pixels to exact geometry (#6304) A read-only command that answers, for screenshot pixels (window or model frame) or world-space rays: body, face index, exact world point and outward normal, depth, occurrence/component for placed parts, and the nearest edge/vertex within edge_px. Faces are raycast through the same per-body pick index the mouse uses; flat faces are solved exactly against their plane, curved faces take the mesh hit with the normal interpolated from the mesh's surface normals. Section-aware: faces on the removed side do not stop a pick and the cut cap answers with section_cap. Never touches the selection, camera, document or undo. Exposed as control ui.pick and as view.pick through engine.execute and engine.batch (and through them MCP execute and batch). --------- Co-authored-by: Dahak Builds <dahakbuilds@users.noreply.github.com> |
||
|
|
c0640cb95e |
inspect.parameter_sweep: check a design across a parameter's range (#2273) (#2276)
* inspect.parameter_sweep: check a design across a parameter's range Rebuilds a copy of the design at each value of a parameter and reports what no longer holds compared with the design as it is: features that fail or warn, joint origins that are lost or turn over on their own part, sketch planes that turn over, and sketch solves that fail or fold. The design is not changed; each value's rebuild time is reported too. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * inspect.parameter_sweep: params doc matches what it takes and returns `steps` takes at most 199 (200 values), as the check says; failed and warned entries carry the feature's name; a lost origin says which one; a value the parameter refuses gives {value, ms, ok: false, error}. The refusal test covers steps 200. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * inspect.parameter_sweep: Japanese and Chinese labels Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Aac7mP9rthK3WsPpPRvCsF --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> |
||
|
|
2ff17c0fcb |
3D mouse: follow the device that moves, not the first one found (#3988) (#4339)
* claim: #3988 (3D mouse: follow the device that moves, not the first one found) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * 3D mouse: follow the device that moves, not the first one found (#3988) On Windows and macOS the reader opened the first 3D-mouse interface it could and read it until it failed. A 3Dconnexion Universal Receiver with nothing paired opens fine, has a valid layout and never fails, so it kept the reader for good. A SpaceMouse on a cable next to it was never read ("Not calibrated (hid 256f:c652)", every axis at zero). The reader now opens every candidate and follows the one in use. The first is followed from the start, as before. Another takes over once it shows use (an axis off zero or a button down) while the followed one has shown none for STALE_AFTER, so two devices moved together don't trade the reading. A candidate that fails is dropped; if it was the followed one the reading resets and the next is read. With one device the reader behaves as before, down to the 100 ms read timeout. Several take 10 ms turns, and reports queue in the system meanwhile. The selection is `follow()`, written against a small `ReportSource` trait, so it is tested with simulated devices on every platform: an idle receiver next to a SpaceMouse, two devices in use at once, and devices failing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * 3D mouse: a press that makes a device the one in use counts as a press Since #3825 a HID device's first button report after it connects is its baseline: a button down in it is held, not pressed. A device taking over from another one was connected at that moment, so the press that took over was swallowed. With an idle Universal Receiver found first, that is the first button press on the SpaceMouse. follow() now keeps the buttons each candidate last reported while another was read, and the reader hands them to the reading as the baseline when that candidate takes over. A device that reported no buttons before it took over keeps the held-not-pressed rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Tyler Chiriboga <18270301+Tyler-Chiriboga@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
4b119dd471 |
Performance overlay: frame-time graph and histogram, triangles, draw calls (#2548) (#2549)
* Performance overlay: frame-time graph and histogram, triangles, draw calls (#2548) Net change of the perf-overlay branch, rebased onto main as one commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Document frame_rate_details in ui.prefs 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> |
||
|
|
4cd1a51f48 |
Assistant: a request timeout per endpoint for slow models (#5009) (#5010)
* claim: #5009 * Assistant: a request timeout per endpoint for slow models (#5009) An OpenAI-compatible endpoint now stores how long one model request may take (request_timeout_s, 300 s by default, clamped to 30 s ..= 1 h). It is set in the Add agent dialog and in the endpoint's entry under Agents (a running conversation uses a change from its next request), through ui.agent_chat add_agent, and reported in the chat's state. A request that runs out of time says the limit and where to raise it instead of "timeout: global". The desktop HTTP cap goes from 900 s to an hour. The tool-call timeout stays 330 s: it covers SolidCraft's own tool work and the user's Allow, never the model. * Assistant settings: line up an endpoint's Request timeout with Permissions The label column of an agent's entry is wide enough for "Request timeout", so the label isn't cut and both rows share one column. |
||
|
|
dbdeeec2e9 |
Undo restores what a hide put away (#2219) (#4780)
* Undo: what is hidden lives in the snapshot, so hiding is a step (#2219) `Session::execute` records a step only when the document `Arc` changes, and what is hidden lives in `Session::visibility` — saved with the design, but outside the document. `browser.visibility` was also declared `.noundo()`, and `Snapshot` had no field for it, so even a recorded step could not put a hidden body back: undo went to the command before the hide and left it hidden (#2219). `Snapshot` and `Checkpoint` now carry the `Visibility`, `go_to` restores it, and `Session::execute` treats a visibility change as a change of its own. That change is display-only, so it refreshes the view with a revision bump (`refresh_display`) instead of evaluating a model a hide does not touch. The command also takes `folder: "all"` (every body, sketch, construction item, origin item and joint, plus the browser folders and occurrence hides) so Show All can be one step, and asking for the state an item already has no longer reorders the hidden lists: a redundant hide is not a step and leaves no unsaved changes. * Show/Hide: the menus run browser.visibility, so the history has it (#2219) The hide and show actions wrote `session.visibility` directly instead of running the command: the body and face menus (`ui.hide` / `ui.show`), the `V` key (`context_menu::toggle_visibility`), the browser rows' eyes, the Origin rows and `ui.originAll` / `ui.originPart`. The engine could record a step and there was nothing to record — which is why the release still answered "nothing to undo" after hiding from the Browser. They all run `browser.visibility` now (the repo rule that the UI acts through commands), and `ui.showAll` is that one `folder: "all"` call, so Show All is one undo step rather than three. `docs/occurrence-workflows.md` says what visibility does in the history. |
||
|
|
582e6097be |
Find in Browser finds the body; Find in Timeline opens the feature's folders (#3883) (#3884)
* claim: #3883 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Find in Browser finds the body; Find in Timeline opens the feature's folders (#3883) A right-click on a body in the viewport picks a face, and the face menu's Find in Browser selected the face's creating feature in the Features folder instead of the body. It now reveals and selects the body, as the edge and body menus already did. Find in Timeline now opens any collapsed history folders around the feature, and opens the Browser's Features folder for the picked occurrence, scrolled to the feature (the reveal formerly behind Find in Browser). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Find in Browser opens collapsed rows above the body and finds later placements (#3883) Open the document, placement, Bodies and group rows when the command runs, not while the Bodies folder is drawn, so a collapsed ancestor no longer hides the body. Match the scroll target by the placed body's world name, and fix the group row key ({scope}/g{id}). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Find in Browser picks the body's own placement; Find in Timeline leaves the Browser alone from rows (#3883) Every component's first placement keeps the definition's body name, so the root placement matched before the body's own one and Find in Browser on a first copy opened nothing above it: the placement must belong to the body's component too. Find in Timeline from a sketch, construction plane or feature row has no body to say which copy was meant, so it opened the Features folder of whichever placement came first (the other copy), or one that never lists sketches. From those rows it now only reveals the feature in the History; from a face, edge or body it still opens that body's copy's Features folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
f7b08ab8c4 |
Dimension values: #name = value defines a parameter too (#2371) (#4212)
* claim: #2371 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27 * Dimension values: `#name = value` defines a parameter too (#2371) `#width = 40` in a dimension's value now works like `width = 40` (#2916): it adds the user parameter `width` and dimensions with it. On `main` the `#` made it an ordinary expression that failed to parse. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
b702ce8c7d |
fix: start the window on Intel Macs without wgpu's indirect-call validation (#3024) (#4808)
Co-authored-by: Nathalie Schönwetter <nathalie@cfw-ag.ch> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
2fd7b6f08d |
Measure: a face or edge picked by its point alone (#4099) (#4114)
* claim: #4099 * Measure: a face or edge picked by its point alone (#4099) inspect.measure (and the MCP measure tool) refused a face or edge item without an index ("missing field `index`"). Face and edge items are now read as body + point with an optional index: the point finds the face (the same lookup face picking uses) or the nearest edge within the pick tolerance, before the selection is built. A missing body or a point on no face or edge is a clear error. Explicit indices still work. |
||
|
|
59795872f6 |
Extrude: document which way a positive taper goes (#4098) (#4115)
* claim: #4098 * Extrude: document which way a positive taper goes (#4098) A positive taper slopes the walls outward (the far end is larger along the extrusion direction), a negative one inward. Say so in the params doc, the JSON schema and the guide, and pin the sign with a test. |
||
|
|
152efb5774 |
Windows installer: add the install folder to the system PATH (#6340)
MCP clients configured with "command": "solidcraft-cli" could not find it. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
99fd05afeb |
Sketch Dimension: click an existing dimension to edit it while the tool is on (#5451)
With Sketch Dimension on and nothing picked yet, a click on a dimension that is already in the sketch opens its value box, the same in-place editor a double-click opens without a tool. Enter applies, Esc cancels, and the tool stays on for the next dimension. The dimension's text always takes the click; its lines only away from sketch points and curves, which still start a new dimension (the rule plain selection uses). Once a new dimension is under way, clicks keep their meaning. Dimensions off in the selection filter are left alone. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
c795a3f581 | Regenerate THIRD-PARTY-LICENSES.txt and docs/features.md [skip ci] | ||
|
|
8cbde001ef |
Front … Isometric View commands, Ctrl+1…7 by default (#5057) (#5058)
* Ctrl+1…7 turn the view to the standard views (#5057) Front, back, left, right, top, bottom and isometric, handled with the other view keys beside Ctrl+8: animated like the view cube, reserved so no command can take them, and ignored on the flat pattern page. * Front … Isometric View are commands, Ctrl+1…7 their default keys (#5057) The standard views become seven commands (view.front, view.back, view.left, view.right, view.top, view.bottom, view.isometric) whose default shortcuts are Ctrl+1…7, instead of keys the window handles itself. They show in Keyboard Shortcuts, can be moved to other keys or cleared, and the digits can be given to other commands. In the app they turn the view as the view cube does; headless they set the session camera, keeping target, distance and projection. |
||
|
|
9919825ea3 |
Expand All and Collapse All in the Browser (#5190) (#5335)
Open or close every Browser folder from the design or a component menu, including folders that start closed. Display only: not saved, not an undo step. |
||
|
|
d61dff69a6 |
Exploded views export as an animation (#3713) (#3744)
* claim: #3713 * Exploded views export as an animation (#3713) motion.export_animation takes an exploded view (view: id|name) as well as a study or a joint: the parts come apart at a steady pace from the assembled placement to where the view shows them, and back together with back: true (exploded at the middle frame). 41 frames by default, 81 with back. The home view frames the parts both assembled and exploded. As with explode.show, the design keeps its placements, its history and its saved state. explode.show and the export share the moves; moves a design file gives with no finite translation are left out. * Mechanisms skill: an exploded view's default frame count --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> |
||
|
|
0520910bfd |
Control: name the token file and spot a stale one when a call is unauthorized (#4664) (#4670)
* claim: #4664 * Control: name the token file and spot a stale one when a call is unauthorized (#4664) When the app refuses a token that the MCP client read from a token file, the error now names that file, when it was written and how long ago, without printing the token. The app also writes `<port>.pid` beside the token file (its process id and, on Linux, its start time) and removes both at exit; when that process has exited, the error says the token file is stale. The process check runs only after a refusal, and the token file itself stays one line, so existing clients keep working. Document force-quit leftovers and the MSIX AppData redirection. * Bench assistant: read the token out of the new ClientToken Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: bherbruck <brennen.herbruck@gmail.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
46f24f2394 |
Save the browser's view with the design, and an option to hide the origin by default (#1849)
The Origin folder's eye, a finished sketch's Show Profile and Show Dimensions, and body locks move from UiState into the design's saved visibility (origin_hidden, hidden_profiles, shown_dimensions, locked_bodies), so each tab keeps its own and they survive closing the design. The Sketches folder uses the saved browser folder (c0/sketches in hidden_folders); ui.set/ui.inspect keep showOrigin, showSketches, hiddenProfiles, shownDims and lockedBodies. Preferences > Design > "Hide origin by default": a design that never toggled its Origin eye follows the preference. New fields are a pending format change (format/pending/browser-view-state.rs). Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
d5a79a77e6 |
Agent chat: Pick context and Attach selection for elements, features and bodies (#2286) (#2288)
* claim: #2224 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Agent chat: keep Send in view for a long message, open "View attached" (#2224) The message box sat in a fixed 92-point reserve, so a long message grew it past the panel and took Send, Stop and Attach view with it. The box is now a panel of its own at the bottom: it grows upwards up to a cap, then scrolls, and the conversation takes what is left. The picture sent with a message is kept on it (once the agent starts on the message), and the "View attached" caption opens it in a window. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Agent chat: a message's pictures as thumbnails with a hover preview and a viewer (#2224) Instead of a window on the far side of the screen: the pictures of a message show as small thumbnails under it, hovering one shows it bigger for as long as the pointer stays, and a click opens a viewer over the app with the message's pictures one at a time (previous and next, arrow keys, Esc). A picture carries a note shown with it, so attachments of other kinds can use the same viewer. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * claim: #2286 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Agent chat: Attach selection sends what is selected in the model with the message (#2286) A checkbox beside Attach view. The selection is read when the message is sent (also for a queued one) and described: faces and edges with the names, indices and points the tools take plus their size and place, features by name and kind, bodies by name; at most 64, the rest counted. The agent gets it as text after the message; the conversation shows the message as typed with the things as grouped chips (hover for what the agent was told). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * WIP: the chat's context picker dialog (#2286) * Agent chat: Pick context, a picker for elements, features and bodies (#2286) A button beside Attach selection opens the picker: a dialog with Elements, Features and Bodies inputs, so clicks in the model, the timeline and the browser pick into the active one (clicking again takes one out), with the usual highlight. OK puts the picks as chips with an x above the message box; they go with the next message like an attached selection (text for the agent, chips in the conversation) and the tray is empty again afterwards. Cancel keeps what was picked before. The control channel opens it with pick. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Agent chat: Attach selection counts and describes what was clicked, not the pieces of a rim (#2286) A click on a circular rim or a split surface selects all its pieces for the commands. The checkbox counted them one by one and the agent got one entry per piece (reported on macOS). They are now grouped back into the click they came from: one chip, one entry with the whole size, and the indices of every piece in its detail. Edge details are looked up by position as well as index. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Agent chat: a message's picture is kept on exactly that message (#2224) The turn now carries its message's place in the conversation (also through a queue and a send again after a sign-in), so its picture is kept there, once, and never on an older message that also wanted one (review of #2225). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * Agent chat: use the UI kit's checkbox and button and the font tokens (guard tests) Main's UI-kit guard tests reject raw egui checkboxes, buttons and font sizes in the chat panel; Attach selection, Pick context, the chip remove button and the chip fonts now come from ui_kit and Tokens. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
5d47946e4d |
Downloads: say Windows code signing comes from SignPath Foundation (#6207)
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
69cfd89ae8 | Regenerate THIRD-PARTY-LICENSES.txt and docs/features.md [skip ci] | ||
|
|
9e6e0b8df1 |
Render workspace: complete experimental ribbon, resources and effects integration (#5493) (#5494)
* wip(render): reconcile completed material and image pipeline source with 0.20 (#5493) Source-only integration reference for staged review, not a merge-ready aggregate. Donor: 0xlillith/solidcraft@aea20b0115. Upstream: |
||
|
|
b7b25f9e2b |
Render workspace: first basic delivery to main (#6050)
* Normalize UI container violation paths across platforms (#5599) Report repository-relative paths with forward slashes so diagnostics and the existing nested-package regression assertions agree on Windows and Unix. Keep the container detection rules unchanged. Validation: official ui-containers gate and all seven focused xtask tests passed; rustfmt and diff checks passed. Only xtask/dependencies were compiled; no application build or heavy tests. (cherry picked from commit |
||
|
|
a633a67e63 |
Preferences: choose the window system on Linux (Wayland or X11) (#3083) (#3084)
* claim: #3083 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * WIP: choose the window system on Linux in Preferences (#3083) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Preferences: a window system set over the control channel is saved for the next start again The merge kept main's check in ui.prefs, which only looked at the anti-aliasing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Preferences: the window system section drops the restart badge its note already states Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
592f6a6fee |
ci: fix local scheduling and Windows test baselines (#4941)
* ci: repair local nextest scheduling and Windows fixtures * test: refresh MSVC robustness references and isolate GNU policy Integrate the Windows reference records from #3361 and the target-environment selection and recording policy from #4159. Keep shared records and comparison tolerances intact, and retain seed 36 as an existing failure tracked by #3583. Co-authored-by: Ray <raykholo@users.noreply.github.com> Co-authored-by: chris <christopher.nourse@gmail.com> * test: make CI subprocess and revolve fixtures deterministic --------- Co-authored-by: Ray <raykholo@users.noreply.github.com> Co-authored-by: chris <christopher.nourse@gmail.com> |
||
|
|
19db763899 |
Tapped Hole: verified metric fine, UNC/UNF and parallel G/Rp catalogues (#4178)
* feat: expand tapped-hole catalogue with metric fine and Unified sizes * docs: distinguish metric designations from expanded tapped catalogue * feat: add internal pipe catalogue and checked Rc profile data * Connect parallel G and Rp catalogues to cylindrical tapped holes * fix(i18n): register tapped thread catalogue labels * fix(i18n): complete thread labels in required locales |
||
|
|
9a737bd63c |
Linked components: joints keep their face after Update Links (#3330) (#4874)
* claim: #3330 * Linked components: joints keep their face after Update Links (#3330) A linked design comes in as STEP text, which keeps no face names, so the faces of its bodies were named by their place in the file (`face:<k>`). An edit of the part that adds a face earlier in the file (a second hole of the same size) gave that place to another face, and a joint on the linked part moved there silently. When a link is made or updated, each imported face is matched to the part face it was written from (the same geometry), and the Import feature keeps that face's name in the part (`Feature::link_faces`, a new pending format change). The linked face is named `F<import>🔗<digest of that name>`, pieces keeping their qualifiers, so references follow the part's own history through Update Links as they do inside the part, and a face the part no longer has is reported. Linked faces still answer to `face:<k>`, so older references keep resolving; Update Links warns about joints that use them and reports joints that no longer solve. * Linked faces: a solid's twin keeps its own names; renamed faces count as an update Two solids of a part alike in one place each take the names of the solid the file names them after. Update Links reports a link whose part named its faces differently since as updated (a joint may follow that name to another face), not as unchanged; only a link getting its first names stays unchanged. * Linked faces: Extract to File carries the design's face names too Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
8b65d41b31 |
Expression completion: keep longer names visible when the typed word is a unit (#3663) (#3664)
* claim: #3663 * Expression completion: keep longer names listed when the typed word is a unit (#3663) Typing `rad` into an expression box showed nothing because `rad` is the radians unit and a word that is itself a known token closed the popup. The popup now stays open on such a word. A complete name (`width` with `width_extra` defined) opens it unarmed: the longer names are listed with no row selected, Enter submits what was typed and Tab moves on; Up or Down picks a row, after which Enter or Tab complete it as before. A unit means something only after a number, so a unit typed anywhere else (`rad` on the way to `radius`) is a prefix like any other: the popup is armed and Enter completes `radius` instead of submitting one radian. A complete token is extended only by names that start with it (`in` lists `inner`, not `rounding`), a typed unit offers no other units (`in` does not list `inch`), and a unit right after a number (`2 in`, the form every dialog starts its sizes in) opens no popup at all, so nothing sits over a dialog's OK button. Fixes #3663 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> |
||
|
|
807e367bdb |
Hole: place a Single hole by distances from reference edges (#37) (#2931)
A Single hole can take up to two straight edges of its face as references,
each with the distance of the hole's centre from that edge's line, measured
in the face's plane. `solid.hole` takes them as `references: [{edge, distance}]`;
the edges are found again by their persistent names, else their points, so
the hole follows them when the part changes, and each distance is a
parameter. A bad reference (no edge there, a curved edge, one square to the
face, parallel edges, a negative distance, a centre off the face) is refused.
In the Hole dialog, Reference 1 and 2 follow the face, each with its Distance
row; the canvas shows each distance as a dimension from its edge to the hole,
with a box just past the edge to type it in. Picking an edge measures its
distance (and its box takes the keyboard), typing one moves the hole, and
moving the hole measures them again. Edit Feature picks the edges again with
their distances.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
400e06c202 |
Hole: snap to face and round-edge centres, drag placed holes, section in the dialog (#2171) (#2912)
Placing a Single hole put it exactly where the click landed, with nothing to line it up by and no
way to move it but taking it out and picking again; the dialog was a list of size fields.
- Preferences › Design › Create Hole has two settings, both off by default, so a new installation
places holes as before:
- Snap to face and edge centres (`hole_snaps`): the planar face under the cursor offers its
middle and the centres of its round edges (a boss, a rounded corner, a hole already there) as
marks; a pick near one, or on or beside such an edge, takes that centre and the mark is named.
Sketch points on the face still come first; Alt or Ctrl held places it where clicked.
- Move holes by clicking or dragging (`hole_moves`): each placed hole has a handle that drags it
(snapping when snaps are on) and takes it out when clicked, and a pick elsewhere on its face
moves it there. Edit Feature shows the handle too, so a hole can be moved later (#1047).
- The Hole dialog draws a section of the hole as its options make it, with each size in a field
beside the dimension it sets; a hovered or focused field lights its dimension. The layout is a
new kit element, `ui_kit::figure_rows` (a caller-painted figure beside captioned fields).
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
1fa0371c75 |
Pattern dialogs: Quantity fields get up/down step arrows (#4260) (#4264)
A new kit control, `ui_kit::count_field` / `count_row`, is an expression field for a whole-number count with stacked step arrows at its right edge. An arrow steps the evaluated count by one within the field's limits: a plain number is replaced, an expression keeps its parameters and gains or adjusts a trailing `+ n`. The text changes as typing changes it, so the live preview follows. Used by the Quantity rows of the sketch Rectangular (1-500, both directions together at most 500) and Circular (2-500) patterns, and the solid Rectangular, Circular and Path patterns (1-1000). Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
fc3e3b6c8d |
Join: say so when the joined piece doesn't touch the body (#4434) (#4436)
* claim: #4434 * Join: say so when the joined piece doesn't touch the body (#4434) A Join (extrude, revolve, sweep, loft, pipe, coil, primitives, thicken, boundary fill, surface network) whose material meets none of its targets still joins it to the first target as a separate piece. The result stays as it was; the feature now warns: "the joined piece doesn't touch `Body1`, so `Body1` is now in 2 separate pieces (New Body makes it a body of its own)". History marks it and the command reply carries it. The check compares pieces (outer shells, not voids) of the bodies the feature changed or absorbed before and after it, so it holds for the batched multi-profile path too, stays quiet for a join that bridges pieces or closes a cavity, and leaves Combine (which joins the bodies it is given) alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
612d9d08dd |
cadmpeg 0.6.3: FreeCAD and Rhino import in the browser too (#4482)
cadmpeg 0.6.3 is pure Rust (ruzstd instead of the zstd C library, zip 9), so solidcraft-io depends on it on every target and the wasm build reads .FCStd and .3dm files like the desktop app. The browser's file pickers offer them. 0.6.3 replaces DecodeOptions::container_only with a decode depth; ask for Geometry, what its STEP writer reads. zip 8 leaves the tree, and with it the three cargo-deny advisory exceptions kept for it. Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> |
||
|
|
1f6a2d4daf |
3D mouse: driver choice, guided calibration, button mapping and a picture of the device (#1463) (#3825)
* Add a small test boat to steer around with the 3D mouse A little hull in its own camera, drawn by the UI itself and not the CAD viewport, so a 3D mouse can be tried out without opening a design. It brings the model (generated by assets/models/make_test_boat.py) and the tests for how the camera moves it. Nothing uses it yet; Preferences picks it up with the rest of the 3D mouse work. * UI kit: keep a choice row from flipping with the scrollbar A choice row picks segments or a dropdown by whether its labels fit. A page scrollbar that comes and goes narrows the row by its own width, so the row could flip back and forth between the two on a page that sits right at the edge. It is now judged on the whole row and through a small helper, fits_steadily, that only changes its answer once the miss is wider than the scrollbar. Also tests for that, for typed numbers in a slider's value box, and a test hook to put up the issue-report input barrier by hand. * 3D mouse: device model, guided calibration, buttons and a picture The 3D mouse becomes a device we know something about instead of six raw numbers. The reader picks between spacenavd and the direct hidraw driver, falls back from one to the other, and says so when it can't open the device. Guided calibration asks whether the device is a spring cap or a trackball, adds a touch step, and uses a settle filter so a ball let go of stops reading as motion. Buttons get jobs (keys, held modifiers, commands), saved per device, with defaults for the SpaceMouse Pro. Preferences gets a picture of the device that moves as it does, next to the test boat, and the same picture can sit in the 3D view at Left Viewport, Right Viewport or Left Window, above the floating History card like the legend and readouts. These ride together because the crate's calibration types, the Preferences page, the Linux reader and the button hook all use each other. * 3D mouse: offer to calibrate an uncalibrated device When a 3D mouse shows up that has not been calibrated, a card in the 3D view offers to calibrate it, to swap drivers when the other one would work better, to close, or to never ask again. It is made once per device, goes away after 30 seconds in view, and gives way to a status or computing toast instead of stacking on it. The card is the shared toast, which now takes buttons: they group by purpose, wrap inside the card at narrow widths, and do nothing while an issue report holds CAD input. The picture of the device in the 3D view keeps clear of the card. * 3D mouse: translations and attribution The 3D mouse strings (ui.3d_mouse_*, the calibration steps and the offer card) in every shipped language, the Japanese catalog note, and the credit for the test boat model in ATTRIBUTION.md. This is last because the code before it only looks keys up: it builds and runs without these, falling back to English until they land. * 3D mouse: draw its preferences with the settings kit like the rest of Navigation The 3D mouse section was a folded header with its own layout. It now uses the same kit as the sections above it: a settings_section card, settings_form rows with the shared label column, dividers between the device, axes, picture and buttons groups, Text::Hint for the helper lines, and settings_control_width for the dropdowns. The section is open like every other one (the header still folds it), so the device badge on the folded header is gone; the calibration row already names the device. Every setting, string and key is unchanged. Tests that unfolded the section no longer click it, and the hint lines are looked up as hints instead of notes. * 3D mouse: show each axis's live tilt in Preferences, like main's axis rows Each view axis row is main's axis row again: a meter that follows the tilt of the motion driving it, with the dead zone marked, next to Invert, Speed and the "driven by" menu. The meter reads the calibrated travel when the device has a calibration and the raw reading over full scale when it does not, and asks for a frame whenever the reading changes. The helpers are back as they are on main, and the calibration state is a badge by the enable toggle. * 3D mouse: line its preferences up with the rest of Navigation - The two checkboxes sit side by side in the same two-column grid as Wheel and trackpad. - Row labels stop repeating "3D mouse" and use sentence case: Calibration, Driver, Restore defaults, Reset view, Left viewport, Right viewport, Left window. - Hints line up under the control column instead of the left edge. - The six view axes are named Pan X, Pan Y, Zoom, Orbit X, Orbit Y and Roll so they fit the name column. - Buttons are a divider and rows in a form like the other groups, without the bold sub-heading. - The driver, dead zone, axes, picture and buttons sit behind a collapsed Advanced section, since most people never touch them. * 3D mouse: tidy the Advanced test for clippy |
||
|
|
6c6ffe4802 |
MCP: wait out long requests, honest batch outcomes, batch tool aliases (#2901)
Rebased onto main as one commit (was |
||
|
|
46fca160e1 | Regenerate THIRD-PARTY-LICENSES.txt and docs/features.md [skip ci] | ||
|
|
16727f331c |
docs(mcp): Windows setup for Claude Desktop (#3794)
* docs(mcp): Windows setup for Claude Desktop (paths, two servers, Store config file) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * docs(mcp): say the Store build can keep the config elsewhere, not that the other path fails Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
fb374b543b |
UI: integrate theme radii, borders, palettes and viewport refresh (#5045) (#5046)
* claim: #4922 * UI: let themes own corner radii * UI: use four-point panel and window radii in SolidCraft 95 * UI: align the 95 radius assertion with four-point panels * claim: #4953 * UI: let themes own structural and control borders * UI: single Blueprint outlines and dotted secondary rules * UI: separate container outlines and add theme-owned 95 bevels * claim: #5007 * UI: apply theme palettes to icons, workspace tabs and Gruvbox settings * claim: #5045 * Viewport: invalidate cached geometry colours when the theme palette changes * UI: preserve legacy theme logo colours with the borderless mark |
||
|
|
0dffb206b1 |
Assembly: ground the first part; drag free joint chains (#2804) (#2805)
* assembly(feat): ground first parts and drag free joint chains Ground the first top-level part when it is created and let face dragging reposition free occurrences or any member of a floating joint chain in one undo step. Preserve exact repeated-placement frames, joint values, modifier selection and Escape cancellation. Keep the accumulated fixture, viewport layout and documentation integration fixes from the existing PR. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(fix): update movable fixtures for first-part grounding Accept the documented grounded override in component creation, explicitly free movement fixtures, and keep linked clipboard pastes movable even in an empty document. Cover first and reused linked pastes, default insertion grounding, and single-step undo in the existing link tests. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(test): keep the motion-cost crank free Unground the first component in the document-level joint-face measurement fixture so its motion samples can rotate after first-part grounding. Preserve the rotation and shared-measurement assertions that caught the Linux CI failure. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(test): free the frame placement fixture Create the frame-member placement fixture ungrounded before moving it above its root sketch. Keep its world-space member assertions while respecting first-part grounding in the frame tests added on main. Signed-off-by: Karl Von Richter<karl@embeint.com> --------- Signed-off-by: Karl Von Richter<karl@embeint.com> |