mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-06 20:02:16 +00:00
stack/render-11087
1065 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 | ||
|
|
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 |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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. |
||
|
|
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 ( |
||
|
|
51d237829a | Regenerate generated files and fold pending files [skip ci] | ||
|
|
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 |
||
|
|
f8a98eed33 | Regenerate generated files and fold pending files [skip ci] | ||
|
|
1432131e95 |
English: command labels in title case, other labels in sentence case (#9085) (#10734)
* English: command labels in title case, other labels in sentence case (#9085) The rest of #9085 after #9194 (the plural and the spelling) and #9907 (the Preferences page names). Command labels are in title case (422 of 430 were already); the seven in sentence case follow, and Fix/UnFix reads Fix/Unfix. The UI text skill states the rule. The user docs name the Preferences footer's button by its current label, Restore page defaults (#10295). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Navigation bar menu test: the echo names the command by its own label Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * UI text skill: state the case rule in one short sentence, under the 3600 limit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Localization doc: the case rule in full, with examples Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Localization doc: the example button is Restore page defaults now Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
06def2231d |
Agent chat: tell the agent the design changed by hand since its last reply (#10854) (#11144)
* claim: #10854 * Agent chat: tell the agent the design changed by hand since its last reply (#10854) The chat remembers the design as the agent last saw it, at the end of a turn it answered or worked in. When the next message goes and the design is no longer that one, a note goes before the message for the agent (not into the conversation, like the note after an interruption): the user changed the design by hand, which parameters changed from what to what, which features are new, edited or removed, where the History marker went, and to read the design again before reusing positions, picks or sizes. A new chat and a stopped backend forget it, so a session that has seen nothing gets no note. Each list names at most 12 items and counts the rest; names and expressions are cut at 60 characters. * Agent chat docs: the design-changed note asks the agent to read the design again (#10854) --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> |
||
|
|
d39fd6c397 |
Assistant: discover Mistral Vibe and offer sign-in (#11692) (#11704)
* claim: #11692 * Assistant: discover Mistral Vibe and support its sign-in (#11692) |
||
|
|
91ecea8cfd |
Properties: account for sheet perforations (#6025) (#6028)
* claim: #6025 * fix(engine): account for sheet perforations in physical properties * fix(inspect): retain kernel topology counts for sheet bodies |
||
|
|
8068e8f4b8 |
Preferences: the theme strip's arrows page by a screenful of themes (#11434) (#11600)
* claim: #11434 Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch> * Preferences: the theme arrows move by the themes that fit in view The previous and next arrows beside the theme cards in Preferences > Appearance moved the row by one card per click, although their hover text says "Previous themes" and "Next themes". With 26 themes and about six cards in view, reaching the last theme took some twenty clicks. The shared carousel now moves by the number of cards that fit at the current width, so one click shows the next screenful. The last page ends on the last card, the first page starts on the first, and the arrow at an end stays dimmed and inert. The step follows the window width, and the row still opens on the chosen theme. Fixes #11434 Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch> --------- Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch> |
||
|
|
e27d17c421 |
Assistant: offer the Mistral AI endpoint in Add Agent (#11246) (#11715)
* claim: #11246 * Assistant: offer the Mistral AI API endpoint (#11246) |
||
|
|
de9a2bc846 |
Shaded with hidden edges: optionally select edges through faces (#11841)
* Allow optional hidden-edge picking in Shaded with hidden edges Keep visible-only picking as the default. Cover the preference, hover cache, section and body visibility, and Fillet inputs in the existing UI tests. Use platform-absolute fixture paths in the Windows CI argument-parser test. * Respect section caps and visible-edge ties in hidden-edge picking * Keep section caps as occluders behind nearer kept faces |
||
|
|
fb80454368 |
User guide: window tour gets a numbered screenshot and a navigation clip (#10323)
* Book: a numbered window screenshot and a navigation clip, from a capture script The window tour now opens with a screenshot of the real window, its parts numbered in the order the page describes them, and a short looping clip of orbit, pan, zoom and Home. examples/demo/doc_shots.py makes both, and any later figure: each shot is a function that starts a fresh app (its own settings) under Xvfb, drives it over the control channel with the demo's Demo driver, and writes a still (numbered callouts, palette-optimised PNG) or an H.264 clip (the drawn pointer of overlay.py, short button labels, idle cut by trim_idle.py) into docs/book/src/media/. CONTRIBUTING.md says how to redo a figure when the UI changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * doc_shots: clips keep a moment on each result; the window tour again on 0.29.0 trim_idle.py takes --hold S, the seconds of each idle stretch to keep (default 0.1, as before, so the README demo is unchanged). The guide's clips keep 0.8 s, so a reader can see what each step did before the next begins. The window screenshot and the navigation clip are made again with it, on SolidCraft 0.29.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
dcbedbd805 |
Don't blindly reopen a design that stopped the last session (#5064) (#10443)
A design that crashes or hangs the app while it is being reopened was reopened blindly every launch, bricking the app each time. A launch that reopens designs now marks them in the recovery folder; the marker is cleared as each design finishes opening. A launch that finds the marker left behind skips those designs once and says which one the last session stopped on, so the app starts usable and the loop breaks. Co-authored-by: Dahak Builds <dahakbuilds@users.noreply.github.com> |
||
|
|
fd9b3fd9f2 | Regenerate generated files and fold pending files [skip ci] | ||
|
|
3e70ad9876 |
View navigator: right-click to choose Axes, Cube or a Custom body (#10266)
* View navigator: a custom body as the navigator, and a right-click menu to switch types A right-click anywhere on the view navigator opens a menu with its three types: Axes, Cube and Custom. Custom opens the Custom View Navigator panel (a feature panel with OK and Cancel): pick a body in the view, its texture (Themed: the cube's colours; Modeled: the body's own appearance and the view's edge colour), and whether the cube's rotation arrows and Home button go around it. The navigator previews the panel's choices while it is open; Cancel leaves it as it was. The custom navigator draws the body at the cube's size through a small depth-buffered raster, so hidden faces stay hidden; hovering a face highlights it, a click looks straight at it (and frames the model with navigator_fit on), a drag orbits. Until a body is chosen it draws the cube. The body is kept as a packed snapshot (16-bit, base64) with the preferences and in settings profiles, so it stays across runs and designs and travels with an exported profile. Bodies over 10,000 triangles, and long or flat ones (thinnest width under a fifth of the widest), are refused. New command view.navigator (style, body, texture, arrows, home) does the same without opening anything; new preferences navigator_texture, navigator_arrows and navigator_home, and a Custom choice for navigator_style. Defaults are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: a hovered face in Modeled takes the view's selection colours In the Modeled texture the face under the pointer is filled and outlined the way the view selects a face of the model (sel_face, sel_edge), not in the cube's hover blue and accent, which Themed keeps. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: a hovered face in Modeled lights up as the view's mouse-over does The face under the pointer keeps its own colour, a little lighter (hover_face_lift) and still shaded, with its edges in the view's mouse-over edge colour (hover_edge), as the 3D view shows a face under the pointer; not the selection colours. Themed keeps the cube's hover blue and accent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: rotation arrows and Home on by default navigator_arrows and navigator_home start on, so a new custom navigator has the cube's arrows and Home button around it; the Custom View Navigator panel turns either off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: the strings in every complete language, and test fixes - The new messages in Arabic, Hebrew and Vietnamese (complete catalogs, like Japanese and Chinese). - The navigator's raster goes through one colour helper, listed with its reason among the files allowed colour literals (the design's appearance shaded into pixels). - nav_settings joins the requested-icon manifest (the view.navigator command's icon). - A visible edge piece is kept only when the stretch seen with it, across the edge's segments, is at least two samples long: a hidden edge no longer shows a sliver at a silhouette corner. - The navigator layout test treats Custom without a body as the cube it draws; the panel and size tests no longer assume an empty undo list, the style before opening, or a coarse sphere. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: profiles carry its texture, arrows and Home Settings profiles keep a fixed set of preference keys (#9907), which the custom navigator's newer settings are not part of. They travel in the profile's own `view_navigator` entry, next to its body (`view_gizmo`): captured, checked (a value this version can't read is left out) and applied, leaving the fixed key set unchanged. The cube's arrow inversion (#10286) applies to the custom navigator's arrows too, through the shared arrows(). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: follow main's Vec3 move and fallible world_state Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: list view.navigator in the rig's EXEMPT, refuse a stored body that can't save again, right-click without a widget over the navigator Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: keep the body unless picked again, save only a profile that reads back, no navigator menu through a popup Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: refuse a stored body with a triangle past its points Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: a stored body meets the triangle and aspect limits a picked one does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Custom view navigator: a body at the 5:1 limit stays inside it once packed Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
4d738cd210 |
Sketch: an ellipse is drawn with its axes, and D measures its half-axes (#9291) (#9292)
* Sketch: an ellipse comes with its axes, and D measures its half-axes An ellipse could only be sized by its minor radius, drawn like a circle's radius, and there was no way to give its full axes. sketch.ellipse now also adds the major and minor axes as construction lines through the centre. The major axis runs from the major end to the point opposite it; the minor one is perpendicular to it, ends on the ellipse, and both are bisected by the centre. That adds six coordinates and six equations, so the ellipse keeps its five degrees of freedom, and it needs no new constraint kind and no format change. With the axes in place every ellipse size is an ordinary dimension. D on an axis line gives its length, the whole axis. D on the outline gives a half- axis, the distance from the centre to an axis end, chosen the way a line chooses horizontal or vertical but in the ellipse's own frame: text pulled across the major axis measures along it (the major half-axis), text pulled out past an end of it measures across it (the minor one). The end on the text's side is used. Near the boundary between the two, a dimension being placed keeps the half-axis it had (sketch.dimension's previous_axis, which the Dimension tool sends), so the preview does not flip. A half-axis and its whole axis determine each other, so the second becomes a driven dimension through the existing redundancy path. Deleting the ellipse leaves its axes, as deleting a Center Rectangle's edges leaves its construction diagonals. Ellipses without axes, from existing designs, keep the minor radius as before, and type radius still gives it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Guide: an ellipse's axes and half-axis dimensions Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: test that an ellipse's half-axis preview keeps its axis near the boundary The Dimension tool sends the half-axis its last preview chose, so near the boundary between the major and the minor half-axis the preview keeps it. This covers that path from the tool, from both sides of the boundary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse's axes select and drag with it, as a rectangle's diagonals do A double-click on a Center Rectangle's edge or diagonal selects its edges and both diagonals, and dragging a diagonal moves the rectangle without changing it, because its lines share corner points. An ellipse's axes are held by constraints instead, so a double-click selected only the ellipse (and Delete then left the axes behind), and dragging the major axis moved the ellipse but stretched its minor half-axis. Sketch::ellipse_axes now finds an ellipse's construction axes (the detection sketch.dimension already used, moved into the sketch crate). Sketch::chain treats an ellipse and its two axes as joined, so a double-click on any of them selects all three. Dragging either axis moves the ellipse and both axes as one, keeping both half-axes. Dragging the outline still sets the minor half-axis. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a corner test reads its line's id instead of assuming l1 sketch.ellipse now adds two axis lines, which take the first line ids, so the extend test reads the id of the line it draws from the reply. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse's axes cut a trim, as a Center Rectangle's diagonals do Trim, extend and break take every other curve as a cutter, construction lines included, so an ellipse's construction axes stop them as a Center Rectangle's diagonals do. A test now states it for both shapes, and the guide says it. The freeform cutter test keeps the axes it used to delete and asserts the piece a trim removes: from where the major axis crosses the circle to where the ellipse does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: test dragging an ellipse's outline with its axes present Dragging the outline sets the minor half-axis, and the minor axis line, held on the ellipse at one end, follows it; the centre and the major half-axis stay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: other dimension types on an ellipse with axes keep the minor radius Only auto, major and minor give a half-axis on an ellipse drawn with its axes. Any other type (radius, diameter, horizontal and the rest) gives what it gives on an ellipse without axes, as the parameter doc says, instead of quietly becoming a half-axis chosen by the text. The arm for a missing text_at is dropped: with no text the rule already picks the minor half-axis. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: test an ellipse's half-axis dead zone from the major side too The tests only showed a previous minor half-axis being kept near the boundary; the point they used on the major side is major by geometry alone. A point inside the band where geometry says minor now shows a previous major half-axis kept, in the engine and in the Dimension tool's preview. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a placed ellipse half-axis is the one its preview showed On an ellipse already sized, a half-axis is added as a driven dimension on the click, and that command left out the half-axis the preview kept near the boundary, so the click could place the other one. It now passes it as the preview does. The remembered half-axis also comes only from a draft whose text was placed (one without text is the minor half-axis by default and biased the first placement), is kept per sketch as well as per picks, and is forgotten once a dimension is placed or the picks are cleared. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: say how an ellipse's axes are recognised and what that costs The axes are read from the constraints, with no mark in the design, so the doc comment says which lines count, that deleting the midpoint or point-on-curve constraint leaves an ellipse without axes, and that each lookup scans curves times constraints. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse with one axis deleted still picks its half-axis by the text With one construction axis deleted, D on the ellipse fell back to the minor radius wherever the text was pulled, because the half-axis choice needed both axes. It now reads what is left of them and chooses as before: the major half-axis goes to the major end (also from the far side, when the point opposite is gone with its line), the minor one to its axis end, or as the minor radius when the minor axis is the one deleted. An ellipse with neither axis keeps the minor radius. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: the one-axis half-axis test checks what is measured to The test for an ellipse with one axis deleted checked only the reply's axis and value, which both ends of an axis give alike. It now checks the dimension's kind and end: the axis end on the text's side, the major end from either side once the point opposite is gone, a radius once the minor axis is. With the major axis deleted and no text the reply names the minor axis and measures to its end, where it used to be a radius with no axis named. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse's minor radius is drawn as its half-axis, without R A radius on an ellipse is the minor half-axis, and it was drawn as a circle's radius: one leader from the centre towards the text, marked R, which measures nothing a reader can see. It is now drawn as the distance from the centre to the minor axis end on the text's side, the way the half-axis is drawn while the ellipse has its axes, and labelled with the length alone. This is what D gives once the minor axis line is deleted, and on an ellipse with no axes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse's half-axis keeps a radius's stored text The half-axis frame read the stored text from the middle of the half-axis, so a radius placed on an ellipse in an existing design would show its text somewhere else. The text is stored from the centre again, as a radius's always was, and the side drawn to follows it. An unplaced one sits where a linear dimension to the minor axis end puts its text, and stacked texts step out from the centre as a radius's do. A view test reads the painted label, so the drawing cannot go back to R unnoticed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse moved, turned or scaled takes its axes along Move, Sketch Transform and Scale moved only the curves picked, so an ellipse moved without its axes left them where they were: its centre no longer halved them, the minor end left the ellipse, and the sketch stayed unsolved. A Center Rectangle's diagonals share its corners and always go along; an ellipse's axes share only the major end. The axes now go with the ellipse, as they do when it is dragged. Copy is unchanged: it copies no constraints, for a rectangle either. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a preference draws ellipses without their axes, as before Drawing an ellipse with its construction axes changes what the Ellipse tool makes out of the box, so the old ellipse stays one setting away: Preferences › Sketch › Draw ellipses with their axes, on by default. Off, the tool draws the ellipse alone. sketch.ellipse takes axes: false for the same, and keeps drawing the axes when it is not given. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: sketch.ellipse refuses an axes value that is not true or false A string such as "false" was read as not given, so the axes were drawn; it is now refused as the text commands refuse a non-boolean bold or italic. The move test also covers an ellipse whose minor axis was deleted: the major axis left goes along. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: D picks a half-axis on an ellipse without axes too An ellipse with no axis lines (both deleted, a mirrored copy, one from an older design) gave the minor radius wherever the text was pulled, so its major half-axis could not be dimensioned on it. The half-axis is now chosen by where the text is on every ellipse: the major one to the ellipse's own major end, the minor one as its minor radius. With no text it is the minor radius, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: with one half-axis dimensioned, D on the ellipse gives the other D on an ellipse chose the half-axis by where the text was pulled even when that half-axis was already held by a dimension, so the second D usually guessed the one already there and was refused as over-constrained. With a driving dimension already on one half-axis (to an axis end, the minor radius, or the whole axis along its line or between its ends), D with no type now gives the other, in either order and with or without the axis lines. With both held it chooses as before; an explicit major or minor is kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: the held half-axis rule is documented and its cases tested The Dimension command's parameters and the guide now say that with one half-axis held, D on the ellipse gives the other. Tests cover the whole axis held as a distance between its ends and as its line's length with the other axis deleted, and check that a mirrored ellipse has no axes. The placement test undoes its first dimension, so its second half still tests where the text is rather than the held half-axis. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: Transform previews an ellipse with its axes OK in Sketch Transform moves, turns and scales an ellipse's axes with it, but the window drew where OK would leave only the picked curves, so the axes stayed put in the preview until OK. An ellipse picked alone is now drawn with the axis lines it has. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: the typed-radius ellipse test counts the ellipse's axes Main's #10282 test drew an ellipse with typed radii and expected one curve; with the ellipse_axes preference on by default the tool also draws the two axes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse's remaining axis still drags and selects it With one axis deleted, dragging the other axis did not hold the ellipse (with the minor axis left, the drag squashed it), and a double-click on the ellipse or that axis selected only the one curve. The drag and Sketch::chain now read whichever axes are left through ellipse_axis_lines, as Transform and Move already do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: drop the unreachable third arm of the held half-axis check A distance from the centre to the major end or the point opposite it is already matched by the first arm, so the third arm and its major_end closure never ran. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: D on an ellipse's axis line is the whole axis wherever the value is pulled An axis line took the free line's rule, so on a turned ellipse a value pulled beside or above the box the axis spans gave its horizontal or vertical distance. An ellipse's axis is a construction axis, so auto now always gives its length, which the held half-axis check already counts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse's axis is never a side of a Fillet or Chamfer corner A line drawn from an ellipse's major end shares that point with the major axis, so Fillet or Chamfer there took the two as a corner (two lines skip the construction filter) and rounded the line into the axis. The axes are left out of a corner, picked by its point or as a and b. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: test the move reply, extend and the one-axis Transform preview for ellipse axes The reply of sketch.move, sketch.transform and sketch.scale lists the axis lines, Extend stops at an axis, and Sketch Transform previews an ellipse with the one axis left after the other was deleted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: with Draw ellipses with their axes off, D on an ellipse is its minor radius as before The preference brought back the old drawing only; D on an ellipse had changed with no way back. sketch.dimension takes half_axes (default true, refused when not true or false); false makes auto on an ellipse the minor radius wherever the text is. The Dimension tool and the context menu's Sketch Dimension pass it from the preference, and with it off a radius on an ellipse is drawn and labelled R as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: read an ellipse's axes in one pass over the constraints ellipse_axis_lines scanned every constraint for every curve, so 500 ellipses with their axes (1500 curves, 2000 constraints) took 1.6 s to read and Move on all of them 2.0 s. It now collects the lines the centre bisects first: 3 ms and 0.36 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: the dimension and corner parameters say how an ellipse's axis lines take part Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Preferences: Draw ellipses with their axes says D gives the minor radius when off Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: ask only the ellipses centred on a line's midpoint whether it is their axis is_ellipse_axis read every ellipse's axes to answer for one line. An axis is bisected by its ellipse's centre, so it now asks only the ellipses centred on a point that bisects the line. The answer is the same. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a horizontal or vertical dimension across a level major axis holds it for D on the ellipse half_axes_held counted a distance, a length and a radius, but not a horizontal or vertical dimension across the major axis, which is its length when the axis lies that way. D on the outline could then take the held major half-axis and be refused as determined; it now gives the minor one. Across a slanted axis such a dimension is only a projection and does not count. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Dimension: a draft on an ellipse is drawn with the axes preference it was made with The frame read the preference as it is now, while the dimension added is the draft's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a horizontal or vertical dimension across an upright minor axis holds it too Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: drop the unused Sketch::ellipse_axes; ellipse_axis_lines says how the axes are read Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse's own axes do not cut it, so Trim takes a lone ellipse whole and stops at real crossings Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: Fillet and Chamfer offer no corner at an ellipse's axis end, as the engine takes none Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a deleted ellipse leaves its centre on its axes, as a Center Rectangle's centre stays Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: ellipse axis docs say what they do, and the corner picker tests a curve's ends before its axis role Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: the trim-at-a-crossing test checks that part of the ellipse is left Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: an ellipse axis moved, turned or scaled on its own takes its ellipse along, as a drag does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a selection dragged by an ellipse axis takes the ellipse along, as the axis alone does Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: the Sketch preferences page lists Draw ellipses with their axes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: the ellipse axes help text says D gives the minor radius, drawn and labelled R as before, wherever the value is pulled Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
e3f99de8af |
Onyx: a tactile stone-grey theme with broad subtle blur (#10338)
* Onyx: add the finished stone-grey theme and document its blur range * Onyx: distinguish grey construction lines from gold dimensions |
||
|
|
954232cef1 |
AI client setup: preserve configuration files when a write fails (#11363) (#11410)
* claim: #11363 * AI client setup: replace configuration files atomically (#11363) |
||
|
|
41a450be7c |
i18n: add Georgian (ka) interface language (#11501)
A Georgian catalog (assets/locales/ka.json) carrying every English message, registered in crates/ui-egui/src/i18n.rs, with a row in the new-language test, a pending attribution file and a terminology note in docs/localization.md. The catalog is Mkhedruli only; egui's built-in Hack already draws it. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
b227924be9 |
Render: the Cancel button keeps its full label during a render (#11222) (#11241)
* claim: #11222 * Render: the progress row keeps Cancel whole (#11222) The progress card is an egui area, laid out within last frame's size. When the status grew (9 % to 10 %, a longer phase or name), the caption and the Cancel button were truncated, down to "..." with a long shot name. progress_action now takes the name and the status apart and gives each part an explicit width from the room the caller offers (the canvas for the floating card): Cancel and the status always show whole, a long name is cut with an ellipsis (full name on hover), then the meter narrows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
28b47059bb |
Agent chat: a text selection dragged past the edge scrolls the conversation (#11527) (#11533)
* claim: #11527 * Agent chat: a text selection dragged past the edge scrolls the conversation (#11527) Holding a text selection near or past the top or bottom of the conversation scrolls it, faster the further out, so a long answer can be selected in one drag. egui scrolls a label's selection only for the label under the cursor, and not at all for a table, whose label sits in its own horizontal scroll area. egui also leaves a label out of the text selection while it is scrolled out of view: a selection whose start had scrolled away was dropped, and Copy missed the hidden text. The conversation's labels now take part out of view too, clipped to nothing, so they keep their end of the selection and give their text to Copy without being drawn or moving the selection. * Agent chat: only a drag towards the edge scrolls the conversation (#11527) A press on a label creates an empty selection on the press frame, so a click, a double click or a held press on the line by the edge scrolled the conversation, and so did the start of a drag from there inwards. Scrolling now waits until the pointer has moved more than 8 points towards that edge since the press. * Agent chat: approval titles and pending messages keep a selection scrolled away They were plain selectable labels, so a selection that started in one was dropped once its label scrolled out of view, as in the rest of #11527. They now use the same off-screen-aware label as the conversation's text. --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> |
||
|
|
f9dd77e383 |
Configurations: reject invalid suppression values when saving rows (#9088) (#11571)
* claim: #9088 * Configurations: reject invalid suppression values before saving rows (#9088) |
||
|
|
7bd66b7c06 |
Sketch dimensions: enter the value in a small window with step arrows (#7246) (#7251)
* claim: #7246 * feat(sketch): enter a dimension's value in a small window with step arrows (#7246) * Dimension window: fit the layer split, and keep the wheel off the camera over the window 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> |
||
|
|
6312c2760a |
MCP list_commands: ask for commands by id prefix or panel, ids and labels only, or a page at a time (#11726) (#11788)
* claim: #11726 * MCP list_commands: ask for commands by id prefix or panel, ids and labels only, or a page at a time (#11726) list_commands answered with the whole catalog, every key of 575 commands (about 350 KB), and could only narrow it by a substring. It now also takes `prefix` (start of the id), `panel` (a whole panel or tab name), `compact` (id and label), `fields` (the keys to keep) and `limit`/`offset` (pages, as {commands, total, offset, next_offset}). With none of them the reply is the same as before. A batch step naming list_commands narrows the same way, and a bad argument is an error that names it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
481687fff3 |
Modeled threads: the thread runs down to a flat face with no uncut block, so a nut can bottom out (#11782)
* Modeled threads: run down to a flat shoulder so a nut can bottom out An external thread running the whole face stopped with its groove clear of a shoulder, leaving up to a turn uncut above it. The groove now runs on past the plane of the face's end and is trimmed there, so its root reaches the shoulder at every angle and nothing past the plane is cut. A shoulder rising back along the face keeps the square stop, as do internal threads, tapers, runouts and lengths stopping short. Where the kernel refuses the trimmed cut, the groove also keeps the square stop and the feature warns. Closes #11610 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Kernel ladder: record the thread cases that now reach their shoulder Six cases gain the faces of the trimmed last turn; every other case is unchanged apart from its timing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Thread at a shoulder: review fixes, and a test of the fallback The shoulder check starts just off the face, as the free-end check does, so a slope rising from the face counts. A groove the trim leaves nothing of now falls back to the square stop too. A test forces the fallback and reads its warning. The ladder's order and report go back to main's, changed only for the cases this moved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Thread at a shoulder: check all the radii the groove cuts The check for a shoulder rising along the face looked a fixed distance out, which falls short of the groove on an undersized shaft. It now covers the groove's reach. A test reads how each kind of shoulder is classified. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Thread at a shoulder: test the trim that leaves nothing of the groove The test now reaches the path where the half-space keeps nothing, which is the one that must fall back to the square stop. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Thread at a shoulder: say so when the shoulder can't be checked If the kernel can't make the rising-shoulder check, the groove keeps the square stop as before, and the feature now warns that its last turn is left uncut. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
f74c6605c4 |
Fillet: Mitre or Swept corners where two rounds meet (#11498)
* SMLib wrapper: a swept or mitred turn for constant rounds (Turn) Brep::blend_dropping takes a Turn: Mitre (the default, as before) or Swept, which sets solidcore's FilletSession::set_swept_turns before the corners are made. A swept turn solidcore refuses at CreateFilletCorners comes back as Error::TurnRefused with its reason and place (NoRoom at a concave side edge, else CornerUnsupported). Swept is for Blend::Round only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ * Kernel: fillet rounds turn in a mitre or swept (FilletTurn) fillet_removing, fillet_max, fillet_max_each and fillet_each take a FilletTurn and hand it to SMLib, through the reblend of earlier rounds at a later corner too. A swept corner solidcore does not build is refused as invalid input with its reason and place: no smaller radius builds it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ * Design: a fillet saves its turn, mitre (default) or swept FeatureKind::Fillet gets `turn` (FilletTurn: mitre, the default and not saved, or swept), one pending format file. Evaluation hands it to the kernel, pattern copies included, and refuses a swept turn with a style, fit, corner or setbacks the kernel's swept corner does not take (SWEPT_TAKES). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ * solid.fillet: the turn parameter, and the command's input and output schemas `turn: mitre|swept` on solid.fillet, refused when unknown or with options a swept corner does not take. solid.fillet now has its contract (FilletParams) and reply type (FilletResult), registered with checked!, and leaves schema/unconverted.txt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ * Fillet dialog: a Turns choice, Mitre or Swept A Constant radius fillet's Turns row sends `turn: swept`; choosing a narrowed radius or a curvature corner puts it back to Mitre, and Swept puts those back. Its tooltip says what each does where two rounds turn round a corner edge. New strings in a pending locale file (en, de, ja, ko, zh); glossary entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ * Fillet turn: the schema tests' fixes and the complete catalogs' strings The no-contract example in the schema tests is solid.chamfer now that solid.fillet has one; the reply test checks the mid-radii form against the contract (solidcore refuses that law's corner yet, #430) instead of building it; Arabic, Hebrew and Vietnamese, complete catalogs, get the new strings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ * Fillet schema test: variable and spline forms checked against the contract solidcore fails a variable round on a box edge at this pin (status 1001, as variable_radius_on_a_box_edge), so the reply test checks those forms against the contract instead of building them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ * Fillet turn: the swept rig cases pass; the MCP no-contract example is solid.chamfer cov-fillet-turn-swept-boss-base-r1 and cov-fillet-turn-swept-pocket-sharp-corner-refused-r1 pass now that solid.fillet takes `turn`: off the rig's known-failing list. The MCP bridge test's example of a command without a contract was solid.fillet, which has one now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DtL5M41G8Nua7HvuFPZkmJ --------- Co-authored-by: jyviko <2501648+jyviko@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
c5bc849913 | Blur: keep themed backing and notice actions accessible (#9810) | ||
|
|
381ff99f70 |
Desktop: one design's long kernel call no longer stops other designs (#11684)
solidcraft-smlib held one process-wide kernel lock for the whole of every solidcore call, so a long call in one design (a modeled thread, a fillet) held up every kernel call in every other design, even after its tab was closed, and a call that never returned held them until restart. Each call now takes a kernel from a pool and the lock is only held to take or put one back. Calls one after another get the same kernel as before; one that starts while another runs gets its own. Each kernel has its own range of procedural blend serials, since a body keeps the serials of the kernel that made it. History commands and delete checks now belong to their design: they wait with its tab, go when it closes, and can't land in another design. An agent's command for a design that left the window is refused at once instead of holding up the requests behind it. Closes #11681 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
ec31745f0a |
Preferences redesign 10/11: Navigation and 3D mouse (#9882) (#10739)
* Preferences: preserve Navigation and 3D mouse alongside other panels * Tests: check preference search visibility after scrolling settles * Tests: identify preference search results through indexed row handles |
||
|
|
5e2a1460ff |
Preferences redesign 9/11: Sketch (#9881) (#10720)
* Preferences: preserve Sketch redesign alongside Graphics * Preferences: share hinted and unhinted blocks across independent panels * Tests: wait for preference search scrolling before checking visible targets * Tests: locate preference search results by their indexed rows |
||
|
|
92a9a5e0f0 |
Preferences redesign 6/11: Layout (#9878) (#10638)
* Preferences: preserve Layout controls alongside the other redesigned panels * Tests: locate the redesigned Layout checkbox by its visible label |
||
|
|
1094503e97 | Preferences: share picture choices without conflicting with panel redesigns (#10937) | ||
|
|
f3977d5c2d |
Preferences redesign 8/11: Design and Tools (#9880) (#10710)
* Redesign Design and Tools preferences * Refine Tools: icon rows for Create, dashed Assembly Move ring, gradient cursor trail * Preserve current behavior when rebasing Design and Tools preferences * Preferences: keep Design search aliases compatible with queued panels * Preferences: let Design and Graphics helpers merge independently |
||
|
|
908fe48c0b |
Preferences: group Shortcuts and use cards for Assistant and Plugins (#9883) (#10765)
* Preferences: group Shortcuts and refine Assistant and Plugins * Preferences: keep Assistant search additions compatible with other panels |
||
|
|
138e3478e6 | Regenerate generated files and fold pending files [skip ci] | ||
|
|
fbd30b0bd0 |
Panels: inspect and change layouts through commands (#11304) (#11454)
* claim: #11218 * Panels: add shared layout rules and retained content runtime * claim: #11304 * Panels: inspect and change layouts through shared commands (#11304) * Panels: account for layout commands in geometry coverage |
||
|
|
372136fa6a |
Preferences redesign 7/11: Graphics (#9879) (#10662)
* Preferences: keep Graphics redesign independent on current main * Preferences: repair Graphics search targets and CI regressions |