Emergency draft source checkpoint from A077; existing authored history is retained through the real parent. No source repair or claimed authorship reassignment. Exact C28 source binding d38a: 28 PASS / 1 font-fixture FAIL / 954 UNRUN; three postchecks UNRUN. Native acceptance/full CI/readiness incomplete. Separate unadopted fixture/compatibility proposals remain separate; see preservation notes.
* Sketch Intersect: add Faces/Bodies and Projection Link options (#1110)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Sketch Project: add Geometry/Bodies and Projection Link options (#1110)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Sketch Project/Intersect: keep exact lines and arcs of whole bodies, no noisy rebuild warning (#1110)
Whole-body silhouettes and sections fit lines and arcs tightly and snap arcs
tangent to their neighbours. A rebuilt projection warns only when it removed
the user's own constraints or curves. Pending locales cover ar, he and vi, and
the preselection tests use the direct-pick workflow.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Select Other: label curves from Intersect as intersected (#1110)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* claim: #8692
* Browser: remember the folded card across runs, optional reveal on hover (#8692)
The browser card's fold (the chevron in its header) is now a preference,
saved with the other layout state, so the next run starts the way the user
left it. Preferences > Interface > Layout adds Shown / Reveal on hover: the
browser then stays out of sight until the pointer comes over its place or
the thin tab at its left edge, fading in like the navigation bar's Hide
until hovered, and stays while the pointer is inside or a menu, drag or text
edit started from it is open. It never folds in that mode.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Browser: move the reveal-on-hover messages to a pending locale file (#8692)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8306
* Timeline: joints in feature folders (#8306)
timeline.group and timeline.move_to_group take joints as well as features, so
hundreds of joints fold into one folder tile. A closed folder shows one tile
whatever it holds; opening it shows its features and joints in both the bottom
and left History. Suppress, delete and ungroup on a folder reach its joints too
(one undo step), deleting a joint removes it from its folder, and an unknown
joint id or name is an error. Saved with the design; designs without joint
folders read and write as before.
* claim: #8862
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Expressions: Enter after `pi mm` keeps the unit, not a longer name (#8862)
A unit after a name or constant multiplies it, as after a number (`pi mm`
is pi millimetres), so it is a complete word there: the longer names are
listed unarmed and Enter submits what was typed. A unit at the start, or
after an operator or bracket, stays a prefix as #3664 chose.
Whether Enter completes is now worked out again every frame, unless a key
armed the list. It was kept from when the list first appeared for a word
and caret position, so it went stale when the text before the word was
replaced, or when the box took the focus before the names were gathered.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* claim: #7023
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Status bar: switch the mouse mapping from a menu (#7023)
The status bar gets a mouse-mapping button beside the units. It shows the
current mapping, and a click opens a menu of the mappings above the bar.
Picking one sets what Preferences > Navigation sets for it (bindings, wheel
direction, middle double-click, right drag orbits) through
choose_nav_preset. Nothing changes while the status bar is off (the
default).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Phanoob <phanoob@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #4176
* Preferences: mouse-wheel zoom speed (#4176)
A 0.25x to 4x multiplier for each wheel zoom step, applied in
navigation::handle so every canvas uses it. The 3D mouse keeps its own
speed. Values outside the range are refused when set and reset to 1x when
loaded.
* Control protocol: wheel_zoom_speed in the sorted ui.prefs list (#4176)
* Wheel zoom speed: its label in the complete catalogs (#4176)
* Arabic: fix the Resize Part hint (tanween style, part list, command name)
* Arabic: navigation bar Edge reads as position, tanween spelling in the geometry budget help
* claim: #8040
* wip: 3D line/spline/point tools (#8040)
* Take sketch.move3d off the toolbar help backlog now that it is agent-only (#8040)
---------
Co-authored-by: Dahak Builds <dahakbuilds@users.noreply.github.com>
* claim: #8794
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019FAWPuFoh9qxn2uS2j53QZ
* Control token: a closing window removes only its own token and discovery files (#8794)
Under Flatpak each instance has its own loopback, so a second window
binds the same port number as the first and writes the same
<port>.token, <port>.pid and current.port in the shared data folder.
At exit the first window deleted them all, unconditionally, leaving the
second window running with no token file a client could read.
remove_token_file now takes this launch's token and removes the token
and process files only while the file still holds it; the process id
can't tell instances apart, as every Flatpak instance has the same one.
remove_current_port also takes the token and keeps the discovery file
while another launch's token file holds that port, and removes
current.pid with current.port (it was left behind).
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>
* claim: #8835
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: a selected text moves when dragged from anywhere inside its frame (#8835)
A drag had to start on one of the text's letters to move it. From the
space between letters, or inside a letter's outline, it found no geometry
and drew a selection box instead.
Off the sketch's own geometry, a drag from inside the selected text's
frame now grabs the text, as one from a letter does. Handles, dimensions
and geometry under the pointer still come first, and outside the frame a
drag from empty space still draws a selection box.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* Trackpad: zoom with two-finger scroll while holding a key, chosen in Preferences (#8322)
Holding the zoom key turns a vertical two-finger scroll (or a wheel) into zoom at
the pointer, with the wheel zoom's speed, direction and anchor, so a laptop user
zooms without pinching. Preferences > Navigation > "Zoom with two-finger scroll
while holding": Cmd on macOS and Ctrl elsewhere (default), Option/Alt, Ctrl, or
Off. That key with the scroll did nothing before, so no default changes; Off
keeps it that way. Shift keeps its orbit.
* Trackpad zoom modifier: off by default (#8322)
Scroll keeps its usual meaning until a key is chosen in Navigation.
* Trackpad zoom modifier tests: Off is the default; tests that zoom choose Cmd (#8322)
* Trackpad zoom modifier: zoom once alongside the Ctrl+wheel pinch from #8539 (#8322)
A wheel the chosen key claims is no longer also read as a pinch, and a key that is not
chosen keeps main's pinch handling unchanged.
Align gets an Object Type row (Bodies | Components). In Components mode it runs the new
occurrence.align command, which moves only the chosen occurrence placements (their
transforms) instead of adding an Align feature to the shared component, so other instances
stay where they are.
- occurrence.align: from/to points, snaps, planar faces and planes in world coordinates,
flip, capture/pending, grounded and rigid-group refusals as occurrence.move.
- A viewport or browser-body pick takes the placement directly under the active component.
- A placement inside a subassembly placed more than once still moves (as occurrence.move
does) but the dialog warns, and the reply lists it under shared.
corner_free looked only in a fixed column at the view's right edge and took
the largest free rect there by area. Next to a tall dialog docked at the
right edge, or the Assistant in the Floating layout, the narrow strip beside
the pane won: the toasts were squeezed into it, their text broke inside
words, and with a wider pane they were not shown at all.
It now tries that column first and then columns ending at each obstacle's
left edge, nearest the corner first, and takes the first free rect that is
TOAST_WIDTH wide and tall enough for a toast, as the frame-rate readout
moves beside a right pane (#6755); failing that, a rect tall enough beats a
wider one too short to show any toast. Without a pane the stack stays
exactly where it was.
* claim: #7688
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Graphics: a background colour of your choice for the 3D view (#7688)
Preferences › Interface › Theme gets a Background row: the theme's
gradient (the default, unchanged) or one colour for the whole application,
filling the view in either theme. The window keeps its own colours, a
picture of the view (`ui.render`) takes the colour too, and `ui.prefs`
sets it as `viewport_background` ([r, g, b] or null).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Phanoob <phanoob@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: add joint-aware assembly Move handles and live motion readouts
* test: improve render job failure diagnostics
* fix: preserve assembly Move compatibility and viewport theme colors
* ci: skip default label sync for fork PRs
* fix: keep Windows CI checks portable after main rebase
* test: cover RTL assembly strings and stable refraction job
* i18n: cover assembly Move in Vietnamese
* i18n: cover assembly Move in French
* fix: complete CGA palette for assembly motion handles
* fix: complete Assembly Move palettes and Turkish strings
* fix: retain assembly move cache answers and toolbar help
* style: format merged assembly Move navigation guard
* fix: align Assembly Move preferences and tests with main
* Fix offline update fixture synchronization and clipped prism intersections
Wait for all v5 manifest requests before deploying v6. Intersect hole-free prism sections over their common height, retaining the established B-rep path for newly clipped perforated sections. Preserve the failing property seed and add closed-form and cap-boundary regressions.
* claim: #8592
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* History: error and warning marks in the browser and on folded folders (#8592)
In the History "In browser" layout, a feature whose build failed gets the
error icon at the end of its row, one that built with a warning the
warning icon, with the message in the tooltip: the marks and text of the
History on the left. A folded History or Features folder carries the
worst mark of what it holds, and so does a folded folder in the History
on the left. Suppressed and rolled-back features are not built and get
none.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
- active_body: take every body's owner in one pass (model_body_components) instead of searching the timeline body by body
- Timeline strip: find each chip's result in a table built once per frame (result_index) instead of a linear search per chip
- 4,880-body design: UI frame 31-32 ms -> 7 ms of CPU; tests pin the active body and the result lookup
Co-authored-by: P'tite Tête <asso@ptitetete.com>
* claim: #8095
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Properties: moment of inertia, principal axes and first moments of a part or assembly (#8095)
component.properties and occurrence.properties report each closed body's
inertia tensor about its centre of mass, and in total the tensor about the
total centre of mass (world axes, g·mm²), its principal moments and axes,
the first moments, and with `about: [x, y, z]` the tensor about any point.
The tensor comes from each body's welded export mesh, tessellated once per
body, scaled to the measured mass and turned by each placement; bodies add
by parallel axes. The maths is a new crates/geom inertia module.
The Properties window shows the first moments, the tensor, the principal
moments and axes, and the view marks the centre of mass with the principal
axes while it is open. Inspect → Measure → Properties now opens that window
(it ran the command and showed nothing).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Properties: Copy matrix, and the whole design's card titled just Properties (#8095)
Copy matrix, under the tensor, puts it on the clipboard as three lines of
tab-separated values at full precision, in the units shown. The card for
the whole design is titled Properties; one opened on a component,
placement or bodies keeps its name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Properties: measure beside the window, so a large assembly doesn't freeze it (#8095)
Properties ran on the window thread: 18 s on a 144-body design, with the
window answering nothing meanwhile (#5203). In the desktop app the card now
measures on a copy of the session on a worker, the way #4614 made agents'
measures work, says "Measuring…" until the reply is in, and Close drops it.
A quick measure still shows at once; headless, tests and the web measure in
place.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The wasm compile ran only by hand, so #8227 (a native-only DroppedFile::bytes() call in
crates/ui-egui) passed PR CI and the merge queue and broke the web build on main (#8534).
A merge group that touches the crates below the apps, the web app, the vendored crates, the
manifests, the toolchain or this workflow now runs `cargo xtask wasm`, and `ci` requires it.
Dependency advisories ran only nightly. A pull request or merge group that changes Cargo.lock
or a Cargo.toml now runs `cargo deny --locked check --warn unmaintained advisories`, and `ci`
requires it then. The nightly keeps the full advisories, bans and sources scan.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #4127
* Render preview: geometry budget from the device, readable refusals (#4127)
The Render preview refused every scene over a fixed 128 MiB of geometry. On
desktop the budget now follows the device's buffer limit (eight of its
largest buffers, at most 2 GiB; 2 GiB with the usual 256 MiB buffers). The
web keeps 128 MiB.
The product upload runs under its own GPU error scopes: an allocation the
device refuses is reported in the preview instead of reaching the device's
uncaptured-error handler, and the half-uploaded batches are dropped. Buffer
uploads map the buffer themselves so a refused buffer fails the upload
rather than panicking in create_buffer_init.
Refusals name the geometry size and the limit and say how to get under it,
on a theme panel card that stays readable on any preview background.
* Render preview: keep the previous geometry budget behind a preference (#4127)
* Render preview: adapt the device budget to main's GPU upload errors (#4127)
* claim: #5717
* ui(feat): let users choose visible toolbar tabs
Keep Sheet Metal and Weldments visible by default while adding persisted tab visibility controls and restoring specialty tabs for designs that use them.
Signed-off-by: Karl Von Richter<karl@embeint.com>
* ui(fix): respect hidden toolbar tabs in every design
Remove feature-based visibility overrides for Sheet Metal and Weldments. Keep all tabs visible by default and preserve the user choice across feature creation, opening designs, selection and undo.
Signed-off-by: Karl Von Richter<karl@embeint.com>
---------
Signed-off-by: Karl Von Richter<karl@embeint.com>
The nightly failed every day from 2026-10-16 to 2026-10-28 without anyone noticing. A new
nightly-alert job (scheduled runs only, the only job with issues: write) opens or comments on
one issue, "Nightly CI is failing" (label ci), when a nightly job fails, and closes it when a
nightly passes.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #7724
* Update now installs the newest release, checked when pressed (#7724)
* Update: close the unmanaged-install test after the rebase (#7724)
* Update: the refresh messages in Arabic, Hebrew and Vietnamese too (#7724)
* claim: #8533
Co-authored-by: Cursor <cursoragent@cursor.com>
* Parameters: show full names in the table and formula popup.
Hover tips carry the full identifier when Name cells or completion rows clip, and the completion list widens for long suggestions (#8533).
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
A new arch job repackages each release tarball as
solidcraft-<version>-linux-<arch>.pkg.tar.zst with makepkg, through the Craft apps' shared
action (storytold/craft-common-actions/actions/arch-package, pinned by commit). The package
is io.tangencylabs.solidcraft, named after the tarball's .desktop file, provides solidcraft
and conflicts with solidcraft-bin/-git. Each package also gets a version-less copy, and
docs/downloads.md links them.
* claim: #8183
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Navigation bar: can sit at the top of the view (#8183)
Preferences > Navigation bar gets an Edge choice, Bottom (default) or Top.
On top the bar sits under the ribbon, its menus open downwards and its
tooltips show below it; the OK/Cancel pair and the axis view move down
below it when they would overlap.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Navigation bar: the edge's labels in the complete catalogs (#8183)
ar, he, ja, vi and zh carry every English message; the Edge row's three
labels were missing from them, so `xtask i18n --check` and
`every_complete_catalog_carries_every_english_message` failed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Phanoob <phanoob@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
body_appearance_key hashed only the name of a body's assigned material, so
after material.edit changed that material's colour (or an undo or redo
changed it back) the key stayed the same and the viewport kept the cached
old look. The key now also hashes the material's resolved look; with an
unchanged material the cache is reused as before.
* Keyboard shortcuts: a command can have several keys
Click a key on the Keyboard Shortcuts page to replace it, or the + after it
to add another; every key runs the command and menus show the first. One
key is still saved as a string, several as a list. Taking a key over from
another command leaves that command its other keys. ui.shortcut takes a
slot and reports every key.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Keyboard shortcuts: follow main's search layout; fix prefs test for key lists
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>
Chamfer at a corner of two lines lying on each other cut both back and
added a line of no length between their ends; lines in line with each
other have no corner either. chamfer now refuses a corner angle of 0 or
180 degrees with Fillet's message, "the lines are parallel" (found by a
local trim fuzzer).
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Resize Part: say what it works on instead of a parameter error; Parts opens the library (#8735)
Resize Part (parts.resize) started with no standard part selected, as the
ribbon starts it, ran the command with no parameters and showed
"`component` must be an id or a name". It now says to select an inserted
standard part, and that Scale resizes a body. Parts (parts.library) only
listed the library, so its button did nothing: it opens the Insert Part
dialog. The German and Dutch button labels said "scale" ("Teil skalieren",
"Onderdeel schalen"), like the Scale command: they now say change size.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Resize Part: the German label matches the command, and the test checks that nothing ran (#8735)
The German ribbon label reads "Bauteilgröße ändern", the name the command,
its dialog and its messages already use. The hint for a missing standard
part is now one function shared by the ribbon start and the Browser's
Change Part Size. The regression test also checks that the design and its
history stay as they were and no message carries the command's own error,
that a scripted parts.library still only lists the library, and that with a
standard part picked Change Part Size opens on it.
---------
Co-authored-by: semmelrinde <124386289+semmelrinde@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A placement row's menu starts from its component's menu, which takes
Turn Up Axis's enabled state from the component's first placement.
Move/Copy was already set again for the placement right-clicked; Turn Up
Axis and its two turns now are too, so a free second placement can turn
while the first is grounded, and a grounded one can't.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A trimmed circle ended on a line exactly where an arc started on that
line, held there by a point-on-curve tie. Trimming the line away dropped
the tie and left the two ends on one spot, untied. remove_curves now ties
each point held on a removed curve at one of its ends to that end before
the curve goes (found by a local trim fuzzer, 15 -> 12 cases in 2000
seeds).
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8480
* Pinch to zoom on touchpad: native Ctrl+wheel pinch zooms the view (#8480)
The viewport's pinch path read only `egui::Event::Zoom`; `immediate_wheel` leaves
wheel events carrying the zoom modifier to egui. Native Linux and Windows
touchpads report a pinch as Ctrl+wheel in points, so the gesture reached neither
path and the view did not move. `pinch_factor` now reads those wheels too, in
every wheel unit and scaled as egui scales them, and `ui.scroll` can send the
same gesture (`ctrl: true`) so scripts and scenarios can replay a pinch.
* fix: finish Ctrl+wheel pinch handling and replay validation (#8480)
* claim: #8561
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Dialogs: disable Apply until something changed (#8561)
The dialog footer gets a disabled state for Apply (Footer::nothing_to_apply,
Window::apply_enabled): drawn with the theme's dim ink, not clickable, not
reached by Tab and reported disabled to accessibility. Preferences enables
Apply only while something differs from its snapshot (what Cancel would put
back), so it is disabled when the dialog opens and again after Apply.
ui.prefs replies with apply_enabled.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8746
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Move/Copy: changing Move Type keeps the move made so far, and picks follow the moved body (#8746)
Switching the Move Type reset the values, so the move made under the
earlier type was lost. The dialog now keeps it (`chain`) and the new type
moves the bodies on from there; params() composes the two into one
solid.move (one turn about the origin and a translation, as before).
While the new type's picks are missing, the kept move alone is made.
The new type measures from where the bodies now stand (Free Move's pivot,
Rotate's ring, round-edge centres and axes on a moved body). The picker,
the edge/face highlights, the centre marker and Rotate's axis line follow
the moving body, mid-drag too; a pick on it is taken back by the current
type's own move so it doesn't move with the move it sets. While the
triad is dragged the moved bodies' highlights are hidden and rebuilt once
on release.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8382
* Browser: Show/Hide context menu on origin axis rows (#8382)
Right-clicking an origin axis row (X, Y, Z) now opens its own menu with
Show/Hide (V), through ui.originPart and browser.visibility like the
origin planes' entry. An axis takes no sketch, so Create Sketch is not
offered.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The Display menu's "Perspective while orbiting, ortho on faces" ran past
the menu's edge: a menu row painted its label at full length. It is now
cut before the row's detail and check, and shown whole on hover, as a
long name in a list is.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix(ui): keep selected sketch points highlighted
Add persistent point selection rings while retaining constraint-state markers, with regressions for pointer selection, dialog inputs, aliases and visibility. Fixes#1069.
* Move the sketch point selection tests into the viewport overlay tests (#1069)
Run them through a frame that clears its texture uploads, as the current egui
requires, next to the other overlay tests.
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Victor Santos Oliveira <56417388+Vittuu@users.noreply.github.com>
Co-authored-by: Colin Faulkingham <colinfaulkingham@Colins-Mac-mini.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Render lights: uniform light list, solo and mute, and the Light editor
* Render lights: Lighting and Light editors to the approved design
* Render lights: the scale-test frame carries the product light list
* Restore the stable Render light mute target on the shared eye control
* fix: validate the viewport BRDF probe with current shader dependencies
* fix: compile legacy lighting controls only for tests
* fix: scope the legacy lighting preset import to tests
* fix: reuse the merged Add Light label and translations
* test: enable the implemented Add Light radial action
* fix: restrict the legacy CPU vector editor to tests
* test: reveal Output before checking Lights browser focus
* test: use the published Browser card rectangle for Output scrolling
* test: reveal Output children before exercising editor navigation
* claim: #8267
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch Create menu: family flyouts open beside their row, on hover (#8267)
A family row (Line, Rectangle, Arc, ...) opened its variants as a dropdown
below the row, covering the rows under it. The flyout now opens to the
right of its row, level with it, and on the left only when the right has
no room. Hovering a row opens it, as the context menu's Appearance
flyout does; resting on another row closes it after the shared delay.
The context menu and the Create menu share the flyout timing
(SUBMENU_CLOSE_DELAY, flyout_hover, flyout_leaving) and placement
(flyout_at) in ui_kit::menu.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A vertex pick found its named edges and then picked each again by a point
on it, among the edges of every body. At a corner where another body's
edge runs past (a wall against a side wall), all three became that edge,
and the vertex its end 3 mm away. Take each named edge's ends from the
body that has it.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
menu_tests::linked_component_opens_its_part_in_a_tab_and_reports_a_missing_source
gave the background open of the linked part 600 frames. Headless frames
are quick, so on a loaded machine (the whole ui-egui suite at once) the
read can take longer, and the test then found the assembly still shown.
It now waits until the part is open, up to 120 s as Harness::settle and
the edit-in-place tests wait for a load.
Co-authored-by: Claude <noreply@anthropic.com>
* claim: #4160
* Sketch Fillet: 3D sketch lines are not offered, and say they can't be filleted (#4160)
The Fillet tool offered 3D sketch lines as picks, and sketch.fillet then
refused them with "`a` must be a line". The tool no longer offers them, and
the command refuses them with "not supported yet: filleting 3D sketch lines".
* Sketch Fillet and Chamfer: refuse all spatial sketch curves (#4160)
* Sketch corner test: give the picked curve its point (#4160)
main added a point to sketch-curve hits after this branch was written.
* Render shot editor: camera and frame controls, aspect presets, guides and the frame overlay
* Render shot: Shot editor and Scene overview to the approved design
* Distinguish Render stage variants from native window frames
* fix: restore library inspection after clearing shot selection
* test: follow the merged Output Check navigation
* test: inspect Check without requiring a preflight result
* test: cancel Shot removal through its shared dialog action
* fix: remove obsolete Inspector stage form after editor integration
* fix: preserve Appearance Advanced when clearing Wear focus
* test: expect the dedicated Check editor from Scene overview
Saving gave no sign that it worked, while an export names the file it wrote.
After Save or Save As, the status line now reads "Saved <path>".
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The dense solve updated each matrix element through bounds-checked get/add;
on slow scripted drags it was most of the time. The same operations in the
same order on row slices give bit-identical solutions, about twice as fast.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #4359
* Canvas and Decal say where to click after the image is chosen (#4359)
After picking an image the placement tool started silently, so it looked
as if nothing had happened. Show the tool's placement hint as a toast while
it waits for the click (translated), and end it once the image is placed.
* Canvas: include placement hint in viewport obstacles (#4359)
* claim: #8662
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Preferences: typing in a number field edits it instead of searching (#8662)
Type-to-search takes printable keys unless the focused field notes the key
sink. number_field (Autosave every, the Largest file to open limits) never
did, so its digits went into the search.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #4193
* Sketch Mirror: an origin axis can be the mirror line (#4193)
Mirror accepted only a straight curve of the sketch. It now also takes an
origin axis that lies in the sketch plane ({axis: X|Y|Z}), projected into
the sketch as a fixed linked line, so the copies stay symmetric to it and
follow the source when it moves.
* Sketch Mirror: use current sketch store (#4193)
In Preferences, letters typed in a drop-down list's own Search box (the
Font list, a 3D mouse's button assignments) went to the Preferences search
instead, which then filtered the page, usually to "No matching
preferences", and closed the list. The Preferences search takes typing only
when no text field held the keyboard on the previous frame, and the
drop-down's Search box never said it did. On the full Interface page the
number fields' focus check covered for it; once a search hid them, as when
the Font row is found by searching for "font", nothing did.
The Search box in searchable_dropdown_with now reports that it has the
keyboard, as the Preferences search box does.
Co-authored-by: Claude <noreply@anthropic.com>
* Render output: Effects and Check sections, Size presets panel and the Check tool chip
* Render output: Sampling, Effects and Check editors as child rows under Output
* fix: restrict legacy Output controls to test builds
* fix: cover status controls and reveal Effects test targets
* fix: include shared quality reviews in copied check reports
* fix: remove the obsolete Effects GPU guard after Wear integration
* Render appearance: click, drag and paint to assign, Pick Up, copy and paste, and Remove
* Exclude the workspace Shots strip from dialog width checks
* Exclude the collapsed Shots control from dialog width checks
* Retain assembly cache listings and measure actual dialog bounds
* fix: handle toast button rectangles in assignment status
* fix: restrict gallery note measurement helper to tests
* test: measure assignment help at the catalogue footer
* fix: share the command revision snapshot after restacking
* claim: #7445
* Color picker: add shared Hex input mode (#7445)
Accept strict RGB/RGBA Hex input while preserving exact opacity,
opaque/PBR restrictions, invalid drafts and existing U8/F behavior.
Keep explicit English fallback entries for the three new Hex messages
in Arabic and Hebrew, which final integration main now requires as
complete catalogs. No Arabic or Hebrew translations are claimed.
The user authorized this feature-only commit after full cargo xtask ci
stopped at the pre-existing geometry nonminimal_bool lint. The same
failure was reproduced without this patch at the published claim and
main. No unrelated lint fix or suppression is included.
* i18n: cover complete catalogs for Hex picker (#7445)
Add the three Hex message keys to Vietnamese in the feature's pending
locale file. Keep the unchanged English source values as explicit
fallbacks; no Vietnamese translations are claimed.
Audit the complete-catalog set (ar, he, ja, vi, zh) rather than only
the first catalog reported by CI. Preserve the existing completeness
test and all picker/Appearance code.
The completeness regression changes from red to green. Full local CI
and wasm checks remain blocked by failures independently reproduced
in clean upstream main; no unrelated fixes or suppressions are added.
* Appearance: use the shared opacity-aware color picker in Render (#7445)
Route the merged Render Appearance editor through the UI-kit picker,
passing exact opacity only for non-PBR looks. Keep a non-editable mixed
label and treat explicitly accepting the first color as a mixed edit.
Remove the external Hex field and duplicate parser, replace its gallery
entry with the shared mixed-aware picker, and update the control contract.
Preserve existing regression assertions and add actual Render UI tests
for alpha edits, precision, invalid drafts, PBR rejection and mixed edits.
Full local CI and wasm were run before this commit and remain blocked
by the separately reproduced unchanged upstream geometry lints and
prefs.bytes wasm error. No unrelated fixes or suppressions are included.
---------
Co-authored-by: mynoc <298906611+mynoc-96@users.noreply.github.com>
* claim: #8086
* Configuration table: a filter in the Add Column menu (#8086)
The + menu listed every parameter, feature suppression and body
material/appearance with no way to narrow it. A filter field now sits at
the top, takes focus when the menu opens, narrows the entries and the Face
Appearance submenu as typed, picks a lone match on Enter and clears when
the menu closes. A click into the field keeps the menu open (plus_header
closes on outside clicks; entries close it themselves), and the list keeps
its full height after the filter has emptied it once.
New kit element ui_kit::menu_filter (glyph, frameless editor, rule) so the
field does not read as an entry; gallery, i18n guard and docs/ui-kit.md
updated. Regression test in manage_dialogs_tests.
* claim: #6756
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Windows: never load a dxcompiler.dll found on PATH; FXC unless DXC ships beside the app (#6756)
wgpu's Dx12Compiler::Auto loads dxcompiler.dll by name, so Windows takes the
first one on PATH. SolidCraft ships none, and DXC 1.8.2505 from other programs'
folders (Obsidian, NVIDIA SDK Manager) crashed every start with
EXCEPTION_ILLEGAL_INSTRUCTION during the viewport shader compile.
solidcraft_gpu::dx12_compiler() now chooses: WGPU_DX12_COMPILER as wgpu reads
it when it names a compiler; otherwise DXC from the dxcompiler.dll beside the
program, by its full path, else FXC. The window, the headless/CLI instance and
the test helpers start with it, and dx12_compiles_with_fxc follows it.
WGPU_DX12_COMPILER=dxc keeps the old lookup.
Fixes#6756
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: points tied only through a removed curve's end stay tied
Removing a curve removed its orphaned end points with their constraints, so
two points made coincident with such an end lost their tie although they
still met: two rectangles' corners on one arc end came apart when the arc
was trimmed. They are now tied to each other before the point goes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch: keep the tie test with the other trim tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Naming a face swept from a sketch flattened every curve of the sketch to
a polyline and measured its distance to each, for every face. On a sketch
with thousands of curves (a sheet with many cut-outs) that grew with
curves times faces. The curves are now flattened once per feature, each
with its box, and a curve whose box is farther than the best distance so
far is not measured.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Spanish (es-ES): catch up with en.json
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Navigation preferences: name the Shift key through the catalog
Spanish now translates the key name, so the page painted it in English.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: bherbruck <brennen.herbruck@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #7356
* Orbit about the cursor: on an edge or sketch line, turn about the point under the cursor (#7356)
With Orbit around: point under the cursor, a drag that starts on a body
edge turned about the edge's middle, which on a long edge is far from
the cursor, and one that starts on a sketch curve turned about the
centre of the bodies in view. Edge and sketch curve hits now carry the
point under the cursor, which the pick already measured, and
pivot_under uses it. An edge hit's `mid` is unchanged, so selections
still record the edge's middle.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8139
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019FAWPuFoh9qxn2uS2j53QZ
* 3MF export: a component's bodies as one object with parts (#8139)
file.export and file.save_mesh wrote every body as its own 3MF object and
build item, so a slicer loaded a multi-body part as separate objects and
could arrange them apart on the bed. With objects: "component", each placed
component that holds two or more bodies is written as one object whose
<components> are its bodies' meshes, built once, so PrusaSlicer, OrcaSlicer,
Bambu Studio and Cura load it as one object with a part per body, each of
which can take its own filament. The design's own bodies, and a component
with a single body, stay objects of their own. The default (objects: "body")
writes the same file as before.
- io: model_xml_parts and write_3mf_parts write the parts; export_with_parts
maps body names to them. model_xml_with and export_with_quality give the
same output as before.
- engine: mesh_parts reads `objects` (component is refused for formats
other than 3MF); component_parts groups the placed bodies by placement,
each part named after its occurrence (Bracket:1, Bracket:2).
- file.save_mesh passes the parts on when it also sends the file to a slicer;
file.send_to_slicer's own folder export is unchanged.
Fixes#8139.
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>
* Render wear: a Wear row and editor for the aging layers
* test: read Wear header text from accessibility label values
* test: restore body picks for Wear header recovery assertions
* Render environment editor: rotation, intensity, backdrop colour and ground through render.environment.set
* Render environment editor: rotation ring in the view with one undo step per drag
* Render environment: Source, orientation, backdrop, ground and atmosphere sections
* Keep segmented controls inside their allocated rows
* fix: compile legacy environment controls only for tests
Where several curves cut at one place, trim pinned the new end onto the
first of them. At the touch point of two circles that was a rectangle side
passing through, and once a later trim removed the side the arc ends were
loose: a trimmed dog bone kept two untied ends.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch Coincident: refuse a line's two ends
Making a line's two ends coincident shrinks it to a point; a Parallel or
Perpendicular on it afterwards has no direction to hold and a later solve
could throw points far away while reporting solved, as with a line's own end
as its midpoint (#8562).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sketch Coincident: keep the own-ends test with the other Coincident tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #3693
* Fix timeline playback to show each rebuilt feature
* Move History playback into the Inspect ribbon
* Refuse Play History up front when playback couldn't run
Starting Play and the per-frame check that stops it were looking at
different app state, so Play could be accepted during an apply, a delete
check or queued history work and then stop silently on the next frame.
Both now use one playback_blocked check.
The UI also reads the engine's PlaybackAction as the typed enum instead of
matching strings, so a bad reply is an error rather than a quiet toggle.
* Put Play History in the History controls
History now shows five controls in transport order: start, previous,
play, next, end. Play runs timeline.play, so it turns into Stop while
playback runs, same as the ribbon button and the shortcut.
It's on by default (#3688, #3740, #4216). Anyone who wants the old four
controls back can right-click them and pick Hide Play Button, or clear
history_play_button under Preferences > Interface. In a named vertical
History too narrow for five buttons beside its grip, Play is left to the
ribbon rather than overlapping the grip.
* Draw the History Play button as a plain play/pause glyph
The Play button in the History controls now uses the same drawn glyphs as
its neighbours: a filled triangle, and two bars while History plays. The
triangle is bigger than the step arrows so it doesn't read as Forward.
The ribbon command keeps its timeline_play and timeline_stop icons.
* Keep the playback changes clear of PRs queued ahead
Several PRs in the merge queue touch the same lines, so this moves ours
aside without changing behaviour:
- history_play_button and its reset-test row sit with the other History
preferences, not beside view_confirm_corner (#7248 adds status_bar there).
- History keeps main's history_transport_width() for four controls (#6430
and #7459 call it); the Play button's count uses history_controls_width.
- A new or opened document stops playback after dim_view::cancel(), clear
of the line #7819 adds after reset_chat.
- The Play/Stop label swap moves from interactive_command_info, which #7906
rewrites, into the ribbon's command_info.
* Stop playback after the command completes, clear of #6433#6433 rewrites the session.execute line in execute_command, and our playback check sat right under it, so the queue couldn't merge the two. Checking the revision after command_completed does the same job a couple of lines later.
---------
Co-authored-by: cfaulkingham <colin.faulkingham@gmail.com>
* claim: #7834
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Viewport: vertex markers where edges are drawn (#7834)
Each body's vertices (the ends of its pickable edges, once each) show as
small screen-space squares in the edge colour in the styles that draw
edges: shaded with edges, wireframe, and shaded with hidden edges, where
hidden vertices show faintly like hidden edges. Plain shaded draws none.
A marker is a lifted line from the vertex to itself in the body's block,
so it is instanced with the edges, cached with them, and depth-tested
like a highlight band. The existing vertex hover ring stays on top.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Viewport tests: count edge segments apart from vertex markers (#7834)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Vertex markers: an option, off by default (#7834)
Adds the Vertex markers preference (Preferences > Graphics, off by default) and draws the dots only when it is on.
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>
Open refused a saved model whose text records (a feature's warning, a body or
sketch name) held more than 65,536 bytes, although Save writes them, so such a
design was evaluated again on every open.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Viewport: cut dashed lines to the view, so a huge distance can't fill the memory
epaint makes one shape per dash and steps along a line in f32. The
viewport's dashed lines (the Extrude taper handle, Measure's legs, the
fillet radius guide, the inference and snap guides, a sketch text's
frame) were dashed over their whole projected length. With an Extrude
distance of 1e9 mm the taper line was billions of points long: the
frame never finished and filled the memory within a second.
`viewport::dashed_line` dashes a line that lies in view exactly as
before, and cuts one that reaches far off screen to the view (grown by
two dash periods) first, keeping its dashes in phase with its start.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Viewport: compute a cut dashed line's ends in f64
A line a trillion points long lost its cut ends in f32: they collapsed to one point, and the part in view drew nothing. The new test caught it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Two new commands, view.next_tab and view.previous_tab, with Ctrl+Tab and
Ctrl+Shift+Tab as their default keys: they appear on the Keyboard Shortcuts
page and can be rebound or cleared like any other. The window steps along the
tab strip and goes round at either end; one design alone stays as it is, and
a "save changes?" prompt keeps its tab shown. The engine only echoes the
step (no design edit, no undo step); engine.batch refuses them like the
other steps that go to another design.
Co-authored-by: Phanoob <phanoob@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #5066
* Pattern counts: name a length-unit parameter, refuse fractional counts (#5066)
A count parameter created with a length or angle unit now gets an error
that names it and says to set its Unit to none. A count that evaluates to
a fraction is refused instead of being rounded silently.
A mesh body's row (an imported STL, 3MF, OBJ, ...) now shows a new
mesh_body icon, a triangulated cube in the mesh accent, instead of the
solid body's grey cube. Hovering a body row says Mesh body, Surface body
or Solid body. Body::is_mesh() decides; nothing new is saved.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #7744
* Vendor winit 0.30.13 with Wayland touchpad pinch and rotation gestures
The 0.30 Wayland backend never binds zwp_pointer_gestures_v1, and
WindowEvent::PinchGesture / WindowEvent::RotationGesture only come from the
macOS and iOS backends, so a trackpad pinch produces no input at all on
Linux and Wayland (two-finger scroll still works, since X11/XWayland
reports it as a wheel). egui-winit already maps the events to
egui::Event::Zoom and navigation::handle already zooms the camera from
that, so the Wayland backend was the only missing piece.
Upstream the gesture support is part of winit 0.31 (rust-windowing/winit#4338),
which eframe 0.36 cannot use while it still requires winit 0.30, and the
0.30 backport rust-windowing/winit#4778 was closed unmerged. So ship the
same fix locally, upstream-style-applied and stripped of example and test
targets, with its unit tests for the gesture state machine kept under
cargo test -p winit --lib -- pointer_gesture:
- src/platform_impl/linux/wayland/seat/pointer/pointer_gesture.rs: bind
the global (versions 1..=3), one pinch gesture object per pointer,
destroyed before the pointer is released; begin/update/end become the
two events for the window the gesture began over. Two fingers only;
the protocol's scale is relative to the gesture's beginning, so the
event carries the change since the previous update; rotation is
negated to winit's counterclockwise degrees; a non-finite scale is
dropped, and so are updates of a gesture whose begin we never saw.
- seat state wiring: bind the global, track and drop the gesture object.
- wayland-protocols' unstable feature, platform notes on both events,
changelog, patch-section entry in Cargo.toml, vendor/README, and
Linux/Wayland notes in the troubleshooting guide and the UI tour.
Retire this vendoring once an eframe release consumes winit 0.31 or
later; the cleaned branch is kept as
https://github.com/purp0w/winit/tree/wayland-pinch-gestures.
* ci: retrigger after flaky occurrence-cache test
---------
Co-authored-by: Francisco das Chagas Danta Filho <dev@dantas-filho.me>
Parallel, collinear, equal or concentric of a curve with itself was added
as a constraint that always holds; perpendicular or tangent to itself was
refused as geometry that can't move. These six now refuse one curve
picked twice, as Coincident already does for a point, and leave the
sketch as it was. Constraints already in a design are untouched.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #7919
* Pick by the body's own size, not the camera's distance (#7919)
The occlusion test that decides whether an edge or vertex is hidden by the
face in front allowed a slack of `scene_radius(app) * 0.02`, and
`scene_radius` ends with `.max(app.cam.half_height() * 2.0)`: in an
orthographic view that is `0.016 x camera distance`. Zooming out grew the
slack without bound until a whole body fitted inside it and every edge behind
the front face counted as visible, and edges and vertices are offered before
faces, so they won the pick. Cutting the slack from the scene also gave a
small part in a large assembly a tolerance many times its own size.
`pick_slack` now takes a size and returns the mesh's own chord tolerance with
room to spare, `DisplayQuality::Coarse.chord(size) * 4.0`: a facet sits at
most a chord tolerance inside its surface, and that tolerance is already a
fraction of the body's size, so the slack no longer moves when the camera
does. Each body is tested with its own bounding box, which the loop already
holds. `view.pick` does the same, so an agent's pick still matches a click on
the same pixel. Sketch profiles and origin planes belong to no body and keep
a scene-level value, `scene_pick_slack`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
A line's own end held at its middle shrinks the line to a point. The
solve accepted that, and a later angle, tangent or parallel on the line
had no direction to hold: its points went millions of millimetres away
while the sketch still reported solved. MidPoint now refuses the pick,
saying why, and leaves the sketch as it was. Constraints already in a
design are untouched (only the command refuses).
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #4750
Co-Authored-By: Claude <noreply@anthropic.com>
* Extend: pick two curves to extend both to where they meet (#4750)
`sketch.extend` gains a second form: `curves: [a, b]` names two lines or
arcs, with an optional `at: [[x,y],[x,y]]` naming the end of each to grow
(default: the end nearest the meeting point). Both grow along their own
line or circle to where they cross and the two ends are joined with one
Coincident, in one undo step. `moved` is the joined end's id.
- Where two crossings are possible (line and arc, two arcs) the one with
the least total growth is used; a tie is refused.
- A curve that already reaches the point does not grow. An end held by
other geometry or a constraint stays and gets a new line or arc.
- Parallel or collinear lines, curves that never meet, a point behind the
chosen end, the same curve twice, splines, ellipses, infinite lines,
offset geometry and malformed `curves`/`at` are refused with no change.
- The single-curve form is unchanged; its code is shared through
`grow_line` / `grow_arc`.
Canvas: in the Extend tool, Shift-click two curves. Shift goes through
the tool modifier registry as the new `extend_pair` action, and Extend
turns off Shift's midpoint snap. Escape drops a pending first pick. The
sketching guide describes the gesture.
Co-Authored-By: Claude <noreply@anthropic.com>
---------
Co-authored-by: Claude <noreply@anthropic.com>
* claim: #7893
* Toasts: one stack in the view's bottom-right corner, one width, buttons as in dialogs (#7893)
* Control protocol: toast_place in the sorted ui.prefs list (#7893)
* Toasts: a sketch test clears the status notice before clicking the view's corner (#7893)
The test's line end lands in the bottom-right corner, where notices now stack
and take clicks as they did at the bottom centre; the test is about the circle.
* Toasts: the pattern scenario's circle sits clear of the view's corner (#7893)
After the refit, a circle at y 0 landed in the bottom-right corner, where the
tool's prompt now stacks and takes clicks. The circle moves 40 mm up; the
pattern it checks is the same.
* claim: #8358
* Components: a component named like the design is reachable by name (#8358)
Document::find_component resolved the design's own name to the root component (id 0) before
searching the component list, so a component that shares the design's name was unreachable by
name: appearance.assign reported `no component `CurtainRailPlug`` (the same lookup serves every
command that takes a component by name).
An exact component name (or component id) match now wins over the design-name fallback; "0" and
"root" still always mean the design.
Regression test: a_component_named_like_the_design_takes_its_appearance_by_name (fails on main
with the reported error, passes with the fix).
* claim: #8521
* feat: give History feature folders their own symbol
A folder of features in the History on the left drew the same folder icon
as the Browser's folders. It now draws feature_group, a pile of history
chips with the front one in blue, and so do Add to New Folder and Remove
from Folder in the History's menu. Other uses of folder keep it.
* claim: sheet.* typed parameter schemas
* Sheet metal feature commands: typed parameter contracts
sheet.flange, sheet.perforate, sheet.hem, sheet.fold, sheet.unfold, sheet.refold and
sheet.convert read their parameters by hand, so a misspelt key or a value of the wrong
shape was ignored or failed late, and describe_command had only prose for them.
Each now has a contract in schema/sheet.rs, checked in front of the unchanged handler,
and returns FeatureResult. The values no shared type fits (sheet-edge points, an edge
flange's edges, a fold's line and fixed point, the flange type, the positions, the
relief shape and the perforation pattern) get types that call the handlers' own
readers, split out of cmd/sheet.rs, and give their messages. The rule's values
(thickness, K-factor, bend radius, reliefs) stay out of the contracts: the handlers
refuse them, and strict refuses them as unknown keys.
A test passed a nested `base` object whose `sketch` the flange never reads; it now
names the sketch at the top level.
Part of #2829 (#6581).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Sheet metal contracts: a further bend's angle stays as lenient as before
The flange handler reads a `then` bend's `angle` that is no expression
(`true`, a list) as left out and bends it 90 degrees. The rebased
contract had moved that check into the shared reader, so the handler
refused such a call even with the check off.
The reader is back to the handler's behaviour, and `ThenSteps` is the
stricter one, as the schema guide asks: warn reports such an angle and
strict refuses it. Tests cover the reader's leniency, the type's
refusal and the three check levels on one flange.
Part of #2829 (#6581).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Browser: the history in the browser, as a History layout (compact mode)
Settings > Interface > History gains "In browser" (view.history_layout dock: browser):
neither timeline is shown, and each component's History folder lists its sketches and
features in history order with the marker. Dragging the marker rolls the history back
through timeline.roll_to; Find in Timeline reveals the feature in the browser.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Browser history: sketches listed under their feature as in the vertical History
With Sketches: Under their feature, the history in the browser (compact mode) lists each
sketch under the first feature built from it, through the shared history_rows (#6494)
without reference rows: same rule, same fold key, so switching the History layout keeps
what is open. A drop above a row rolls back its listed sketches with it. Selecting a feature
lights the rows of its sketches, and selecting a sketch lights the features built from it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Browser: with the history in the browser, the Sketches folder starts closed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Browser history: sketch rows have the eye of their Sketches folder row
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* History in the browser: Arabic, Hebrew and Vietnamese for the layout's name
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Dialogs: scroll a long refusal into view with its Create Issue (#8454)
A dialog's refusal comes last in its fields. When the fields fill the
dialog, the refusal sits under the fold: an Extrude Cut that the kernel
refused showed only its first line, "boolean Cut: the operation failed: no",
and no Create Issue. The dialog now scrolls a new refusal into view once:
a refusal on OK at once, a preview's once no field is being typed in, so a
field never moves away while it is typed in.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Dialogs: decide the reveal in one function and test it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* Lists many PRs add to: no written lengths, one file per theme (#7747)
* xtask lists: the fixed-table allowlist in order, each with its own reason
* Lists: the wide-character blocks and the drawing scale presets as slices too (#7747)
* Lists: the drawing units test reads UNITS as a slice (#7747)
A copied body transfer was pasted like any feature and given the target
component as its owner. A transfer belongs to the component it moves bodies
to, so the saved design was refused on open ("body transfer owner must match
its destination"), and a pasted transfer had nothing to move anyway: the
copies go into the component they are pasted into. Paste now leaves body
transfers out and says so in its notices; a clipboard of only transfers is
refused.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8410
* Preferences: reverse trackpad orbit direction (#8410)
Add "Reverse trackpad orbit direction" under the pan settings in
Preferences > Navigation. orbit_reverse defaults off, so older settings
files load unchanged, and turns the Shift + two-finger orbit the other
way on both axes, as natural scrolling flips both. Pan, zoom and mouse
orbiting are untouched. Labels in en, ar, de, he, ja, ko, vi and zh as
a pending locale file; orbit_reverse in the control protocol's sorted
settings list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* claim: #8542
* CI: report missing translations for complete catalogs before review (#8542)
`cargo xtask i18n --check` already reads the pending locale files and fails
when a complete catalog lacks an English message, but no workflow ran it, so
the gap surfaced only in the full test run after approved-for-ci. It now runs
in Format and repository checks, and CONTRIBUTING names the complete catalogs.
# Cargo.lock or a Cargo.toml changed on a pull request or in a merge group.
if [ "$DEPS_RUN" = true ]; then
test "$ADVISORIES" = success
fi
# A merge group that reaches the wasm build.
if [ "$WASM_RUN" = true ]; then
test "$WASM" = success
fi
- name:Note a carried result
if:needs.changes.outputs.carried != ''
env:
@@ -1033,9 +1090,13 @@ jobs:
run:|
echo "This push only merges main into a change that already passed; the heavy checks were not repeated. Passing run: $CARRIED" >> "$GITHUB_STEP_SUMMARY"
# Every crate below the apps and the web app must build for the browser (`cargo xtask wasm`, a
# cargo check, no tests). In the merge queue for a group that reaches the wasm build (Select
# checks' `wasm`), where `ci` requires it; by hand with cross_compile.
@@ -603,6 +603,12 @@ Original SolidCraft drawings, Open for owner review; no runtime assignments.
| assets/icons/ui/design/svg/model/finish_edit.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
| `assets/locales/pending/sketch-tracking-guides.json` | SolidCraft contributors | Original alignment-guide preference labels and help text | MIT OR Apache-2.0 |
| assets/locales/pending/point-clouds.json | SolidCraft contributors | Original point-cloud UI strings and translations | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/feature_group.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/mesh_body.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/timeline_play.svg | SolidCraft contributors | Original history playback icon; canonical grey_cube base and original action cue | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/model/timeline_stop.svg | SolidCraft contributors | Original history playback icon; canonical grey_cube base and original action cue | MIT OR Apache-2.0 |
| assets/icons/ui/design/svg/flat/status_pin.svg | SolidCraft contributors | Original analytic pin icon for persistent viewport results | MIT OR Apache-2.0 |
| assets/locales/pending/render-wear.json | SolidCraft contributors | Original UI labels and translations | MIT OR Apache-2.0 |
"ui.part_size_needs_a_part":"Vælg en indsat standarddel (en skrue, møtrik, skive eller stift) for at ændre dens størrelse. Brug Skalering til at gøre et emne større eller mindre.",
"ui.part_size_shared":"Genopbygger delen og erstatter alle tilføjede features. Alle forekomster af komponenten opdateres.",
"cmd.render_effects_describe":"Lens and Creative Effects",
"cmd.sketch_arc_center_point":"Centre Point Arc",
@@ -16,7 +23,13 @@
"cmd.sketch_slot_arc_center":"Centre Point Arc Slot",
"cmd.sketch_slot_center_point":"Centre Point Slot",
"cmd.sketch_slot_center_to_center":"Centre to Centre Slot",
"color.copy":"Click to copy colour values",
"color.edit":"Click to edit colour",
"color.gamma":"Showing colour values in 0-255 gamma space",
"color.linear":"Showing colour values in 0-1 linear space",
"color.selected":"Selected colour",
"pattern.alignment_hint":"Counts include the original. Centre balances copies; Flip chooses the extra side for even totals.",
"prefs.logo_theme":"Theme's colours",
"prefs.max_file_size":"Largest file to open",
"prefs.max_file_size_design":"Design files",
"prefs.max_file_size_flag":"This run started with --max-file-size {size}, which applies until SolidCraft closes. These settings apply when it starts without it.",
@@ -24,6 +37,8 @@
"prefs.max_file_size_step":"STEP and import files",
"prefs.max_file_size_web":"The web app opens STEP and import files up to 512 MB and designs up to 256 MB: a browser tab can't hold larger files. The desktop app can raise these limits.",
"prefs.megabytes":"MB",
"prefs.sketch_conflict_colour":"Conflicting geometry in the conflict colour",
"prefs.sketch_conflict_colour_note":"While a sketch's constraints conflict, the curves and points a failing constraint holds are drawn in the conflict colour too, not only its glyph or dimension. Off: they keep their usual colours.",
"prefs.sketch_state_icons":"Sketch icons in the colour of their state",
"prefs.sketch_state_icons_note":"In History and the browser, a sketch's icon takes the colour of its state (under constrained, fully constrained or conflicting) and its tooltip names the state. Off: every sketch has the same icon.",
"prefs.sketch_tracking_guides":"Centre and midpoint alignment guides",
@@ -35,6 +50,8 @@
"prefs.theme_follow_note":"Reloaded whenever another tool rewrites it. Choosing a theme stops following it.",
"render.aging_airborne_help":"Airborne dust is a separate finite homogeneous scattering volume. It changes transport and raw EXR, not the surface-aging stack. Existing volume/glass/denoising restrictions remain explicit; no atmosphere is added automatically.",
@@ -62,6 +79,8 @@
"render.aging_target_help":"A named target must still match its captured index and name. Global masks are world-anchored; they do not follow moving parts. This is neither cavity detection nor true edge wear. Filter the list to reach additional bodies.",
"render.background_hdr_separate":"The current HDR resources illuminate and reflect on surfaces; they are not automatically displayed as a panorama behind the subject. Changing a gradient does not rotate or recolour the lighting.",
"render.background_lighting_section":"HDR illumination · separate from camera background",
"render.background_no_alpha_override":"A camera background is not added to transparent output silently. Raw-master regrading uses captured coverage and does not reapply denoising; the source EXR remains unchanged.",
"render.background_not_light":"Background colour is presentation, not an additional lighting source.",
"render.background_regrade":"Apply to retained raw master",
"render.background_stage_occlusion":"This shot includes physical stage geometry. A large floor or wall can fill the frame and hide a camera-only background. Clear or resize the stage deliberately, or change its physical reflectance. Regrading cannot remove captured geometry.",
"render.background_workflow":"Choose the background you intend: a camera-only colour/gradient, a physical stage that receives light, or HDR illumination. They are independent. Live Preview is a modelling view; render a new image or regrade a retained master to see camera finishing.",
"render.base_color":"Base colour · sRGB",
"render.bloom_help":"Creative output-only glow from positive linear highlights, spread with three normalised box passes. Radius is in output pixels. Added in linear display light before sRGB; not a lens, volumetric effect or convergence improvement. The raw EXR is unchanged.",
"render.cpu_light_help":"Up to eight directional lights. An empty custom list turns them off; selecting a preset restores its lights. Colours are linear RGB and intensity is relative, not watts.",
"render.effects_gpu_only":"These effects require GPU path tracing. Changing the page never switches the renderer automatically.",
"render.effects_help":"Combine ordered colour looks and image-space lens effects. Rendering and raw-master regrading use the same saved settings. Raw EXR stays unchanged. These are original artistic controls, not calibrated lens or branded-film emulations.",
"render.hdr_primaries_undeclared":"The source does not declare primaries; review the renderer colour requirements.",
"render.layer_down":"Move down",
"render.layer_enabled":"Layer enabled",
"render.layer_remove":"Remove layer",
@@ -90,6 +117,13 @@
"render.layer_up":"Move up",
"render.lens_effects_help":"Flare uses up to four separated bright sources in the actual linear image. Ghosts, halo, streaks, chromatic offsets and radial distortion are artistic image-space approximations. Spatial effects need opaque output; outside samples extend the image edge. Grain is deterministic. No physics, EXR or geometry is altered.",
"render.library_inspect_only":"Select to inspect; nothing is applied automatically. Favourites and recent history belong to this open document session.",
"render.library_rig_help":"Fit once at an explicit centre and physical extent. Complete rigs include passive cards; calibration blockers still refuse. Conservative emitter/card clearance is checked before saving.",
"render.library_source_preview_help":"Authored base-colour source map. This is not a rendered or measured material preview.",
"render.material_color_replace":"Base map replaces body colour",
"render.material_map_required":"Choose a colour image or a normal image before using maps.",
"render.material_maps":"Planar colour and normal maps",
"render.material_maps_help":"PNG/JPEG up to 1024×1024; 16 MiB encoded total. U and V are orthogonal world-mm repeat vectors (maximum 128 repeats). Colour is sRGB; normal data uses OpenGL +Y. Files are captured at Check/Start.",
"render.opaque_preview_help":"Opaque PBR and simple colours; blended transparency. Refraction, HDRI and final rendering are not available yet.",
"render.page_aging":"Aging & contamination",
"render.page_background":"Backgrounds",
@@ -110,9 +149,16 @@
"render.ribbon_effects":"Effects",
"render.sharpening":"Detail sharpening",
"render.soft_focus":"Soft focus",
"render.studio_center":"Centre X, Y, Z (mm)",
"render.studio_hdr_help":"Radiance .hdr, 2:1 panorama, up to 2048 × 1024. EXR is unavailable. The colour assumption applies only when primaries are unspecified.",
"sketch_text.align_center":"Centre",
"ui.3d_mouse_kind_cap":"Return to Centre",
"ui.3d_mouse_looks_like_cap":"The reading stays put while you hold it, the way a Return to Centre device does.",
"ui.3d_mouse_step_pull":"Pull the cap towards you, hold it, then let go.",
"ui.3d_mouse_switch_cap":"Calibrate as Return to Centre",
"ui.center":"Centre",
"ui.center_arc_follows_cursor":"Centre point arc follows the cursor's direction",
"ui.center_arc_follows_cursor_tip":"A centre point arc runs clockwise or counter-clockwise the way the cursor goes round its centre. Off: always counter-clockwise from the start.",
"ui.centerline":"Centreline",
"ui.customizeToolbar":"Customise Toolbar…",
"ui.design_properties.license":"Licence",
@@ -123,6 +169,7 @@
"ui.point_cloud_file_colors":"File Colours",
"ui.point_cloud_no_file_colors":"The file has no colours",
"ui.point_cloud_single_color":"Single Colour",
"ui.properties.inertia_note":"About the centre of mass, in world axes (g·{unit}²)",
"ui.ribbon_labels":"Show text under ribbon icons",
"ui.workspace_layout":"Workspace layout",
"ui.zoom_to_cursor_tip":"The wheel zooms towards the point under the cursor (off: towards the view's centre)",
"render.cpu_glass_help":"Standard uses bounded paths and may darken reflective glass. Continue reflections stops with an error if a supported optical limit is reached. Selected opaque reflections and unsupported glass shapes remain unavailable.",
"render.cpu_glass_label":"Glass rendering",
"render.cpu_glass_standard":"Standard"
},
"ar":{
"render.cpu_glass_continue":"متابعة الانعكاسات",
"render.cpu_glass_help":"يستخدم الوضع القياسي مسارات ضوء محدودة، وقد يجعل الزجاج العاكس أغمق. يوقف خيار «متابعة الانعكاسات» التصيير مع ظهور خطأ عند بلوغ أحد الحدود البصرية المدعومة. تظل الانعكاسات المحددة على الأجسام المعتمة وأشكال الزجاج غير المدعومة غير متاحة.",
"render.cpu_glass_help":"Standard begrenzt die Lichtwege und kann reflektierendes Glas abdunkeln. Reflexionen fortsetzen stoppt das Rendering mit einem Fehler, wenn eine unterstützte optische Grenze erreicht wird. Ausgewählte opake Reflexionen und nicht unterstützte Glasformen bleiben nicht verfügbar.",
"render.cpu_glass_label":"Glasdarstellung",
"render.cpu_glass_standard":"Standard"
},
"es":{
"render.cpu_glass_continue":"Continuar reflejos",
"render.cpu_glass_help":"Estándar limita los recorridos y puede oscurecer el vidrio reflectante. Continuar reflejos detiene el render con un error si alcanza un límite óptico admitido. Los reflejos opacos seleccionados y las formas de vidrio no compatibles siguen sin estar disponibles.",
"render.cpu_glass_label":"Render de vidrio",
"render.cpu_glass_standard":"Estándar"
},
"he":{
"render.cpu_glass_continue":"המשך השתקפויות",
"render.cpu_glass_help":"המצב הרגיל מגביל את מסלולי האור ועלול להכהות זכוכית מחזירת אור. האפשרות «המשך השתקפויות» עוצרת את הרינדור עם שגיאה כאשר מגיעים לאחת המגבלות האופטיות הנתמכות. השתקפויות נבחרות על גופים אטומים וצורות זכוכית שאינן נתמכות נשארות לא זמינות.",
"render.cpu_glass_help":"표준은 광선 경로를 제한하므로 반사 유리가 어둡게 보일 수 있습니다. 반사 계속은 지원되는 광학 한계에 도달하면 오류와 함께 렌더링을 중지합니다. 선택한 불투명 표면 반사와 지원되지 않는 유리 형상은 계속 사용할 수 없습니다.",
"render.cpu_glass_label":"유리 렌더링",
"render.cpu_glass_standard":"표준"
},
"vi":{
"render.cpu_glass_continue":"Tiếp tục phản xạ",
"render.cpu_glass_help":"Chế độ tiêu chuẩn giới hạn đường truyền ánh sáng và có thể làm kính phản xạ trông tối hơn. Tùy chọn Tiếp tục phản xạ dừng kết xuất kèm lỗi khi đạt một giới hạn quang học được hỗ trợ. Các phản xạ đã chọn trên vật thể đục và các hình dạng kính không được hỗ trợ vẫn không khả dụng.",
"render.cpu_directional_shadow_help":"CPU optics are temporary and require certified sheets or axis-aligned boxes with opaque body and face appearances. Directional transmitted shadows require global shadows on and all active assignments to agree. Mixed choices, nesting, environment lighting and local lights are unsupported in that mode. This is straight RGB visibility, not refracted shadows or caustics. Subsurface, coats and maps remain unsupported; fixed and progressive sampling retain finite-depth limits.",
"render.cpu_shadow_conflict":"The global directional transmission option conflicts with an optical assignment whose transmitted shadows are off. No authored option was changed.",
"render.cpu_shadow_mixed":"CPU uses one transmitted-shadow switch for all active optical assignments. Mixed on/off choices cannot be represented and have been preserved."
},
"es":{
"render.cpu_directional_shadow_help":"La óptica CPU es temporal y requiere láminas o cajas alineadas con los ejes certificadas, con aspectos opacos de cuerpo y caras. Las sombras transmitidas direccionales requieren sombras globales activadas y que todas las asignaciones activas coincidan. Ese modo no admite mezclas, nesting, iluminación de entorno ni luces locales. Es visibilidad RGB recta, sin sombras refractadas ni cáusticas. La dispersión subsuperficial, las capas y los mapas siguen sin admitirse; el muestreo fijo y progresivo conserva los límites de profundidad.",
"render.cpu_shadow_conflict":"La opción global de transmisión direccional contradice una asignación óptica con sombras transmitidas desactivadas. No se ha cambiado ninguna opción definida.",
"render.cpu_shadow_mixed":"CPU usa un único control de sombras transmitidas para todas las asignaciones ópticas activas. No puede representar opciones activadas y desactivadas mezcladas; se han conservado."
},
"de":{
"render.cpu_directional_shadow_help":"CPU-Optik ist temporär und erfordert zertifizierte Scheiben oder achsenparallele Quader mit opaken Körper- und Flächenerscheinungen. Gerichtete durchgelassene Schatten erfordern globale Schatten und übereinstimmende aktive Zuweisungen. Gemischte Optionen, Verschachtelung, Umgebungslicht und lokale Lichter sind in diesem Modus nicht unterstützt. Dies ist geradlinige RGB-Sichtbarkeit, keine gebrochenen Schatten oder Kaustiken. Subsurface-Streuung, Beschichtungen und Maps bleiben nicht unterstützt; feste und progressive Abtastung behalten die endliche Tiefengrenze.",
"render.cpu_shadow_conflict":"Die globale gerichtete Transmission widerspricht einer optischen Zuweisung mit ausgeschalteten durchgelassenen Schatten. Keine festgelegte Option wurde geändert.",
"render.cpu_shadow_mixed":"CPU verwendet einen Schalter für durchgelassene Schatten aller aktiven optischen Zuweisungen. Gemischte Ein-/Aus-Werte sind nicht darstellbar und wurden beibehalten."
},
"ko":{
"render.cpu_directional_shadow_help":"CPU 광학은 임시 설정이며 불투명한 바디와 면 외관을 가진 인증된 판 또는 축 정렬 상자가 필요합니다. 방향성 투과 그림자는 전역 그림자가 켜져 있고 모든 활성 할당의 설정이 같아야 합니다. 이 모드는 혼합 설정, 중첩, 환경 조명 및 로컬 광원을 지원하지 않습니다. 이는 직선 RGB 가시성이며 굴절 그림자나 코스틱이 아닙니다. 표면하 산란, 코팅 및 맵은 계속 지원하지 않으며 고정 및 점진적 샘플링은 유한 깊이 제한을 유지합니다.",
"render.cpu_shadow_conflict":"전역 방향성 투과 옵션이 투과 그림자가 꺼진 광학 할당과 충돌합니다. 작성된 옵션은 변경되지 않았습니다.",
"render.cpu_shadow_mixed":"CPU는 모든 활성 광학 할당에 하나의 투과 그림자 스위치를 사용합니다. 켜짐과 꺼짐이 섞인 설정은 표현할 수 없으며 그대로 보존되었습니다."
},
"ar":{
"render.cpu_directional_shadow_help":"بصريات CPU مؤقتة وتتطلب صفائح أو صناديق محاذية للمحاور اجتازت التحقق، بمظاهر معتمة للجسم والأوجه. تتطلب الظلال النافذة الاتجاهية تفعيل الظلال العامة وتطابق كل التعيينات النشطة. لا يدعم هذا الوضع الخيارات المختلطة أو التداخل أو إضاءة البيئة أو الأضواء المحلية. هذه رؤية RGB مستقيمة وليست ظلالًا منكسرة أو كاوستيك. يبقى التشتت تحت السطحي والطلاءات والخرائط غير مدعوم، وتبقى حدود العمق المحدودة لأخذ العينات الثابت والتدريجي.",
"render.cpu_shadow_conflict":"يتعارض خيار النفاذ الاتجاهي العام مع تعيين بصري تكون ظلاله النافذة معطلة. لم يتغير أي خيار محدد.",
"render.cpu_shadow_mixed":"يستخدم CPU مفتاح ظلال نافذة واحدًا لجميع التعيينات البصرية النشطة. لا يمكن تمثيل خليط من التفعيل والتعطيل، وقد تم الاحتفاظ بالخيارات."
},
"he":{
"render.cpu_directional_shadow_help":"אופטיקת CPU היא זמנית ודורשת יריעות או תיבות מיושרות לצירים שעברו אימות, עם מראה אטום של הגוף והפאות. צללים מועברים כיווניים דורשים צללים כלליים פעילים ואחידות בכל ההקצאות הפעילות. מצב זה אינו תומך בערכים מעורבים, קינון, תאורת סביבה או אורות מקומיים. זו נראות RGB בקו ישר, ללא צללים נשברים או קאוסטיקה. פיזור תת-משטחי, ציפויים ומפות עדיין אינם נתמכים; דגימה קבועה והדרגתית שומרות על מגבלות העומק הסופי.",
"render.cpu_shadow_conflict":"אפשרות ההעברה הכיוונית הכללית סותרת הקצאה אופטית שהצללים המועברים שלה כבויים. שום אפשרות שנקבעה לא שונתה.",
"render.cpu_shadow_mixed":"CPU משתמש במתג צללים מועברים אחד לכל ההקצאות האופטיות הפעילות. לא ניתן לייצג ערכים מעורבים של פעיל וכבוי, והם נשמרו."
"render.cpu_directional_shadow_help":"Quang học CPU là tạm thời và cần tấm hoặc hộp song song các trục đã được kiểm chứng, với diện mạo thân và mặt đục. Bóng truyền qua từ đèn định hướng cần bật bóng toàn cục và mọi phép gán đang bật phải cùng lựa chọn. Chế độ này không hỗ trợ lựa chọn lẫn bật/tắt, lồng nhau, ánh sáng môi trường hoặc đèn cục bộ. Đây là độ nhìn thấy RGB theo đường thẳng, không phải bóng khúc xạ hay caustic. Tán xạ dưới bề mặt, lớp phủ và bản đồ vẫn không được hỗ trợ; lấy mẫu cố định và lũy tiến vẫn có giới hạn độ sâu hữu hạn.",
"render.cpu_shadow_conflict":"Tùy chọn truyền sáng định hướng toàn cục xung đột với phép gán quang học có bóng truyền qua đang tắt. Không thay đổi tùy chọn đã soạn nào.",
"render.cpu_shadow_mixed":"CPU dùng một công tắc bóng truyền qua cho tất cả phép gán quang học đang bật. Không thể biểu diễn lựa chọn lẫn bật và tắt; các lựa chọn đã được giữ nguyên."
"render.cpu_optics_certification":"CPU Check and Start validate captured identity, opaque body and face appearances, and the requested sheet or axis-aligned box certificate. Choosing a boundary does not certify geometry. Start rechecks the capture; passing Check does not guarantee later admission."
},
"es":{
"render.cpu_optics_certification":"Comprobar e Iniciar en CPU validan la identidad capturada, los aspectos opacos del cuerpo y sus caras, y el certificado de lámina o caja alineada con los ejes solicitado. Elegir una frontera no certifica la geometría. Iniciar comprueba de nuevo la captura; superar Comprobar no garantiza una admisión posterior."
},
"de":{
"render.cpu_optics_certification":"Prüfen und Starten auf der CPU validieren die erfasste Identität, opake Körper- und Flächenerscheinungen sowie das angeforderte Zertifikat für Scheiben oder achsenparallele Quader. Die Wahl einer Grenze zertifiziert keine Geometrie. Starten prüft die Erfassung erneut; erfolgreiches Prüfen garantiert keine spätere Zulassung."
},
"ko":{
"render.cpu_optics_certification":"CPU의 확인과 시작은 캡처한 식별 정보, 불투명한 바디와 면 외관, 요청한 판 또는 축 정렬 상자의 인증을 검증합니다. 경계를 선택하는 것만으로 형상이 인증되지는 않습니다. 시작 시 캡처를 다시 확인하며, 확인에 성공해도 이후 승인이 보장되지는 않습니다."
},
"ar":{
"render.cpu_optics_certification":"يتحقق الفحص والبدء على CPU من الهوية الملتقطة ومظاهر الجسم والأوجه المعتمة وشهادة الصفيحة أو الصندوق المحاذي للمحاور المطلوبة. اختيار حد لا يثبت صلاحية الهندسة. يعيد البدء فحص اللقطة؛ نجاح الفحص لا يضمن القبول لاحقًا."
},
"he":{
"render.cpu_optics_certification":"בדיקה והתחלה ב-CPU מאמתות את הזהות שנלכדה, מראה אטום של הגוף והפאות ואת האישור המבוקש ליריעה או לתיבה מיושרת לצירים. בחירת גבול אינה מאשרת את הגאומטריה. התחלה בודקת שוב את הלכידה; הצלחה בבדיקה אינה מבטיחה אישור מאוחר יותר."
"render.cpu_optics_certification":"Kiểm tra và Bắt đầu trên CPU xác thực danh tính đã chụp, diện mạo thân và mặt đục, cùng chứng nhận tấm hoặc hộp song song các trục được yêu cầu. Chọn biên không chứng nhận hình học. Bắt đầu kiểm tra lại bản chụp; vượt qua Kiểm tra không bảo đảm được chấp nhận về sau."
"render.cpu_optics_enable":"Use these optics on CPU",
"render.cpu_optics_explicit":"Review this assignment and explicitly enable its CPU optical route.",
"render.cpu_optics_fixed":"The installed CPU transport cannot admit this optical sampling request.",
"render.cpu_optics_help":"Temporary CPU optics: fixed or progressive sampling, opaque body and face appearances, certified sheets or axis-aligned boxes. Transmitted shadows, subsurface, coats and maps are unsupported. Box nesting needs explicit opt-in and certification. Accumulation retains the finite-depth transport limits.",
"render.cpu_optics_limit":"CPU supports at most eight optical body assignments.",
"render.cpu_optics_request":"CPU optics require the typed CPU image request and its existing options.",
"render.cpu_optics_saved":"Saved GPU optics cannot be mixed with temporary CPU optical assignments.",
"render.cpu_optics_unsupported":"This CPU route supports glass without transmitted shadows, subsurface, coats or maps. Review the authored options; they have been preserved."
},
"es":{
"render.cpu_optics_boundary":"CPU requiere elegir explícitamente Lámina fina o Caja. La geometría capturada debe superar la certificación.",
"render.cpu_optics_conflict":"Las asignaciones ópticas CPU no pueden sustituir las modificaciones dieléctricas existentes.",
"render.cpu_optics_enable":"Usar esta óptica en CPU",
"render.cpu_optics_explicit":"Revisa esta asignación y activa explícitamente su ruta óptica CPU.",
"render.cpu_optics_fixed":"El transporte CPU instalado no puede admitir esta solicitud de muestreo óptico.",
"render.cpu_optics_help":"Óptica CPU temporal: muestreo fijo o progresivo, aspectos opacos de cuerpo y caras, láminas o cajas alineadas con los ejes certificadas. No admite sombras transmitidas, dispersión subsuperficial, capas ni mapas. Las cajas anidadas requieren activación explícita y certificación. La acumulación conserva los límites de profundidad del transporte.",
"render.cpu_optics_limit":"CPU admite como máximo ocho asignaciones ópticas de cuerpo.",
"render.cpu_optics_request":"La óptica CPU requiere la solicitud de imagen CPU tipada y sus opciones existentes.",
"render.cpu_optics_saved":"La óptica GPU guardada no se puede mezclar con asignaciones ópticas CPU temporales.",
"render.cpu_optics_unsupported":"Esta ruta CPU admite vidrio sin sombras transmitidas, dispersión subsuperficial, capas ni mapas. Revisa las opciones definidas; se han conservado."
},
"de":{
"render.cpu_optics_boundary":"CPU erfordert die ausdrückliche Wahl von Dünner Scheibe oder Quader. Die erfasste Geometrie muss zertifiziert werden.",
"render.cpu_optics_conflict":"Optische CPU-Zuweisungen können vorhandene dielektrische Überschreibungen nicht ersetzen.",
"render.cpu_optics_enable":"Diese Optik auf der CPU verwenden",
"render.cpu_optics_explicit":"Prüfen Sie diese Zuweisung und aktivieren Sie ihren optischen CPU-Pfad ausdrücklich.",
"render.cpu_optics_fixed":"Der installierte CPU-Transport kann diese optische Abtastanforderung nicht zulassen.",
"render.cpu_optics_help":"Temporäre CPU-Optik: feste oder progressive Abtastung, opake Körper- und Flächenerscheinungen, zertifizierte Scheiben oder achsenparallele Quader. Durchgelassene Schatten, Subsurface-Streuung, Beschichtungen und Maps werden nicht unterstützt. Verschachtelte Quader erfordern ausdrückliche Aktivierung und Zertifizierung. Die Akkumulation behält die endliche Transporttiefe bei.",
"render.cpu_optics_limit":"CPU unterstützt höchstens acht optische Körperzuweisungen.",
"render.cpu_optics_request":"CPU-Optik erfordert die typisierte CPU-Bildanforderung und deren vorhandene Optionen.",
"render.cpu_optics_saved":"Gespeicherte GPU-Optik kann nicht mit temporären optischen CPU-Zuweisungen kombiniert werden.",
"render.cpu_optics_unsupported":"Dieser CPU-Pfad unterstützt Glas ohne durchgelassene Schatten, Subsurface-Streuung, Beschichtungen oder Maps. Prüfen Sie die unverändert erhaltenen Optionen."
},
"ko":{
"render.cpu_optics_boundary":"CPU에서는 얇은 판 또는 상자 경계를 명시적으로 선택해야 합니다. 캡처한 형상은 인증을 통과해야 합니다.",
"render.cpu_optics_conflict":"CPU 광학 할당은 기존 유전체 재정의를 대체할 수 없습니다.",
"render.cpu_optics_enable":"이 광학 설정을 CPU에서 사용",
"render.cpu_optics_explicit":"이 할당을 검토하고 CPU 광학 경로를 명시적으로 활성화하세요.",
"render.cpu_optics_fixed":"설치된 CPU 전송 모델은 이 광학 샘플링 요청을 허용할 수 없습니다.",
"render.cpu_optics_help":"임시 CPU 광학: 고정 또는 점진적 샘플링, 불투명한 바디와 면 외관, 인증된 판 또는 축 정렬 상자. 투과 그림자, 표면하 산란, 코팅 및 맵은 지원하지 않습니다. 중첩 상자는 명시적 활성화와 인증이 필요합니다. 누적해도 전송의 유한 깊이 제한은 유지됩니다.",
"render.cpu_optics_limit":"CPU는 최대 8개의 광학 바디 할당을 지원합니다.",
"render.cpu_optics_request":"CPU 광학에는 형식화된 CPU 이미지 요청과 기존 옵션이 필요합니다.",
"render.cpu_optics_saved":"저장된 GPU 광학을 임시 CPU 광학 할당과 혼합할 수 없습니다.",
"render.cpu_optics_unsupported":"이 CPU 경로는 투과 그림자, 표면하 산란, 코팅 및 맵이 없는 유리를 지원합니다. 작성된 옵션을 검토하세요. 옵션은 그대로 보존되었습니다."
},
"ar":{
"render.cpu_optics_boundary":"يتطلب CPU اختيار حد صفيحة رقيقة أو صندوق صراحةً. يجب أن تجتاز الهندسة الملتقطة التحقق.",
"render.cpu_optics_conflict":"لا يمكن لتعيينات البصريات على CPU استبدال تجاوزات العوازل الموجودة.",
"render.cpu_optics_enable":"استخدام هذه البصريات على CPU",
"render.cpu_optics_explicit":"راجع هذا التعيين وفعّل مساره البصري على CPU صراحةً.",
"render.cpu_optics_fixed":"لا يمكن لنموذج النقل المثبت على CPU قبول طلب أخذ العينات البصري هذا.",
"render.cpu_optics_help":"بصريات CPU مؤقتة: أخذ عينات ثابت أو تدريجي، ومظاهر معتمة للجسم والأوجه، وصفائح أو صناديق محاذية للمحاور اجتازت التحقق. الظلال النافذة والتشتت تحت السطحي والطلاءات والخرائط غير مدعومة. تتطلب الصناديق المتداخلة تفعيلًا صريحًا والتحقق. يبقى عمق النقل محدودًا حتى مع التراكم.",
"render.cpu_optics_limit":"يدعم CPU ثمانية تعيينات بصرية للأجسام كحد أقصى.",
"render.cpu_optics_request":"تتطلب بصريات CPU طلب صورة CPU محدد النوع وخياراته الموجودة.",
"render.cpu_optics_saved":"لا يمكن خلط بصريات GPU المحفوظة مع تعيينات بصريات CPU المؤقتة.",
"render.cpu_optics_unsupported":"يدعم مسار CPU هذا الزجاج دون ظلال نافذة أو تشتت تحت سطحي أو طلاءات أو خرائط. راجع الخيارات المحددة؛ فقد تم الاحتفاظ بها."
},
"he":{
"render.cpu_optics_boundary":"CPU דורש בחירה מפורשת בגבול יריעה דקה או תיבה. הגאומטריה שנלכדה חייבת לעבור אימות.",
"render.cpu_optics_conflict":"הקצאות אופטיות של CPU אינן יכולות להחליף דריסות דיאלקטריות קיימות.",
"render.cpu_optics_enable":"שימוש באופטיקה זו ב-CPU",
"render.cpu_optics_explicit":"יש לבדוק הקצאה זו ולהפעיל במפורש את הנתיב האופטי שלה ב-CPU.",
"render.cpu_optics_fixed":"מודל התעבורה המותקן ב-CPU אינו יכול לאשר בקשת דגימה אופטית זו.",
"render.cpu_optics_help":"אופטיקה זמנית ב-CPU: דגימה קבועה או הדרגתית, מראה אטום של הגוף והפאות, יריעות או תיבות מיושרות לצירים שעברו אימות. צללים מועברים, פיזור תת-משטחי, ציפויים ומפות אינם נתמכים. תיבות מקוננות דורשות הפעלה מפורשת ואימות. הצבירה שומרת על מגבלת עומק התעבורה הסופית.",
"render.cpu_optics_limit":"CPU תומך בעד שמונה הקצאות אופטיות לגופים.",
"render.cpu_optics_request":"אופטיקת CPU דורשת בקשת תמונת CPU מטיפוס מוגדר ואת האפשרויות הקיימות שלה.",
"render.cpu_optics_saved":"לא ניתן לערבב אופטיקת GPU שמורה עם הקצאות אופטיות זמניות של CPU.",
"render.cpu_optics_unsupported":"נתיב CPU זה תומך בזכוכית ללא צללים מועברים, פיזור תת-משטחי, ציפויים או מפות. יש לבדוק את האפשרויות שנקבעו; הן נשמרו ללא שינוי."
"render.cpu_optics_fixed":"インストール済みの CPU 光輸送では、この光学サンプリング要求を受け付けられません。",
"render.cpu_optics_help":"一時的な CPU 光学設定:固定またはプログレッシブサンプリング、不透明なボディと面の外観、認証済みの薄板または軸に平行なボックス。透過シャドウ、表面下散乱、コート、マップは非対応です。入れ子のボックスには明示的な有効化と認証が必要です。累積しても光輸送の有限深度制限は残ります。",
"render.cpu_optics_request":"CPU 光学設定には型付きの CPU 画像リクエストと既存のオプションが必要です。",
"render.cpu_optics_saved":"保存済み GPU 光学設定と一時的な CPU 光学割り当ては混在できません。",
"render.cpu_optics_unsupported":"この CPU 経路は透過シャドウ、表面下散乱、コート、マップのないガラスに対応します。設定したオプションを確認してください。内容は保持されています。"
},
"vi":{
"render.cpu_optics_boundary":"CPU yêu cầu chọn rõ ràng biên Tấm mỏng hoặc Hộp. Hình học đã chụp phải vượt qua kiểm chứng.",
"render.cpu_optics_conflict":"Các gán quang học CPU không thể thay thế các ghi đè điện môi hiện có.",
"render.cpu_optics_enable":"Dùng quang học này trên CPU",
"render.cpu_optics_explicit":"Hãy xem lại phép gán này và bật rõ ràng tuyến quang học CPU của nó.",
"render.cpu_optics_fixed":"Mô hình truyền ánh sáng CPU đã cài không thể chấp nhận yêu cầu lấy mẫu quang học này.",
"render.cpu_optics_help":"Quang học CPU tạm thời: lấy mẫu cố định hoặc lũy tiến, diện mạo thân và mặt đục, tấm hoặc hộp song song các trục đã được kiểm chứng. Không hỗ trợ bóng truyền qua, tán xạ dưới bề mặt, lớp phủ và bản đồ. Hộp lồng nhau cần được bật rõ ràng và kiểm chứng. Tích lũy vẫn giữ giới hạn độ sâu hữu hạn của truyền ánh sáng.",
"render.cpu_optics_limit":"CPU hỗ trợ tối đa tám phép gán quang học cho thân.",
"render.cpu_optics_request":"Quang học CPU yêu cầu yêu cầu ảnh CPU có kiểu cùng các tùy chọn hiện có.",
"render.cpu_optics_saved":"Không thể trộn quang học GPU đã lưu với các gán quang học CPU tạm thời.",
"render.cpu_optics_unsupported":"Tuyến CPU này hỗ trợ kính không có bóng truyền qua, tán xạ dưới bề mặt, lớp phủ hoặc bản đồ. Hãy xem lại các tùy chọn đã soạn; chúng đã được giữ nguyên."
"render.preview_environment_fixed":"تتطلب معاينة النموذج دوران بيئة بقيمة 0 وشدة بقيمة 1.",
"render.raster_exposure_help":"يضبط تعريض التصيير النقطي من −32 إلى 32 EV بعد التظليل. يحافظ الصفر على الاستجابة الحالية، دون تغيير الأضواء أو المواد.",
"render.raster_exposure_invalid":"يجب أن يكون تعريض التصيير النقطي قيمة محدودة بين −32 و32 EV."
},
"de":{
"render.preview_environment_fixed":"Die Modellvorschau benötigt eine Umgebungsdrehung von 0 und eine Intensität von 1.",
"render.raster_exposure_help":"Passt die Rasterbelichtung nach der Schattierung von −32 bis 32 EV an. Null erhält die bisherige Darstellung; Licht und Materialien bleiben unverändert.",
"render.raster_exposure_invalid":"Die Rasterbelichtung muss endlich sein und zwischen −32 und 32 EV liegen."
},
"en":{
"render.preview_environment_fixed":"Model Preview requires environment rotation 0 and intensity 1.",
"render.raster_exposure_help":"Adjusts Raster exposure from −32 to 32 EV after shading. Zero preserves the current response; lights and materials stay unchanged.",
"render.raster_exposure_invalid":"Raster exposure must be finite and between −32 and 32 EV."
},
"es":{
"render.preview_environment_fixed":"La vista previa del modelo requiere una rotación del entorno de 0 y una intensidad de 1.",
"render.raster_exposure_help":"Ajusta la exposición Raster de −32 a 32 EV después del sombreado. Cero conserva la respuesta actual; no cambia luces ni materiales.",
"render.raster_exposure_invalid":"La exposición Raster debe ser finita y estar entre −32 y 32 EV."
},
"he":{
"render.preview_environment_fixed":"תצוגת המודל המקדימה מחייבת סיבוב סביבה של 0 ועוצמה של 1.",
"render.raster_exposure_help":"התאמת חשיפת רסטר בין −32 ל־32 EV לאחר ההצללה. אפס שומר על התוצאה הנוכחית; התאורה והחומרים אינם משתנים.",
"render.raster_exposure_invalid":"חשיפת הרסטר חייבת להיות סופית ובטווח שבין −32 ל־32 EV."
"render.raster_exposure_help":"シェーディング後のラスター露出を −32~32 EV で調整します。0 は現在の表示を維持し、ライトやマテリアルは変更しません。",
"render.raster_exposure_invalid":"ラスター露出は −32~32 EV の有限値にしてください。"
},
"ko":{
"render.preview_environment_fixed":"모델 미리보기에서는 환경 회전이 0이고 강도가 1이어야 합니다.",
"render.raster_exposure_help":"셰이딩 후 래스터 노출을 −32~32 EV로 조정합니다. 0은 현재 표현을 유지하며 조명과 재질은 변경하지 않습니다.",
"render.raster_exposure_invalid":"래스터 노출은 −32~32 EV 범위의 유한한 값이어야 합니다."
},
"vi":{
"render.preview_environment_fixed":"Xem trước Mô hình yêu cầu góc xoay môi trường là 0 và cường độ là 1.",
"render.raster_exposure_help":"Điều chỉnh phơi sáng Raster từ −32 đến 32 EV sau khi tô bóng. Giá trị 0 giữ cách hiển thị hiện tại; ánh sáng và vật liệu không thay đổi.",
"render.raster_exposure_invalid":"Phơi sáng Raster phải là số hữu hạn trong khoảng −32 đến 32 EV."
"render.glass_library_help":"Prepares the recipe in the existing editor without assigning an appearance or rendering. CPU needs explicit optical permission and a Thin sheet or Box that passes actual certification. Closed-mesh and shadow settings stay unchanged.",
"render.glass_library_method":"Choose CPU or GPU rendering to prepare physical glass. Raster has no physical-glass route.",
"render.glass_library_prepared":"Physical glass recipe prepared for editing; review its boundary and optical settings before rendering."
},
"es":{
"render.glass_library_conflict":"Este cuerpo ya tiene ajustes ópticos. Edítalos o elimínalos antes de preparar otra receta.",
"render.glass_library_help":"Prepara la receta en el editor existente sin asignar un aspecto ni renderizar. CPU necesita permiso óptico explícito y una lámina o caja que supere la certificación real. No cambia los ajustes de malla cerrada ni de sombras.",
"render.glass_library_method":"Elige renderizado CPU o GPU para preparar vidrio físico. Raster no tiene una ruta de vidrio físico.",
"render.glass_library_prepared":"Receta de vidrio físico preparada para editar; revisa su frontera y sus ajustes ópticos antes de renderizar."
},
"de":{
"render.glass_library_conflict":"Dieser Körper hat bereits optische Einstellungen. Bearbeite oder entferne sie, bevor du ein anderes Rezept vorbereitest.",
"render.glass_library_edit":"Physikalisches Glas vorbereiten",
"render.glass_library_help":"Bereitet das Rezept im vorhandenen Editor vor, ohne ein Aussehen zuzuweisen oder zu rendern. CPU benötigt eine ausdrückliche Freigabe der Optik und eine dünne Scheibe oder einen Quader mit tatsächlicher Zertifizierung. Einstellungen für geschlossene Netze und Schatten bleiben unverändert.",
"render.glass_library_method":"Wähle CPU- oder GPU-Rendering, um physikalisches Glas vorzubereiten. Raster unterstützt kein physikalisches Glas.",
"render.glass_library_prepared":"Glasrezept zur Bearbeitung vorbereitet; prüfe vor dem Rendern seine Begrenzung und optischen Einstellungen."
},
"ko":{
"render.glass_library_conflict":"이 바디에는 이미 광학 설정이 있습니다. 다른 레시피를 준비하기 전에 기존 설정을 편집하거나 제거하세요.",
"render.glass_library_edit":"물리 기반 유리 준비",
"render.glass_library_help":"모양을 지정하거나 렌더링하지 않고 기존 편집기에서 레시피를 준비합니다. CPU에는 명시적인 광학 허용과 실제 검증을 통과하는 얇은 판 또는 상자가 필요합니다. 닫힌 메시와 그림자 설정은 변경하지 않습니다.",
"render.glass_library_method":"물리 기반 유리를 준비하려면 CPU 또는 GPU 렌더링을 선택하세요. Raster는 물리 기반 유리를 지원하지 않습니다.",
"render.glass_library_prepared":"편집할 유리 레시피를 준비했습니다. 렌더링 전에 경계와 광학 설정을 검토하세요."
},
"ar":{
"render.glass_library_conflict":"لهذا الجسم إعدادات بصرية بالفعل. عدّلها أو أزلها قبل تجهيز وصفة مختلفة.",
"render.glass_library_edit":"تجهيز زجاج فيزيائي",
"render.glass_library_help":"يجهّز الوصفة في المحرر الحالي دون تعيين مظهر أو تصيير. يتطلب CPU إذنًا بصريًا صريحًا وصفيحة رقيقة أو صندوقًا يجتاز التحقق الفعلي. تبقى إعدادات الشبكة المغلقة والظلال دون تغيير.",
"render.glass_library_method":"اختر التصيير عبر CPU أو GPU لتجهيز زجاج فيزيائي. لا يدعم Raster الزجاج الفيزيائي.",
"render.glass_library_prepared":"جُهّزت وصفة الزجاج للتحرير؛ راجع حدودها وإعداداتها البصرية قبل التصيير."
},
"he":{
"render.glass_library_conflict":"לגוף הזה כבר יש הגדרות אופטיות. יש לערוך או להסיר אותן לפני הכנת מתכון אחר.",
"render.glass_library_help":"מכין את המתכון בעורך הקיים בלי להקצות מראה או לרנדר. CPU דורש אישור אופטי מפורש ולוח דק או תיבה שעוברים אימות בפועל. הגדרות רשת סגורה וצללים אינן משתנות.",
"render.glass_library_method":"יש לבחור רינדור CPU או GPU כדי להכין זכוכית פיזיקלית. Raster אינו תומך בזכוכית פיזיקלית.",
"render.glass_library_prepared":"מתכון הזכוכית הוכן לעריכה; יש לבדוק את הגבול ואת ההגדרות האופטיות לפני הרינדור."
"render.glass_library_conflict":"Thân này đã có thiết lập quang học. Hãy sửa hoặc xóa chúng trước khi chuẩn bị công thức khác.",
"render.glass_library_edit":"Chuẩn bị kính vật lý",
"render.glass_library_help":"Chuẩn bị công thức trong trình chỉnh sửa hiện có mà không gán diện mạo hay kết xuất. CPU cần cho phép quang học rõ ràng và tấm mỏng hoặc hộp vượt qua kiểm chứng thực tế. Không đổi thiết lập lưới kín và bóng đổ.",
"render.glass_library_method":"Chọn kết xuất CPU hoặc GPU để chuẩn bị kính vật lý. Raster không hỗ trợ kính vật lý.",
"render.glass_library_prepared":"Đã chuẩn bị công thức kính để chỉnh sửa; hãy kiểm tra biên và thiết lập quang học trước khi kết xuất."
"help.render.interactive":"Aktivieren Sie die vorläufige CPU-Vorschau zum Bearbeiten manuell. Einstellungen für das finale Rendering und exportierbare Bilder bleiben unverändert.",
"render.interactive_error":"Fehler in der interaktiven Vorschau",
"render.interactive_feedback_milestones_complete":"Für dieses Rendering sind keine weiteren Vorschauaktualisierungen geplant.",
"render.interactive_feedback_policy":"Vorschauaktualisierungen sind pro Rendering begrenzt; die Einstellungen des finalen Bildes bleiben unverändert.",
"render.interactive_feedback_quota_exhausted":"Limit für Vorschauaktualisierungen dieses Renderings erreicht.",
"render.interactive_feedback_usage":"{started}/{limit} Vorschauaktualisierungen für dieses Rendering gestartet.",
"render.interactive_target":"Zielanzahl an Samples erreicht",
"render.interactive_updating":"Wird aktualisiert"
},
"es":{
"cmd.render.interactive":"Render interactivo",
"help.render.interactive":"Activa explícitamente una vista previa provisional por CPU mientras editas. Los ajustes del render final y las imágenes exportables se mantienen intactos.",
"render.interactive_error":"Error en la vista previa interactiva",
"render.interactive_feedback_milestones_complete":"No hay más actualizaciones de vista previa programadas para este renderizado.",
"render.interactive_feedback_policy":"Las actualizaciones de vista previa se limitan por renderizado; los ajustes de la imagen final no cambian.",
"render.interactive_feedback_quota_exhausted":"Se ha alcanzado el límite de actualizaciones de vista previa de este renderizado.",
"render.interactive_feedback_usage":"Se han iniciado {started}/{limit} actualizaciones de vista previa para este renderizado.",
"render.interactive_final_active":"Render final activo",
"help.render.interactive":"Chủ động bật bản xem trước tạm thời bằng CPU khi chỉnh sửa. Thiết lập kết xuất cuối và các ảnh có thể xuất vẫn được giữ nguyên.",
"render.interactive_error":"Lỗi xem trước tương tác",
"render.interactive_feedback_milestones_complete":"Không còn cập nhật xem trước nào được lên lịch cho lần kết xuất này.",
"render.interactive_feedback_policy":"Số lần cập nhật xem trước được giới hạn theo từng lần kết xuất; cài đặt ảnh cuối cùng không thay đổi.",
"render.interactive_feedback_quota_exhausted":"Đã đạt giới hạn cập nhật xem trước cho lần kết xuất này.",
"render.interactive_feedback_usage":"Đã bắt đầu {started}/{limit} cập nhật xem trước cho lần kết xuất này.",
"render.interactive_final_active":"Đang kết xuất ảnh cuối",
"render.interactive_off":"Tắt",
"render.interactive_on":"Bật",
"render.interactive_partial_dimensions":"Hiển thị {display_width} × {display_height} px · Lấy mẫu {source_width} × {source_height} px · Đầu ra {final_width} × {final_height} px",
"render.interactive_partial_exhausted":"Ngân sách tính toán còn lại không đủ cho một ảnh từng phần nữa.",
"render.interactive_partial_samples":"Mẫu/điểm ảnh {min}–{max} · Đã lấy mẫu {known}/{pixels} điểm ảnh nguồn",
"render.interactive_pause":"Tạm dừng",
"render.interactive_paused":"Đã tạm dừng",
"render.interactive_provisional":"Bản xem trước tạm thời",
"render.interactive_refining":"Đang cải thiện bản xem trước",
"render.interactive_requires_cpu":"Xem trước tương tác yêu cầu dò tia bằng CPU.",
"prefs.render_open_result_on_start":"فتح النتيجة عند بدء التصيير",
"prefs.render_open_result_on_start_help":"افتح النتيجة مرة واحدة بعد بدء التصيير بنجاح. عطّل هذا الخيار للاحتفاظ بالعرض المحدد. يمكنك العودة إلى النموذج أثناء التصيير."
},
"de":{
"prefs.render_open_result_on_start":"Ergebnis beim Renderstart öffnen",
"prefs.render_open_result_on_start_help":"Nach erfolgreichem Renderstart einmal das Ergebnis öffnen. Deaktivieren, um die gewählte Ansicht beizubehalten. Während des Renderns können Sie zum Modell zurückkehren."
},
"en":{
"prefs.render_open_result_on_start":"Open Result when rendering starts",
"prefs.render_open_result_on_start_help":"After starting a render successfully, open Result once. Turn off to keep your selected view. You can return to Model while rendering."
},
"es":{
"prefs.render_open_result_on_start":"Abrir Resultado al iniciar el renderizado",
"prefs.render_open_result_on_start_help":"Abre Resultado una vez tras iniciar correctamente el renderizado. Desactiva esta opción para conservar la vista seleccionada. Puedes volver a Modelo durante el renderizado."
},
"he":{
"prefs.render_open_result_on_start":"פתיחת התוצאה עם תחילת הרינדור",
"prefs.render_open_result_on_start_help":"פתיחת התוצאה פעם אחת לאחר התחלת רינדור בהצלחה. יש לבטל אפשרות זו כדי לשמור על התצוגה שנבחרה. אפשר לחזור למודל בזמן הרינדור."
"prefs.render_open_result_on_start":"렌더링 시작 시 결과 열기",
"prefs.render_open_result_on_start_help":"렌더링이 성공적으로 시작되면 결과를 한 번 엽니다. 끄면 선택한 보기가 유지됩니다. 렌더링 중에도 모델로 돌아갈 수 있습니다."
},
"vi":{
"prefs.render_open_result_on_start":"Mở Kết quả khi bắt đầu kết xuất",
"prefs.render_open_result_on_start_help":"Mở Kết quả một lần sau khi bắt đầu kết xuất thành công. Tắt để giữ chế độ xem đã chọn. Bạn có thể quay lại Mô hình trong khi kết xuất."
"ui.part_size_needs_a_part":"Zaznacz wstawioną część znormalizowaną (śrubę, nakrętkę, podkładkę lub kołek), aby zmienić jej rozmiar. Aby powiększyć lub pomniejszyć bryłę, użyj polecenia Skala.",
"ui.part_size_shared":"Przebudowuje część, zastępując wszystkie dodane elementy. Wszystkie wystąpienia tego komponentu zostaną zaktualizowane.",
"ui.part_size_needs_a_part":"Selecione uma peça padrão inserida (um parafuso, uma porca, uma arruela ou um pino) para alterar o tamanho. Para aumentar ou diminuir um corpo, use Escala.",
"ui.part_size_shared":"Reconstrói a peça, substituindo quaisquer recursos adicionados. Todas as ocorrências deste componente são atualizadas.",
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.