mirror of
https://github.com/bherbruck/solidcraft.git
synced 2026-11-07 20:41:50 +00:00
f4d937d8a298f9bd930d8a430d82de2ec00e02bb
292 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
1f93b6d39c |
Joint: use the picked straight edge as the motion axis (#5457) (#6086)
* claim: #5457 * fix: align new straight-edge joint snaps with the edge (#5457) |
||
|
|
9d226b3535 |
Sheet metal DXF: options to leave out the bend lines and to use one layer (#4314) (#6130)
sheet.export_dxf always wrote the dashed bend lines (BEND_UP, BEND_DOWN) and split the flat pattern over a layer for each role. A cutter that cuts every line it is given cut the bend lines too. bend_lines: false now leaves them out, and layers: single writes every entity on layer 0. The defaults keep today's output. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
c0640cb95e |
inspect.parameter_sweep: check a design across a parameter's range (#2273) (#2276)
* inspect.parameter_sweep: check a design across a parameter's range Rebuilds a copy of the design at each value of a parameter and reports what no longer holds compared with the design as it is: features that fail or warn, joint origins that are lost or turn over on their own part, sketch planes that turn over, and sketch solves that fail or fold. The design is not changed; each value's rebuild time is reported too. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * inspect.parameter_sweep: params doc matches what it takes and returns `steps` takes at most 199 (200 values), as the check says; failed and warned entries carry the feature's name; a lost origin says which one; a value the parameter refuses gives {value, ms, ok: false, error}. The refusal test covers steps 200. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> * inspect.parameter_sweep: Japanese and Chinese labels Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Aac7mP9rthK3WsPpPRvCsF --------- Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> |
||
|
|
4b119dd471 |
Performance overlay: frame-time graph and histogram, triangles, draw calls (#2548) (#2549)
* Performance overlay: frame-time graph and histogram, triangles, draw calls (#2548) Net change of the perf-overlay branch, rebased onto main as one commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Document frame_rate_details in ui.prefs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
f7b08ab8c4 |
Dimension values: #name = value defines a parameter too (#2371) (#4212)
* claim: #2371 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27 * Dimension values: `#name = value` defines a parameter too (#2371) `#width = 40` in a dimension's value now works like `width = 40` (#2916): it adds the user parameter `width` and dimensions with it. On `main` the `#` made it an ordinary expression that failed to parse. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
b702ce8c7d |
fix: start the window on Intel Macs without wgpu's indirect-call validation (#3024) (#4808)
Co-authored-by: Nathalie Schönwetter <nathalie@cfw-ag.ch> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
59795872f6 |
Extrude: document which way a positive taper goes (#4098) (#4115)
* claim: #4098 * Extrude: document which way a positive taper goes (#4098) A positive taper slopes the walls outward (the far end is larger along the extrusion direction), a negative one inward. Say so in the params doc, the JSON schema and the guide, and pin the sign with a test. |
||
|
|
99fd05afeb |
Sketch Dimension: click an existing dimension to edit it while the tool is on (#5451)
With Sketch Dimension on and nothing picked yet, a click on a dimension that is already in the sketch opens its value box, the same in-place editor a double-click opens without a tool. Enter applies, Esc cancels, and the tool stays on for the next dimension. The dimension's text always takes the click; its lines only away from sketch points and curves, which still start a new dimension (the rule plain selection uses). Once a new dimension is under way, clicks keep their meaning. Dimensions off in the selection filter are left alone. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
8cbde001ef |
Front … Isometric View commands, Ctrl+1…7 by default (#5057) (#5058)
* Ctrl+1…7 turn the view to the standard views (#5057) Front, back, left, right, top, bottom and isometric, handled with the other view keys beside Ctrl+8: animated like the view cube, reserved so no command can take them, and ignored on the flat pattern page. * Front … Isometric View are commands, Ctrl+1…7 their default keys (#5057) The standard views become seven commands (view.front, view.back, view.left, view.right, view.top, view.bottom, view.isometric) whose default shortcuts are Ctrl+1…7, instead of keys the window handles itself. They show in Keyboard Shortcuts, can be moved to other keys or cleared, and the digits can be given to other commands. In the app they turn the view as the view cube does; headless they set the session camera, keeping target, distance and projection. |
||
|
|
9919825ea3 |
Expand All and Collapse All in the Browser (#5190) (#5335)
Open or close every Browser folder from the design or a component menu, including folders that start closed. Display only: not saved, not an undo step. |
||
|
|
d61dff69a6 |
Exploded views export as an animation (#3713) (#3744)
* claim: #3713 * Exploded views export as an animation (#3713) motion.export_animation takes an exploded view (view: id|name) as well as a study or a joint: the parts come apart at a steady pace from the assembled placement to where the view shows them, and back together with back: true (exploded at the middle frame). 41 frames by default, 81 with back. The home view frames the parts both assembled and exploded. As with explode.show, the design keeps its placements, its history and its saved state. explode.show and the export share the moves; moves a design file gives with no finite translation are left out. * Mechanisms skill: an exploded view's default frame count --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> |
||
|
|
9e6e0b8df1 |
Render workspace: complete experimental ribbon, resources and effects integration (#5493) (#5494)
* wip(render): reconcile completed material and image pipeline source with 0.20 (#5493) Source-only integration reference for staged review, not a merge-ready aggregate. Donor: 0xlillith/solidcraft@aea20b0115. Upstream: |
||
|
|
b7b25f9e2b |
Render workspace: first basic delivery to main (#6050)
* Normalize UI container violation paths across platforms (#5599) Report repository-relative paths with forward slashes so diagnostics and the existing nested-package regression assertions agree on Windows and Unix. Keep the container detection rules unchanged. Validation: official ui-containers gate and all seven focused xtask tests passed; rustfmt and diff checks passed. Only xtask/dependencies were compiled; no application build or heavy tests. (cherry picked from commit |
||
|
|
592f6a6fee |
ci: fix local scheduling and Windows test baselines (#4941)
* ci: repair local nextest scheduling and Windows fixtures * test: refresh MSVC robustness references and isolate GNU policy Integrate the Windows reference records from #3361 and the target-environment selection and recording policy from #4159. Keep shared records and comparison tolerances intact, and retain seed 36 as an existing failure tracked by #3583. Co-authored-by: Ray <raykholo@users.noreply.github.com> Co-authored-by: chris <christopher.nourse@gmail.com> * test: make CI subprocess and revolve fixtures deterministic --------- Co-authored-by: Ray <raykholo@users.noreply.github.com> Co-authored-by: chris <christopher.nourse@gmail.com> |
||
|
|
9a737bd63c |
Linked components: joints keep their face after Update Links (#3330) (#4874)
* claim: #3330 * Linked components: joints keep their face after Update Links (#3330) A linked design comes in as STEP text, which keeps no face names, so the faces of its bodies were named by their place in the file (`face:<k>`). An edit of the part that adds a face earlier in the file (a second hole of the same size) gave that place to another face, and a joint on the linked part moved there silently. When a link is made or updated, each imported face is matched to the part face it was written from (the same geometry), and the Import feature keeps that face's name in the part (`Feature::link_faces`, a new pending format change). The linked face is named `F<import>🔗<digest of that name>`, pieces keeping their qualifiers, so references follow the part's own history through Update Links as they do inside the part, and a face the part no longer has is reported. Linked faces still answer to `face:<k>`, so older references keep resolving; Update Links warns about joints that use them and reports joints that no longer solve. * Linked faces: a solid's twin keeps its own names; renamed faces count as an update Two solids of a part alike in one place each take the names of the solid the file names them after. Update Links reports a link whose part named its faces differently since as updated (a joint may follow that name to another face), not as unchanged; only a link getting its first names stays unchanged. * Linked faces: Extract to File carries the design's face names too Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: MateuszSychXpl <151755914+MateuszSychXpl@users.noreply.github.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
8b65d41b31 |
Expression completion: keep longer names visible when the typed word is a unit (#3663) (#3664)
* claim: #3663 * Expression completion: keep longer names listed when the typed word is a unit (#3663) Typing `rad` into an expression box showed nothing because `rad` is the radians unit and a word that is itself a known token closed the popup. The popup now stays open on such a word. A complete name (`width` with `width_extra` defined) opens it unarmed: the longer names are listed with no row selected, Enter submits what was typed and Tab moves on; Up or Down picks a row, after which Enter or Tab complete it as before. A unit means something only after a number, so a unit typed anywhere else (`rad` on the way to `radius`) is a prefix like any other: the popup is armed and Enter completes `radius` instead of submitting one radian. A complete token is extended only by names that start with it (`in` lists `inner`, not `rounding`), a typed unit offers no other units (`in` does not list `inch`), and a unit right after a number (`2 in`, the form every dialog starts its sizes in) opens no popup at all, so nothing sits over a dialog's OK button. Fixes #3663 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> |
||
|
|
807e367bdb |
Hole: place a Single hole by distances from reference edges (#37) (#2931)
A Single hole can take up to two straight edges of its face as references,
each with the distance of the hole's centre from that edge's line, measured
in the face's plane. `solid.hole` takes them as `references: [{edge, distance}]`;
the edges are found again by their persistent names, else their points, so
the hole follows them when the part changes, and each distance is a
parameter. A bad reference (no edge there, a curved edge, one square to the
face, parallel edges, a negative distance, a centre off the face) is refused.
In the Hole dialog, Reference 1 and 2 follow the face, each with its Distance
row; the canvas shows each distance as a dimension from its edge to the hole,
with a box just past the edge to type it in. Picking an edge measures its
distance (and its box takes the keyboard), typing one moves the hole, and
moving the hole measures them again. Edit Feature picks the edges again with
their distances.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
400e06c202 |
Hole: snap to face and round-edge centres, drag placed holes, section in the dialog (#2171) (#2912)
Placing a Single hole put it exactly where the click landed, with nothing to line it up by and no
way to move it but taking it out and picking again; the dialog was a list of size fields.
- Preferences › Design › Create Hole has two settings, both off by default, so a new installation
places holes as before:
- Snap to face and edge centres (`hole_snaps`): the planar face under the cursor offers its
middle and the centres of its round edges (a boss, a rounded corner, a hole already there) as
marks; a pick near one, or on or beside such an edge, takes that centre and the mark is named.
Sketch points on the face still come first; Alt or Ctrl held places it where clicked.
- Move holes by clicking or dragging (`hole_moves`): each placed hole has a handle that drags it
(snapping when snaps are on) and takes it out when clicked, and a pick elsewhere on its face
moves it there. Edit Feature shows the handle too, so a hole can be moved later (#1047).
- The Hole dialog draws a section of the hole as its options make it, with each size in a field
beside the dimension it sets; a hovered or focused field lights its dimension. The layout is a
new kit element, `ui_kit::figure_rows` (a caller-painted figure beside captioned fields).
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
||
|
|
fc3e3b6c8d |
Join: say so when the joined piece doesn't touch the body (#4434) (#4436)
* claim: #4434 * Join: say so when the joined piece doesn't touch the body (#4434) A Join (extrude, revolve, sweep, loft, pipe, coil, primitives, thicken, boundary fill, surface network) whose material meets none of its targets still joins it to the first target as a separate piece. The result stays as it was; the feature now warns: "the joined piece doesn't touch `Body1`, so `Body1` is now in 2 separate pieces (New Body makes it a body of its own)". History marks it and the command reply carries it. The check compares pieces (outer shells, not voids) of the bodies the feature changed or absorbed before and after it, so it holds for the batched multi-profile path too, stays quiet for a join that bridges pieces or closes a cavity, and leaves Combine (which joins the bodies it is given) alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
612d9d08dd |
cadmpeg 0.6.3: FreeCAD and Rhino import in the browser too (#4482)
cadmpeg 0.6.3 is pure Rust (ruzstd instead of the zstd C library, zip 9), so solidcraft-io depends on it on every target and the wasm build reads .FCStd and .3dm files like the desktop app. The browser's file pickers offer them. 0.6.3 replaces DecodeOptions::container_only with a decode depth; ask for Geometry, what its STEP writer reads. zip 8 leaves the tree, and with it the three cargo-deny advisory exceptions kept for it. Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> |
||
|
|
fb374b543b |
UI: integrate theme radii, borders, palettes and viewport refresh (#5045) (#5046)
* claim: #4922 * UI: let themes own corner radii * UI: use four-point panel and window radii in SolidCraft 95 * UI: align the 95 radius assertion with four-point panels * claim: #4953 * UI: let themes own structural and control borders * UI: single Blueprint outlines and dotted secondary rules * UI: separate container outlines and add theme-owned 95 bevels * claim: #5007 * UI: apply theme palettes to icons, workspace tabs and Gruvbox settings * claim: #5045 * Viewport: invalidate cached geometry colours when the theme palette changes * UI: preserve legacy theme logo colours with the borderless mark |
||
|
|
0dffb206b1 |
Assembly: ground the first part; drag free joint chains (#2804) (#2805)
* assembly(feat): ground first parts and drag free joint chains Ground the first top-level part when it is created and let face dragging reposition free occurrences or any member of a floating joint chain in one undo step. Preserve exact repeated-placement frames, joint values, modifier selection and Escape cancellation. Keep the accumulated fixture, viewport layout and documentation integration fixes from the existing PR. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(fix): update movable fixtures for first-part grounding Accept the documented grounded override in component creation, explicitly free movement fixtures, and keep linked clipboard pastes movable even in an empty document. Cover first and reused linked pastes, default insertion grounding, and single-step undo in the existing link tests. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(test): keep the motion-cost crank free Unground the first component in the document-level joint-face measurement fixture so its motion samples can rotate after first-part grounding. Preserve the rotation and shared-measurement assertions that caught the Linux CI failure. Signed-off-by: Karl Von Richter<karl@embeint.com> * assembly(test): free the frame placement fixture Create the frame-member placement fixture ungrounded before moving it above its root sketch. Keep its world-space member assertions while respecting first-part grounding in the frame tests added on main. Signed-off-by: Karl Von Richter<karl@embeint.com> --------- Signed-off-by: Karl Von Richter<karl@embeint.com> |
||
|
|
1ed394f8d6 |
Extrude: picking a face, vertex or parallel plane off the profile switches the extent to To Object (#2855)
* Extrude: picking a face, vertex or parallel plane off the profile turns the extent to To Object With profiles picked, a face off their plane (or curved), a vertex off it, or a construction plane parallel to it is taken as the To Object target instead of another profile: the extent switches without the Extent Type choice, and the distance shows how far the target is. Coplanar faces still join the profiles. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Extrude: automatic To Object is a Preferences setting, off by default Preferences > Design > "Extrude to a picked target" (`extrude_auto_to_object`, default false) turns the automatic To Object on. Off, picks in the Extrude dialog only add profiles and the distance is not synced to a target, as before this change. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
6eaf723041 |
fix(ui): preview shortcut chords and wait for complete modifier input (#1810)
Keep physical modifier events out of the ordinary-key slot, preview held keys immediately, and confirm after release and a one-second settling interval. Preserve legacy control-channel modifier behavior while allowing explicit physical Control/Command input. Add regression coverage, a UI scenario, localized guidance and documentation. Fixes #1809. Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
fa2c1c31f6 |
3MF import: name a Bambu Studio project's bodies after its objects (#3858) (#3859)
* claim: #3858 (3MF import: names from a Bambu Studio project) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * 3MF import: name a Bambu Studio project's bodies after its objects (#3858) Bambu Studio leaves the name off the root model's objects and keeps it in Metadata/model_settings.config (<config><object id="N"><metadata key="name">), so every object of a project came in as Mesh1, Mesh2, ... A build item whose root object has no name of its own now takes the object's name from those settings. A name in the model still comes first, and part names, other settings and objects of other model parts are left alone. The settings are read only when a body needs a name, within what the model parts left of the 1 GB budget. Settings that can't be read (malformed, nested too deeply, too large) never fail the import: the bodies keep the generic names, with a warning saying why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Tyler Chiriboga <18270301+Tyler-Chiriboga@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
7e472bc4da |
Cancel Sketch: leave a sketch without keeping its changes (#3838) (#3938)
* claim: #3838 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27 * Cancel Sketch: leave a sketch without keeping its changes (#3838) sketch.cancel (Cancel Sketch, ribbon Exit group and the sketch's right-click menu) puts the design back as it was when the open sketch was created or opened for editing: a new sketch is removed with its dimension parameters, an edited one returns to how it was. It is one undo step, so Undo goes back into the sketch. The session remembers the design and the undo history at the point a sketch is entered. Cancel uses that only while the history still runs through it (the same steps before, every step since taken in this sketch); otherwise it refuses and points to Undo, so a stale entry can never throw away later work. The icon is the approved close glyph in the sketch accent (alias sketch_cancel); ja and zh carry the new label. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SBN24y2TcqRcm2zn8Gkj27 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
04dc68d988 |
macOS: Fusion navigation preset does not support Shift + two-finger orbit (#3446)
* Macos: keep touchpad/key modifiers true to fusion * fix: remove obsolete orbit snap reset from trackpad navigation Upstream removed ViewportState::orbit_snap. The new trackpad orbit path retained one reference, causing E0609 in the PR merge build. Validation: all seven trackpad tests pass; cargo check -p solidcraft-ui-egui --all-targets passes on the exact failing CI merge 66a2791b with this fix applied; rustfmt and diff checks pass. Co-Authored-By: GitHub Copilot <noreply@github.com> * fix: retain Fusion trackpad help in refactored preferences Preserve upstream's new preferences pages and apply the translated Fusion trackpad tooltip in prefs/navigation.rs. Validation: cargo build -p solidcraft passed. Tests and full CI were not run, as requested. Co-Authored-By: GitHub Copilot <noreply@github.com> * style: format Fusion trackpad preferences tooltip Apply rustfmt's required wrapping for the relocated tooltip. No behavior changes. Validation: cargo fmt --all -- --check and git diff --check passed. Co-Authored-By: GitHub Copilot <noreply@github.com> --------- Co-authored-by: GitHub Copilot <noreply@github.com> |
||
|
|
4b42ef50c7 |
Mesh leftovers from the ribbon redesign (#133) (#4471)
* claim: #133 * mesh: Save As Mesh declares the panel that shows it (#133) The ribbon redesign (#2176) removed the MESH tab, but three things still pointed at it: - `file.save_mesh` declared `.at("MESH", "MODIFY")`. The command inventory prints the placement a spec declares, so `docs/features.md` advertised a `MESH > MODIFY` location no ribbon has. Its real home is already INSERT / FILES (`SECTIONS` lists it), so the declaration now agrees with the ribbon; `destination()` resolved it there before and after, so nothing moves on screen. - The user guide sent people to "the Mesh tab under Modify" for Save as mesh. - A test now refuses any command that declares a tab the ribbon removed, and pins where Save As Mesh lives. `PLACEMENTS` keeps its MESH entries: those migrate toolbars users saved under the old panels, which is a different question from what a spec declares. --------- Co-authored-by: Geraldrunion <geraldrunion@users.noreply.github.com> |
||
|
|
2dc31a30d4 |
Extract to File: move a component into its own linked design (#5113)
The component's sketches, features, bodies, subcomponents, the joints among them and the parameters they use move to a new .solidcraft design, keeping their ids and names, and the component becomes linked to it as Insert Design makes it. The new design must build the same bodies and the assembly must look the same afterwards, else nothing changes and no file is written. Joint faces on the component are found again on the linked bodies, and components that build the same bodies can become placements of the link. Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
63d81cc096 |
Motion Trace: regenerate kept curves only when inputs change (#5248) (#5270)
* claim: #5248 * feat(motion): regenerate kept traces when source inputs change * feat(motion): add a parametric Chebyshev trace demo * perf(joints): reuse face measurements across motion samples Face-centred joint origins called Body::faces on every solve, bypassing the reference-mesh reuse used for rigid placements. Share face measurements with unchanged model geometry at the existing tolerance, while guarding replaced bodies and applying offsets after the cached measurements. Cover repeated named/nearest-face solves, shape edits, retained snapshots and direct replacement with deterministic work counts. The 145-point Chebyshev dimension and range updates retain identical sampled and interpolated curves. * perf(naming): skip preparation for cached face names Both face lookup paths spawned fresh workers over every body even when their name cells were ready. Prepare only cold cells, with direct handling of zero or one cold body. Preserve the existing parallel naming path and all face selection semantics. Deterministic regressions cover repeated picked and unique-name lookups, misses, partial warmup, renames, snapshots and moved copies. Release Chebyshev medians fall from 859 to 50 ms for a dimension edit and 871 to 34 ms for a sweep edit; all 145 samples and interpolated points remain identical. Full cargo xtask ci passes with RUST_TEST_THREADS=4 and the existing local Windows validation overlays. |
||
|
|
92d3a2fde5 |
GPU: a lost device stops drawing instead of crashing (#4172) (#4229)
* claim: #4172 * GPU: a lost device stops drawing instead of crashing (#4172) After the driver resets the GPU (Windows TDR), the first queue write to meet the lost device panicked inside wgpu-core (PendingWrites::activate unwrapping DeviceError::Lost). Nothing watched the device for its loss. - egui-wgpu: RenderState::device_lost (DeviceLost) is set by the device's lost callback. The painter draws nothing on a lost device, and before a frame's uploads it submits nothing (DeviceLost::probe), so a loss the driver reports is found by that submission instead of the first write. - Pictures (thumbnails of saves, ui.render) watch the same flag: on a lost device the capturer refuses with GpuError::DeviceLost without touching it, and the picture comes from the CPU rasterizer. Headless capturers watch their own devices. - The app, seeing the loss, closes keeping unsaved changes for recovery (as a forced quit does) and starts again; the new start says what happened. A second loss within ten minutes starts on the software renderer. The loss is noted in the crash journal. |
||
|
|
4b23bb3a03 |
Implement compact workspace layout (#2029) (#4533)
* Vertical history strip: left of the browser, compact rows, hollow-circle marker, collapsed rail hover * Vertical history strip: seam handle to expand and collapse names, drag to resize with snap * Vertical history strip: no empty gap below the transport * Show the history seam arrow only on hover (#2028) * claim: #2021 * Redesign the Assistant chat panel with shared UI components * Show Assistant in the shared floating panel shell * Extend floating Assistant to viewport height and shift navigation * Dock Assistant before history and match docking preview bounds * Align Assistant top margin with floating shell cards * Extract a shared panel drag grip * Rebuild responsive history sizing and three-way docking * Share browser and History collapse hover styling * Show the History title as soon as its text fits * Animate stacked browser and History expansion and collapse * Make panel folding responsive and independent of frame delays * Let folding panel contents shrink continuously to header height * Use four explicit History transport actions in every layout * Resize the shared Browser and History column from either card * claim: shared compact-mode containers (#2029) * Centralize layout-aware UI containers and enforce their use * Keep docked Assistant at the outer edge beside tool sheets * Use shared surface policy for Assistant tool space * Let tool sheets drag over shell panels while avoiding Assistant * Update Parameters drag bounds assertion for shell overlap * Keep dragged tool sheets below ribbon and workspace selector * Enforce universal UI containers in mandatory repository checks * Remove legacy report windows and require shared window composition * Remove retired UI styling and require shared controls * claim: compact layout preference (#2029) --------- Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
920398ac53 |
Bring back the view-change glide; orbit, pan and zoom stay instant (#4596)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
dfd58293a6 |
Navigation: opt-in free orbit and shared Normal to Selection (#1912)
* Navigation: opt-in free orbit and shared Normal to Selection Preserve the complete reviewed feature, shared camera setting propagation, rigid pivot behavior and focus/drag regressions from PR #1912. Consolidate the prior main-integration commits before rebasing, so their merge-resolution fixes remain in the linear feature history. * docs: move free orbit help beside viewport controls * Merge main into fix/solidworks-free-orbit Camera animation is gone on main, and with it the orbit snap spring: the Shift snap keeps its unsnapped orbit in orbit_free, which the free-orbit checks now read. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: bherbruck <brennen.herbruck@gmail.com> Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
b289dc2421 |
Sketch Dimension: name = value defines a user parameter (#2916) (#3638)
* Sketch Dimension: `name = value` defines a user parameter (#2916) In a dimension's value (the D tool's box, and `sketch.dimension`'s `value` from scripts, the CLI, MCP and the control channel), `name = expression` adds the user parameter `name` with that expression and dimensions with `name`: typing `width = 40` on a line gives a 40 mm user parameter `width` and a dimension whose expression is `width`. A bare number is read in the design's unit, as a bare dimension value is; an angle's parameter is in degrees. The expression may be anything the parameter editor takes. It is one command: one undo removes the parameter and the dimension together, and a dimension the sketch refuses leaves no parameter behind. A taken name is refused with a hint (type the name to use it, or change it in Parameters), a reserved name with the parameter editor's message, and a left side that is not a name (`2 = 3`) still fails to parse as before. A driven dimension defines nothing. The reply carries `defined`, and the status line names the parameter. The splitter lives in the doc crate (`expr::definition`) so other value inputs can take the same form later; editing an existing dimension, the inline shape boxes and feature dialogs are follow-ups. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Sketch Dimension: say why a name is refused, in the command's own words (#2916) The dimension editor showed a refused definition raw, in the box and the status line: "invalid parameters for `sketch.dimension`: value: `mm` is a unit, constant or function name". It now reads "Sketch Dimension: `mm` is a unit name, so it cannot be a parameter name": the editor passes the command's errors through `friendly_error` like every other command, and drops the `value:` field tag, since the box is the value. The taken-name hint reads the same way: "Sketch Dimension: there is already a parameter `w`: type `w` to use it, or change it in Parameters". A reserved name says what kind of word it is and what that means (`param_name_problem`, shared with the Parameters dialog): a unit name, a function name, or a constant, "so it cannot be a parameter name"; `expr::reserved_kind` tells them apart. `friendly_error` translates the command label with the interface language (the engine's sentence stays English), so the prefix reads "Wymiar szkicu:" in Polish. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> * Sketch Dimension test: keep the third line off the ribbon (#2916) On current `main` the ribbon floats over the top of the canvas, and the test's third line at sketch y = 50 projected under it: the click opened Parameters instead of picking the line. The line now goes below the first one. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
84ec512d7a | fix: midpoint tool rejects two lines (#3836) | ||
|
|
63f210b49f |
Restyle the vertical history sidebar (#2028) (#3953)
* Vertical history strip: left of the browser, compact rows, hollow-circle marker, collapsed rail hover * Vertical history strip: seam handle to expand and collapse names, drag to resize with snap * Vertical history strip: no empty gap below the transport * Show the history seam arrow only on hover (#2028) * Extract a shared panel drag grip * Rebuild responsive history sizing and three-way docking * Share browser and History collapse hover styling * Show the History title as soon as its text fits * Animate stacked browser and History expansion and collapse * Make panel folding responsive and independent of frame delays * Let folding panel contents shrink continuously to header height * Use four explicit History transport actions in every layout * Resize the shared Browser and History column from either card |
||
|
|
cb3cabeda1 |
Remove camera animation: every view change and orbit applies at once (#4296)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
164554edba |
3MF import: production extension review follow-ups (#2089) (#3628)
* claim: #2089 (3MF production extension: review follow-ups) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * 3MF import: production extension review follow-ups (#2089) Follow-ups from the review of #2127: - Only the root model's build is read; other parts' build sections are ignored as the spec asks (a slicer's child build pointing at a thumbnail no longer matters). - A model part that can't be read fails only the placements that need it; the package-wide caps (part names, 1 GB of model XML) still refuse the package. The root XML is dropped once parsed and each part is read against the remaining budget. - Loops are reported apart from depth, keyed by (part, object). - Messages name parts as written; objects are kept in id order so parts are read in the same order every run; %XX escapes in part names are decoded; the model unit is a local of the parser. - Tests: a component without p:path stays in its part (T1), the same id in two parts is no loop (T2), a slicer-shaped project (T3), the placement budget across parts (T4), a loop through three parts and a chain past the depth cap (T5), broken parts and child builds (T6), escaped names; the hostile-parts test asserts its messages; the mutation test also mutates the parts' XML and zips it again. - Guide: what slicer-only data is not read. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Tyler Chiriboga <18270301+Tyler-Chiriboga@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
d9d6af51c6 |
Sheet metal: mirrored and copied sheet bodies stay sheet metal (#3353) (#3354)
* claim: #3353 * Sheet metal: mirrored and copied sheet bodies stay sheet metal Mirroring a sheet metal body into a new body gave a plain solid: the opposite-hand bracket had no flat pattern, DXF or bend table ("`Body1 (2)` is not a sheet metal body"). Copies from a body pattern or Move with copy lost their sheet model the same way. A copy now takes the sheet model with it (SheetBody::copied). A rigid copy moves the flat frame. A mirror moves the frame with its x axis turned round, so the thickness side stays, and mirrors everything in flat coordinates (x -> -x): base, flange bend lines (run from their far end, with their end extensions, slopes and tears swapped), panel shapes, cut-outs, pockets, bores, letters and base sketch lines. Arcs stay exact and loops keep their sense. A perforation field of a mirrored copy runs its grid from the right, so its holes are the mirror image too. The flat length, bends and K-factor are unchanged, and the copy takes further sheet metal features of its own. Mirror with combine is unchanged: the joined body has no single sheet model yet. Mirroring or patterning flange features is still refused. Sheet models are derived from the timeline, so no design format change. * Format: note the saved from_right of a mirrored sheet's perforation field The new `from_right` flag is saved in the design, so it gets a pending format note. No migration: a field without it runs from the left as before. |
||
|
|
6e87fb1a25 |
Ribbon: Parameters and Configurations back on Model, Sheet Metal and Sketch; Sheet Metal tab always reachable; Finish Sketch button back in the sketch palette (#3937)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> |
||
|
|
0379ee76c6 |
CI: spread the slowest tests across the test shards (#3646)
* CI: give the slowest tests a shard each Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * CI: spread the slow tests on pull requests too, and keep both junit files Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * CI: pull requests skip the goldens and the action matrix sample unless the kernel changes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Docs: which pull requests run the goldens Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * CI: run the tests in one job on a big runner, slowest first Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * CI: allow the 32 vCPU runner label in actionlint, read junit.xml in the golden hint Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
079a600481 |
Recovery: autosave every open design tab (#2884) (#2952)
* Fix recovery for unsaved background tabs (#2884) * Recovery: scheduled autosaves of every tab write on the worker thread (#2884) After #3139, Autosaver::save waits for the write and Autosaver::tick runs it on a worker. The scheduled path now goes through tick (which skips a tab whose previous write is still running), so several dirty tabs no longer write on the window thread each interval (#3044). save stays for Save, close and shutdown. Each tab's autosaver has no clock of its own: the shared cadence decides when it is due. The tests wait for the writes a tick started. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Recovery: closing a tab waits for its running autosave before removing the entry (#2884) With the autosave on a worker thread, discard could remove the files and the lock while a write was still running; the write then recreated the entry without a lock, and the next launch offered a design closed with Don't Save. discard now ends the running write first, as Drop does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> |
||
|
|
41a62d210c | File menu: Export STL… and Export 3MF… open the mesh dialog with that format; command search finds mesh export by format (#3873) | ||
|
|
d45fcce72c | Command search popup on the UI kit; the bottom command line is gone | ||
|
|
f2eaead594 | Per-tab accent tokens: fill, ink and tint for every tab, with a contrast guard | ||
|
|
1122cd44b8 | UI library, tokens, fonts and icons (step 5 of #2016, after #2287) | ||
|
|
a0c1a67220 |
Application bar and ribbon redesign (step 1 of #2016) (#2176)
* ui: spacing, radius and type tokens, per-tab accents, agent and on-accent tokens * ui: per-tab accent behaviour and a larger application bar with a Start page button * icons: silhouette master and flat assistant and agent link icons (open for review) * icons: apply review notes (sparkle assistant, refined plug, silhouette halo) * icons: wire the silhouette master to inspect.silhouette; record the accepted icons * ui: application bar to the design: separators, Save, house, assistant icon, readable hovers * ui: ribbon structure: Model to View tabs, contextual Sketch and Sheet Metal, migrated pins * ui: ribbon painting to the compact design * ui: smaller icon button highlight and assistant mark on the bubble corner * ui: short ribbon labels that wrap at spaces * ui: ribbon buttons fit their labels and Finish Sketch shows its full name * ui: constraint gallery, workspace menu, section list headings and richer tooltips * ui: lighter selected tab label, ribbon surface and dimmer bar separators match the dark design * ui: document tabs as rounded chips with a dimmer inactive label * ui: document tabs fit their names and show close only when active or hovered * icons: close and plus masters for the document tabs (open for review) * ui: centre the new-tab plus and overflow button on the bar * ui: a quiet rule under the ribbon tabs on non-contextual tabs * ui: the application bar mark separates its faces with the bar colour, not white * ui: open ribbon section label uses the selected tint and a chevron * ui: dim the tab close and plus icons until hovered * ui: every ribbon dropdown uses the chevron, the workspace card included * ui: the active document tab uses the design's surface colour * ui: the bug button's right padding mirrors its icon side * ui: square constraint cells and a rule before the grid * ui: constraint cells back to their earlier size, keeping the rule * ui: smaller constraint cells and icons, centred in the section * ui: constraint cells fit the height of the large buttons' icon and label * ui: sketch Create titles share the other labels' line * ui: format the application bar and ribbon changes * ui: active tab surface token and the colour and hover tests that follow the redesign * tests: the merged parameter and narrow toolbar tests follow the compact ribbon * i18n: the Malay Gap label has an English source and its Japanese and Chinese translations * apply_off_thread tests: the evaluation lingers in tests, so still computing never depends on machine speed --------- Co-authored-by: bherbruck <brennen.herbruck@gmail.com> |
||
|
|
b2168435ba |
Web: save to and open from files on your computer (#104) (#3681)
Save As and Open use the browser's file dialogs where the File System Access API exists; Save writes back to the same file, its handle kept in IndexedDB across reloads. File > Download design added. Other browsers keep storing designs in OPFS. |
||
|
|
fb87cde6a1 | Sketch: persist Shift-picked midpoints with ordinary constraints (#2087) (#2378) |