mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-06 20:02:16 +00:00
develop
446 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
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> |
||
|
|
e438a9bbea |
Web app: choose the release, the release candidate or the edge build (#11419)
The web app is now offered at /app/ (latest release), /app-rc/ (newest release candidate) and /app-edge/ (current main), each with its own browser storage. /app/ is built from the latest release's web zip instead of main. |
||
|
|
c5ccb9201d |
Wave 43/45: smlib: rustfmt after the C++ kernel's removal (and 1 more)
2 commits, squashed; the originals stay reachable from branch jyviko/merge-main-develop-solidcore (#11360). - |
||
|
|
ea772a0438 |
Merge develop into main: SolidCraft on the SMLib kernel (v1.1.0-alpha) (#11351)
* UI: rim and wall picking tests for a circle of arcs that is one wall A circle drawn as two half arcs now extrudes to one full-turn wall with its seam edge, and each rim is one closed edge (tangency-labs/smlib#67). The tests keep their intent on that body: a rim clicked once is one item, measured and highlighted whole and picked from either side; a wall picked either side of its seam is the same surface, lit whole, and toggles off from the other side; every face is its own patch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Fillets: a later round at a corner where earlier rounds meet blends them again with it The owner's ruling of 2026-10-30: a later fillet on an edge at a vertex where earlier rounds already meet in a mitre makes the corner rounding all of them at once makes, one smooth patch, the mitre gone. A body made by constant-radius rounds keeps what they were made on and which edges they rounded at which radius; a later round reaching such a corner blends the earlier rounds' edges (from the earliest of those meeting there on) with the new edges in one SMLib blend of the body before them. The result's history is put over the body the later round was given: an earlier round's face is that face trimmed anew (its name kept), the corner patch and the new rounds are the later fillet's. A picked mitre seam has no round of its own: it is refused unless a new edge of its radius meets it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Tests: a later r3 round at an r2 mitre, through the Fillet feature, makes the all-at-once corner Two box edges rounded r2 in one fillet, then the upright edge at their mitre r3 in a second fillet (tangent chain on, so the seam comes with it): 10 faces, 7928.743041 mm³ as fillet_radii of the box gives, the r2 rounds' names kept, the r3 round and the corner patch the second fillet's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Kernel: a body's record of rounds goes with its history, and can be read back The rounds that made a body are over the body its history is over: a new history (an operation carrying a step's result back to its own operands) leaves the record out, so a later round never reads one history against another body. Body::rounds gives the record and Body::with_rounds_of takes one back, checked (edges of the body before them, a fillet's radii, the body's history over that body), for a saved model to keep it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * 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 ( |
||
|
|
6be5be7f0c |
Keys: option to keep model keys out of sketches (#7675)
* Keys: a sketch and the model kept apart on Scope `command_for` fell back to the first enabled command bound to a key, so a model key pressed in a sketch (F, Fillet) still ran the model command. A key now runs only a command of the scope the view is in, or one that works everywhere; otherwise nothing fires. Inspecting, views and file commands (`inspect.*`, `view.*`, `file.*`) count as everywhere, so Measure's I still works in a sketch. #4432's `sketch_and_model_keys_are_kept_apart` is ported to `Scope`. Not ready: main's `the_extrude_key_in_a_sketch_finishes_the_sketch` (#2815) expects E in a sketch to finish it and open Extrude, which this rule stops. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Keys: keep model keys out of sketches as an opt-in preference The strict sketch/model split is now Preferences > Shortcuts > Keep model keys out of sketches, off by default. Off, a key resolves exactly as on main (a feature key such as E still finishes the sketch). On, a sketch runs only sketch keys and keys that work everywhere (inspect, view, file). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * rustfmt Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
ce6ad21106 |
macOS update: say to quit SolidCraft before replacing it (#7584) (#7886)
* claim: #7584 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FAWPuFoh9qxn2uS2j53QZ * macOS update: say to quit SolidCraft before replacing it (#7584) After Download and open, the update window told people to drag SolidCraft to Applications, replacing the old copy, then restart it. Finder refuses to replace an app that is running ("the item “SolidCraft” is in use"), so the message now says to quit SolidCraft first, then drag the new copy over and open it again. "Quit" rather than "close": closing the window on macOS can leave the app running. The id update.dmg_opened is unchanged; every catalog that carries it is updated, and the user guide's update tables get the same step. Fixes #7584. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FAWPuFoh9qxn2uS2j53QZ --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
dadefec702 |
Joint dialog: Find Limits fills the limits from where parts collide (#5968) (#7047)
* claim: #5968 * Joint dialog: Find Limits fills the limits from where parts collide (#5968) joint.find_limits sweeps each value of a joint both ways from where it is, on a copy and with its own limits left out, and answers where the parts it moves first touch another part, where a closed loop stops closing, or that nothing is met within a turn (angles) or the parts' reach (distances). Edit Joint's Limits section gets a Find Limits button that runs it on the joint as the dialog has it, off the window thread, and fills the rows. joint.sweep now tells touching bodies apart from the other bodies of the same two parts: on the Hinge Assembly sample the pins touch where it starts, and the plates used to pass through each other unnoticed. * find_limits: read the session only * find_limits: a joint with nothing to meet, edits during a search, tiny ranges * find_limits: keep touching at the start per pair of parts Per body, the Hinge Assembly sample's plates, which only come flush in the end plane the two leaves share, stopped the search. The leaves never pass into each other: the sample's answer is a whole turn. * find_limits: touching boxes cost no collision work; stale results and rounding * find_limits: each pair of bodies of resting parts held to its own depth; loops without bodies * find_limits: a 32-bit budget it can pass, a repaint with the result, a bad form says so first * find_limits: each pair of resting bodies gets its own margin * find_limits: Arabic, Hebrew and Vietnamese strings (complete catalogs on main) * find_limits: search the joint with Edit Joint's side picks Edit Joint now keeps the joint's sides as picks in its inputs, and its OK commands compare them with what it opened on. Built without them, the commands Find Limits applies first asked for the sides again, so every search failed. --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> |
||
|
|
89f1234f28 |
Browser: placements start closed (#9274) (#9658)
* claim: #9274 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Browser: placements start closed (#9274) A large assembly opened with every placement unfolded, so the browser was a long list to scroll through. Placements now start closed; opening one shows its own placements still closed, and closing and reopening it leaves them as they were. Find in Browser, a pick in the view, Expand All and Collapse All open and close them as before. Preferences > Interface > Components start open (browser_components_open) keeps every placement open from the start, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Browser: scenarios and the icon audit open placements, which now start closed Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Browser: tests that read rows inside placements set the open-placements preference Three tests added on main since this branch started (joint folders, Features folder marks, group rename) look at rows inside placements, which now start closed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: bherbruck <tenbee91@gmail.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
c7547eb3a8 |
Extrude: a face picked off the profile's plane is the target by default (#11201)
With a profile or face picked, clicking a face, vertex or parallel plane that is not in the profile's plane now sets Extrude to To Object, not one more profile. Clicking into the Profiles box first makes the next picks profiles again. Preference extrude_auto_to_object (Tools) turns it off. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
b6aabb88ff |
Insert Design: place reused links from their parent origin (#10813) (#10825)
* claim: #10813 * fix: place reused linked designs from parent origin (#10813) |
||
|
|
446590dca1 |
fix(engine): report design variant in timeline.inspect and accept in timeline.add (#10748) (#10792)
* fix(engine): report design variant in timeline.inspect and accept in timeline.add (#10748) * ci: refresh checks to clear cancelled workflow run |
||
|
|
b557f22f97 |
Sketch: a construction/normal switch in the construction line tools (#10258) (#10551)
* Sketch: a construction line with a length can be a normal line (#10258) `construction: false` on a construction line command that has a `length` makes the segment a normal sketch line, ready to close a profile, instead of construction geometry. The default stays construction, and an infinite line is always construction. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a length box in the construction line tools (#10258) The horizontal, vertical, parallel and perpendicular construction line tools show a Length box beside the pointer from the start. It stays empty (shown as infinite) and leaves the keyboard to the tool's shortcuts until a digit is typed; then the box takes the keyboard. Without a length the tools work as before: one click, an infinite line. With a length the first click sets the start and a second click the side the segment runs to, sent as the command's `length` and `near`, so the segment gets its length dimension. The angle tool has a Length box beside its Angle box. A typed length keeps the start's snap, and the preview draws the segment the click will create. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: a construction/normal switch in the construction line tools (#10258) A Construction | Normal switch sits under the Length box of the construction line tools. Normal sends `construction: false`, so a segment with a length becomes a normal sketch line, ready to close a profile, without converting it afterwards. The switch starts at Construction with each start of a tool. An infinite line is always construction, so without a length the switch is greyed out and its tooltip says why. It belongs to the tool alone: the Sketch Palette's drawing line type (X) is left as it is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
ce72abacf9 |
Construct: plane through an axis and a point (#10178) (#10472)
* claim: #10178 * feat: add plane through axis and point (#10178) |
||
|
|
24b91bd453 | Sketch Concentric: accept a circle or arc and a sketch point (#10487) | ||
|
|
7bafc99390 |
Send to Slicer: the Print face input takes one face for each body sent (#10468)
With several bodies to send (after Add all bodies, say), the Print face input refused every face. It took a print face only when exactly one body was sent; any other pick was cleared at once, with a note in the status bar only. Each body's print face then had to be set with Ctrl+B, or by sending that body alone. The input now holds the print face of each body being sent. A face picked in it becomes its body's print face, in place of the one it had. A click on a body's print face takes it out and clears only that body's. A face of a body that is not being sent is refused with a message (`ui.print_face_body_not_sent`, in place of `ui.print_face_one_body`). Each change is still one `body.print_face` command, so it undoes on its own. Picks in this window are no longer widened to the other pieces of the face's surface, so a click on a print face takes it out rather than adding its neighbours. The user guide (guide/files.md) says so. The new message is in assets/locales/pending/print-face-each-body.json, in all 31 languages; the old one is removed from the catalogs. Test: dialogs_save_mesh::tests::the_print_face_input_takes_one_face_for_each_body_sent (fails without the change: the second body's face is refused). Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
9d01f6e005 |
Sketch: construction lines with a length (#10258) (#10427)
* claim: #10258 * Sketch: construction lines with a length (#10258) The horizontal, vertical, angle, parallel and perpendicular construction line commands take an optional `length`: the line becomes a construction segment from `at`, running towards `near`, held by a length dimension that follows its expression. Without `length` the line stays infinite, as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Markus Kaltenbrunner <kaltenbrunnermarkus@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
9475e0e1a4 |
Docs/design approach 10063 (#10409)
* claim: #10063 * docs: add a design approach and workflows chapter to the user guide (#10063) Adds guide/design-approach.md after the window tour: the parametric idea, principles for designs that change well, the timeline and rollback marker, bodies vs components and occurrences, common workflows with links, a term map for users of other CAD software, and where to find help. * docs: match the chapter to the app's labels and sketch colours (#10063) Checked in the web app (0.29.0): the timeline strip is headed History, the toolbar shows New Sketch and Parameters for Create Sketch and Change Parameters, and fully constrained geometry turns white in the default dark theme rather than dark. * docs: tighten the design approach chapter's wording (#10063) The glossary covers most, not all, of the chapter's terms; Redo moves forward; the timeline is shown as the History strip; Report a bug drafts a report for the user to file and sends nothing itself. |
||
|
|
e4a67d1e30 |
Assembly: move sketches to the part they're drawn on (#10218) (#10219)
* claim: #10218 * Assembly: move sketches to the part they're drawn on (#10218) `component.move_sketches.to_parts` moves each given sketch, or every sketch in the design, whose plane is an exactly attached face of a part's body into that part through `component.move_sketches`, as one undo step. Sketches with no single part to go to stay where they are, and the reply lists what moved and what stayed, with the reason. The Sketches folder's menu offers it for the folder's sketches (or the selected ones), and a sketch's menu for that sketch or the selected sketches; the status bar says how many moved and why the others stayed. `component.move_sketches` now keeps a face-attached sketch where it is on its face: the sketch is authored in the new component's placement (the face's own when the component owns the face), and its picked point and repair plane are carried into it. Before, a face-attached sketch moved out of the design was left without an author placement and failed to evaluate. * Tests: the moved part is free to move; face anchor path * Tests: move the to_parts test to the component command tests * Shorter label: Move Sketches to Their Parts |
||
|
|
80fb02f0b8 |
Sketch Ellipse: Major radius and Minor radius boxes while drawing (#10279) (#10282)
* Sketch Ellipse: Major radius and Minor radius boxes while drawing (#10279) The Ellipse tool showed no value boxes. After the centre it now shows Major radius, after the end of the major axis Minor radius; a typed value places the point at that size and becomes the ellipse's dimension, as for a circle's Diameter. sketch.draw.dimensioned takes major_radius and minor_radius for sketch.ellipse, so Dimension new shapes covers it too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Ellipse: test the typed radii in the tool and in sketch.draw.dimensioned, and say so in the guide (#10279) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch Ellipse: rustfmt the new engine test (#10279) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
4594d81f7a |
Gruvbox: light and dark themes with three contrast choices (#10292)
* claim: consolidate Gruvbox contrast variants * Consolidate Gruvbox variants into light and dark contrast choices * Check both original Gruvbox viewport gradient endpoints * Reset Gruvbox scenario state before independent theme checks |
||
|
|
2e3448f348 |
Sketch: an option to make the part active when sketching on its face (#10215) (#10216)
* claim: #10215 * Sketch: an option to make the part active when sketching on its face (#10215) Preferences › Sketch › "Sketching on a part's face makes that part active", off by default. When it is on, a sketch started on a face of another component's body activates that component at the picked placement first and is made there, as after an explicit activate. The part stays active, so what is built from the sketch lands in the same part. For scripts the same is `sketch.create` `activate_part: true`; the reply's `activated` names the component and placement. On an error the active component goes back to what it was. * Tests: a free part, no edge projection, the sketch on the face plane |
||
|
|
8be56316f6 |
Sketch Chamfer: several corners at once, as Fillet does (#8998)
The three sketch chamfers take `points: [corners]` (a point reference or
{a, b} each), as sketch.fillet does: every corner is cut alike in one
edit, and a corner that can't be cut, or is named twice, refuses them all.
The Chamfer window sends every picked corner instead of refusing a second.
Claude-Session: https://claude.ai/code/session_01PVKpSVXR9iiwSM9B25kpvq
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
0476154973 |
Update Links: linked designs that changed while the tab was away come back as one undo step (#9743) (#9753)
* claim: #9743 * Update Links: linked designs that changed while the tab was away come back as one undo step (#9743) Coming back to an assembly's tab read each changed link in an Update Links run of its own, so each became its own undo step: one Undo took back one component and left another copy of the same part at the new version. component.update_links now takes `components`, a list, and goes on past a design it cannot read: that link keeps its bodies, is named in `failed` and gets a warning. The tab return sends one request with every changed link, records as read only the ones that were, and says on the status line which one could not be read. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8f259d5b83 |
Sketch: the Line tool can switch to a tangent arc and back without changing tool (#9489) (#9553)
* claim: #9489 * Sketch: the Line tool can switch to a tangent arc and back without changing tool (#9489) With Preferences > Sketch > "Rest on a line's last point to switch to a tangent arc" on (off by default), leaving the chain's last point and resting back on it for 0.35 s makes the next click a tangent arc, by the existing sketch.arc.tangent command, and the same gesture goes back to lines. A label at the cursor says which. sketch.arc.tangent's end can now name an existing point, so an outline drawn this way closes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch: the cursor label names the command in words (#9489) The label asked the catalog for a message id that doesn't exist, so it showed the id. It now takes the command's translated label, and the test checks the words it paints. Moved clear of the pointer's own badge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
5bb3b6717f |
Equation curves: the variable can carry its range's unit (#9333) (#9549)
* claim: #9333 * Equation curves: the variable can carry its range's unit (#9333) A curve can set variable_unit "range" (or tick the new box in its window): the variable is then a length, so a ^ 2 / (4 * t) is a length when a is one. Start and end must both be lengths, or one a length and the other a plain number in the design's unit; anything else is refused. Saved only when set, as one pending format change; without it curves behave as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
3c0d4e120e |
Linked designs: one changed while the assembly was closed is read again when it opens (#9739) (#9872)
* Claim #9739 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Linked designs: one changed while the assembly was closed is read when it opens (#9739) A link now keeps the SHA-256 of its design file's bytes as the assembly last read them (DesignLink::file_sha256, a pending format change), set by Insert Design, Relink, Extract to File and Update Links. component.links reports `changed` from it, hashing a file again only when its time or size changed (vfs::design_path_stamp, behind the design-path rule). The app treats a link it meets for the first time whose file changed as not read yet, so opening an assembly, in its own tab or in place of the blank design, reads those parts again as a tab coming back does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Linked designs: read what changed last when a design opens in place of the blank one (#9739) A read is taken up only by the design revision it started from, and adopt bumped the revision after starting it, so the read was dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
da23eb1377 |
Sketch dialog follows "Dialog buttons at top" (#9860) (#9884)
* claim: #9860 Co-Authored-By: Claude <noreply@anthropic.com> * Sketch panel follows Dialog buttons at top (#9860) The Sketch panel drew Finish Sketch, Look at and Slice in a footer under its options even with Preferences > Interface > Dialog buttons set to Top. Panel::palette now reads the same published preference as the feature cards and draws its footer row under the header, above the options, when it is Top. With the preference off nothing changes. Changes a default: no Co-Authored-By: Claude <noreply@anthropic.com> * Docs: Dialog buttons at top also moves the Sketch panel's Finish row (#9860) Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> |
||
|
|
9d8ab72da7 |
Ribbon tooltips: help for every remaining toolbar command (#9060) (#9868)
The last 106 commands on the backlog get the two-sentence help under their tooltip, in English, German, Japanese, Chinese, Arabic, Hebrew and Vietnamese: Surface, Sheet Metal, Plastic, Inspect, Construct, Configure, Parameters, Library, View and the few single ones (Bill of Materials, Frame Member, Pattern on Path, Convert Mesh, checkpoints). With that the backlog is empty, so it goes: the test is now every_toolbar_command_has_help, and the docs that mentioned the backlog say so. The help tests use sketch.drag, which is not on the ribbon, as the command without help. |
||
|
|
160662ffec |
Tab colours: per-tab surfaces and fade (#8876) (#9808)
* claim: #8876 * Resolve theme tab surfaces with cached Oklab transitions * Apply tab surfaces to unauthored Render preview backgrounds * Allow quantized endpoint colours late in cubic Render fades * Keep tab surface publication from restyling ordinary widgets |
||
|
|
2f6ca7e46b |
Linux: optional system title bar (server-side decorations) (#9263)
On Linux the window always had no OS decorations and drew Windows-style caption buttons in the application bar. SOLIDCRAFT_TITLEBAR=system, or "titlebar": "system" in graphics.json, now opens the window with the desktop's own title bar and buttons (server-side decorations where the compositor offers them). The default is unchanged; Windows and macOS are unaffected. Claude-Session: https://claude.ai/code/session_01Gnm1n2PVPqghMuR9kHWXfh Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
d7cba9e96d |
Preferences: theme options list and the opacity option (#8876) (#9807)
* claim: #8876 * claim: #8876 * Theme options: persist per-theme values and expose preferences contracts * Restore selected theme mode after stopping a followed theme * claim: #8876 * Preferences: render theme options and apply readable panel opacity * Use floating-point scale expectation in theme preferences scenario * Keep panel opacity colour construction inside theme tokens * Complete theme options translations in Arabic Hebrew and Vietnamese * Let standalone theme sliders fill their option cells |
||
|
|
3b77567932 |
Docs: joint flip needs x for point origins; checkpoints are single use, 16 kept (#9746) (#9844)
joint.create's flip text and the assemblies guide said two origins at one point with the same z stay as they are; a point origin without x takes its x from z, so a part turned about z turns back. Say so, and point to giving x on both origins or joint.as_built. edit.checkpoint and edit.restore_checkpoint now say that restoring or forgetting uses the checkpoint (and later ones) up and that only the last 16 are kept, and the "no checkpoint N" error says why. The editing and mechanisms skills no longer read as if a checkpoint can be restored twice. Co-authored-by: thocsmith <193096300+thocsmith@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
ca005237a1 |
Theme files: options, overlays and requires (#8876) (#9805)
* claim: #8876 * Theme files: add options, overlays and requirements |
||
|
|
3877ef08b9 |
Measure: drag the labels away from the part (#8510) (#9395)
* claim: #8510 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Measure: drag the labels away from the part (#8510) The distance and X/Y/Z labels in the view follow a drag of the pointer and keep a leader to what they measure; a double-click or a new measurement puts them back. A press on a label picks nothing, starts no box selection and opens no Select Other. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
cce337f83f |
Sketch: alignment guides from any hovered point while drawing (#9105) (#9673)
* claim: #9105 * Sketch: alignment guides from any hovered point while drawing (#9105) While a drawing tool waits for a point, hovering a line or arc end, a rectangle corner or a free point wakes the same temporary horizontal/ vertical tracking guide as a circle centre or line midpoint. Idle hovering keeps centres and midpoints only. Preference sketch_tracking_points (on) turns it off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8311ae5c5d |
BOM: group purchased children under inseparable parts (#9744) (#9794)
* claim: #9744 * Fix grouped BOM children for inseparable parts |
||
|
|
ffbaf292f0 |
Browser: drag over the eyes to show or hide many rows at once (#9680) (#9681)
* claim: #9680 Co-Authored-By: Claude <noreply@anthropic.com> * Browser: drag over the eyes to show or hide many rows at once (#9680) Press an eye and drag up or down over other eyes: each eye the pointer passes takes the first eye's new state (shown or hidden), and the whole drag is one undo step. A plain click is unchanged. Dragging near the list's top or bottom edge scrolls it. A component's eye now goes through browser.visibility, so it is undoable like a body's. Co-Authored-By: Claude <noreply@anthropic.com> * Browser: fix the eye drag's undo merge and layering (#9680) Merge the drag's steps from the undo depth noted at press, when the design and visibility still match, instead of searching the history. Run the merge every frame from logic(), so a release under an overlay is never missed. An eye under a popup or tooltip no longer takes part in the drag. Adds a regression test for a drag from the Origin's eye after a show. Co-Authored-By: Claude <noreply@anthropic.com> * Browser: say when the eye drag's undo merge gives up (#9680) Co-Authored-By: Claude <noreply@anthropic.com> * Gallery test: the eye-drag state key is not a renderable element Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: bherbruck <tenbee91@gmail.com> |
||
|
|
1b927421f6 |
Restore Browser and source-body context during Extrude editing (#5573) (#5576)
* claim: #5573 * Keep Browser and source bodies in the Extrude edit context (#5573) * fix: keep Browser feature rows after manual rollback --------- Co-authored-by: Kirill Frolov <k.a.frolov@vk.team> |
||
|
|
fc499441e2 |
Lost GPU: the old process exits instead of hanging in the driver, after the settings are saved (#9044) (#9054)
After a lost device the next start began from on_exit, while eframe was still writing app.ron, and the old process then hung in vkDestroySwapchainKHR on NVIDIA. Start it from Drop for App instead, after eframe has joined the settings save and before it drops the window's GPU surface, and end the process there after a loss. The update restart moves there too. The loss reason is passed to the next start and shown in its note. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
0952686c1b |
Sheet metal: personal Sheet Metal Rules, saved in the profile and offered by every design's rule manager (#9346) (#9520)
* Sheet metal: personal rules library in the profile, offered by every design's rule manager Adds personal_sheet_rules.rs and its tests, the personal_sheet_rules preference, and the rule manager wiring. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UqPNsVN9JQhyMReCXXsRSu * Sheet metal: pending strings for personal rules English and the complete catalogs (ar, he, ja, vi, zh), plus de and ko. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UqPNsVN9JQhyMReCXXsRSu * Docs: personal rules in the sheet metal guide Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UqPNsVN9JQhyMReCXXsRSu * Docs: glossary entry for personal sheet metal rule Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UqPNsVN9JQhyMReCXXsRSu --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
f1c2f67d63 |
Quick measurement: the selection's length, area or distance in the view's corner (#7000) (#7513)
* Quick measurement: the selection's length, area or distance in the view's corner (#7000) With edges, faces, sketch curves or points selected, the view's bottom right corner above History shows what they measure, as the Measure tool lists it: an edge's length (Ø and R for a round one), a face's area, a point's position; two items' distance and angle; several edges' or faces' count and total. It is computed off the window thread from a copy of the session whenever the selection or the design changes, and a click copies it. Preferences > Interface turns it off. The Measure dialog's rows come from the same function. * Quick measurement: off by default, turned on under Preferences > Interface (#7000) The quick_measure preference now defaults to false, so nothing changes until it is turned on. Its tests turn it on, and a new test checks that nothing shows until it is. |
||
|
|
5439bfc0b5 |
Expressions: a decimal comma inside plain parentheses (#9408) (#9447)
A comma separates arguments only directly in a function call, so plain parentheses take a decimal comma like the rest of an expression: `-(width-0,5)/2`. The UI no longer rewrites commas before wrapping a value in the design unit's parentheses. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
aff8106205 |
Help: check for updates and show results in the selected language (#8896)
* Help: add manual update checks and status window * Test manual update checks and localized results * Add update check to the native Help menu * Localize Help update checks in all app languages * Document manual update checks from Help * Document ui.help updates control action |
||
|
|
12636b67be |
Select hidden geometry with Select Other and fit the list to the window (#5574) (#5577)
* claim: #5574 * Pick hidden geometry near long clicks in a five-row list (#5574) * fix: make Select Other configurable and fit its list to the window --------- Co-authored-by: Kirill Frolov <k.a.frolov@vk.team> |
||
|
|
6e39efd4ac |
Theme: System follows the desktop's dark/light setting on Linux GNOME (#7944) (#8123)
* claim: #7944 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Theme: System follows the desktop's dark/light setting on Linux (#7944) On GNOME (Wayland, or X11 through XWayland) the window toolkit never reports the desktop's dark or light preference, nor its changes, so Theme: System kept its colours. The Linux app now reads org.freedesktop.appearance color-scheme through the XDG Desktop Portal's Settings interface (then GNOME's color-scheme and gtk-theme when it has no preference) on a thread of its own, follows the portal's SettingChanged signal, and falls back to gsettings or a slow poll. The window reads the answer through Services::desktop_dark; the decision from the raw values is prefs::desktop_prefers_dark. Windows and macOS keep the window toolkit's theme. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
3c40edd12a |
Print face: Send to Slicer lays a body on its marked face (#8429) (#8433)
* claim: #8429 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Print face: Send to Slicer lays a body on its marked face (#8429) A body can have one flat print face (Document::print_faces, held by the certified target a sketch on a face holds). body.print_face {body, point?} marks or clears it. Send to Slicer, Save Mesh with a slicer and EasyPrint turn and move the exported copy so the face lies on the bed at Z = 0 with the centre of mass over the origin; a face that can't be found is a warning and that body is exported as it lies. Move/Copy and Mirror give a copy its source's print face. One pending format file; the command has its own icon (print_face). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Print face: Ctrl+B, the face menu and the Send to Slicer row (#8429) Ctrl+B and the face context menu mark the selected flat face as its body's print face, or clear it. Send to Slicer shows the print face of the one body being sent in a Print face input, takes a flat face picked in the viewport and clears it when emptied. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Print face: a light tint in the viewport and its strength in Preferences (#8429) Each visible body's print face is tinted towards the theme's section colour and outlined, at the strength set under Preferences > General > Slicer (print_face_highlight, 0 to 1, 20 % by default; 0 hides it). The user guide describes the print face, and the known limitation after a shell of a shelled body is listed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
1754318df7 |
Browser: the visibility eye at the right end of each row (#8718) (#8720)
* claim: #8718 * Browser: the eye sits in a column at each row's right end (#8718) Tree rows draw the visibility eye right-aligned at the row's end, clear of the fold arrow and the radio and of a floating scroll bar; names stop short of it. Preferences > Interface > Eye next to the fold arrow (browser_eye_left) keeps the old position. Rows report their control positions so placement handles and inline rename follow the layout. * Docs: the browser's eye column and browser_eye_left (#8718) * Browser: the eye's tip shows by the eye at the row's end (#8718) * Browser: a gap keeps the fold arrow and the radio apart; the eye clears a floating scroll bar (#8718) The eye's old slot leaves a 10 pt gap instead of 4 pt, so the radio's hit area is 7.5 pt from the fold arrow's and History pattern rows step in from their sketch as far as browser children do. The eye's inset follows the scroll style: only a floating bar laid over the rows takes room. Rows publish indent:<label> where their depth puts them. * Tests: browser depth checks run on the default layout, by indent handles (#8718) |
||
|
|
f59f6698f1 |
Ribbon drop-downs as a grid of large icons, as an option (#4739) (#5012)
* Ribbon drop-downs as a grid of large icons, as an option (#4739) Preferences > Interface gets two settings, both off by default: - Menus: List | Large icons. With Large icons a panel's drop-down shows its commands as rows of up to five icons at 32 px (twice the list's), keeping the list's group headings and order. The name, shortcut and help are in the tooltip, as on a ribbon button. Arrow keys move across and between rows; a click starts the command; right-click and drag pin it as before. Resting on an icon for two seconds arms a pin in its corner; a quicker click anywhere starts the command, so nothing is pinned by accident. A pinned command shows its pin. - "Leave pinned commands out of the drop-down menus": a drop-down (list or grid) leaves out the commands the ribbon shows as buttons; a panel too narrow for its buttons lists them again, and a menu is never left empty. No icon artwork or colours change. Sketch > Create keeps its family list. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Sketch > Create in the large-icon grid: every variant under its family (#4739) With Menus: Large icons, Sketch > Create showed its family sub-menus as plain text rows (Line, Rectangle, Circle, ...), unlike every other menu. It now shows every variant as a large icon under its family's heading, then the other tools under "More". The list keeps its family sub-menus. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Large-icon menus: groups side by side, no footer (#4739) A menu of two or more headed groups (Sketch > Create's families, Model > Modify's Edges, Faces, Bodies, Specialise) puts the groups side by side, each heading over a column of its icons, at most two across. Menus without groups, or one too wide for the window, keep rows of up to five. The pinning note under the large-icon menus goes: the tooltips and right-click menus say it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Large-icon menus: a separator line between groups side by side (#4739) As between the ribbon's sections: a 1 px line in the theme's border colour. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Large-icon menus: at most three rows, growing to the right (#4739) A menu fills five columns, more when that would take over three rows (Model > Create: 7 x 3); in grouped menus a group too big for three rows gets more columns. Only a window too narrow for that wraps into more rows. A test checks every panel's menu of every tab. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Large-icon menus: group headings centred over their icons (#4739) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Drop-down group headings: smaller than the drop-down's header, not in capitals (#4739) Edges, Faces, Bodies (and Sketch > Create's families) were drawn in capitals at font_small, which reads larger than the drop-down's own header (font_caption). They now use font_micro, written as named, in the list and the large-icon grid. Review feedback on #5012. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Large-icon menus: start a command from the grid at its icon, as main's rows do (#4739) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Ribbon icon grid strings: a pending locale file, with ar, he and vi (#4739) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Large-icon menus: commands in no group stand apart, so a left-out group doesn't move them (#4739) With Convert to Sheet Metal pinned and left out of Model > Modify, its Specialise group went and Delete, in no group, moved under Bodies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
bd1525dcfb |
Expressions: hyperbolic functions sinh, cosh, tanh and their inverses (#9332) (#9334)
* claim: #9332 * Expressions: hyperbolic functions sinh, cosh, tanh and their inverses (#9332) `sinh`, `cosh`, `tanh` and `asinh` take a unit-less number and give one, as `exp` does; `acosh` refuses x < 1 and `atanh` refuses |x| >= 1, worded as `asin` and `ln` refuse what lies outside their domain. They are in the expression help (`FUNCTIONS`, the parameter autocomplete), the hostile-expression fuzz tokens, the parameters and equation-curve guides, and the checking skill's list of functions. Horn flares (Salmon's hypex `cosh h + T sinh h`), catenaries and the tractrix can now be written as they are stated instead of expanded into `exp`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
71bb4f7c98 |
Docs: a beginner's page for equation curves, with pictures and examples (#9282)
A new user guide page, Equation curves, under Sketching: the first curve step by step, Explicit and Parametric explained with tables of rules to type (a line, a parabola, a wave, a circle, a spiral), radians, parameters with the involute of a base circle, building a part (a closed flower curve extruded), editing, and common mistakes. The technical details stay in a short section for scripts and agents. Seven pictures, rendered by `cargo xtask book` from new scripts in docs/book/scripts/equation-*.json (gitignored output, attributed in attribution/pending/docs-equation-curves.md). The Sketching page keeps a short summary and links to the new page. |