* claim: #10254
* ViewCube: an option to invert the directional rotation arrows (#10254)
A new Navigation preference, "Invert the view cube rotation arrows"
(invert_navigator_arrows, off by default): with it on, an arrow around the
cube orbits the camera the way the arrow points, as in Fusion and Inventor,
instead of rotating the cube toward the side the arrow sits on. Left and
right, and up and down, trade places, and each tooltip names the action
actually performed. The curved roll arrows are not inverted: they name the
rotation they perform, not a direction.
---------
Co-authored-by: Dahak Builds <dahakbuilds@users.noreply.github.com>
* 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
* 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
* claim: #10151
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
* Sketch: clicking the running tool's button ends it, so clicks select again (#10151)
The lit ribbon button of the running sketch tool started the tool over
when clicked again, so it gave no way out: every click in the view kept
drawing or measuring, and Ctrl+click never reached selection. Esc and
right-click already end a tool, but the pressed button looks like the
natural switch.
A second click on the running tool's button (large ribbon buttons and
the constraint grid) now ends the tool. Persistent analysis toggles keep
their own on/off. The old behaviour stays behind the Sketch preference
"Clicking the running tool's button ends it" (ribbon_click_ends_tool).
Fixes#10151
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
---------
Signed-off-by: Maurizio Monticelli <maurizio@whatwedo.ch>
* claim: #10138
* Follow the system language on a first start (#10138)
The language preference defaults to a new 'system' value: the OS locale
(sys-locale) is matched against the catalog list - exact tag, base
language, then English - and a System choice sits at the top of the
Preferences language list. A saved language still wins.
* Drop the explicit deref clippy flagged; regenerate THIRD-PARTY-LICENSES.txt for sys-locale
---------
Co-authored-by: Dahak Builds <dahakbuilds@users.noreply.github.com>
* Navigation: an NX mouse mapping
NX's CAD1 scheme drags the middle button to rotate, middle + left to zoom and
middle + right to pan. The mouse mappings here hold one button at a time, so
the preset takes the middle drag with Shift (pan) and Ctrl (zoom) for those two
drags, leaves the right button to the context menu, and fits on a middle
double-click as NX does.
The help text says which NX drags the modifiers stand for.
* Navigation NX note: translations for the complete catalogs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Navigation NX note: use the message id nav.nx.help in the pending file
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: clarkliu <277482660@qq.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #10091
* View cube and axis gizmo: a standard view centres and fits the model (#10091)
A new Navigation preference, "Fit the model after a navigator view change"
(`navigator_fit`, off by default): with it on, a face, corner or arrow of
the view cube and an axis tip of the gizmo look at the middle of the model
from the one distance that fits its bounding sphere, so Home, an opened
design and every view chosen on a navigator share one zoom and one centre
and only the direction changes. Off, both navigators turn in place as
before.
"Home and Fit size" (`home_fit_size`, 10–100 %, default 100 %) is how much
of the view between the panels and the controls the model fills when Home,
Fit, an opened design or a navigator view change frames it; 100 % is the
framing as before.
`view.navigate` takes an optional `fit: true` with a direction or a turn,
so programmatic callers get the same framing.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
* claim: #4376
* Selection: a freehand lasso that takes what is wholly inside it (#4376)
The SELECT panel gets a Lasso checkbox (UiState::lasso_select, ui.set
lassoSelect). With it on, a primary drag from empty space draws a
freehand loop; the release selects through the same path as the window
box: items whose points are all inside the loop and no segment crosses
it, so a concave loop leaves out a curve that bulges out of it. Shift
and Ctrl add as with the box. ui.drag takes via waypoints (and scenario
drag steps take more than two points) so agents and tests can draw it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: thocsmith <193096300+thocsmith@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Arabic: isometric view wording in the Extrude view preference
* Arabic: equation curve range unit option and note read naturally
* Arabic: tanween spelling in the new bold-font and delete-first messages, menu and option names quoted in the graphics card note
* claim: #9234
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Colour popover: step buttons, H/S/V fields and recent colours (#9234)
Every colour field of the app opens the same ui_kit popover. It gains:
- step buttons beside each number (R, G, B and the new H, S, V): a press
steps once, holding repeats, for live fine-tuning;
- H (degrees), S and V (percent) fields on the same gamma HSV as the square;
- a row of the last 12 colours picked in any colour field. A colour joins
when an edit is finished; fine-tuning in one opening replaces its entry.
The list is saved with the app's settings (`recent_colors`), hostile
saved entries dropped and the list capped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Recent colours: keep the shared list outside ui_kit, crate-visible only (#9234)
The store and the per-frame sync with the saved settings move to
crate::recent_colors; the ui_kit colour popover only shows the list and
adds finished picks. No plain pub escape from the gallery's ui_kit rule.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #10057
* Pattern and Mirror dialogs: explain Object Type, and say why a sketch is not taken (#10057)
The Object Type row of the Rectangular, Circular and Path Pattern and Mirror
dialogs gets a tooltip saying what Bodies and Features are and that a sketch
is neither. A sketch clicked for their objects, in the view, the Browser or
the History, now shows a hint naming what to pick and what to do with a
sketch instead of being ignored.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8706
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Properties: measure faster, show progress, and stop when closed (#8706)
Properties on a large assembly measured every placed copy of every body
afresh (transform plus three fine tessellations each), so it took minutes.
#5203 (in #8103) already moved the measurement beside the window; this
builds on it.
- A rigid placement reuses the body's own cached measurement: volume, area
and counts unchanged, centre placed, box from the placed corners (quarter
turns) or from the body's shared mesh placed (other turns). Scaled or
mirrored placements are still measured as placed.
- Bodies are grouped by component once and the subtree traversal groups
occurrences by parent once (both were quadratic).
- The measurement beside the window is watched by a Progress: the card
says "Measuring... n of N bodies" with a bar, and closing it (or
switching designs) cancels the worker at its next body instead of
leaving it running.
- component.properties and occurrence.properties are answered on a copy for
control-channel requests too, as inspect.measure is.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Properties: count the measuring work instead of timing it in the reuse test (#8706)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A switch between design tabs cancels the open dialog and tool of the design
left and shows MODEL. With the new Interface preference "Keep dialogs and
tools open when switching designs" (keep_work_on_tab_switch, off by default)
each tab keeps its dialog (with its picks and values), its editing state, its
tool and its toolbar tab, and has them back when it is shown again. A feature
still computing after OK is cancelled as before. A feature edit's saved source
revision follows the view refresh of the switch, so its Cancel still restores
the history.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #9079
* Modify ▸ Delete with nothing selected asks for a pick instead of a parameter error (#9079)
Starting `timeline.delete` from the ribbon, the command palette or the
control channel ran it with no parameters, so the notice showed the
engine's check ("`features` must list features, or `groups` timeline
folders"). It now deletes what is selected, as the Delete key does, and
with nothing selected shows a hint saying what to pick, changing nothing.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #7974
* Viewport: dark parts keep their shape: linear-light shading and a sky fill (#7974)
Preferences > Graphics "Keep the shape of dark parts" (off by default)
shades the viewport in linear light: the key light and eye fill over a
sky fill that grows as a face turns up, plus the 4% of that sky every
dielectric reflects (a little more toward grazing), encoded to sRGB
once. Near-black faces keep a gradient; light and mid-grey faces stay
within a few levels of the sRGB shading. The world's up direction and
the switch ride in a new `sky` vec4 at the end of the viewport uniform,
and the frame key, so turning it on redraws. Off, the shader takes the
old path unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ui): disable bold in Edit Text when font has no bold face (#9940)
- Check whether font has bold face via font_data_styled() before enabling bold toggle
- Automatically uncheck bold and disable bold button with explanatory tooltip for built-in font
- Prevent sending bold: true in sketch.edit_text when font lacks bold face
- Add unit regression test in sketch_text::tests
Fixes#9940
* style: format choice.rs in ui_kit
* i18n: move sketch_text.no_bold to pending locale catalog with complete translations
* test(sketch_text): assert disabled bold on built-in font without error (#9940)
* claim: #8341
Co-authored-by: Cursor <cursoragent@cursor.com>
* Graphics: keep a preferred card when surface marks it incompatible (#8341)
Prefer the saved adapter by exact then case-insensitive name, including when only listed as surface-incompatible, and explain in Preferences when another card is still in use.
Co-authored-by: Cursor <cursoragent@cursor.com>
* Format and clippy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* 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>