Compare commits
188 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 65d288227e | |||
| fedb3bcdb1 | |||
| a51dfc9e1f | |||
| 9aaa8016e5 | |||
| 632ec4157c | |||
| c3ed8b1c07 | |||
| 8301d1c48e | |||
| 2a02eb71ac | |||
| 097b8b7550 | |||
| f120285c96 | |||
| af7ca3a8a2 | |||
| b31fddb98e | |||
| 27ddb725c7 | |||
| 2bf3d4e11f | |||
| 9852a2e758 | |||
| 17bac141c8 | |||
| 4b42ef50c7 | |||
| fdde3f9da9 | |||
| 74ea81519b | |||
| 769dfff1a5 | |||
| 3ef68c708f | |||
| 3ed1829cc7 | |||
| b982ccd8c4 | |||
| 2586b09f5a | |||
| a5f9ff45dd | |||
| 61360c3b0d | |||
| eec6da060f | |||
| f422bb1263 | |||
| 96ce31153c | |||
| a9c3c8bb8a | |||
| a147a7c083 | |||
| 89a11d75c0 | |||
| 84cad43154 | |||
| 5c280b9a94 | |||
| 1a953736ff | |||
| 4106332738 | |||
| 9559ad398a | |||
| bddb52c96a | |||
| a0fd39a7be | |||
| be87303683 | |||
| bd0cc4bb51 | |||
| 4c8ae5d078 | |||
| e33c371e99 | |||
| e104e241a3 | |||
| 3bca787213 | |||
| 21257c39c2 | |||
| ed6e123d54 | |||
| dad28abecf | |||
| d1f5d6e223 | |||
| 1b215b521d | |||
| 36a354e3a7 | |||
| a05a0f1053 | |||
| 60efbe39e3 | |||
| 9e20a373ca | |||
| 2f55a39c9c | |||
| 80fd2fbbf1 | |||
| c3d1ce8237 | |||
| 567bc50723 | |||
| 1a5fcd05d6 | |||
| 3a6153d18f | |||
| d273c45de6 | |||
| da46c660df | |||
| 92d1331978 | |||
| 01bbc0aa9f | |||
| dbbad6d4ee | |||
| 4f69e6540c | |||
| 55608665ef | |||
| 0fb4a3e868 | |||
| 2dc31a30d4 | |||
| 8b68eb7eac | |||
| 96679f3e2b | |||
| 3ba17bb517 | |||
| ae3b36ac88 | |||
| 5367ef4367 | |||
| caa1e6e196 | |||
| 8bd17cea42 | |||
| 4256775274 | |||
| 5962f56f87 | |||
| b6a45b8278 | |||
| 8ae90f9667 | |||
| 17f0d6bc68 | |||
| 8b1a722f06 | |||
| 63d81cc096 | |||
| 46a8f86e80 | |||
| 94279fe059 | |||
| 867df396ea | |||
| 858e5995d6 | |||
| edf57cec29 | |||
| 0c72ad56d2 | |||
| 92d3a2fde5 | |||
| b0048a6104 | |||
| 0db2abbeca | |||
| 9761d75699 | |||
| a06bdf5cfc | |||
| 030187452a | |||
| 198fbeb814 | |||
| 186096cbe6 | |||
| 3b982ca371 | |||
| aaa110218b | |||
| 46f80b769f | |||
| 26ca82735b | |||
| 408d30ea56 | |||
| 75261cd797 | |||
| 6f5d0038ab | |||
| 1814adb06a | |||
| 971b28c982 | |||
| f79cbc216c | |||
| 4dc1828138 | |||
| f843a3f83c | |||
| f0fd5c10b7 | |||
| 981d23d1d2 | |||
| 01648da72d | |||
| 3d3dd27439 | |||
| 6c60f1a9ed | |||
| 33fdcdb3a0 | |||
| 5899e5b6c5 | |||
| e23a5bf243 | |||
| 4b23bb3a03 | |||
| 920398ac53 | |||
| 688124937d | |||
| b49557c294 | |||
| dfd58293a6 | |||
| ba4f7864ff | |||
| b289dc2421 | |||
| 2daf22923c | |||
| 2fdc105d87 | |||
| 95b23f28d6 | |||
| 14b27f323a | |||
| 4ab3a85323 | |||
| c54b711345 | |||
| 84ec512d7a | |||
| 17ece2edc0 | |||
| 63f210b49f | |||
| 9acff62422 | |||
| 915ee8a178 | |||
| ac1768e08b | |||
| e1daf0a8b6 | |||
| 57c3e94df6 | |||
| 5e05d925e0 | |||
| 50313d147f | |||
| c07ab5f8f9 | |||
| 728f753b80 | |||
| f22a026c27 | |||
| 4b37c046e4 | |||
| 54072b7014 | |||
| cb3cabeda1 | |||
| 775e5155bb | |||
| e570c0b4eb | |||
| d9059d8da5 | |||
| 463cea0615 | |||
| 0225e4d2a5 | |||
| fea32f8aac | |||
| 034aa60d47 | |||
| 971b223246 | |||
| 8c861f9f46 | |||
| e04a016e7c | |||
| 93a2922c5e | |||
| ff8b09c225 | |||
| 975a08c992 | |||
| 55587f4ac4 | |||
| e94900933d | |||
| 776541b081 | |||
| 79a843c963 | |||
| 1bcc3602b4 | |||
| 93684a4728 | |||
| 9db39f3d7d | |||
| 29369a0bb5 | |||
| 5a9e771cc9 | |||
| 63cb48a4ee | |||
| 36c732ddb7 | |||
| fdec948abc | |||
| 7803b3968f | |||
| cbac4eab3f | |||
| 08eff4f9dd | |||
| 9b80163421 | |||
| 164554edba | |||
| 453c6bcb14 | |||
| f44ff18ca4 | |||
| 98cd67f029 | |||
| d9d6af51c6 | |||
| 38c710e72e | |||
| 5b5b051e02 | |||
| 686576e368 | |||
| 68e4186080 | |||
| b66ad0a9c9 | |||
| 2eacbc37f4 | |||
| f2f9c6fe27 | |||
| d21e2b1afd |
@@ -280,6 +280,10 @@ jobs:
|
||||
run: cargo xtask licences --check
|
||||
- name: Dependency layers
|
||||
run: cargo xtask layers
|
||||
- name: Universal UI containers
|
||||
run: |
|
||||
cargo xtask ui-containers
|
||||
cargo test -p xtask ui_containers --locked
|
||||
- name: Sorted lists
|
||||
run: cargo xtask lists
|
||||
- name: Design format pending changes
|
||||
@@ -290,8 +294,8 @@ jobs:
|
||||
run: python3 -I scripts/ci/test_affected.py
|
||||
- name: Merge-of-main detection self-test
|
||||
run: python3 -I scripts/ci/test_main_merge.py
|
||||
- name: Claim and triage bot tests
|
||||
run: node --test scripts/claim/*.test.js scripts/triage/*.test.js
|
||||
- name: Claim, triage and kernel-paused bot tests
|
||||
run: node --test scripts/claim/*.test.js scripts/triage/*.test.js scripts/kernel-paused/*.test.js
|
||||
|
||||
# Fast feedback for a pull request that has not been approved for the full CI yet.
|
||||
quick-compile:
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
# While a new geometry kernel is evaluated, new issues, pull requests and discussions about kernel
|
||||
# work are labelled `kernel-paused` for a maintainer to answer (CONTRIBUTING.md, "Kernel work is
|
||||
# paused"). The logic is in scripts/kernel-paused/ (tested in ci.yml).
|
||||
name: Kernel paused
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
# pull_request_target so PRs from forks can be labelled. It runs the base branch's
|
||||
# scripts/kernel-paused and only lists the PR's changed paths; the PR's code is never checked out.
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
discussion:
|
||||
types: [created]
|
||||
|
||||
permissions:
|
||||
contents: read # to check out scripts/kernel-paused
|
||||
issues: write
|
||||
pull-requests: read # to list a PR's changed paths
|
||||
discussions: write
|
||||
|
||||
concurrency:
|
||||
group: kernel-paused-${{ github.event.issue.number || github.event.pull_request.number || github.event.discussion.number }}
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
paused:
|
||||
name: Kernel paused bot
|
||||
runs-on: ubuntu-24.04
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||
with:
|
||||
sparse-checkout: scripts/kernel-paused
|
||||
- uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||
with:
|
||||
script: |
|
||||
const paused = require('./scripts/kernel-paused/kernel-paused.js');
|
||||
const done = context.eventName === 'discussion'
|
||||
? await paused.handleDiscussion({ github, context })
|
||||
: await paused.handleOpened({ github, context });
|
||||
core.info(done);
|
||||
@@ -203,6 +203,8 @@ jobs:
|
||||
name: Snap ${{ matrix.arch }}
|
||||
needs: [version, linux]
|
||||
if: needs.version.outputs.build == 'true'
|
||||
# The Snap Store hasn't accepted SolidCraft yet, so a snap failure never holds up a release.
|
||||
continue-on-error: true
|
||||
# Repackages the Linux job's tarball, like the Flatpak. On 24.04 because the core24 base is
|
||||
# Ubuntu 24.04, which lets snapcraft build on the runner itself (--destructive-mode).
|
||||
runs-on: ${{ matrix.runner }}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
/.claude/worktrees/
|
||||
/target-snapshot
|
||||
__pycache__/
|
||||
.vscode/
|
||||
|
||||
# cargo-mutants output (docs/mutation-testing.md)
|
||||
mutants.out*/
|
||||
|
||||
@@ -33,9 +33,11 @@ People trust SolidCraft with their designs; a crash loses their work. **This out
|
||||
and calls through its function pointers), two functions in
|
||||
`apps/solidcraft/src/open_documents.rs` (macOS hands Finder files only to an Objective-C
|
||||
method), the Windows-only `apps/solidcraft/src/native_crash.rs` (the exception filter that
|
||||
records crashes inside native code such as graphics drivers) and the Windows-only
|
||||
records crashes inside native code such as graphics drivers), the Windows-only
|
||||
`apps/solidcraft/src/native_frame.rs` (the window procedure that answers the resize-border hit
|
||||
test of the window without OS decorations).
|
||||
test of the window without OS decorations) and the Windows-only
|
||||
`apps/solidcraft/src/space_mouse/windows_hid.rs` (asks Plug and Play which HID interfaces are 3D
|
||||
mice, so no other device is sent anything).
|
||||
- **Errors are `Result<T, E>`** through the crate's error type and `?`. An unfinished feature
|
||||
returns an error ("not supported yet: …"); it never panics.
|
||||
- **Input-derived numbers are hostile** (command parameters, design files, control-channel
|
||||
@@ -88,6 +90,14 @@ People trust SolidCraft with their designs; a crash loses their work. **This out
|
||||
egui/eframe/winit/wgpu/rfd. **The UI crate is swappable.** Only `crates/kernel` may use `truck`.
|
||||
- **The UI is thin**: panels read engine state and act through `app.run(id, params)` /
|
||||
`app.start(id)`. Colours come from `theme::Tokens`.
|
||||
- **One outer UI container**: all panels, floating sheets, menus, overlays and platform UI
|
||||
windows use `ui_kit::Container` (directly or through `Panel`, `Window`, `Confirm`, `Menu`).
|
||||
Declare the semantic `Surface`; workspace panels use its shared layout policy and chrome.
|
||||
System/report windows use `ui_kit::Window`; its low-level host builder is kit-private.
|
||||
Do not construct raw egui hosts, outer popup/window frames or shadows in feature modules.
|
||||
`cargo xtask ui-containers` recursively checks source/examples in all current and future crates
|
||||
and apps. It runs in the fast repository CI job and `cargo xtask ci`, with no caller allowances.
|
||||
See `docs/ui-container-audit.md` for the inventory and legitimate content/native exceptions.
|
||||
- **One set of camera controls**: every page or canvas with a camera (viewport, Render
|
||||
preview, future flat pattern or drawing pages) calls `navigation::handle` with its `NavCaps`
|
||||
(orbit off for flat 2D pages). New canvases must use `navigation::handle`; never hand-roll
|
||||
|
||||
@@ -14,6 +14,7 @@ Editable drawing code, native projects and shipped exports are collected under `
|
||||
|
||||
| File | Author | Source | Licence |
|
||||
|---|---|---|---|
|
||||
| examples/chebyshev-motion-trace.json | SolidCraft contributors | Original parametric Chebyshev lambda mechanism and associative-trace demo, constructed from analytic circle intersections; classical link proportions documented at https://doi.org/10.1002/rcs.70095; no external CAD geometry or artwork | MIT OR Apache-2.0 |
|
||||
| examples/render-studio.json | SolidCraft contributors | original procedural box/cylinder enclosure script for the integrated Render workspace | MIT OR Apache-2.0 |
|
||||
| examples/render-opaque-studio.json | SolidCraft contributors | original procedural sphere study varying opaque metal fraction and roughness independently; no external assets or engineering data | MIT OR Apache-2.0 |
|
||||
| crates/gpu/src/pbr.rs | SolidCraft contributors | original WGSL translation of SolidCraft's opaque surface and fixed studio reference, embedded as Rust source; no external shader code | MIT OR Apache-2.0 |
|
||||
@@ -107,7 +108,7 @@ Editable drawing code, native projects and shipped exports are collected under `
|
||||
| assets/icons/app/linux/exports/hicolor/48x48/apps/ai.storyteller.solidcraft.png | SolidCraft contributors | Generated from assets/icons/app/shared/source/app_icon.rs with the original CLI/ICO encoders | MIT OR Apache-2.0 |
|
||||
| assets/icons/app/linux/exports/hicolor/512x512/apps/ai.storyteller.solidcraft.png | SolidCraft contributors | Generated from assets/icons/app/shared/source/app_icon.rs with the original CLI/ICO encoders | MIT OR Apache-2.0 |
|
||||
| assets/icons/app/linux/exports/hicolor/64x64/apps/ai.storyteller.solidcraft.png | SolidCraft contributors | Generated from assets/icons/app/shared/source/app_icon.rs with the original CLI/ICO encoders | MIT OR Apache-2.0 |
|
||||
| assets/icons/app/shared/source/app_icon.rs | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 |
|
||||
| assets/icons/app/shared/source/app_icon.rs | SolidCraft contributors | Original SolidCraft drawing code: the borderless mark, drawn from the faces and gradients of assets/icons/app/macos/source/SolidCraft.icon/Assets/03-solid-blue-cutout.svg | MIT OR Apache-2.0 |
|
||||
| assets/icons/app/shared/source/windows_ico.rs | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 |
|
||||
| assets/icons/app/windows/exports/solidcraft-executable.ico | SolidCraft contributors | Generated from assets/icons/app/shared/source/app_icon.rs with the original CLI/ICO encoders | MIT OR Apache-2.0 |
|
||||
| assets/icons/app/windows/exports/solidcraft.ico | SolidCraft contributors | Generated from assets/icons/app/shared/source/app_icon.rs with the original CLI/ICO encoders | MIT OR Apache-2.0 |
|
||||
@@ -156,6 +157,20 @@ Editable drawing code, native projects and shipped exports are collected under `
|
||||
| assets/styles/ui/themes/gruvbox-light.json | SolidCraft contributors | original SolidCraft theme file mapping SolidCraft's UI colours to the Gruvbox palette's colour values (Gruvbox by Pavel Pertsev, https://github.com/morhetz/gruvbox, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/gruvbox-light-hard.json | SolidCraft contributors | original SolidCraft theme file mapping SolidCraft's UI colours to the Gruvbox palette's colour values (Gruvbox by Pavel Pertsev, https://github.com/morhetz/gruvbox, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/gruvbox-light-soft.json | SolidCraft contributors | original SolidCraft theme file mapping SolidCraft's UI colours to the Gruvbox palette's colour values (Gruvbox by Pavel Pertsev, https://github.com/morhetz/gruvbox, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/solidcraft-95.json | SolidCraft contributors | original SolidCraft theme file | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/platinum-9.json | SolidCraft contributors | original SolidCraft theme file | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/cupertino.json | SolidCraft contributors | original SolidCraft theme file | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/green-phosphor.json | SolidCraft contributors | original SolidCraft theme file | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/amber-phosphor.json | SolidCraft contributors | original SolidCraft theme file | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/blueprint.json | SolidCraft contributors | original SolidCraft theme file | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/one-dark.json | SolidCraft contributors | original SolidCraft theme file with colours adapted from the One Dark palette (Atom One Dark by GitHub Atom, https://github.com/atom/atom, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/tokyo-night.json | SolidCraft contributors | original SolidCraft theme file adapting the colours of a published palette (Tokyo Night by enkia, https://github.com/enkia/tokyo-night-vscode-theme, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/solarized-light.json | SolidCraft contributors | original SolidCraft theme file adapting the colours of a published palette (Solarized by Ethan Schoonover, https://github.com/altercation/solarized, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/nord.json | SolidCraft contributors | original SolidCraft theme file adapting the colours of a published palette (Nord by Sven Greb and the Nord contributors, https://github.com/nordtheme/nord, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/high-contrast.json | SolidCraft contributors | original SolidCraft theme file | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/graphite.json | SolidCraft contributors | original SolidCraft theme file | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/nosferatu.json | SolidCraft contributors | original SolidCraft theme file adapting the colours of a published palette (Dracula by Zeno Rocha and the Dracula Theme contributors, https://github.com/dracula/dracula-theme, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/ui/themes/catppuccin-mocha.json | SolidCraft contributors | original SolidCraft theme file adapting the colours of a published palette (Catppuccin by the Catppuccin organisation, https://github.com/catppuccin/catppuccin, MIT) | MIT OR Apache-2.0 |
|
||||
| assets/styles/web/loading-logo.svg | SolidCraft contributors | Animation of the SolidCraft mark, built from the paths and gradients of assets/icons/app/macos/source/SolidCraft.icon/Assets/03-solid-blue-cutout.svg; original animation | MIT OR Apache-2.0 |
|
||||
| assets/styles/web/loading.css | SolidCraft contributors | Original SolidCraft resource data or drawing code, collected without redesign | MIT OR Apache-2.0 |
|
||||
| crates/io/src/native_cad/fixtures/block.FCStd | SolidCraft contributors | original 10 × 20 × 30 mm test box saved by FreeCAD 1.1.4 run as an external program (`make_block_fcstd.py` beside it); no third-party geometry | MIT OR Apache-2.0 |
|
||||
@@ -182,6 +197,11 @@ Editable drawing code, native projects and shipped exports are collected under `
|
||||
| assets/icons/ui/design/svg/flat/redo.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/save.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/settings.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/settings_keyboard.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/settings_monitor.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/settings_mouse.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/settings_palette.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/settings_plug.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/spin.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/style.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/undo.svg | SolidCraft contributors | single-colour application/navigation icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
@@ -319,6 +339,10 @@ Editable drawing code, native projects and shipped exports are collected under `
|
||||
| assets/icons/ui/design/svg/model/offset_symmetric.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/import_tray.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/export_tray.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/send.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/stop.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/flat/shield.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/status_recovery.svg | SolidCraft contributors | original icon master (64 grid) | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/placeholder.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/plane.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
| assets/icons/ui/design/svg/model/plane_angle.svg | SolidCraft contributors | two-tone modelling icon master (64 grid), original SolidCraft artwork | MIT OR Apache-2.0 |
|
||||
|
||||
@@ -15,6 +15,15 @@ Before choosing a task, check the [command inventory](docs/features.md) and
|
||||
|
||||
Questions, ideas or want to say what you're working on? Join the [Discord](https://discord.gg/FtU4NQNVDH).
|
||||
|
||||
## Kernel work is paused
|
||||
|
||||
We're evaluating a new geometry kernel. Until that's decided, please don't open issues, pull
|
||||
requests or discussions about kernel work: booleans, fillets, chamfers, shell, offsets, sweeps and
|
||||
lofts, threads and holes, STEP/IGES import and export, tessellation, or anything else that changes
|
||||
`crates/kernel/`. The pinned issue on the tracker explains it. New ones get the `kernel-paused`
|
||||
label (`.github/workflows/kernel-paused.yml`) and a maintainer answers them. Crashes and data loss
|
||||
are still taken as issues, and everything outside the kernel carries on as normal.
|
||||
|
||||
## Get it running (about 10 minutes on a fast machine)
|
||||
|
||||
You need stable Rust 1.95 or newer (required by egui/eframe 0.36). For the web
|
||||
|
||||
@@ -996,6 +996,15 @@ dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-channel"
|
||||
version = "0.5.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.8"
|
||||
@@ -2271,6 +2280,16 @@ dependencies = [
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "keyboard-types"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d"
|
||||
dependencies = [
|
||||
"bitflags 2.13.2",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "keyring"
|
||||
version = "3.6.3"
|
||||
@@ -2480,6 +2499,24 @@ dependencies = [
|
||||
"pxfm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "muda"
|
||||
version = "0.21.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4340e89c178916e62879c5c36b7f699019369be413e496178a6983ce91b8bc03"
|
||||
dependencies = [
|
||||
"crossbeam-channel",
|
||||
"dpi",
|
||||
"keyboard-types",
|
||||
"objc2 0.6.5",
|
||||
"objc2-app-kit 0.3.2",
|
||||
"objc2-core-foundation",
|
||||
"objc2-foundation 0.3.2",
|
||||
"png",
|
||||
"thiserror 2.0.21",
|
||||
"windows-sys 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "multiversion_no_op"
|
||||
version = "1.0.0"
|
||||
@@ -4162,7 +4199,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"block2 0.6.2",
|
||||
"eframe",
|
||||
@@ -4172,6 +4209,7 @@ dependencies = [
|
||||
"hidapi",
|
||||
"keyring",
|
||||
"log",
|
||||
"muda",
|
||||
"objc2 0.6.5",
|
||||
"objc2-app-kit 0.3.2",
|
||||
"objc2-foundation 0.3.2",
|
||||
@@ -4193,13 +4231,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-3dx-client"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-cli"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"image",
|
||||
"log",
|
||||
"serde_json",
|
||||
"solidcraft-engine",
|
||||
"solidcraft-gpu",
|
||||
@@ -4208,7 +4247,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-derive"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -4217,7 +4256,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-doc"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"log",
|
||||
"serde",
|
||||
@@ -4234,7 +4273,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-engine"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"log",
|
||||
"schemars",
|
||||
@@ -4253,7 +4292,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-geom"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -4262,7 +4301,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-gpu"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"log",
|
||||
"naga",
|
||||
@@ -4279,7 +4318,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-io"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"cadmpeg-core",
|
||||
"cadmpeg-ir",
|
||||
@@ -4302,7 +4341,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-kernel"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"log",
|
||||
"proptest",
|
||||
@@ -4322,7 +4361,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-mcp"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"serde_json",
|
||||
"solidcraft-engine",
|
||||
@@ -4331,7 +4370,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-render"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"image",
|
||||
"moxcms",
|
||||
@@ -4345,7 +4384,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-sketch"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -4356,14 +4395,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-space-mouse"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-ui-egui"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"arboard",
|
||||
"egui",
|
||||
@@ -4372,6 +4411,7 @@ dependencies = [
|
||||
"log",
|
||||
"minisign-verify",
|
||||
"pollster 0.4.0",
|
||||
"proc-macro2",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@@ -4390,7 +4430,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "solidcraft-web"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"eframe",
|
||||
"egui",
|
||||
@@ -5920,10 +5960,12 @@ checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7"
|
||||
|
||||
[[package]]
|
||||
name = "xtask"
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"serde_json",
|
||||
"sha2 0.10.9",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
@@ -5,7 +5,7 @@ members = ["crates/*", "apps/*", "xtask"]
|
||||
exclude = ["vendor"]
|
||||
|
||||
[workspace.package]
|
||||
version = "0.18.2"
|
||||
version = "0.21.0"
|
||||
edition = "2024"
|
||||
license = "MIT OR Apache-2.0"
|
||||
rust-version = "1.95"
|
||||
|
||||
@@ -55,7 +55,7 @@ PCB / Package, Render, Animation, Simulation, Manufacture/CAM, Drawings.
|
||||
| M3 | General fillets and chamfers (curved edges, chains, vertex blends); saddle rolling-ball surfaces now use continuous seam sections and arc-length fitting with shared contact boundaries and bounded accuracy checks; tiny rim edges remain selected instead of nearby wall seams when filleting (#2498) | in progress | 30 |
|
||||
| M4 | Files: STEP import (done — [docs/step-import.md](docs/step-import.md)), FreeCAD/Rhino solids through cadmpeg (done, desktop and CLI), 3MF export and 3MF/STL import as mesh bodies (done), 3MF with B-rep face tags ([docs/formats/3mf-face-tags.md](docs/formats/3mf-face-tags.md), done), constant-section parametric mesh reconstruction, DXF sketches, OBJ import | in progress | 6 |
|
||||
| M5 | Persistent naming of faces and edges (docs/book/src/dev/naming.md): faces named from their exact kernel-reported history (sketch curve sides, caps, revolve sections, primitive sides, blends, shell inner walls, pattern/mirror copies; split pieces told apart by the faces around them, lumps of a cut body named after their faces), edges by their faces; fillets/chamfers, sketches on faces, shell/draft/offset/replace faces, hole placements, joint origins and face appearances resolve by name first and warn when the entity split or vanished: done. sheet metal edges by base sketch line and flange side, shell inner faces, sweep and loft roles: done. kernel-reported face history: done (merged faces answer to every name; operations without history yet fall back to geometric names, flagged unverified; format 14 keeps older designs' geometric names). Left: history through sheet metal, plastic, surface and emboss features; FaceSource certificates through history | in progress | 20 |
|
||||
| M6 | UI depth: selection feedback and origin (done), timeline editing (done: hover and selection highlight modifier faces, including fillets and chamfers; edit feature, history marker drag, dependency-checked single and multi-item reorder, suppress, rename, delete with dependents, re-resolved references; redefining selections refreshes persistent edge/face references while retaining feature identity and dimension names; optional compact named left feature history with rollback bar, multi-selection and persistent folders above the parts browser), right-docked dialogs (done), live previews for every feature dialog (done), keyboard-first commands with on-canvas value boxes and sketch inline dimensions (done), drag manipulators with automatic join/cut (done: extrude incl. two sides, fillet, shell, hole depth, move, pattern spacing, revolve rotator, extrude taper), dark theme (done), right-click menu with Repeat (done), measure tool (done), section analysis (done), selection filter (done), drag-solve of sketch points (done); appearance controls now preserve body/face/component targeting, named transparent looks, reuse/search and override removal; preferences | in progress | 6 |
|
||||
| M6 | UI depth: selection feedback and origin (done), timeline editing (done: hover and selection highlight modifier faces, including fillets and chamfers; edit feature, history marker drag, dependency-checked single and multi-item reorder, suppress, rename, delete with dependents, re-resolved references; redefining selections refreshes persistent edge/face references while retaining feature identity and dimension names; responsive feature history with width-driven icons/names/title, snapping width resize, bottom/left/browser-stack docking, shared-column collapse, rollback bar, multi-selection and persistent folders), right-docked dialogs (done), live previews for every feature dialog (done), keyboard-first commands with on-canvas value boxes and sketch inline dimensions (done), drag manipulators with automatic join/cut (done: extrude incl. two sides, fillet, shell, hole depth, move, pattern spacing, revolve rotator, extrude taper), dark theme (done), right-click menu with Repeat (done), measure tool (done), section analysis (done), selection filter (done), drag-solve of sketch points (done); appearance controls now preserve body/face/component targeting, named transparent looks, reuse/search and override removal; preferences | in progress | 6 |
|
||||
| M7 | Thin extrude (walls along open or closed curves: centre, inside, outside or two sides; mitred corners, crossing walls joined; #721), sweep, loft (incl. to a point), rib and web (to next / depth), emboss (planar faces and exact radial emboss/deboss of bounded orthogonal profiles on complete exterior cylinders/sleeves), thread (cosmetic, and modelled M3–M20 outside and inside: the ISO profile screwed in as a faceted cut), coil (smooth B-spline helical walls), pipe, pattern on path, patterns of bodies and components, replace face (parallel), align, remove, feature copy/paste: done. Unique eligible cylindrical targets are inferred for new Emboss features. Left: general curved-face emboss and exact (unfaceted) modelled threads | in progress | 12 |
|
||||
| M8 | Surface workspace (#772). Done: Patch (sketch regions; edge loops filled G0, plus `crown`), Stitch, Thicken (planes and cylinders), Extend (straight edges of planar surfaces), Trim (by a plane, a face or sketch curves swept onto the surface, keeping a side or the picked regions; mutual trim of two surfaces, extended to meet and stitched, #767), Delete Face (healing), Boundary Fill, zebra/draft/curvature-map analysis, Surface Extrude/Revolve/Sweep/Loft from open and closed curves, Offset, Unstitch and Reverse Normal; the continuity-driven core (`kernel/src/bridge.rs`, G0–G3 Hermite rows) with **Blend** (`surface.blend`, #764: edge chains along one or several faces, closed rims paired seam to seam or from picked seams, a dialog), **Match** (`surface.match`), **Boundary** (`surface.boundary`, #763 — two sketch curves exact with G0–G3, three or four as the flat patch of their loop, and curve networks: Coons and Gordon surfaces through sketch, 3D-sketch or edge curves, a point for a three-sided side, G1/G2 against the faces along one direction's edges, joined into their body on request; G1/G2 on two sides that meet at a corner waits for the Gregory-type corner), **Fair** (`surface.fair`, CV fairing), **continuity analysis** (`inspect.continuity`, #770; a toolbar tool with edge markers and a legend, and curvature combs along face isocurves) and a multi-section **loft** with per-end continuity and crown, and guide rails on solid and surface lofts (one or two, scaling or stretching the sections between; #201). Also in the Class-A pass: G1…G4 blend curves in the sketch, chord and variable-radius fillets on curved edges (with honest refusals where the fit cannot hold), and a G2 corner patch where filleted edges meet (kernel; the command refuses until the patch's sections can be sewn to the blends' contacts). Left: bias/form-factor fillet sections (design recorded), a Gregory-type corner, surface Fillet between separate surface bodies (#769), Ruled (#762), Untrim (#761), curved-face Extend (#760), and every remaining #757–#772 item | deferred | — |
|
||||
| M9 | Components and assemblies: New Component / Create Components from Bodies, active component, per-component origin/bodies/sketches/timeline entries, occurrences with transforms, Copy/Paste vs Paste New, nested Browser tree with visibility and isolate; Ground, Move/Copy of occurrences, joints (rigid, revolute, slider, cylindrical, pin-slot, planar, ball) by joint origins with limits and Drive Joints, closed kinematic loops (four-bar, slider-crank: the loop's other joints follow the driven one on its branch, and driving stops where a loop can no longer close), cams (`joint.cam`: a revolute cam drives a slider or revolute follower along a closed sketch profile or the cam's edges, knife, roller or flat followers, worked out again when the profile changes; drives, studies, closed loops, contact sets), As-built Joint, Rigid Group, Contact Sets (driving and motion studies stop where bodies in a set would pass through each other), Motion Study (joint values keyed along a timeline, playback, export of occurrence positions as JSON/CSV), motion analysis (joint values and a point's path charted over a study as value, velocity and acceleration; the parts that collide along a study, with the steps where they do), Exploded views (automatic or by hand, shown without changing placements); interference, per-component physical properties; STEP with assembly structure; URDF export for robot simulators (links with meshes, mass and inertia; joint chains whose values match Drive Joints; docs/urdf.md). Physical properties now measure material-aware component/occurrence placements, descendants and repeated instances, including pending moves and body reassignment offsets; contact geometry and automatic exploded centres respect those offsets. Groundwork done: component tree, occurrences with transforms (instances, Paste New), world placement, active component as authoring frame, ground, Capture/Revert Position, moving bodies and sketches. UI: ASSEMBLE panel dialogs for New Component, Joint (snaps on faces, edges, circles and vertices; animated motion preview; offsets, flip, limits), As-built Joint, Joint Origin, Rigid Group, Drive Joints (live slider), Motion Link, Cam and Interference (overlaps shown red); joints in the timeline and the Browser | in progress | 32 |
|
||||
@@ -70,7 +70,12 @@ pointer movement orbits without a mouse button, and vertical scrolling zooms. Ot
|
||||
retain their saved two-finger scroll preference; camera motion is available through
|
||||
`view.navigate` and modifier-aware `ui.move` automation.
|
||||
|
||||
M11 precursor: File → Export Current View as DXF exports shown placed bodies from the current
|
||||
UI redesign (#2016): the File/start view (#2027) uses shared light/dark navigation,
|
||||
action tiles, recent rows and sample cards, with recovery review and Save As/Export
|
||||
entry points. Document loading, sample caches and recovery safety retain their
|
||||
existing command paths.
|
||||
|
||||
M11 precursor: File → Export Current View as DXF exports shown placed bodies and sketches from the current
|
||||
camera as a 2D millimetre drawing, with hidden edges omitted or dashed. Vector occlusion splits
|
||||
partly hidden edges and includes curved silhouettes. Repeated part meshes and triangle
|
||||
hierarchies are shared; bounded desktop preparation and occlusion use up to eight workers.
|
||||
@@ -329,8 +334,25 @@ completed drawings publish atomically. The browser still exports synchronously.
|
||||
- Saved projections from a removed strip retain their geometry and report the lost
|
||||
reference. Explicitly reselect the wall to repair that projection.
|
||||
|
||||
## Workspace layouts (#2029)
|
||||
|
||||
- General preferences save Floating or Compact using the universal UI containers.
|
||||
Compact joins the workspace selector and ribbon, docks the content-hugging Browser
|
||||
flush beneath them with a square join, and opens tool sheets below the compass.
|
||||
Sheets remain draggable, rounding all corners away from their right dock; footer
|
||||
backgrounds follow the same corners. A separate preference hides ribbon icon labels
|
||||
for a shorter ribbon in either layout.
|
||||
Assistant keeps the outermost edge and History keeps its chosen dock. Switching
|
||||
retains the active tool, camera, selection and design; system windows and menus
|
||||
keep their existing behavior.
|
||||
|
||||
## View navigation
|
||||
|
||||
- Navigation has an opt-in Free orbit preference for mouse and 3D-mouse rotation through
|
||||
both poles with roll. It defaults off, preserving existing preset snapping and pole limits.
|
||||
The SolidWorks face menu offers Normal to Selection (`view.normal_to`), shared with Look At
|
||||
and Ctrl+8, including repeat-to-flip, preserving scale and projection.
|
||||
|
||||
- Desktop Ctrl/Cmd +/- and 0 change or reset the saved UI scale. The scale slider keeps
|
||||
its layout stable during a drag and applies the selected scale on release.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Third-party software in SolidCraft
|
||||
|
||||
SolidCraft (the desktop app, solidcraft-cli and the web app) is built from the 560 crates below.
|
||||
SolidCraft (the desktop app, solidcraft-cli and the web app) is built from the 563 crates below.
|
||||
Generated by `cargo xtask licences` from Cargo.lock and the crates' own licence files.
|
||||
SolidCraft's own licence is in LICENSE-MIT and LICENSE-APACHE, and NOTICE.
|
||||
|
||||
@@ -95,6 +95,7 @@ core_detect 1.0.0 (MIT/Apache-2.0)
|
||||
cpufeatures 0.2.17 (MIT OR Apache-2.0)
|
||||
cpufeatures 0.3.1 (MIT OR Apache-2.0)
|
||||
crc32fast 1.5.2 (MIT OR Apache-2.0)
|
||||
crossbeam-channel 0.5.17 (MIT OR Apache-2.0)
|
||||
crossbeam-deque 0.8.8 (MIT OR Apache-2.0)
|
||||
crossbeam-epoch 0.9.21 (MIT OR Apache-2.0)
|
||||
crossbeam-utils 0.8.23 (MIT OR Apache-2.0)
|
||||
@@ -210,6 +211,7 @@ jni-sys 0.4.1 (MIT OR Apache-2.0)
|
||||
jni-sys-macros 0.4.1 (MIT OR Apache-2.0)
|
||||
js-sys 0.3.106 (MIT OR Apache-2.0)
|
||||
katexit 0.1.5 (MIT OR Apache-2.0)
|
||||
keyboard-types 0.8.3 (MIT OR Apache-2.0)
|
||||
keyring 3.6.3 (MIT OR Apache-2.0)
|
||||
khronos-egl 6.0.0 (MIT/Apache-2.0)
|
||||
kurbo 0.13.1 (Apache-2.0 OR MIT)
|
||||
@@ -234,6 +236,7 @@ minisign-verify 0.3.0 (MIT)
|
||||
miniz_oxide 0.8.9 (MIT OR Zlib OR Apache-2.0)
|
||||
miniz_oxide 0.9.1 (MIT OR Zlib OR Apache-2.0)
|
||||
moxcms 0.8.1 (BSD-3-Clause OR Apache-2.0)
|
||||
muda 0.21.2 (Apache-2.0 OR MIT)
|
||||
multiversion_no_op 1.0.0 (Apache-2.0 OR MIT)
|
||||
naga 30.0.1 (MIT OR Apache-2.0)
|
||||
naga-types 30.0.1 (MIT OR Apache-2.0)
|
||||
@@ -1108,26 +1111,27 @@ ahash 0.8.12, arrayvec 0.7.8, async-channel 2.5.0, async-executor 1.14.0, async-
|
||||
4.7.1, atomic-waker 1.1.2, base64 0.23.1, bitflags 1.3.2, bitflags 2.13.2, blocking 1.7.0, bumpalo
|
||||
3.20.3, cfg-if 1.0.5, cgl 0.3.2, concurrent-queue 2.5.0, core-foundation 0.10.1, core-foundation
|
||||
0.9.4, core-foundation-sys 0.8.7, core-graphics 0.23.2, core-graphics-types 0.1.3, core_detect
|
||||
1.0.0, crossbeam-deque 0.8.8, crossbeam-epoch 0.9.21, crossbeam-utils 0.8.23, dbus-secret-service
|
||||
4.1.0, displaydoc 0.2.7, either 1.19.0, equivalent 1.0.2, errno 0.3.14, euclid 0.22.14,
|
||||
event-listener 5.4.2, event-listener-strategy 0.5.4, fastrand 2.5.0, flate2 1.1.10, form_urlencoded
|
||||
1.2.2, futures-lite 2.6.1, gethostname 1.1.0, gif 0.14.2, glow 0.17.0, gltf 1.4.1, gltf-derive
|
||||
1.4.1, gltf-json 1.4.1, hashbrown 0.16.1, hashbrown 0.17.1, hermit-abi 0.5.3, httparse 1.10.1, idna
|
||||
1.1.0, idna_adapter 1.2.2, indexmap 2.14.2, itertools 0.13.0, itertools 0.15.0, js-sys 0.3.106,
|
||||
khronos-egl 6.0.0, lazy_static 1.5.1, linux-raw-sys 0.12.1, linux-raw-sys 0.4.15, lock_api 0.4.14,
|
||||
log 0.4.34, num 0.4.3, num-bigint 0.4.8, num-complex 0.4.6, num-integer 0.1.47, num-iter 0.1.46,
|
||||
num-rational 0.4.2, num-traits 0.2.19, once_cell 1.21.4, openssl-probe 0.2.1, ordered-stream 0.2.0,
|
||||
parking 2.2.1, parking_lot 0.12.5, parking_lot_core 0.9.12, percent-encoding 2.3.2, piper 0.2.5,
|
||||
plain 0.2.3, png 0.18.1, polling 3.11.0, pollster 0.4.0, pollster 1.0.1, rayon 1.12.0, rayon-core
|
||||
1.13.0, renderdoc-sys 1.1.0, robust 1.2.0, ron 0.12.2, roxmltree 0.21.1, rustc-hash 1.1.0, rustix
|
||||
0.38.44, rustix 1.1.5, rustls 0.23.46, rustls-native-certs 0.8.5, scoped-tls 1.0.1, scopeguard
|
||||
1.2.0, secret-service 4.0.0, security-framework 2.11.1, security-framework 3.7.0,
|
||||
security-framework-sys 2.17.0, signal-hook-registry 1.4.8, simd_cesu8 1.2.0, smallvec 1.16.2,
|
||||
smol_str 0.2.2, stable_deref_trait 1.2.1, syn 1.0.109, tempfile 3.27.0, ttf-parser 0.25.1,
|
||||
unicode-segmentation 1.13.3, unicode-width 0.2.2, url 2.5.8, uuid 1.27.0, wasi
|
||||
0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12, wasm-bindgen 0.2.129, wasm-bindgen-futures
|
||||
0.4.79, wasm-bindgen-macro 0.2.129, wasm-bindgen-macro-support 0.2.129, wasm-bindgen-shared 0.2.129,
|
||||
web-sys 0.3.106, weezl 0.1.12, wit-bindgen 0.57.1
|
||||
1.0.0, crossbeam-channel 0.5.17, crossbeam-deque 0.8.8, crossbeam-epoch 0.9.21, crossbeam-utils
|
||||
0.8.23, dbus-secret-service 4.1.0, displaydoc 0.2.7, either 1.19.0, equivalent 1.0.2, errno 0.3.14,
|
||||
euclid 0.22.14, event-listener 5.4.2, event-listener-strategy 0.5.4, fastrand 2.5.0, flate2 1.1.10,
|
||||
form_urlencoded 1.2.2, futures-lite 2.6.1, gethostname 1.1.0, gif 0.14.2, glow 0.17.0, gltf 1.4.1,
|
||||
gltf-derive 1.4.1, gltf-json 1.4.1, hashbrown 0.16.1, hashbrown 0.17.1, hermit-abi 0.5.3, httparse
|
||||
1.10.1, idna 1.1.0, idna_adapter 1.2.2, indexmap 2.14.2, itertools 0.13.0, itertools 0.15.0, js-sys
|
||||
0.3.106, keyboard-types 0.8.3, khronos-egl 6.0.0, lazy_static 1.5.1, linux-raw-sys 0.12.1,
|
||||
linux-raw-sys 0.4.15, lock_api 0.4.14, log 0.4.34, muda 0.21.2, num 0.4.3, num-bigint 0.4.8,
|
||||
num-complex 0.4.6, num-integer 0.1.47, num-iter 0.1.46, num-rational 0.4.2, num-traits 0.2.19,
|
||||
once_cell 1.21.4, openssl-probe 0.2.1, ordered-stream 0.2.0, parking 2.2.1, parking_lot 0.12.5,
|
||||
parking_lot_core 0.9.12, percent-encoding 2.3.2, piper 0.2.5, plain 0.2.3, png 0.18.1, polling
|
||||
3.11.0, pollster 0.4.0, pollster 1.0.1, rayon 1.12.0, rayon-core 1.13.0, renderdoc-sys 1.1.0, robust
|
||||
1.2.0, ron 0.12.2, roxmltree 0.21.1, rustc-hash 1.1.0, rustix 0.38.44, rustix 1.1.5, rustls 0.23.46,
|
||||
rustls-native-certs 0.8.5, scoped-tls 1.0.1, scopeguard 1.2.0, secret-service 4.0.0,
|
||||
security-framework 2.11.1, security-framework 3.7.0, security-framework-sys 2.17.0,
|
||||
signal-hook-registry 1.4.8, simd_cesu8 1.2.0, smallvec 1.16.2, smol_str 0.2.2, stable_deref_trait
|
||||
1.2.1, syn 1.0.109, tempfile 3.27.0, ttf-parser 0.25.1, unicode-segmentation 1.13.3, unicode-width
|
||||
0.2.2, url 2.5.8, uuid 1.27.0, wasi 0.11.1+wasi-snapshot-preview1, wasip2 1.0.4+wasi-0.2.12,
|
||||
wasm-bindgen 0.2.129, wasm-bindgen-futures 0.4.79, wasm-bindgen-macro 0.2.129,
|
||||
wasm-bindgen-macro-support 0.2.129, wasm-bindgen-shared 0.2.129, web-sys 0.3.106, weezl 0.1.12,
|
||||
wit-bindgen 0.57.1
|
||||
================================================================================
|
||||
|
||||
Apache License
|
||||
@@ -4030,7 +4034,605 @@ Apache License
|
||||
limitations under the License.
|
||||
|
||||
================================================================================
|
||||
crossbeam-deque 0.8.8, crossbeam-epoch 0.9.21, crossbeam-utils 0.8.23
|
||||
crossbeam-channel 0.5.17
|
||||
================================================================================
|
||||
|
||||
===============================================================================
|
||||
|
||||
matching.go
|
||||
https://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
Creative Commons Legal Code
|
||||
|
||||
Attribution 3.0 Unported
|
||||
|
||||
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
|
||||
LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN
|
||||
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
|
||||
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
|
||||
REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR
|
||||
DAMAGES RESULTING FROM ITS USE.
|
||||
|
||||
License
|
||||
|
||||
THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE
|
||||
COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY
|
||||
COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS
|
||||
AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
|
||||
|
||||
BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE
|
||||
TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY
|
||||
BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS
|
||||
CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND
|
||||
CONDITIONS.
|
||||
|
||||
1. Definitions
|
||||
|
||||
a. "Adaptation" means a work based upon the Work, or upon the Work and
|
||||
other pre-existing works, such as a translation, adaptation,
|
||||
derivative work, arrangement of music or other alterations of a
|
||||
literary or artistic work, or phonogram or performance and includes
|
||||
cinematographic adaptations or any other form in which the Work may be
|
||||
recast, transformed, or adapted including in any form recognizably
|
||||
derived from the original, except that a work that constitutes a
|
||||
Collection will not be considered an Adaptation for the purpose of
|
||||
this License. For the avoidance of doubt, where the Work is a musical
|
||||
work, performance or phonogram, the synchronization of the Work in
|
||||
timed-relation with a moving image ("synching") will be considered an
|
||||
Adaptation for the purpose of this License.
|
||||
b. "Collection" means a collection of literary or artistic works, such as
|
||||
encyclopedias and anthologies, or performances, phonograms or
|
||||
broadcasts, or other works or subject matter other than works listed
|
||||
in Section 1(f) below, which, by reason of the selection and
|
||||
arrangement of their contents, constitute intellectual creations, in
|
||||
which the Work is included in its entirety in unmodified form along
|
||||
with one or more other contributions, each constituting separate and
|
||||
independent works in themselves, which together are assembled into a
|
||||
collective whole. A work that constitutes a Collection will not be
|
||||
considered an Adaptation (as defined above) for the purposes of this
|
||||
License.
|
||||
c. "Distribute" means to make available to the public the original and
|
||||
copies of the Work or Adaptation, as appropriate, through sale or
|
||||
other transfer of ownership.
|
||||
d. "Licensor" means the individual, individuals, entity or entities that
|
||||
offer(s) the Work under the terms of this License.
|
||||
e. "Original Author" means, in the case of a literary or artistic work,
|
||||
the individual, individuals, entity or entities who created the Work
|
||||
or if no individual or entity can be identified, the publisher; and in
|
||||
addition (i) in the case of a performance the actors, singers,
|
||||
musicians, dancers, and other persons who act, sing, deliver, declaim,
|
||||
play in, interpret or otherwise perform literary or artistic works or
|
||||
expressions of folklore; (ii) in the case of a phonogram the producer
|
||||
being the person or legal entity who first fixes the sounds of a
|
||||
performance or other sounds; and, (iii) in the case of broadcasts, the
|
||||
organization that transmits the broadcast.
|
||||
f. "Work" means the literary and/or artistic work offered under the terms
|
||||
of this License including without limitation any production in the
|
||||
literary, scientific and artistic domain, whatever may be the mode or
|
||||
form of its expression including digital form, such as a book,
|
||||
pamphlet and other writing; a lecture, address, sermon or other work
|
||||
of the same nature; a dramatic or dramatico-musical work; a
|
||||
choreographic work or entertainment in dumb show; a musical
|
||||
composition with or without words; a cinematographic work to which are
|
||||
assimilated works expressed by a process analogous to cinematography;
|
||||
a work of drawing, painting, architecture, sculpture, engraving or
|
||||
lithography; a photographic work to which are assimilated works
|
||||
expressed by a process analogous to photography; a work of applied
|
||||
art; an illustration, map, plan, sketch or three-dimensional work
|
||||
relative to geography, topography, architecture or science; a
|
||||
performance; a broadcast; a phonogram; a compilation of data to the
|
||||
extent it is protected as a copyrightable work; or a work performed by
|
||||
a variety or circus performer to the extent it is not otherwise
|
||||
considered a literary or artistic work.
|
||||
g. "You" means an individual or entity exercising rights under this
|
||||
License who has not previously violated the terms of this License with
|
||||
respect to the Work, or who has received express permission from the
|
||||
Licensor to exercise rights under this License despite a previous
|
||||
violation.
|
||||
h. "Publicly Perform" means to perform public recitations of the Work and
|
||||
to communicate to the public those public recitations, by any means or
|
||||
process, including by wire or wireless means or public digital
|
||||
performances; to make available to the public Works in such a way that
|
||||
members of the public may access these Works from a place and at a
|
||||
place individually chosen by them; to perform the Work to the public
|
||||
by any means or process and the communication to the public of the
|
||||
performances of the Work, including by public digital performance; to
|
||||
broadcast and rebroadcast the Work by any means including signs,
|
||||
sounds or images.
|
||||
i. "Reproduce" means to make copies of the Work by any means including
|
||||
without limitation by sound or visual recordings and the right of
|
||||
fixation and reproducing fixations of the Work, including storage of a
|
||||
protected performance or phonogram in digital form or other electronic
|
||||
medium.
|
||||
|
||||
2. Fair Dealing Rights. Nothing in this License is intended to reduce,
|
||||
limit, or restrict any uses free from copyright or rights arising from
|
||||
limitations or exceptions that are provided for in connection with the
|
||||
copyright protection under copyright law or other applicable laws.
|
||||
|
||||
3. License Grant. Subject to the terms and conditions of this License,
|
||||
Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
|
||||
perpetual (for the duration of the applicable copyright) license to
|
||||
exercise the rights in the Work as stated below:
|
||||
|
||||
a. to Reproduce the Work, to incorporate the Work into one or more
|
||||
Collections, and to Reproduce the Work as incorporated in the
|
||||
Collections;
|
||||
b. to create and Reproduce Adaptations provided that any such Adaptation,
|
||||
including any translation in any medium, takes reasonable steps to
|
||||
clearly label, demarcate or otherwise identify that changes were made
|
||||
to the original Work. For example, a translation could be marked "The
|
||||
original work was translated from English to Spanish," or a
|
||||
modification could indicate "The original work has been modified.";
|
||||
c. to Distribute and Publicly Perform the Work including as incorporated
|
||||
in Collections; and,
|
||||
d. to Distribute and Publicly Perform Adaptations.
|
||||
e. For the avoidance of doubt:
|
||||
|
||||
i. Non-waivable Compulsory License Schemes. In those jurisdictions in
|
||||
which the right to collect royalties through any statutory or
|
||||
compulsory licensing scheme cannot be waived, the Licensor
|
||||
reserves the exclusive right to collect such royalties for any
|
||||
exercise by You of the rights granted under this License;
|
||||
ii. Waivable Compulsory License Schemes. In those jurisdictions in
|
||||
which the right to collect royalties through any statutory or
|
||||
compulsory licensing scheme can be waived, the Licensor waives the
|
||||
exclusive right to collect such royalties for any exercise by You
|
||||
of the rights granted under this License; and,
|
||||
iii. Voluntary License Schemes. The Licensor waives the right to
|
||||
collect royalties, whether individually or, in the event that the
|
||||
Licensor is a member of a collecting society that administers
|
||||
voluntary licensing schemes, via that society, from any exercise
|
||||
by You of the rights granted under this License.
|
||||
|
||||
The above rights may be exercised in all media and formats whether now
|
||||
known or hereafter devised. The above rights include the right to make
|
||||
such modifications as are technically necessary to exercise the rights in
|
||||
other media and formats. Subject to Section 8(f), all rights not expressly
|
||||
granted by Licensor are hereby reserved.
|
||||
|
||||
4. Restrictions. The license granted in Section 3 above is expressly made
|
||||
subject to and limited by the following restrictions:
|
||||
|
||||
a. You may Distribute or Publicly Perform the Work only under the terms
|
||||
of this License. You must include a copy of, or the Uniform Resource
|
||||
Identifier (URI) for, this License with every copy of the Work You
|
||||
Distribute or Publicly Perform. You may not offer or impose any terms
|
||||
on the Work that restrict the terms of this License or the ability of
|
||||
the recipient of the Work to exercise the rights granted to that
|
||||
recipient under the terms of the License. You may not sublicense the
|
||||
Work. You must keep intact all notices that refer to this License and
|
||||
to the disclaimer of warranties with every copy of the Work You
|
||||
Distribute or Publicly Perform. When You Distribute or Publicly
|
||||
Perform the Work, You may not impose any effective technological
|
||||
measures on the Work that restrict the ability of a recipient of the
|
||||
Work from You to exercise the rights granted to that recipient under
|
||||
the terms of the License. This Section 4(a) applies to the Work as
|
||||
incorporated in a Collection, but this does not require the Collection
|
||||
apart from the Work itself to be made subject to the terms of this
|
||||
License. If You create a Collection, upon notice from any Licensor You
|
||||
must, to the extent practicable, remove from the Collection any credit
|
||||
as required by Section 4(b), as requested. If You create an
|
||||
Adaptation, upon notice from any Licensor You must, to the extent
|
||||
practicable, remove from the Adaptation any credit as required by
|
||||
Section 4(b), as requested.
|
||||
b. If You Distribute, or Publicly Perform the Work or any Adaptations or
|
||||
Collections, You must, unless a request has been made pursuant to
|
||||
Section 4(a), keep intact all copyright notices for the Work and
|
||||
provide, reasonable to the medium or means You are utilizing: (i) the
|
||||
name of the Original Author (or pseudonym, if applicable) if supplied,
|
||||
and/or if the Original Author and/or Licensor designate another party
|
||||
or parties (e.g., a sponsor institute, publishing entity, journal) for
|
||||
attribution ("Attribution Parties") in Licensor's copyright notice,
|
||||
terms of service or by other reasonable means, the name of such party
|
||||
or parties; (ii) the title of the Work if supplied; (iii) to the
|
||||
extent reasonably practicable, the URI, if any, that Licensor
|
||||
specifies to be associated with the Work, unless such URI does not
|
||||
refer to the copyright notice or licensing information for the Work;
|
||||
and (iv) , consistent with Section 3(b), in the case of an Adaptation,
|
||||
a credit identifying the use of the Work in the Adaptation (e.g.,
|
||||
"French translation of the Work by Original Author," or "Screenplay
|
||||
based on original Work by Original Author"). The credit required by
|
||||
this Section 4 (b) may be implemented in any reasonable manner;
|
||||
provided, however, that in the case of a Adaptation or Collection, at
|
||||
a minimum such credit will appear, if a credit for all contributing
|
||||
authors of the Adaptation or Collection appears, then as part of these
|
||||
credits and in a manner at least as prominent as the credits for the
|
||||
other contributing authors. For the avoidance of doubt, You may only
|
||||
use the credit required by this Section for the purpose of attribution
|
||||
in the manner set out above and, by exercising Your rights under this
|
||||
License, You may not implicitly or explicitly assert or imply any
|
||||
connection with, sponsorship or endorsement by the Original Author,
|
||||
Licensor and/or Attribution Parties, as appropriate, of You or Your
|
||||
use of the Work, without the separate, express prior written
|
||||
permission of the Original Author, Licensor and/or Attribution
|
||||
Parties.
|
||||
c. Except as otherwise agreed in writing by the Licensor or as may be
|
||||
otherwise permitted by applicable law, if You Reproduce, Distribute or
|
||||
Publicly Perform the Work either by itself or as part of any
|
||||
Adaptations or Collections, You must not distort, mutilate, modify or
|
||||
take other derogatory action in relation to the Work which would be
|
||||
prejudicial to the Original Author's honor or reputation. Licensor
|
||||
agrees that in those jurisdictions (e.g. Japan), in which any exercise
|
||||
of the right granted in Section 3(b) of this License (the right to
|
||||
make Adaptations) would be deemed to be a distortion, mutilation,
|
||||
modification or other derogatory action prejudicial to the Original
|
||||
Author's honor and reputation, the Licensor will waive or not assert,
|
||||
as appropriate, this Section, to the fullest extent permitted by the
|
||||
applicable national law, to enable You to reasonably exercise Your
|
||||
right under Section 3(b) of this License (right to make Adaptations)
|
||||
but not otherwise.
|
||||
|
||||
5. Representations, Warranties and Disclaimer
|
||||
|
||||
UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR
|
||||
OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY
|
||||
KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
|
||||
INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF
|
||||
LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS,
|
||||
WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION
|
||||
OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
|
||||
|
||||
6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE
|
||||
LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR
|
||||
ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES
|
||||
ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS
|
||||
BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
7. Termination
|
||||
|
||||
a. This License and the rights granted hereunder will terminate
|
||||
automatically upon any breach by You of the terms of this License.
|
||||
Individuals or entities who have received Adaptations or Collections
|
||||
from You under this License, however, will not have their licenses
|
||||
terminated provided such individuals or entities remain in full
|
||||
compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will
|
||||
survive any termination of this License.
|
||||
b. Subject to the above terms and conditions, the license granted here is
|
||||
perpetual (for the duration of the applicable copyright in the Work).
|
||||
Notwithstanding the above, Licensor reserves the right to release the
|
||||
Work under different license terms or to stop distributing the Work at
|
||||
any time; provided, however that any such election will not serve to
|
||||
withdraw this License (or any other license that has been, or is
|
||||
required to be, granted under the terms of this License), and this
|
||||
License will continue in full force and effect unless terminated as
|
||||
stated above.
|
||||
|
||||
8. Miscellaneous
|
||||
|
||||
a. Each time You Distribute or Publicly Perform the Work or a Collection,
|
||||
the Licensor offers to the recipient a license to the Work on the same
|
||||
terms and conditions as the license granted to You under this License.
|
||||
b. Each time You Distribute or Publicly Perform an Adaptation, Licensor
|
||||
offers to the recipient a license to the original Work on the same
|
||||
terms and conditions as the license granted to You under this License.
|
||||
c. If any provision of this License is invalid or unenforceable under
|
||||
applicable law, it shall not affect the validity or enforceability of
|
||||
the remainder of the terms of this License, and without further action
|
||||
by the parties to this agreement, such provision shall be reformed to
|
||||
the minimum extent necessary to make such provision valid and
|
||||
enforceable.
|
||||
d. No term or provision of this License shall be deemed waived and no
|
||||
breach consented to unless such waiver or consent shall be in writing
|
||||
and signed by the party to be charged with such waiver or consent.
|
||||
e. This License constitutes the entire agreement between the parties with
|
||||
respect to the Work licensed here. There are no understandings,
|
||||
agreements or representations with respect to the Work not specified
|
||||
here. Licensor shall not be bound by any additional provisions that
|
||||
may appear in any communication from You. This License may not be
|
||||
modified without the mutual written agreement of the Licensor and You.
|
||||
f. The rights granted under, and the subject matter referenced, in this
|
||||
License were drafted utilizing the terminology of the Berne Convention
|
||||
for the Protection of Literary and Artistic Works (as amended on
|
||||
September 28, 1979), the Rome Convention of 1961, the WIPO Copyright
|
||||
Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996
|
||||
and the Universal Copyright Convention (as revised on July 24, 1971).
|
||||
These rights and subject matter take effect in the relevant
|
||||
jurisdiction in which the License terms are sought to be enforced
|
||||
according to the corresponding provisions of the implementation of
|
||||
those treaty provisions in the applicable national law. If the
|
||||
standard suite of rights granted under applicable copyright law
|
||||
includes additional rights not granted under this License, such
|
||||
additional rights are deemed to be included in the License; this
|
||||
License is not intended to restrict the license of any rights under
|
||||
applicable law.
|
||||
|
||||
|
||||
Creative Commons Notice
|
||||
|
||||
Creative Commons is not a party to this License, and makes no warranty
|
||||
whatsoever in connection with the Work. Creative Commons will not be
|
||||
liable to You or any party on any legal theory for any damages
|
||||
whatsoever, including without limitation any general, special,
|
||||
incidental or consequential damages arising in connection to this
|
||||
license. Notwithstanding the foregoing two (2) sentences, if Creative
|
||||
Commons has expressly identified itself as the Licensor hereunder, it
|
||||
shall have all rights and obligations of Licensor.
|
||||
|
||||
Except for the limited purpose of indicating to the public that the
|
||||
Work is licensed under the CCPL, Creative Commons does not authorize
|
||||
the use by either party of the trademark "Creative Commons" or any
|
||||
related trademark or logo of Creative Commons without the prior
|
||||
written consent of Creative Commons. Any permitted use will be in
|
||||
compliance with Creative Commons' then-current trademark usage
|
||||
guidelines, as may be published on its website or otherwise made
|
||||
available upon request from time to time. For the avoidance of doubt,
|
||||
this trademark restriction does not form part of this License.
|
||||
|
||||
Creative Commons may be contacted at https://creativecommons.org/.
|
||||
|
||||
===============================================================================
|
||||
|
||||
The Go Programming Language
|
||||
https://golang.org/LICENSE
|
||||
|
||||
Copyright (c) 2009 The Go Authors. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
===============================================================================
|
||||
|
||||
The Rust Programming Language
|
||||
https://github.com/rust-lang/rust/blob/master/LICENSE-MIT
|
||||
|
||||
Permission is hereby granted, free of charge, to any
|
||||
person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without
|
||||
limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software
|
||||
is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice
|
||||
shall be included in all copies or substantial portions
|
||||
of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
===============================================================================
|
||||
|
||||
The Rust Programming Language
|
||||
https://github.com/rust-lang/rust/blob/master/LICENSE-APACHE
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
|
||||
================================================================================
|
||||
crossbeam-channel 0.5.17, crossbeam-deque 0.8.8, crossbeam-epoch 0.9.21, crossbeam-utils 0.8.23
|
||||
================================================================================
|
||||
|
||||
The MIT License (MIT)
|
||||
@@ -7716,6 +8318,30 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
================================================================================
|
||||
keyboard-types 0.8.3
|
||||
================================================================================
|
||||
|
||||
Copyright (c) 2017 Pyfisch
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
================================================================================
|
||||
keyring 3.6.3
|
||||
================================================================================
|
||||
@@ -9452,6 +10078,56 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
================================================================================
|
||||
muda 0.21.2
|
||||
================================================================================
|
||||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022-2022 Tauri Programme within The Commons Conservancy
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
================================================================================
|
||||
muda 0.21.2
|
||||
================================================================================
|
||||
|
||||
SPDXVersion: SPDX-2.1
|
||||
DataLicense: CC0-1.0
|
||||
PackageName: muda
|
||||
DataFormat: SPDXRef-1
|
||||
PackageSupplier: Organization: The Tauri Programme in the Commons Conservancy
|
||||
PackageHomePage: https://tauri.app
|
||||
PackageLicenseDeclared: Apache-2.0
|
||||
PackageLicenseDeclared: MIT
|
||||
PackageCopyrightText: 2020-2022, The Tauri Programme in the Commons Conservancy
|
||||
PackageSummary: <text>Menu Utilities for Desktop Applications.
|
||||
</text>
|
||||
PackageComment: <text>The package includes the following libraries; see
|
||||
Relationship information.
|
||||
</text>
|
||||
Created: 2022-12-05T09:00:00Z
|
||||
PackageDownloadLocation: git://github.com/tauri-apps/muda
|
||||
PackageDownloadLocation: git+https://github.com/tauri-apps/muda.git
|
||||
PackageDownloadLocation: git+ssh://github.com/tauri-apps/muda.git
|
||||
Creator: Person: Daniel Thompson-Yvetot
|
||||
|
||||
================================================================================
|
||||
multiversion_no_op 1.0.0
|
||||
================================================================================
|
||||
|
||||
@@ -23,6 +23,7 @@ path = "src/alias.rs"
|
||||
solidcraft-engine = { workspace = true }
|
||||
solidcraft-gpu = { workspace = true }
|
||||
solidcraft-mcp = { workspace = true }
|
||||
log = { workspace = true }
|
||||
serde_json = { workspace = true }
|
||||
|
||||
[dev-dependencies]
|
||||
|
||||
@@ -0,0 +1,700 @@
|
||||
//! `bench-assistant`: the standard Assistant model test (v1, #4851), run against a desktop app.
|
||||
//!
|
||||
//! The app is already running with `--control PORT`; everything goes through its control channel
|
||||
//! (`docs/control-protocol.md`), so the command needs no window code of its own. For each task it
|
||||
//! starts a new design, runs the task's prescribed setup (a box, for some), adds the endpoint as an
|
||||
//! API agent with All permissions, starts a new chat, sends the prompt once and waits for the turn
|
||||
//! to end. The result is checked on the design (`document.inspect` with measurements), never on
|
||||
//! what the model says, except for the one question whose answer is the reply. A failed task is
|
||||
//! put in one of the issue's failure categories from the conversation's items.
|
||||
//!
|
||||
//! ```text
|
||||
//! solidcraft-cli bench-assistant --connect 127.0.0.1:PORT --base-url URL --model NAME
|
||||
//! [--token T] [--tasks 1,2,5] [--repeat N] [--timeout-s 300]
|
||||
//! [--json out.json] [--markdown out.md]
|
||||
//! ```
|
||||
//! prints a table of the results; `--markdown` writes the issue's comment template filled in,
|
||||
//! `--json` every task's rules, conversation and design before and after.
|
||||
|
||||
use std::io::{BufRead, BufReader, Write};
|
||||
use std::net::{SocketAddr, TcpStream};
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
use serde_json::{Value, json};
|
||||
|
||||
/// Standard test v1, as #4851 states it. Changing a prompt or a rule makes it another test.
|
||||
const TASKS: &str = r#"[
|
||||
{"id": "01-cube", "prompt": "Make a 20 mm cube.", "check": {"bodies": 1, "volume": 8000, "bbox_size": [20, 20, 20]}},
|
||||
{"id": "02-cylinder", "prompt": "Make a cylinder 30 mm in diameter and 50 mm tall.", "check": {"bodies": 1, "volume": 35342.92, "bbox_size": [30, 30, 50]}},
|
||||
{"id": "03-block", "prompt": "Create a block 60 mm long, 40 mm wide and 10 mm thick.", "check": {"bodies": 1, "volume": 24000, "bbox_size": [10, 40, 60]}},
|
||||
{"id": "04-sketch-extrude", "prompt": "Sketch a 50 by 30 mm rectangle on the XY plane and extrude it 15 mm.", "check": {"bodies": 1, "volume": 22500, "bbox_size": [15, 30, 50], "feature_kinds": ["Extrude"]}},
|
||||
{"id": "05-plate-hole", "prompt": "Make a plate 80 x 60 x 10 mm with a 20 mm diameter hole straight through the middle.", "check": {"bodies": 1, "volume": 44858.41, "bbox_size": [10, 60, 80], "note": "80*60*10 - pi*10^2*10"}},
|
||||
{"id": "06-fillet-box", "prompt": "Round all the edges of the box with a 3 mm radius.", "setup": [{"command": "solid.box", "params": {"length": 40, "width": 40, "height": 40}}], "check": {"bodies": 1, "volume": 63108.53, "tol": 0.003, "feature_kinds": ["Fillet"], "note": "all 12 edges of a 40 mm cube rounded r=3"}},
|
||||
{"id": "07-move-body", "prompt": "Move the box 50 mm along the X axis.", "setup": [{"command": "solid.box", "params": {"length": 20, "width": 20, "height": 20}}], "check": {"bodies": 1, "volume": 8000, "bbox_min": [50, 0, 0]}},
|
||||
{"id": "08-rename-body", "prompt": "Rename the body to Bracket.", "setup": [{"command": "solid.box", "params": {"length": 30, "width": 20, "height": 10}}], "check": {"bodies": 1, "volume": 6000, "body_name": "Bracket"}},
|
||||
{"id": "09-volume-question", "prompt": "What is the volume of the part?", "setup": [{"command": "solid.box", "params": {"length": 30, "width": 20, "height": 10}}], "check": {"bodies": 1, "volume": 6000, "unchanged": true, "reply_number": "6[ ,. ]?000(?![0-9])|6(\\.0+)? ?cm"}},
|
||||
{"id": "10-two-holes", "prompt": "Make a 100 x 50 x 5 mm plate and drill two 10 mm holes through it, each 15 mm in from the short ends and centred across the width.", "check": {"bodies": 1, "volume": 24214.6, "bbox_size": [5, 50, 100], "note": "100*50*5 - 2*pi*5^2*5"}},
|
||||
{"id": "11-any-change", "prompt": "can you use the software to make a change to the current shape, any change at all", "setup": [{"command": "solid.box", "params": {"length": 30, "width": 20, "height": 10}}], "check": {"changed": true, "note": "verbatim user prompt from #4846; pass = the design changed"}}
|
||||
]"#;
|
||||
|
||||
/// The agent the test adds. A fixed id replaces it on every run instead of adding another.
|
||||
const AGENT_ID: &str = "api-bench-assistant";
|
||||
const AGENT_NAME: &str = "bench";
|
||||
/// Longest control reply read (the channel's own request limit).
|
||||
const MAX_REPLY: usize = 16 << 20;
|
||||
/// Most result data kept for `--json`.
|
||||
const MAX_RESULTS: usize = 64 << 20;
|
||||
/// Deadline of the requests that only set up or read (each is answered at once by the app).
|
||||
const REQUEST_TIMEOUT: Duration = Duration::from_secs(120);
|
||||
/// How often a running turn is polled.
|
||||
const POLL: Duration = Duration::from_millis(250);
|
||||
/// After this long, an idle chat with no reply yet counts as a turn that ended without one.
|
||||
const START_GRACE: Duration = Duration::from_secs(30);
|
||||
/// Absolute tolerance of the lowest corner, in millimetres.
|
||||
const MIN_CORNER_TOL: f64 = 0.05;
|
||||
|
||||
/// A JSON-lines connection to the app. Requests are sent once; a lost reply is never retried,
|
||||
/// so nothing runs twice.
|
||||
struct Control {
|
||||
addr: SocketAddr,
|
||||
token: String,
|
||||
reader: BufReader<TcpStream>,
|
||||
id: u64,
|
||||
}
|
||||
|
||||
impl Control {
|
||||
fn connect(addr: &str, token: Option<&str>) -> Result<Self, String> {
|
||||
let addr: SocketAddr = addr.parse().map_err(|_| format!("--connect: `{addr}` is not an IP address and port"))?;
|
||||
if !addr.ip().is_loopback() || addr.port() == 0 {
|
||||
return Err("--connect requires a loopback address and a nonzero port (the app listens on 127.0.0.1)".into());
|
||||
}
|
||||
let token = solidcraft_engine::control_auth::client_token(addr.port(), token)
|
||||
.ok_or("no control token: pass --token, set SOLIDCRAFT_CONTROL_TOKEN, or run on the app's computer (its token file)")?;
|
||||
if token.len() > 4096 {
|
||||
return Err("the control token is longer than 4096 bytes".into());
|
||||
}
|
||||
Self::open(addr, token)
|
||||
}
|
||||
|
||||
fn open(addr: SocketAddr, token: String) -> Result<Self, String> {
|
||||
let stream = TcpStream::connect_timeout(&addr, Duration::from_secs(5)).map_err(|e| format!("connecting to {addr}: {e}"))?;
|
||||
Ok(Self { addr, token, reader: BufReader::new(stream), id: 0 })
|
||||
}
|
||||
|
||||
/// A new connection to the same app: a request that outlived its deadline keeps the old one
|
||||
/// busy until it is answered.
|
||||
fn reopen(&self) -> Result<Self, String> {
|
||||
Self::open(self.addr, self.token.clone())
|
||||
}
|
||||
|
||||
fn call(&mut self, method: &str, params: Value, deadline: Instant) -> Result<Value, String> {
|
||||
let left = || deadline.checked_duration_since(Instant::now()).filter(|d| !d.is_zero()).ok_or_else(|| "timeout".to_string());
|
||||
let io = |e: std::io::Error| match e.kind() {
|
||||
std::io::ErrorKind::TimedOut | std::io::ErrorKind::WouldBlock => "timeout".to_string(),
|
||||
_ => format!("control channel: {e}"),
|
||||
};
|
||||
self.reader.get_ref().set_write_timeout(Some(left()?)).map_err(io)?;
|
||||
self.id += 1;
|
||||
// The first request on a connection carries the token; sending it on every one is allowed.
|
||||
let request = json!({"id": self.id, "method": method, "params": params, "token": self.token});
|
||||
writeln!(self.reader.get_mut(), "{request}").map_err(io)?;
|
||||
let mut line = Vec::new();
|
||||
loop {
|
||||
self.reader.get_ref().set_read_timeout(Some(left()?)).map_err(io)?;
|
||||
let bytes = self.reader.fill_buf().map_err(io)?;
|
||||
if bytes.is_empty() {
|
||||
return Err("the app closed the control connection".into());
|
||||
}
|
||||
let newline = bytes.iter().position(|b| *b == b'\n');
|
||||
let used = newline.map_or(bytes.len(), |n| n + 1);
|
||||
if line.len() + used > MAX_REPLY {
|
||||
return Err("a control reply is larger than 16 MiB".into());
|
||||
}
|
||||
line.extend_from_slice(bytes.get(..used).unwrap_or_default());
|
||||
self.reader.consume(used);
|
||||
if newline.is_some() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
let reply: Value = serde_json::from_slice(&line).map_err(|e| format!("control reply: {e}"))?;
|
||||
if reply["id"].as_u64() != Some(self.id) {
|
||||
return Err("control reply for another request".into());
|
||||
}
|
||||
if reply["ok"] != true {
|
||||
return Err(format!("{method}: {}", reply["error"].as_str().unwrap_or("failed")));
|
||||
}
|
||||
reply.get("result").cloned().ok_or_else(|| format!("{method}: reply without a result"))
|
||||
}
|
||||
|
||||
fn execute(&mut self, command: &str, params: Value) -> Result<Value, String> {
|
||||
self.call("engine.execute", json!({"command": command, "params": params, "animate": false}), Instant::now() + REQUEST_TIMEOUT)
|
||||
}
|
||||
|
||||
fn chat(&mut self, params: Value) -> Result<Value, String> {
|
||||
self.call("ui.agent_chat", params, Instant::now() + REQUEST_TIMEOUT)
|
||||
}
|
||||
|
||||
fn inspect(&mut self) -> Result<Value, String> {
|
||||
let design = self.call("document.inspect", json!({"measure": true}), Instant::now() + REQUEST_TIMEOUT)?;
|
||||
if design.is_object() { Ok(design) } else { Err("document.inspect returned no design".into()) }
|
||||
}
|
||||
}
|
||||
|
||||
fn tasks() -> Result<Vec<Value>, String> {
|
||||
serde_json::from_str(TASKS).map_err(|e| format!("embedded tasks: {e}"))
|
||||
}
|
||||
|
||||
fn triple(value: &Value) -> Option<[f64; 3]> {
|
||||
match value.as_array()?.as_slice() {
|
||||
[x, y, z] => {
|
||||
let n = |v: &Value| v.as_f64().filter(|n| n.is_finite());
|
||||
Some([n(x)?, n(y)?, n(z)?])
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// What the model said (thoughts left out).
|
||||
fn reply(items: &[Value]) -> String {
|
||||
items.iter().filter(|i| i["thought"] != true).filter_map(|i| i["agent"].as_str()).collect::<Vec<_>>().join("\n")
|
||||
}
|
||||
|
||||
/// v1's reply pattern `6[ ,. ]?000(?![0-9])|6(\.0+)? ?cm`: "6000", "6 000", "6,000", "6.000" not
|
||||
/// followed by a digit, or "6 cm", "6.0cm", … (a narrow no-break space also separates thousands).
|
||||
fn volume_reply(text: &str) -> bool {
|
||||
text.match_indices('6').any(|(at, _)| {
|
||||
let tail = text.get(at + 1..).unwrap_or_default();
|
||||
let thousands = |t: &str| t.strip_prefix("000").is_some_and(|rest| !rest.starts_with(|c: char| c.is_ascii_digit()));
|
||||
let separated = tail.strip_prefix([' ', ',', '.', '\u{202f}']).is_some_and(thousands);
|
||||
let cm = {
|
||||
let t = tail.strip_prefix(".0").map_or(tail, |t| t.trim_start_matches('0'));
|
||||
t.strip_prefix(' ').unwrap_or(t).starts_with("cm")
|
||||
};
|
||||
thousands(tail) || separated || cm
|
||||
})
|
||||
}
|
||||
|
||||
/// The design as the user sees it, without what reading or saving changes (path, saved state,
|
||||
/// revision, selection, undo depth, evaluation timings).
|
||||
fn content(design: &Value) -> Value {
|
||||
let mut v = design.clone();
|
||||
if let Some(o) = v.as_object_mut() {
|
||||
for key in ["path", "dirty", "revision", "selection", "undo", "redo"] {
|
||||
o.remove(key);
|
||||
}
|
||||
}
|
||||
for feature in v.get_mut("timeline").and_then(Value::as_array_mut).into_iter().flatten() {
|
||||
if let Some(o) = feature.as_object_mut() {
|
||||
o.remove("ms");
|
||||
o.remove("boolean_diagnostics");
|
||||
}
|
||||
}
|
||||
v
|
||||
}
|
||||
|
||||
/// Whether the design changed: its content, or a step on the undo stack (a colour, say, that the
|
||||
/// inspection does not list).
|
||||
fn changed(before: &Value, after: &Value) -> bool {
|
||||
content(before) != content(after) || after["undo"].as_u64() > before["undo"].as_u64()
|
||||
}
|
||||
|
||||
/// The rules a task's result breaks (none: it passed). `before` and `after` are
|
||||
/// `document.inspect {measure: true}` before the prompt and after the turn.
|
||||
pub(super) fn check(rule: &Value, before: &Value, after: &Value, items: &[Value]) -> Vec<String> {
|
||||
let Some(all) = after["bodies"].as_array() else { return vec!["the design could not be read".into()] };
|
||||
// Bodies the user sees; a hidden one (a tool body, a hidden original) is not the result.
|
||||
let bodies: Vec<&Value> = all.iter().filter(|b| b["visible"] != false).collect();
|
||||
let mut errors = Vec::new();
|
||||
if let Some(n) = rule["bodies"].as_u64()
|
||||
&& bodies.len() as u64 != n
|
||||
{
|
||||
errors.push(format!("{} bodies, expected {n}", bodies.len()));
|
||||
}
|
||||
if let Some(expected) = rule["volume"].as_f64() {
|
||||
let tol = rule["tol"].as_f64().unwrap_or(0.01);
|
||||
let volumes: Vec<f64> = bodies.iter().filter_map(|b| b["volume_mm3"].as_f64()).filter(|v| v.is_finite()).collect();
|
||||
let total: f64 = volumes.iter().sum();
|
||||
if volumes.len() != bodies.len() || (total - expected).abs() > expected * tol {
|
||||
errors.push(format!("volume {total:.1} mm³, expected {expected} mm³ ±{}%", tol * 100.0));
|
||||
}
|
||||
}
|
||||
let first = bodies.first().copied().unwrap_or(&Value::Null);
|
||||
let min = triple(&first["bbox"]["min"]);
|
||||
if let Some(mut expected) = triple(&rule["bbox_size"]) {
|
||||
expected.sort_by(f64::total_cmp);
|
||||
let size = min.zip(triple(&first["bbox"]["max"])).map(|(lo, hi)| {
|
||||
let mut size = [hi[0] - lo[0], hi[1] - lo[1], hi[2] - lo[2]];
|
||||
size.sort_by(f64::total_cmp);
|
||||
size
|
||||
});
|
||||
if !size.is_some_and(|s| s.iter().zip(expected).all(|(a, e)| (a - e).abs() <= 0.01 * e.max(1.0))) {
|
||||
errors.push(format!("size {size:?}, expected {expected:?} in any orientation"));
|
||||
}
|
||||
}
|
||||
if let Some(expected) = triple(&rule["bbox_min"])
|
||||
&& !min.is_some_and(|m| m.iter().zip(expected).all(|(a, e)| (a - e).abs() <= MIN_CORNER_TOL))
|
||||
{
|
||||
errors.push(format!("lowest corner {min:?}, expected {expected:?}"));
|
||||
}
|
||||
if let Some(name) = rule["body_name"].as_str()
|
||||
&& !bodies.iter().any(|b| b["name"] == name)
|
||||
{
|
||||
errors.push(format!("no body named {name}"));
|
||||
}
|
||||
for kind in rule["feature_kinds"].as_array().into_iter().flatten().filter_map(Value::as_str) {
|
||||
let live = |f: &&Value| f["suppressed"] != true && f["rolled_back"] != true && f["error"].is_null();
|
||||
if !after["timeline"].as_array().into_iter().flatten().filter(live).any(|f| f["type"].as_str().is_some_and(|t| t.contains(kind))) {
|
||||
errors.push(format!("no {kind} in the timeline"));
|
||||
}
|
||||
}
|
||||
if rule["changed"] == true || rule["unchanged"] == true {
|
||||
let changed = before.is_object() && changed(before, after);
|
||||
if rule["changed"] == true && !changed {
|
||||
errors.push("the design did not change".into());
|
||||
}
|
||||
if rule["unchanged"] == true && (changed || !before.is_object()) {
|
||||
errors.push("the design changed".into());
|
||||
}
|
||||
}
|
||||
if rule["reply_number"].is_string() && !volume_reply(&reply(items)) {
|
||||
errors.push("the reply does not give the volume".into());
|
||||
}
|
||||
errors
|
||||
}
|
||||
|
||||
/// A tool call written into the reply as JSON: `{"name": …`, `{"command": …`, `{"function": …`,
|
||||
/// `{"tool": …`.
|
||||
fn call_as_text(text: &str) -> bool {
|
||||
text.match_indices('{').any(|(at, _)| {
|
||||
let rest = text.get(at + 1..).unwrap_or_default().trim_start();
|
||||
["\"name\"", "\"command\"", "\"function\"", "\"tool\""]
|
||||
.iter()
|
||||
.any(|key| rest.strip_prefix(key).is_some_and(|r| r.trim_start().starts_with(':')))
|
||||
})
|
||||
}
|
||||
|
||||
/// How a failed task failed, in the issue's words, from the conversation's items.
|
||||
pub(super) fn classify(items: &[Value], timed_out: bool) -> &'static str {
|
||||
if timed_out {
|
||||
return "timeout";
|
||||
}
|
||||
let tools: Vec<&Value> = items.iter().filter(|i| i.get("tool").is_some()).collect();
|
||||
// A failed call, or a batch whose answer reports a failed step (`"ok": false`).
|
||||
let failed: Vec<String> = tools
|
||||
.iter()
|
||||
.map(|t| t["output"].as_str().unwrap_or_default())
|
||||
.zip(&tools)
|
||||
.filter(|(output, t)| t["status"] == "Failed" || serde_json::from_str::<Value>(output).is_ok_and(|v| v["ok"] == false))
|
||||
.map(|(output, _)| output.to_lowercase())
|
||||
.collect();
|
||||
let notices: Vec<String> = items.iter().filter_map(|i| i["notice"].as_str()).map(str::to_lowercase).collect();
|
||||
let answer = reply(items);
|
||||
if notices.iter().any(|n| n.contains("http 400")) {
|
||||
return "the endpoint refused tools (HTTP 400)";
|
||||
}
|
||||
if notices.iter().any(|n| n.contains("max_turn_requests")) || answer.contains("requests for one message") {
|
||||
return "hit the request limit";
|
||||
}
|
||||
if call_as_text(&answer) {
|
||||
return "wrote the call as text";
|
||||
}
|
||||
if failed.iter().any(|o| o.contains("unknown command") || o.starts_with("unknown tool")) {
|
||||
return "wrong or unknown command";
|
||||
}
|
||||
if failed.iter().any(|o| o.contains("invalid parameters") || o.starts_with("not run:") || o.contains("not valid json")) {
|
||||
return "wrong arguments";
|
||||
}
|
||||
if !failed.is_empty() || notices.iter().any(|n| n.starts_with("http ")) || items.iter().any(|i| i["error"] == true) {
|
||||
return "gave up after errors";
|
||||
}
|
||||
if tools.is_empty() {
|
||||
return if answer.trim().is_empty() { "an empty reply" } else { "only talked" };
|
||||
}
|
||||
"wrong result"
|
||||
}
|
||||
|
||||
/// One run's results in the issue's comment template (`run`: which repetition).
|
||||
pub(super) fn markdown(model: &str, version: &str, results: &[Value], run: u64) -> String {
|
||||
let clean = |s: &str| s.replace(['\n', '\r', '|'], " ");
|
||||
let rows: Vec<&Value> = results.iter().filter(|r| r["repeat"] == run).collect();
|
||||
let passed = rows.iter().filter(|r| r["passed"] == true).count();
|
||||
let mut out = format!(
|
||||
"### {} (<quant>, <download size>)\nRuntime: <Ollama/LM Studio/... version>, context <num_ctx if changed>\nSolidCraft: {}\nResult: {passed}/11\n| # | pass/fail | how it failed |\n|---|---|---|\n",
|
||||
clean(model),
|
||||
clean(version)
|
||||
);
|
||||
for n in 1..=11 {
|
||||
match rows.iter().find(|r| r["task"] == n) {
|
||||
Some(r) if r["passed"] == true => out.push_str(&format!("| {n} | pass | |\n")),
|
||||
Some(r) => out.push_str(&format!("| {n} | fail | {} |\n", clean(r["failure"].as_str().unwrap_or_default()))),
|
||||
None => out.push_str(&format!("| {n} | | not run |\n")),
|
||||
}
|
||||
}
|
||||
out.push_str(if rows.len() == 11 {
|
||||
"Notes: <anything odd, e.g. very slow, needed a retry>\n"
|
||||
} else {
|
||||
"Notes: partial run; the tasks marked \"not run\" were left out.\n"
|
||||
});
|
||||
out
|
||||
}
|
||||
|
||||
fn write(path: &str, text: &str) -> Result<(), String> {
|
||||
solidcraft_engine::io::vfs::write(path, text.as_bytes()).map_err(|e| format!("{path}: {e}"))
|
||||
}
|
||||
|
||||
struct Options<'a> {
|
||||
connect: &'a str,
|
||||
token: Option<&'a str>,
|
||||
base_url: &'a str,
|
||||
model: &'a str,
|
||||
tasks: Vec<usize>,
|
||||
repeat: u64,
|
||||
timeout: Duration,
|
||||
json: Option<&'a str>,
|
||||
markdown: Option<&'a str>,
|
||||
}
|
||||
|
||||
fn options(args: &[String]) -> Result<Options<'_>, String> {
|
||||
const FLAGS: [&str; 9] = ["--connect", "--token", "--base-url", "--model", "--tasks", "--repeat", "--timeout-s", "--json", "--markdown"];
|
||||
let mut given = std::collections::BTreeMap::new();
|
||||
let mut args = args.iter();
|
||||
while let Some(flag) = args.next() {
|
||||
let Some(flag) = FLAGS.iter().find(|f| **f == flag.as_str()) else { return Err(format!("unknown bench-assistant option: {flag}")) };
|
||||
let value = args
|
||||
.next()
|
||||
.filter(|v| !v.starts_with("--") && !v.is_empty() && v.len() <= 4096)
|
||||
.ok_or_else(|| format!("{flag} needs a value (at most 4096 bytes)"))?;
|
||||
if given.insert(*flag, value.as_str()).is_some() {
|
||||
return Err(format!("{flag} given twice"));
|
||||
}
|
||||
}
|
||||
let required = |key: &str| given.get(key).copied().ok_or_else(|| format!("bench-assistant needs {key}"));
|
||||
let number = |key: &str, default: u64, max: u64| -> Result<u64, String> {
|
||||
given
|
||||
.get(key)
|
||||
.map_or(Ok(default), |s| s.parse::<u64>().ok().filter(|n| (1..=max).contains(n)).ok_or_else(|| format!("{key} must be 1 to {max}")))
|
||||
};
|
||||
let tasks = match given.get("--tasks") {
|
||||
None => (1..=11).collect(),
|
||||
Some(list) => {
|
||||
let mut tasks = Vec::new();
|
||||
for n in list.split(',') {
|
||||
let n = n
|
||||
.trim()
|
||||
.parse::<usize>()
|
||||
.ok()
|
||||
.filter(|n| (1..=11).contains(n))
|
||||
.ok_or("--tasks takes task numbers 1 to 11, separated by commas")?;
|
||||
if tasks.contains(&n) {
|
||||
return Err(format!("--tasks lists task {n} twice"));
|
||||
}
|
||||
tasks.push(n);
|
||||
}
|
||||
tasks
|
||||
}
|
||||
};
|
||||
Ok(Options {
|
||||
connect: required("--connect")?,
|
||||
token: given.get("--token").copied(),
|
||||
base_url: required("--base-url")?,
|
||||
model: required("--model")?,
|
||||
tasks,
|
||||
repeat: number("--repeat", 1, 100)?,
|
||||
timeout: Duration::from_secs(number("--timeout-s", 300, 3600)?),
|
||||
json: given.get("--json").copied(),
|
||||
markdown: given.get("--markdown").copied(),
|
||||
})
|
||||
}
|
||||
|
||||
/// Waits for the turn the prompt started to end. Returns the chat's last state and whether the
|
||||
/// deadline passed first.
|
||||
fn wait_for_turn(control: &mut Control, mut chat: Value, began: Instant, end: Instant) -> Result<(Value, bool), String> {
|
||||
let mut seen_busy = false;
|
||||
loop {
|
||||
let state = chat["state"].as_str().unwrap_or_default();
|
||||
let turn = !chat["turn"].is_null();
|
||||
let queued = chat["pending"].as_array().is_some_and(|p| !p.is_empty());
|
||||
seen_busy |= state == "busy" || turn;
|
||||
let idle = !matches!(state, "busy" | "starting") && !turn && !queued;
|
||||
// A turn can start and end between two polls: then the conversation has its answer.
|
||||
let answered = chat["items"].as_array().into_iter().flatten().any(|i| i.get("user").is_none());
|
||||
if idle && (seen_busy || answered || matches!(state, "exited" | "auth" | "off") || began.elapsed() >= START_GRACE) {
|
||||
return Ok((chat, false));
|
||||
}
|
||||
let Some(left) = end.checked_duration_since(Instant::now()).filter(|d| !d.is_zero()) else { return Ok((chat, true)) };
|
||||
std::thread::sleep(POLL.min(left));
|
||||
match control.call("ui.agent_chat", json!({}), end) {
|
||||
Ok(next) => chat = next,
|
||||
Err(e) if e == "timeout" => return Ok((chat, true)),
|
||||
Err(e) => return Err(e),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn run(args: &[String]) -> Result<(), String> {
|
||||
let o = options(args)?;
|
||||
let tasks = tasks()?;
|
||||
let mut control = Control::connect(o.connect, o.token)?;
|
||||
let help = control.call("ui.help", json!({}), Instant::now() + REQUEST_TIMEOUT)?;
|
||||
let version = help["version"].as_str().filter(|s| !s.is_empty() && s.len() <= 256).ok_or("the app reported no version")?.to_string();
|
||||
let config = control.chat(json!({
|
||||
"features": true,
|
||||
"add_agent": {"id": AGENT_ID, "name": AGENT_NAME, "kind": "api", "base_url": o.base_url, "model": o.model},
|
||||
}))?;
|
||||
if !config["agents"].as_array().into_iter().flatten().any(|a| a["id"] == AGENT_ID) {
|
||||
return Err("the app did not add the benchmark's agent".into());
|
||||
}
|
||||
// Put the user's permission setting back afterwards.
|
||||
let permissions = config["permissions"].as_str().map(str::to_string);
|
||||
let result = run_tasks(&mut control, &o, &tasks, &version);
|
||||
let _ = control.chat(json!({"stop": true}));
|
||||
if let Some(p) = permissions {
|
||||
let _ = control.chat(json!({"permissions": p}));
|
||||
}
|
||||
result
|
||||
}
|
||||
|
||||
fn run_tasks(control: &mut Control, o: &Options, tasks: &[Value], version: &str) -> Result<(), String> {
|
||||
let mut results: Vec<Value> = Vec::new();
|
||||
let mut kept = 0;
|
||||
let mut stdout = std::io::stdout().lock();
|
||||
let mut say = |line: String| writeln!(stdout, "{line}").map_err(|e| format!("stdout: {e}"));
|
||||
say(format!("bench-assistant v1: {} on SolidCraft {version}", o.model))?;
|
||||
say("| run | # | task | pass/fail | how it failed | seconds |\n|---|---|---|---|---|---|".into())?;
|
||||
for run in 1..=o.repeat {
|
||||
for &n in &o.tasks {
|
||||
let task = tasks.get(n - 1).ok_or("missing embedded task")?;
|
||||
// A fresh design and a fresh chat, with nothing of the last task still running.
|
||||
control.chat(json!({"stop": true}))?;
|
||||
control.execute("file.new", json!({"name": "Benchmark"}))?;
|
||||
for step in task["setup"].as_array().into_iter().flatten() {
|
||||
control.execute(step["command"].as_str().ok_or("embedded setup without a command")?, step["params"].clone())?;
|
||||
}
|
||||
control.chat(json!({"agent": AGENT_ID, "permissions": "all", "new_chat": true, "attach_view": false}))?;
|
||||
let before = control.inspect()?;
|
||||
let began = Instant::now();
|
||||
let end = began + o.timeout;
|
||||
let (chat, timed_out) = match control.call("ui.agent_chat", json!({"send": task["prompt"]}), end) {
|
||||
Ok(chat) => wait_for_turn(control, chat, began, end)?,
|
||||
Err(e) if e == "timeout" => (json!({}), true),
|
||||
Err(e) => return Err(e),
|
||||
};
|
||||
if timed_out {
|
||||
// The late reply would arrive on the old connection; stop the model on a new one
|
||||
// before reading the design.
|
||||
*control = control.reopen()?;
|
||||
}
|
||||
// Stop the agent before reading the result, so nothing changes the design meanwhile.
|
||||
let stopped = control.chat(json!({"stop": true}))?;
|
||||
let items = stopped["items"].as_array().or(chat["items"].as_array()).cloned().unwrap_or_default();
|
||||
let after = control.inspect()?;
|
||||
let failed_rules = check(&task["check"], &before, &after, &items);
|
||||
let passed = failed_rules.is_empty();
|
||||
let failure = if passed { "" } else { classify(&items, timed_out) };
|
||||
let seconds = began.elapsed().as_secs_f64();
|
||||
say(format!(
|
||||
"| {run} | {n} | {} | {} | {failure} | {seconds:.0} |",
|
||||
task["id"].as_str().unwrap_or_default(),
|
||||
if passed { "pass" } else { "fail" }
|
||||
))?;
|
||||
let result = json!({
|
||||
"task": n, "id": task["id"], "prompt": task["prompt"], "repeat": run, "passed": passed, "failure": failure,
|
||||
"failed_rules": failed_rules, "timed_out": timed_out, "seconds": seconds, "check": task["check"],
|
||||
"items": items, "before": before, "after": after,
|
||||
});
|
||||
kept += result.to_string().len();
|
||||
if kept > MAX_RESULTS {
|
||||
return Err("the results passed 64 MiB; run fewer tasks or repetitions".into());
|
||||
}
|
||||
results.push(result);
|
||||
// Written after every task, so an interrupted run keeps what it measured.
|
||||
if let Some(path) = o.json {
|
||||
let all = json!({"test": "v1", "model": o.model, "base_url": o.base_url, "solidcraft": version, "results": results});
|
||||
write(path, &serde_json::to_string_pretty(&all).map_err(|e| e.to_string())?)?;
|
||||
}
|
||||
if let Some(path) = o.markdown {
|
||||
write(path, &(1..=run).map(|r| markdown(o.model, version, &results, r)).collect::<Vec<_>>().join("\n"))?;
|
||||
}
|
||||
}
|
||||
}
|
||||
for run in 1..=o.repeat {
|
||||
let rows: Vec<&Value> = results.iter().filter(|r| r["repeat"] == run).collect();
|
||||
say(format!("run {run}: {}/{} passed", rows.iter().filter(|r| r["passed"] == true).count(), rows.len()))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn design(bodies: Value, timeline: Value) -> Value {
|
||||
json!({"name": "Benchmark", "params": [], "timeline": timeline, "bodies": bodies, "sketches": [], "undo": 1, "revision": 3, "dirty": true})
|
||||
}
|
||||
|
||||
fn body(name: &str, volume: f64, min: [f64; 3], max: [f64; 3]) -> Value {
|
||||
json!({"name": name, "volume_mm3": volume, "bbox": {"min": min, "max": max}, "visible": true})
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_embedded_tasks_are_v1() {
|
||||
let tasks = tasks().unwrap();
|
||||
assert_eq!(tasks.len(), 11);
|
||||
assert_eq!(tasks[0]["prompt"], "Make a 20 mm cube.");
|
||||
assert_eq!(tasks[10]["prompt"], "can you use the software to make a change to the current shape, any change at all");
|
||||
assert_eq!(tasks[5]["check"]["tol"], 0.003);
|
||||
assert_eq!(tasks[6]["check"]["bbox_min"], json!([50, 0, 0]));
|
||||
let boxes: Vec<_> = tasks.iter().filter(|t| t["setup"].is_array()).map(|t| t["id"].as_str().unwrap()).collect();
|
||||
assert_eq!(boxes, ["06-fillet-box", "07-move-body", "08-rename-body", "09-volume-question", "11-any-change"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pass_rules() {
|
||||
let tasks = tasks().unwrap();
|
||||
let rule = |n: usize| tasks[n - 1]["check"].clone();
|
||||
let empty = design(json!([]), json!([]));
|
||||
let pass = |n: usize, before: &Value, after: &Value, items: &[Value]| check(&rule(n), before, after, items);
|
||||
// 3: any orientation, within 1%.
|
||||
let block = design(json!([body("Body1", 24_100.0, [0.0; 3], [40.0, 10.0, 60.2])]), json!([{"type": "Box"}]));
|
||||
assert!(pass(3, &empty, &block, &[]).is_empty());
|
||||
let thick = design(json!([body("Body1", 24_000.0, [0.0; 3], [40.0, 12.0, 60.0])]), json!([]));
|
||||
assert_eq!(pass(3, &empty, &thick, &[]).len(), 1);
|
||||
let two = design(json!([body("A", 12_000.0, [0.0; 3], [60.0, 40.0, 5.0]), body("B", 12_000.0, [0.0; 3], [60.0, 40.0, 5.0])]), json!([]));
|
||||
assert!(!pass(3, &empty, &two, &[]).is_empty());
|
||||
// A hidden body is not part of the result.
|
||||
let mut hidden = two.clone();
|
||||
hidden["bodies"][1]["visible"] = json!(false);
|
||||
hidden["bodies"][0]["volume_mm3"] = json!(24_000.0);
|
||||
hidden["bodies"][0]["bbox"]["max"] = json!([60.0, 40.0, 10.0]);
|
||||
assert!(pass(3, &empty, &hidden, &[]).is_empty());
|
||||
// 4: the timeline needs a working Extrude.
|
||||
let plate = |kind: Value| design(json!([body("Body1", 22_500.0, [0.0; 3], [50.0, 30.0, 15.0])]), kind);
|
||||
assert!(pass(4, &empty, &plate(json!([{"type": "Sketch"}, {"type": "Extrude"}])), &[]).is_empty());
|
||||
assert!(!pass(4, &empty, &plate(json!([{"type": "Box"}])), &[]).is_empty());
|
||||
for flag in [json!({"suppressed": true}), json!({"rolled_back": true}), json!({"error": "failed"})] {
|
||||
let mut feature = json!({"type": "Extrude"});
|
||||
feature.as_object_mut().unwrap().extend(flag.as_object().unwrap().clone());
|
||||
assert!(!pass(4, &empty, &plate(json!([feature])), &[]).is_empty(), "{flag}");
|
||||
}
|
||||
// 6: the fillet's tolerance is 0.3%.
|
||||
let start = design(json!([body("Body1", 64_000.0, [0.0; 3], [40.0; 3])]), json!([{"type": "Box"}]));
|
||||
let filleted = |v: f64| design(json!([body("Body1", v, [0.0; 3], [40.0; 3])]), json!([{"type": "Box"}, {"type": "Fillet"}]));
|
||||
assert!(pass(6, &start, &filleted(63_108.53 * 1.002), &[]).is_empty());
|
||||
assert!(!pass(6, &start, &filleted(63_108.53 * 1.004), &[]).is_empty());
|
||||
// 7: the lowest corner.
|
||||
let moved = |x: f64| design(json!([body("Body1", 8000.0, [x, 0.0, 0.0], [x + 20.0, 20.0, 20.0])]), json!([]));
|
||||
assert!(pass(7, &empty, &moved(50.0), &[]).is_empty());
|
||||
assert!(!pass(7, &empty, &moved(0.0), &[]).is_empty());
|
||||
// 8: the name.
|
||||
let named = |name: &str| design(json!([body(name, 6000.0, [0.0; 3], [30.0, 20.0, 10.0])]), json!([]));
|
||||
assert!(pass(8, &empty, &named("Bracket"), &[]).is_empty());
|
||||
assert!(!pass(8, &empty, &named("Body1"), &[]).is_empty());
|
||||
// 9: unchanged, and the reply gives the volume.
|
||||
let start = named("Body1");
|
||||
let said = |text: &str| [json!({"user": "What is the volume of the part?"}), json!({"agent": text, "thought": false})];
|
||||
let mut read = start.clone();
|
||||
read["revision"] = json!(7);
|
||||
read["dirty"] = json!(false);
|
||||
read["selection"] = json!([{"body": "Body1"}]);
|
||||
assert!(pass(9, &start, &read, &said("The volume is 6000 mm³.")).is_empty());
|
||||
assert!(!pass(9, &start, &read, &said("About 60 cm³.")).is_empty());
|
||||
assert!(!pass(9, &start, &named("Bracket"), &said("6 000 mm³")).is_empty());
|
||||
let mut undone = start.clone();
|
||||
undone["undo"] = json!(2);
|
||||
assert!(!pass(9, &start, &undone, &said("6000 mm³")).is_empty());
|
||||
// 11: any change counts; reading does not.
|
||||
assert!(pass(11, &start, &named("Bracket"), &[]).is_empty());
|
||||
assert!(pass(11, &start, &undone, &[]).is_empty());
|
||||
assert!(!pass(11, &start, &read, &[]).is_empty());
|
||||
// An unreadable design passes nothing.
|
||||
assert!(!pass(11, &start, &json!({}), &[]).is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_volume_reply() {
|
||||
for yes in ["6000", "6 000 mm³", "6,000", "6.000", "6\u{202f}000", "6 cm³", "6.00cm3", "is 6000."] {
|
||||
assert!(volume_reply(yes), "{yes}");
|
||||
}
|
||||
for no in ["60000", "6,0001", "60 cm³", "600", "6.01 cm³", ""] {
|
||||
assert!(!volume_reply(no), "{no}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn failure_categories() {
|
||||
for (items, expected) in [
|
||||
(
|
||||
json!([{"user": "Make a 20 mm cube."}, {"agent": "{\"name\": \"execute\", \"arguments\": {}}", "thought": false}]),
|
||||
"wrote the call as text",
|
||||
),
|
||||
(
|
||||
json!([{"notice": "HTTP 400: registry.ollama.ai/library/gemma3:4b does not support tools", "error": true}]),
|
||||
"the endpoint refused tools (HTTP 400)",
|
||||
),
|
||||
(json!([{"user": "Make a 20 mm cube."}, {"agent": "", "thought": false}]), "an empty reply"),
|
||||
(json!([{"agent": "Let me think", "thought": true}]), "an empty reply"),
|
||||
(json!([{"agent": "Sure, here is how to make a cube.", "thought": false}]), "only talked"),
|
||||
(
|
||||
json!([{"tool": "1", "status": "Failed", "output": "unknown command `solid.cube` (did you mean `solid.box`?)"}]),
|
||||
"wrong or unknown command",
|
||||
),
|
||||
(json!([{"tool": "1", "status": "Failed", "output": "unknown tool `make_cube`"}]), "wrong or unknown command"),
|
||||
(json!([{"tool": "1", "status": "Failed", "output": "invalid parameters for `solid.box`: `length` is required"}]), "wrong arguments"),
|
||||
(json!([{"tool": "1", "status": "Failed", "output": "Not run: the tool arguments were not valid JSON"}]), "wrong arguments"),
|
||||
(json!([{"tool": "1", "status": "Failed", "output": "no body `Box`"}]), "gave up after errors"),
|
||||
(
|
||||
json!([{"tool": "1", "status": "Completed", "output": "{\"ok\": false, \"failed\": {\"error\": \"unknown command `solid.delete`\"}}"}]),
|
||||
"wrong or unknown command",
|
||||
),
|
||||
(
|
||||
json!([{"tool": "1", "status": "Completed"}, {"agent": "\n(stopped after 24 requests for one message; send another message to go on)"}]),
|
||||
"hit the request limit",
|
||||
),
|
||||
(json!([{"tool": "1", "status": "Completed", "output": "{}"}]), "wrong result"),
|
||||
] {
|
||||
let items = items.as_array().unwrap();
|
||||
assert_eq!(classify(items, false), expected, "{items:?}");
|
||||
assert_eq!(classify(items, true), "timeout");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn markdown_is_the_comment_template() {
|
||||
let rows: Vec<Value> =
|
||||
(1..=11).map(|n| json!({"task": n, "repeat": 1, "passed": n != 2, "failure": if n == 2 { "an empty reply" } else { "" }})).collect();
|
||||
let report = markdown("qwen2.5:7b", "0.19.0", &rows, 1);
|
||||
assert!(report.starts_with(
|
||||
"### qwen2.5:7b (<quant>, <download size>)\nRuntime: <Ollama/LM Studio/... version>, context <num_ctx if changed>\nSolidCraft: 0.19.0\nResult: 10/11\n| # | pass/fail | how it failed |\n|---|---|---|\n| 1 | pass | |\n| 2 | fail | an empty reply |\n"
|
||||
));
|
||||
assert!(report.ends_with("| 11 | pass | |\nNotes: <anything odd, e.g. very slow, needed a retry>\n"));
|
||||
let partial = markdown("m|x", "v", &rows[..1], 1);
|
||||
assert!(partial.starts_with("### m x ("));
|
||||
assert!(partial.contains("Result: 1/11") && partial.contains("| 2 | | not run |") && partial.contains("partial run"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn options_are_checked_before_connecting() {
|
||||
for extra in [
|
||||
&["--repeat", "0"][..],
|
||||
&["--repeat", "101"],
|
||||
&["--timeout-s", "3601"],
|
||||
&["--tasks", "0"],
|
||||
&["--tasks", "12"],
|
||||
&["--tasks", "1,1"],
|
||||
&["--model", "again"],
|
||||
&["--unexpected", "1"],
|
||||
&["--token"],
|
||||
] {
|
||||
let mut args: Vec<String> =
|
||||
["--connect", "127.0.0.1:9", "--model", "m", "--base-url", "http://127.0.0.1:11434/v1"].iter().map(|s| s.to_string()).collect();
|
||||
args.extend(extra.iter().map(|s| s.to_string()));
|
||||
assert!(options(&args).is_err(), "{extra:?}");
|
||||
}
|
||||
let args: Vec<String> =
|
||||
["--connect", "127.0.0.1:9", "--model", "m", "--base-url", "u", "--tasks", "2, 5"].iter().map(|s| s.to_string()).collect();
|
||||
let o = options(&args).unwrap();
|
||||
assert_eq!((o.tasks, o.repeat, o.timeout), (vec![2, 5], 1, Duration::from_secs(300)));
|
||||
assert!(Control::connect("10.0.0.1:9271", Some("t")).is_err());
|
||||
assert!(Control::connect("localhost", Some("t")).is_err());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
//! What the engine logs (`log::info!`, `log::debug!`: why a body has no display plan, why a save
|
||||
//! left its model cache out), written to stderr. Off unless asked for, so the CLI's output and
|
||||
//! the scripts reading it stay as they are: `--debug` shows SolidCraft's own debug messages (and
|
||||
//! other crates' warnings, whose debug output is large), `RUST_LOG=error|warn|info|debug|trace`
|
||||
//! sets one level for every crate.
|
||||
|
||||
use log::{LevelFilter, Log, Metadata, Record};
|
||||
|
||||
struct Stderr {
|
||||
/// The level for SolidCraft's crates.
|
||||
ours: LevelFilter,
|
||||
/// The level for every other crate.
|
||||
others: LevelFilter,
|
||||
}
|
||||
|
||||
impl Log for Stderr {
|
||||
fn enabled(&self, m: &Metadata) -> bool {
|
||||
m.level() <= if m.target().starts_with("solidcraft") { self.ours } else { self.others }
|
||||
}
|
||||
|
||||
fn log(&self, r: &Record) {
|
||||
if self.enabled(r.metadata()) {
|
||||
use std::io::Write as _;
|
||||
// A closed stderr is no reason to stop.
|
||||
let _ = writeln!(std::io::stderr().lock(), "[{} {}] {}", r.level().as_str().to_ascii_lowercase(), r.target(), r.args());
|
||||
}
|
||||
}
|
||||
|
||||
fn flush(&self) {}
|
||||
}
|
||||
|
||||
/// Removes `--debug` from `args`, wherever it is (every subcommand takes it), and installs the
|
||||
/// logger when it or `RUST_LOG` asks for one.
|
||||
pub fn init(args: &mut Vec<String>) {
|
||||
let before = args.len();
|
||||
args.retain(|a| a != "--debug");
|
||||
let debug = args.len() != before;
|
||||
let env = std::env::var("RUST_LOG").ok().and_then(|v| v.trim().parse::<LevelFilter>().ok());
|
||||
let (ours, others) = match (debug, env) {
|
||||
(false, Some(all)) => (all, all),
|
||||
(true, Some(all)) => (all.max(LevelFilter::Debug), all),
|
||||
(true, None) => (LevelFilter::Debug, LevelFilter::Warn),
|
||||
(false, None) => return,
|
||||
};
|
||||
// Installed once, for the life of the process.
|
||||
if log::set_logger(Box::leak(Box::new(Stderr { ours, others }))).is_ok() {
|
||||
log::set_max_level(ours.max(others));
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,9 @@
|
||||
//! solidcraft-cli script <design.solidcraft> [--out script.json] the design's history as a command script
|
||||
//! solidcraft-cli bench-open <design.solidcraft | part.step> [--parse-only] [--save OUT.solidcraft] [--display LEVEL [--edit NAME EXPR]] [--ops script.json] loading timings as JSON lines
|
||||
//! solidcraft-cli bench-agent [--scale F] [--save F] [--script-out F] a ~1,300-body design built command by command, timed
|
||||
//! solidcraft-cli bench-assistant --connect 127.0.0.1:PORT [--token T] --base-url URL --model NAME [--tasks 1,2,5] [--repeat N]
|
||||
//! [--timeout-s 300] [--json out.json] [--markdown out.md]
|
||||
//! the standard Assistant model test (#4851) on a running app
|
||||
//! solidcraft-cli snapshot <script|design> [--in design|part.step] --out shot.png [--width W] [--height H] [--view iso|front|top|…|NAME | --camera JSON] [--no-grid] [--no-axes]
|
||||
//! [--body NAME:opacity=0.3,color=#rrggbb]... [--tool NAME]... [--section z=27]
|
||||
//! solidcraft-cli exec <command> [json-params] run one command on an empty design
|
||||
@@ -17,13 +20,17 @@
|
||||
//! MCP server on stdio (docs/mcp.md)
|
||||
//! solidcraft-cli licences SolidCraft's licence and the third-party licences
|
||||
//! solidcraft-cli icon --out F.png|F.ico [--size N] the app icon (packaging; drawn, not a file)
|
||||
//!
|
||||
//! --debug (with any command) SolidCraft's debug log on stderr (or RUST_LOG=LEVEL)
|
||||
//! ```
|
||||
#![deny(clippy::unwrap_used, clippy::expect_used, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unreachable)]
|
||||
#![forbid(unsafe_code)]
|
||||
|
||||
mod bench_agent;
|
||||
mod bench_assistant;
|
||||
mod crashes;
|
||||
mod fuzz;
|
||||
mod logger;
|
||||
mod oracle;
|
||||
mod preview;
|
||||
mod recipe;
|
||||
@@ -54,6 +61,7 @@ const USAGE: &str = "usage:
|
||||
(--ops: after opening, run each command of the script and undo it, timing the command, the
|
||||
evaluations it caused and the view it leaves: placing and meshing what changed)
|
||||
solidcraft-cli bench-agent [--scale F] [--save design.solidcraft] [--script-out script.json]
|
||||
solidcraft-cli bench-assistant --connect 127.0.0.1:PORT [--token T] --base-url URL --model NAME [--tasks 1,2,5] [--repeat N] [--timeout-s 300] [--json out.json] [--markdown out.md]
|
||||
solidcraft-cli snapshot <script|design> [--in design.solidcraft|part.step] --out shot.png [--width W] [--height H] [--view NAME | --camera JSON] [--no-grid] [--no-axes]
|
||||
[--body NAME:opacity=0.3,color=#rrggbb]... [--tool NAME]... [--section z=27]
|
||||
solidcraft-cli snapshot --in <design.solidcraft|part.step> --out shot.png ...
|
||||
@@ -82,10 +90,13 @@ const USAGE: &str = "usage:
|
||||
lands on: gpu, gpu-software, or the CPU rasterizer (auto with no adapter, or cpu); the policy defaults
|
||||
to SOLIDCRAFT_GPU, else auto; exits with an error when hardware or software finds no such adapter)
|
||||
solidcraft-cli icon --out icon.png [--size 256] | --out icon.ico
|
||||
--debug, with any command: what SolidCraft logs (why a body has no display plan, why a save left its
|
||||
model cache out), on stderr; RUST_LOG=error|warn|info|debug|trace sets one level for every crate
|
||||
";
|
||||
|
||||
fn main() -> ExitCode {
|
||||
let args: Vec<String> = std::env::args().skip(1).collect();
|
||||
let mut args: Vec<String> = std::env::args().skip(1).collect();
|
||||
logger::init(&mut args);
|
||||
let r = match args.first().map(String::as_str) {
|
||||
Some("run") => cmd_run(&args[1..]),
|
||||
Some("eval" | "inspect") => cmd_eval(&args[1..]),
|
||||
@@ -130,10 +141,18 @@ fn main() -> ExitCode {
|
||||
Some("bench-open") => cmd_bench_open(&args[1..]),
|
||||
// A ~1,300-body design built command by command, as an agent builds one over MCP.
|
||||
Some("bench-agent") => bench_agent::run(&args[1..]),
|
||||
// The standard Assistant model test (#4851), run against a desktop app over its control channel.
|
||||
Some("bench-assistant") => bench_assistant::run(&args[1..]),
|
||||
Some("--version" | "-V") => {
|
||||
println!("solidcraft-cli {}", env!("CARGO_PKG_VERSION"));
|
||||
Ok(())
|
||||
}
|
||||
// Asked-for help is not an error: usage on stdout, exit 0.
|
||||
Some("--help" | "-h" | "help") => {
|
||||
use std::io::Write as _;
|
||||
let _ = std::io::stdout().lock().write_all(USAGE.as_bytes());
|
||||
Ok(())
|
||||
}
|
||||
_ => Err(USAGE.to_string()),
|
||||
};
|
||||
match r {
|
||||
@@ -704,9 +723,10 @@ pub(crate) fn cmd_bench_open(args: &[String]) -> Result<(), String> {
|
||||
let t = std::time::Instant::now();
|
||||
let s = Session::opened(doc, saved.as_ref());
|
||||
drop(read);
|
||||
// Taken from the file: nothing evaluated (SOLIDCRAFT_NO_MODEL_CACHE evaluates anyway).
|
||||
// Taken from the file: nothing evaluated (SOLIDCRAFT_NO_MODEL_CACHE evaluates anyway), or
|
||||
// only the features whose state a thinned file left out.
|
||||
let adopted = saved.is_some() && s.model.last_recomputed == 0;
|
||||
println!("{}", json!({"step": "evaluate", "ms": t.elapsed().as_secs_f64() * 1000.0, "adopted": adopted}));
|
||||
println!("{}", json!({"step": "evaluate", "ms": t.elapsed().as_secs_f64() * 1000.0, "adopted": adopted, "recomputed": s.model.last_recomputed}));
|
||||
for r in &s.model.results {
|
||||
println!("{}", json!({"step": "feature", "id": r.id, "name": r.name, "ms": r.ms, "error": r.error}));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
//! An explicit help request prints usage to stdout and succeeds; an unknown command still fails.
|
||||
|
||||
use std::process::Command;
|
||||
|
||||
#[test]
|
||||
fn help_prints_usage_and_succeeds() {
|
||||
for arg in ["--help", "-h", "help"] {
|
||||
let output = Command::new(env!("CARGO_BIN_EXE_solidcraft-cli")).arg(arg).output().unwrap();
|
||||
assert!(output.status.success(), "{arg}: {}", String::from_utf8_lossy(&output.stderr));
|
||||
let stdout = String::from_utf8_lossy(&output.stdout);
|
||||
assert!(stdout.starts_with("usage:"), "{arg}: {stdout}");
|
||||
assert!(stdout.contains("solidcraft-cli run"), "{arg}: {stdout}");
|
||||
assert!(output.stderr.is_empty(), "{arg}: {}", String::from_utf8_lossy(&output.stderr));
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unknown_command_still_fails_with_usage() {
|
||||
let output = Command::new(env!("CARGO_BIN_EXE_solidcraft-cli")).arg("--not-a-command").output().unwrap();
|
||||
assert!(!output.status.success());
|
||||
assert!(output.stdout.is_empty());
|
||||
assert!(String::from_utf8_lossy(&output.stderr).starts_with("error: usage:"));
|
||||
}
|
||||
@@ -7,7 +7,7 @@ use std::sync::Arc;
|
||||
|
||||
use serde_json::{Value, json};
|
||||
use solidcraft_engine::Session;
|
||||
use solidcraft_engine::doc::{ModelBody, ModelState};
|
||||
use solidcraft_engine::doc::{ModelBody, ModelState, SavedModel};
|
||||
|
||||
fn corpus() -> Vec<PathBuf> {
|
||||
let dir = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/corpus");
|
||||
@@ -149,6 +149,87 @@ fn imported_assemblies_open_from_their_model_as_evaluated() {
|
||||
check("imported hinge", s);
|
||||
}
|
||||
|
||||
/// `built` saved with `saved`, a model of it that keeps only some states (as a file without room
|
||||
/// for all of them does, #3220), opens as the design evaluated again: evaluating just the
|
||||
/// features whose state the file left out, then after suppressing a feature at, before or after
|
||||
/// each state it kept, after undoing that, and with the marker moved there and back.
|
||||
fn check_thinned(name: &str, built: &Session, saved: &SavedModel) {
|
||||
let design = built.design();
|
||||
let bytes =
|
||||
solidcraft_engine::io::write_design_container_with_cache(&design, solidcraft_engine::io::DesignCompression::Fast, None, Some(saved)).unwrap();
|
||||
assert!(solidcraft_engine::io::read_design_geometry(&bytes).is_some(), "{name}: the file keeps the final state");
|
||||
let path = temp(&name.replace(' ', "-"));
|
||||
std::fs::write(&path, &bytes).unwrap();
|
||||
let mut cached = open(&path);
|
||||
let mut rebuilt = Session::new(solidcraft_engine::io::read_design(&bytes).unwrap());
|
||||
let features = saved.records["features"].as_array().unwrap();
|
||||
let unkept = features.iter().filter(|f| f["skipped"] == false && f.get("state").is_none()).count();
|
||||
assert!(unkept > 0, "{name}: some states left out");
|
||||
assert_eq!(cached.model.recomputed, unkept, "{name}: evaluated just the features whose state the file left out");
|
||||
assert_eq!(model(name, &cached), model(name, &rebuilt), "{name}: opened from the file's model");
|
||||
let n = cached.doc.features.len();
|
||||
let mut at: Vec<usize> = features
|
||||
.iter()
|
||||
.enumerate()
|
||||
.filter(|(_, f)| f["skipped"] == false && f.get("state").is_some())
|
||||
.flat_map(|(k, _)| [k.saturating_sub(1), k, k + 1])
|
||||
.filter(|i| *i < n)
|
||||
.collect();
|
||||
at.dedup();
|
||||
for i in at {
|
||||
let edit = json!({"feature": cached.doc.features[i].id, "suppressed": true});
|
||||
let (a, b) = (cached.execute("timeline.suppress", &edit), rebuilt.execute("timeline.suppress", &edit));
|
||||
assert_eq!(a.is_ok(), b.is_ok(), "{name}: suppressing feature {i}");
|
||||
assert_eq!(model(name, &cached), model(name, &rebuilt), "{name}: feature {i} suppressed");
|
||||
if a.is_ok() {
|
||||
cached.execute("edit.undo", &json!({})).unwrap();
|
||||
rebuilt.execute("edit.undo", &json!({})).unwrap();
|
||||
assert_eq!(model(name, &cached), model(name, &rebuilt), "{name}: suppressing feature {i} undone");
|
||||
}
|
||||
for marker in [json!({"position": i}), json!({})] {
|
||||
cached.execute("timeline.rollback", &marker).unwrap();
|
||||
rebuilt.execute("timeline.rollback", &marker).unwrap();
|
||||
assert_eq!(model(name, &cached), model(name, &rebuilt), "{name}: the marker at {marker}, from feature {i}");
|
||||
}
|
||||
}
|
||||
let _ = std::fs::remove_file(&path);
|
||||
}
|
||||
|
||||
/// A model too big for its file keeps the final state, then the slowest features' states as fit
|
||||
/// (#3220). Both the smallest such model (the final state, and states that add no body to it)
|
||||
/// and one that keeps more open as the design evaluated again. The placed components' design has
|
||||
/// a cut whose fingerprint reads where the bodies before it lie, which a state left out does not
|
||||
/// say until it is evaluated.
|
||||
#[test]
|
||||
fn thinned_models_open_as_evaluated() {
|
||||
let corpus = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/corpus/components-arm.solidcraft");
|
||||
for sample in ["Sample Plate", "Plastic Enclosure", "components-arm"] {
|
||||
let built = match solidcraft_engine::sample::samples().into_iter().find(|s| s.name == sample) {
|
||||
Some(s) => {
|
||||
let mut built = Session::default();
|
||||
for c in (s.script)()["commands"].as_array().unwrap() {
|
||||
built.execute(c["command"].as_str().unwrap(), &c["params"]).unwrap();
|
||||
}
|
||||
built
|
||||
}
|
||||
None => open(&corpus),
|
||||
};
|
||||
let saved = built.model.saved(&built.design()).unwrap();
|
||||
// Every body a megabyte (the records fit in the room left over): each budget keeps one more
|
||||
// body's worth of states.
|
||||
let body = 1 << 20;
|
||||
let pieces: Vec<Vec<(usize, usize)>> = (0..saved.bodies.len()).map(|i| vec![(i, body)]).collect();
|
||||
let thinned: Vec<SavedModel> =
|
||||
(0..=saved.bodies.len()).filter_map(|n| saved.thinned(&pieces, n * body + body - 1).map(|(m, _, _)| m)).collect();
|
||||
let kept = |m: &SavedModel| m.records["features"].as_array().unwrap().iter().filter(|f| f.get("state").is_some()).count();
|
||||
let smallest = thinned.first().unwrap();
|
||||
assert!(smallest.records["states"].as_array().unwrap().len() < saved.records["states"].as_array().unwrap().len(), "{sample}");
|
||||
let more = thinned.iter().find(|m| kept(m) > kept(smallest) && kept(m) < built.doc.features.len()).unwrap();
|
||||
check_thinned(&format!("{sample} smallest"), &built, smallest);
|
||||
check_thinned(&format!("{sample} thinned"), &built, more);
|
||||
}
|
||||
}
|
||||
|
||||
/// Opened from its model, a design evaluates only from the first feature an edit changes: the
|
||||
/// saved states before it are kept as they were read (the same states, not evaluated again).
|
||||
#[test]
|
||||
|
||||
@@ -30,5 +30,5 @@ web-sys = { version = "0.3", features = [
|
||||
"FileSystemHandle", "FileSystemDirectoryHandle", "FileSystemFileHandle", "FileSystemGetFileOptions", "FileSystemWritableFileStream",
|
||||
"WritableStream", "File", "FileList", "Blob", "BlobPropertyBag", "Url", "HtmlAnchorElement", "HtmlInputElement", "Storage",
|
||||
"IdbFactory", "IdbDatabase", "IdbObjectStore", "IdbOpenDbRequest", "IdbRequest", "IdbTransaction", "IdbTransactionMode",
|
||||
"BeforeUnloadEvent", "Event", "EventTarget", "Response", "MediaQueryList", "Gamepad", "Performance",
|
||||
"BeforeUnloadEvent", "Event", "EventTarget", "KeyboardEvent", "Response", "MediaQueryList", "Gamepad", "Performance",
|
||||
] }
|
||||
|
||||
@@ -499,7 +499,9 @@ fn input_picker(files: &Rc<Files>, intent: Intent) {
|
||||
let Some(doc) = web_sys::window().and_then(|w| w.document()) else { return };
|
||||
let Ok(input) = doc.create_element("input").map(|e| e.unchecked_into::<web_sys::HtmlInputElement>()) else { return };
|
||||
input.set_type("file");
|
||||
input.set_accept(".solidcraft,.solvecraft,.json,.step,.stp,.3mf,.stl,.obj,.glb,.gltf");
|
||||
// Everything the browser build imports, from the format registry (no cadmpeg formats here).
|
||||
let accept = solidcraft_engine::io::formats::open_extensions(false).iter().map(|e| format!(".{e}")).collect::<Vec<_>>().join(",");
|
||||
input.set_accept(&accept);
|
||||
// Attached (hidden) while it is open: some browsers ignore a click on a detached input.
|
||||
let _ = input.set_attribute("style", "display:none");
|
||||
if let Some(body) = doc.body() {
|
||||
|
||||
@@ -17,13 +17,21 @@ mod install;
|
||||
#[cfg(any(target_arch = "wasm32", test))]
|
||||
mod space_mouse;
|
||||
|
||||
/// The browser switches tabs with Ctrl+Tab and Ctrl+Shift+Tab, so the page leaves those keys to
|
||||
/// it (#5227); plain Tab and Shift+Tab still move between the app's fields. (Ctrl+PageUp and
|
||||
/// Ctrl+PageDown already reach the browser.)
|
||||
#[cfg(any(target_arch = "wasm32", test))]
|
||||
fn browser_switches_tabs(key: &str, ctrl: bool) -> bool {
|
||||
ctrl && key == "Tab"
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "wasm32")]
|
||||
mod web {
|
||||
use std::rc::Rc;
|
||||
|
||||
use solidcraft_engine::Session;
|
||||
use solidcraft_engine::io::vfs;
|
||||
use solidcraft_ui_egui::{Services, SolveApp};
|
||||
use solidcraft_ui_egui::{Services, SolveApp, ui_kit};
|
||||
use wasm_bindgen::JsCast as _;
|
||||
|
||||
use crate::api::Api;
|
||||
@@ -84,6 +92,20 @@ mod web {
|
||||
on_unload.forget();
|
||||
}
|
||||
|
||||
/// eframe cancels the browser's action for every Tab it gets, so the browser couldn't switch
|
||||
/// tabs while the app has the keyboard. Its tab-switching keys stop here, on the way down to
|
||||
/// the canvas, before eframe sees them; the browser then acts on them as usual.
|
||||
fn leave_tab_switching_to_browser(window: &web_sys::Window) {
|
||||
let on_key = wasm_bindgen::closure::Closure::<dyn FnMut(web_sys::KeyboardEvent)>::new(|e: web_sys::KeyboardEvent| {
|
||||
if crate::browser_switches_tabs(&e.key(), e.ctrl_key()) {
|
||||
e.stop_propagation();
|
||||
}
|
||||
});
|
||||
let _ = window.add_event_listener_with_callback_and_bool("keydown", on_key.as_ref().unchecked_ref(), true);
|
||||
// The listener lives as long as the page.
|
||||
on_key.forget();
|
||||
}
|
||||
|
||||
const JAPANESE_FONT_PATH: &str = "./fonts/BIZUDPGothic-Regular.ttf";
|
||||
|
||||
type FontLoadResult = Rc<std::cell::RefCell<Option<Result<Vec<u8>, String>>>>;
|
||||
@@ -109,6 +131,7 @@ mod web {
|
||||
/// The language the fonts were last set up for (a CJK UI leads with the CJK face).
|
||||
font_language: String,
|
||||
space_mouse: SpaceMouse,
|
||||
wheel_gestures: solidcraft_ui_egui::WebWheelGestures,
|
||||
}
|
||||
|
||||
impl Shell {
|
||||
@@ -229,24 +252,21 @@ mod web {
|
||||
if !self.files.panel.get() {
|
||||
return;
|
||||
}
|
||||
let mut open = true;
|
||||
let mut act: Option<(&'static str, String)> = None;
|
||||
egui::Window::new("Files in this browser")
|
||||
.open(&mut open)
|
||||
.collapsible(false)
|
||||
.resizable(true)
|
||||
.default_width(520.0)
|
||||
.pivot(egui::Align2::CENTER_CENTER)
|
||||
.default_pos(ctx.content_rect().center())
|
||||
.show(ctx, |ui| {
|
||||
let closed = solidcraft_ui_egui::ui_kit::Window::new(egui::Id::new("sc_browser_files"), "folder", "Files in this browser")
|
||||
.cards(3.0)
|
||||
.show_body(ctx, |ui| {
|
||||
ui.horizontal(|ui| {
|
||||
if ui.button("Open from computer…").clicked() {
|
||||
if ui_kit::button(ui, "Open from computer…", ui_kit::Button::Normal).clicked() {
|
||||
files::pick_from_disk(&self.files, Intent::Open);
|
||||
}
|
||||
if ui.button("Insert from computer…").on_hover_text("STEP, 3MF or STL into the open design").clicked() {
|
||||
if ui_kit::button(ui, "Insert from computer…", ui_kit::Button::Normal)
|
||||
.on_hover_text("STEP, 3MF or STL into the open design")
|
||||
.clicked()
|
||||
{
|
||||
files::pick_from_disk(&self.files, Intent::Insert);
|
||||
}
|
||||
if ui.button("Download open design").clicked() {
|
||||
if ui_kit::button(ui, "Download open design", ui_kit::Button::Normal).clicked() {
|
||||
act = Some(("download_open", String::new()));
|
||||
}
|
||||
});
|
||||
@@ -270,7 +290,7 @@ mod web {
|
||||
for e in &entries {
|
||||
match &mut self.renaming {
|
||||
Some((from, to)) if *from == e.name => {
|
||||
let r = ui.add(egui::TextEdit::singleline(to).desired_width(200.0));
|
||||
let r = ui_kit::cell_editor(ui, ui.make_persistent_id(("stored_file_name", from.as_str())), to, "", false);
|
||||
if std::mem::take(&mut self.rename_focus) {
|
||||
r.request_focus();
|
||||
}
|
||||
@@ -288,28 +308,31 @@ mod web {
|
||||
}
|
||||
ui.label(format!("{:.1} KB", e.size as f64 / 1024.0));
|
||||
ui.horizontal(|ui| {
|
||||
if ui.small_button("Open").clicked() {
|
||||
if ui_kit::button(ui, "Open", ui_kit::Button::Small).clicked() {
|
||||
act = Some(("open", e.name.clone()));
|
||||
}
|
||||
let design = solidcraft_engine::io::is_design_path(&e.name);
|
||||
if !design && ui.small_button("Insert").on_hover_text("Into the open design (STEP, 3MF, STL)").clicked() {
|
||||
if !design
|
||||
&& ui_kit::button(ui, "Insert", ui_kit::Button::Small)
|
||||
.on_hover_text("Into the open design (STEP, 3MF, STL)")
|
||||
.clicked()
|
||||
{
|
||||
act = Some(("insert", e.name.clone()));
|
||||
}
|
||||
if ui.small_button("Rename").clicked() {
|
||||
if ui_kit::button(ui, "Rename", ui_kit::Button::Small).clicked() {
|
||||
self.renaming = Some((e.name.clone(), e.name.clone()));
|
||||
self.rename_focus = true;
|
||||
}
|
||||
if ui
|
||||
.small_button("Save to computer…")
|
||||
if ui_kit::button(ui, "Save to computer…", ui_kit::Button::Small)
|
||||
.on_hover_text("A copy in a file you choose; the stored design stays here")
|
||||
.clicked()
|
||||
{
|
||||
act = Some(("save_copy", e.name.clone()));
|
||||
}
|
||||
if ui.small_button("Download").clicked() {
|
||||
if ui_kit::button(ui, "Download", ui_kit::Button::Small).clicked() {
|
||||
act = Some(("download", e.name.clone()));
|
||||
}
|
||||
if ui.small_button("Delete").clicked() {
|
||||
if ui_kit::button(ui, "Delete", ui_kit::Button::Small).clicked() {
|
||||
act = Some(("delete", e.name.clone()));
|
||||
}
|
||||
});
|
||||
@@ -318,7 +341,7 @@ mod web {
|
||||
});
|
||||
});
|
||||
});
|
||||
if !open {
|
||||
if closed {
|
||||
self.files.panel.set(false);
|
||||
self.renaming = None;
|
||||
}
|
||||
@@ -386,20 +409,19 @@ mod web {
|
||||
fn recovery_prompt(&mut self, ctx: &egui::Context) {
|
||||
let Some((name, path)) = self.files.recovery.borrow().clone() else { return };
|
||||
let mut answer = None;
|
||||
egui::Window::new("Recover unsaved work?").collapsible(false).resizable(false).anchor(egui::Align2::CENTER_CENTER, [0.0, 0.0]).show(
|
||||
ctx,
|
||||
|ui| {
|
||||
let _ = solidcraft_ui_egui::ui_kit::Window::new(egui::Id::new("sc_browser_recovery"), "restore", "Recover unsaved work?")
|
||||
.required()
|
||||
.show_body(ctx, |ui| {
|
||||
ui.label(format!("“{name}” had unsaved changes when this page last closed."));
|
||||
ui.horizontal(|ui| {
|
||||
if ui.button("Recover").clicked() {
|
||||
if ui_kit::button(ui, "Recover", ui_kit::Button::Normal).clicked() {
|
||||
answer = Some(true);
|
||||
}
|
||||
if ui.button("Discard").clicked() {
|
||||
if ui_kit::button(ui, "Discard", ui_kit::Button::Normal).clicked() {
|
||||
answer = Some(false);
|
||||
}
|
||||
});
|
||||
},
|
||||
);
|
||||
});
|
||||
let Some(recover) = answer else { return };
|
||||
*self.files.recovery.borrow_mut() = None;
|
||||
if recover {
|
||||
@@ -488,6 +510,10 @@ mod web {
|
||||
UNSAVED.with(|u| u.set(solidcraft_ui_egui::documents::any_dirty(&self.app)));
|
||||
}
|
||||
fn raw_input_hook(&mut self, ctx: &egui::Context, raw: &mut egui::RawInput) {
|
||||
let now = raw.time.unwrap_or_else(|| ctx.input(|i| i.time));
|
||||
if let Some(delay) = self.wheel_gestures.update(raw, now) {
|
||||
ctx.request_repaint_after(delay);
|
||||
}
|
||||
files::take_drops(&self.files, raw);
|
||||
// Before the app's own hook, which adds the control channel's events.
|
||||
self.space_mouse.raw_input_hook(ctx, self.app.preferences.space_mouse_enabled, raw);
|
||||
@@ -554,6 +580,7 @@ mod web {
|
||||
wasm_bindgen_futures::spawn_local(async {
|
||||
let Some(window) = web_sys::window() else { return };
|
||||
ask_before_unload(&window);
|
||||
leave_tab_switching_to_browser(&window);
|
||||
let Some(document) = window.document() else { return };
|
||||
let Some(canvas) = document.get_element_by_id(CANVAS_ID).and_then(|e| e.dyn_into::<web_sys::HtmlCanvasElement>().ok()) else {
|
||||
log::error!("missing <canvas id=\"{CANVAS_ID}\">");
|
||||
@@ -651,6 +678,7 @@ mod web {
|
||||
cjk_bytes: None,
|
||||
font_language,
|
||||
space_mouse: SpaceMouse::default(),
|
||||
wheel_gestures: solidcraft_ui_egui::WebWheelGestures::default(),
|
||||
}))
|
||||
}),
|
||||
)
|
||||
@@ -676,3 +704,17 @@ fn main() {
|
||||
fn main() {
|
||||
eprintln!("solidcraft-web only runs in the browser: build it with `trunk build --release` in apps/solidcraft-web");
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn only_ctrl_tab_is_left_to_the_browser() {
|
||||
// Ctrl+Tab and Ctrl+Shift+Tab (the event's key is "Tab" either way) switch browser tabs.
|
||||
assert!(browser_switches_tabs("Tab", true));
|
||||
// Tab and Shift+Tab move between the app's fields; Ctrl with other keys stays the app's.
|
||||
assert!(!browser_switches_tabs("Tab", false));
|
||||
assert!(!browser_switches_tabs("s", true));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,8 +50,13 @@ hidapi = { version = "2.6.7", default-features = false, features = ["windows-nat
|
||||
raw-window-handle = "0.6"
|
||||
# Native crash capture (src/native_crash.rs): the exception filter, the faulting module, a minidump.
|
||||
# The window's resize border and DPI size (src/native_frame.rs): the window procedure, hit test, DPI.
|
||||
# Finding 3D mice through Plug and Play without asking other devices anything (src/space_mouse/windows_hid.rs).
|
||||
windows-sys = { version = "0.61", features = [
|
||||
"Win32_Devices_DeviceAndDriverInstallation",
|
||||
"Win32_Devices_HumanInterfaceDevice",
|
||||
"Win32_Devices_Properties",
|
||||
"Win32_Foundation",
|
||||
"Win32_Graphics_Gdi",
|
||||
"Win32_Security",
|
||||
"Win32_Storage_FileSystem",
|
||||
"Win32_System_Diagnostics_Debug",
|
||||
@@ -65,6 +70,7 @@ windows-sys = { version = "0.61", features = [
|
||||
] }
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
muda = { version = "0.21.2", default-features = false }
|
||||
# The 3D mouse through the 3Dconnexion driver, which keeps the device to itself (src/space_mouse.rs).
|
||||
solidcraft-3dx-client = { workspace = true }
|
||||
# The 3D mouse (src/space_mouse.rs), in the shared-device open mode so that a running 3DxWare
|
||||
@@ -73,7 +79,7 @@ hidapi = { version = "2.6.7", default-features = false, features = ["macos-share
|
||||
# Files opened from Finder and the Dock (src/open_documents.rs); all already come with eframe and rfd.
|
||||
objc2 = "0.6"
|
||||
objc2-app-kit = { version = "0.3", default-features = false, features = ["std", "NSApplication", "NSResponder"] }
|
||||
objc2-foundation = { version = "0.3", default-features = false, features = ["std", "block2", "NSArray", "NSNotification", "NSOperation", "NSString", "NSURL"] }
|
||||
objc2-foundation = { version = "0.3", default-features = false, features = ["std", "block2", "NSArray", "NSNotification", "NSOperation", "NSProcessInfo", "NSString", "NSURL"] }
|
||||
block2 = "0.6"
|
||||
|
||||
[target.'cfg(all(unix, not(target_os = "macos")))'.dependencies]
|
||||
|
||||
@@ -3,9 +3,10 @@
|
||||
|
||||
use std::io::{BufRead, BufReader, Write};
|
||||
use std::net::{TcpListener, TcpStream};
|
||||
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
use std::sync::atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering};
|
||||
use std::sync::mpsc::{Receiver, Sender, TryRecvError, channel};
|
||||
use std::time::Duration;
|
||||
use std::sync::{Arc, Mutex, MutexGuard, PoisonError};
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
use serde_json::{Value, json};
|
||||
use solidcraft_engine::MAX_LINE;
|
||||
@@ -178,11 +179,137 @@ struct Pending {
|
||||
reply: Receiver<Value>,
|
||||
}
|
||||
|
||||
fn serve(stream: TcpStream, token: &str, tx: Sender<ControlRequest>, ctx: egui::Context, patient: bool) {
|
||||
serve_with(stream, token, tx, ctx, patient, WAITS);
|
||||
/// Every request the app has been sent and not answered yet, from every connection, for
|
||||
/// `control.running` (#3654). Each connection's own thread answers that, so it never waits behind
|
||||
/// a running request.
|
||||
struct Running {
|
||||
list: Mutex<Vec<InFlight>>,
|
||||
connections: AtomicU64,
|
||||
keys: AtomicU64,
|
||||
}
|
||||
|
||||
fn serve_with(stream: TcpStream, token: &str, tx: Sender<ControlRequest>, ctx: egui::Context, patient: bool, waits: Waits) {
|
||||
/// What `control.running` says about a request: never its parameters beyond the command id.
|
||||
struct InFlight {
|
||||
key: u64,
|
||||
connection: u64,
|
||||
id: Value,
|
||||
method: String,
|
||||
command: Option<&'static str>,
|
||||
steps: Option<usize>,
|
||||
since: Instant,
|
||||
started: Arc<AtomicBool>,
|
||||
}
|
||||
|
||||
/// The app's requests, from both of its listeners.
|
||||
static RUNNING: Running = Running::new();
|
||||
|
||||
impl Running {
|
||||
const fn new() -> Self {
|
||||
Running { list: Mutex::new(Vec::new()), connections: AtomicU64::new(0), keys: AtomicU64::new(0) }
|
||||
}
|
||||
|
||||
fn lock(&self) -> MutexGuard<'_, Vec<InFlight>> {
|
||||
self.list.lock().unwrap_or_else(PoisonError::into_inner)
|
||||
}
|
||||
|
||||
/// List `req`, sent on `connection`, until the returned ticket is dropped.
|
||||
fn add(&'static self, connection: u64, id: &Value, req: &ControlRequest) -> Ticket {
|
||||
let key = self.keys.fetch_add(1, Ordering::Relaxed);
|
||||
// Ids and methods come from the client: only short ones are repeated to the others.
|
||||
let id = match id {
|
||||
Value::Number(_) => id.clone(),
|
||||
Value::String(s) if s.len() <= 64 => id.clone(),
|
||||
_ => Value::Null,
|
||||
};
|
||||
let p = &req.params;
|
||||
let command = match req.method.as_str() {
|
||||
"engine.execute" | "command" => p.get("command").and_then(Value::as_str).and_then(solidcraft_engine::find_command).map(|c| c.id),
|
||||
_ => None,
|
||||
};
|
||||
let steps = match req.method.as_str() {
|
||||
"engine.batch" | "engine.script" => p.get("commands").and_then(Value::as_array).map(Vec::len),
|
||||
_ => None,
|
||||
};
|
||||
let method = req.method.chars().take(64).collect();
|
||||
let started = req.started.clone();
|
||||
self.lock().push(InFlight { key, connection, id, method, command, steps, since: Instant::now(), started });
|
||||
Ticket { running: self, key }
|
||||
}
|
||||
|
||||
/// The `control.running` result, as `asker`'s connection sees it.
|
||||
fn result(&self, asker: u64) -> Value {
|
||||
let rows: Vec<Value> = self
|
||||
.lock()
|
||||
.iter()
|
||||
.map(|e| {
|
||||
let mut r = json!({
|
||||
"connection": e.connection,
|
||||
"id": e.id,
|
||||
"method": e.method,
|
||||
"running_s": (e.since.elapsed().as_secs_f64() * 10.0).round() / 10.0,
|
||||
"queued": !e.started.load(Ordering::Relaxed),
|
||||
});
|
||||
if let Some(c) = e.command {
|
||||
r["command"] = json!(c);
|
||||
}
|
||||
if let Some(n) = e.steps {
|
||||
r["steps"] = json!(n);
|
||||
}
|
||||
if e.connection == asker {
|
||||
r["self"] = json!(true);
|
||||
}
|
||||
r
|
||||
})
|
||||
.collect();
|
||||
json!({"running": rows})
|
||||
}
|
||||
}
|
||||
|
||||
/// A listed request; dropped when its reply arrives.
|
||||
struct Ticket {
|
||||
running: &'static Running,
|
||||
key: u64,
|
||||
}
|
||||
|
||||
impl Drop for Ticket {
|
||||
fn drop(&mut self) {
|
||||
let key = self.key;
|
||||
self.running.lock().retain(|e| e.key != key);
|
||||
}
|
||||
}
|
||||
|
||||
/// The reply to a timed-out request, received on a thread of its own so the request stays listed
|
||||
/// until the app answers, also once its connection has closed (#3654).
|
||||
fn watch(reply: Receiver<Value>, ticket: Ticket) -> Receiver<Value> {
|
||||
let (late_tx, late_rx) = channel();
|
||||
// A small thread per timed-out request (each connection has at most one). If none can be
|
||||
// made, the reply is lost and `control.pending` says the app ended the request without one.
|
||||
// The reply is passed on before the request leaves the list: once `control.running` no longer
|
||||
// shows it, its connection's `control.pending` has it.
|
||||
let _ = std::thread::Builder::new().stack_size(64 * 1024).spawn(move || {
|
||||
if let Ok(v) = reply.recv() {
|
||||
let _ = late_tx.send(v);
|
||||
}
|
||||
drop(late_tx);
|
||||
drop(ticket);
|
||||
});
|
||||
late_rx
|
||||
}
|
||||
|
||||
fn serve(stream: TcpStream, token: &str, tx: Sender<ControlRequest>, ctx: egui::Context, patient: bool) {
|
||||
serve_with(stream, token, tx, ctx, patient, WAITS, &RUNNING);
|
||||
}
|
||||
|
||||
fn serve_with(
|
||||
stream: TcpStream,
|
||||
token: &str,
|
||||
tx: Sender<ControlRequest>,
|
||||
ctx: egui::Context,
|
||||
patient: bool,
|
||||
waits: Waits,
|
||||
running: &'static Running,
|
||||
) {
|
||||
let connection = running.connections.fetch_add(1, Ordering::Relaxed) + 1;
|
||||
let Ok(read) = stream.try_clone() else { return };
|
||||
let mut out = stream;
|
||||
let mut reader = BufReader::new(read);
|
||||
@@ -216,13 +343,16 @@ fn serve_with(stream: TcpStream, token: &str, tx: Sender<ControlRequest>, ctx: e
|
||||
let id = msg.get("id").cloned().unwrap_or(Value::Null);
|
||||
let method = msg.get("method").and_then(Value::as_str).unwrap_or("").to_string();
|
||||
let params = msg.get("params").cloned().unwrap_or(json!({}));
|
||||
// A request that timed out may have finished since (#1618).
|
||||
let late = pending.as_ref().and_then(|p| match p.reply.try_recv() {
|
||||
// A request that timed out may have finished since (#1618). `control.running` only
|
||||
// looks, so it leaves that reply where it is.
|
||||
let late = pending.as_ref().filter(|_| method != "control.running").and_then(|p| match p.reply.try_recv() {
|
||||
Ok(reply) => Some(reply),
|
||||
Err(TryRecvError::Disconnected) => Some(json!({"ok": false, "error": "the app ended the request without a reply"})),
|
||||
Err(TryRecvError::Empty) => None,
|
||||
});
|
||||
let mut r = if method == "control.pending" {
|
||||
let mut r = if method == "control.running" {
|
||||
json!({"ok": true, "result": running.result(connection)})
|
||||
} else if method == "control.pending" {
|
||||
match (pending.take(), late) {
|
||||
(None, _) => json!({"ok": true, "result": {"pending": null}}),
|
||||
(Some(p), Some(reply)) => json!({"ok": true, "result": {"pending": p.id, "method": p.method, "done": true, "reply": reply}}),
|
||||
@@ -243,6 +373,7 @@ fn serve_with(stream: TcpStream, token: &str, tx: Sender<ControlRequest>, ctx: e
|
||||
// A batch replaces many short requests: the whole of it may take long (#743).
|
||||
let wait = if patient || method == "engine.batch" { waits.long } else { waits.short };
|
||||
let (req, rrx) = ControlRequest::new(method.clone(), params);
|
||||
let ticket = running.add(connection, &id, &req);
|
||||
if tx.send(req).is_err() {
|
||||
break;
|
||||
}
|
||||
@@ -251,7 +382,7 @@ fn serve_with(stream: TcpStream, token: &str, tx: Sender<ControlRequest>, ctx: e
|
||||
Ok(r) => r,
|
||||
Err(_) => {
|
||||
let r = json!({"ok": false, "running": true, "error": format!("timeout: `{method}` is still running in the app and will still apply; ask `control.pending` for its result")});
|
||||
pending = Some(Pending { id: id.clone(), method, reply: rrx });
|
||||
pending = Some(Pending { id: id.clone(), method, reply: watch(rrx, ticket) });
|
||||
r
|
||||
}
|
||||
}
|
||||
@@ -307,9 +438,10 @@ mod tests {
|
||||
}
|
||||
});
|
||||
let waits = Waits { short: Duration::from_millis(100), long: Duration::from_millis(100) };
|
||||
static RUNNING: Running = Running::new();
|
||||
std::thread::spawn(move || {
|
||||
if let Some(stream) = listener.incoming().flatten().next() {
|
||||
serve_with(stream, token, tx, egui::Context::default(), false, waits);
|
||||
serve_with(stream, token, tx, egui::Context::default(), false, waits, &RUNNING);
|
||||
}
|
||||
});
|
||||
let s = TcpStream::connect(addr).unwrap();
|
||||
@@ -349,6 +481,102 @@ mod tests {
|
||||
assert_eq!(*ran.lock().unwrap(), ["slow", "ui.view"], "the busy request never reached the app");
|
||||
}
|
||||
|
||||
/// #3654: `control.running` answers on every connection, at once, with what any connection
|
||||
/// has the app running or queued (command ids, never parameters); a timed-out request stays
|
||||
/// listed until the app answers it, and an idle app lists nothing.
|
||||
#[test]
|
||||
fn every_connection_sees_what_the_app_is_running() {
|
||||
static RUNNING: Running = Running::new();
|
||||
let token = "0123456789abcdef0123456789abcdef";
|
||||
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
|
||||
let addr = listener.local_addr().unwrap();
|
||||
let (tx, rx) = channel::<ControlRequest>();
|
||||
// The window: one request at a time, as `drain_control` takes them; the export is held
|
||||
// until the test lets it go.
|
||||
let (gate_tx, gate_rx) = channel::<()>();
|
||||
std::thread::spawn(move || {
|
||||
for req in rx {
|
||||
req.started.store(true, Ordering::Relaxed);
|
||||
if req.method == "engine.execute" {
|
||||
let _ = gate_rx.recv();
|
||||
}
|
||||
let _ = req.reply.send(json!({"ok": true, "result": req.method}));
|
||||
}
|
||||
});
|
||||
let waits = Waits { short: Duration::from_millis(100), long: Duration::from_secs(60) };
|
||||
std::thread::spawn(move || {
|
||||
for stream in listener.incoming().flatten() {
|
||||
let tx = tx.clone();
|
||||
std::thread::spawn(move || serve_with(stream, token, tx, egui::Context::default(), false, waits, &RUNNING));
|
||||
}
|
||||
});
|
||||
let open = || {
|
||||
let s = TcpStream::connect(addr).unwrap();
|
||||
s.set_read_timeout(Some(Duration::from_secs(10))).unwrap();
|
||||
let mut out = s.try_clone().unwrap();
|
||||
let mut lines = BufReader::new(s);
|
||||
move |v: Value| -> Value {
|
||||
writeln!(out, "{v}").unwrap();
|
||||
let mut l = String::new();
|
||||
lines.read_line(&mut l).unwrap();
|
||||
serde_json::from_str(&l).unwrap()
|
||||
}
|
||||
};
|
||||
let running = |ask: &mut dyn FnMut(Value) -> Value, until: &dyn Fn(&[Value]) -> bool| {
|
||||
let deadline = Instant::now() + Duration::from_secs(10);
|
||||
loop {
|
||||
let r = ask(json!({"id": 0, "method": "control.running", "token": token}));
|
||||
let rows = r["result"]["running"].as_array().cloned().unwrap_or_default();
|
||||
if until(&rows) || Instant::now() > deadline {
|
||||
return (r, rows);
|
||||
}
|
||||
std::thread::sleep(Duration::from_millis(10));
|
||||
}
|
||||
};
|
||||
let mut watcher = open();
|
||||
let (r, rows) = running(&mut watcher, &|_| true);
|
||||
assert!(r["ok"] == true && rows.is_empty(), "idle: {r}");
|
||||
|
||||
let mut export = open();
|
||||
let path = "/private/part.step";
|
||||
let params = json!({"command": "file.export", "params": {"path": path}});
|
||||
let r = export(json!({"id": 7, "method": "engine.execute", "params": params, "token": token}));
|
||||
assert_eq!(r["running"], true, "{r}");
|
||||
// A batch from another connection waits behind the export.
|
||||
let mut batch = open();
|
||||
let queued = std::thread::spawn(move || {
|
||||
let steps = json!([{"command": "solid.box"}, {"command": "solid.box"}]);
|
||||
batch(json!({"id": "b", "method": "engine.batch", "params": {"commands": steps}, "token": token}))
|
||||
});
|
||||
// The window may not have taken the export yet, even though it timed out.
|
||||
let (r, rows) = running(&mut watcher, &|rows| rows.len() == 2 && rows[0]["queued"] == false);
|
||||
assert_eq!(rows.len(), 2, "{r}");
|
||||
let (e, b) = (&rows[0], &rows[1]);
|
||||
assert_eq!(
|
||||
(&e["id"], &e["method"], &e["command"], &e["queued"]),
|
||||
(&json!(7), &json!("engine.execute"), &json!("file.export"), &json!(false)),
|
||||
"{r}"
|
||||
);
|
||||
assert!(e["running_s"].as_f64().is_some_and(|s| s >= 0.1), "{r}");
|
||||
assert_eq!((&b["id"], &b["method"], &b["steps"], &b["queued"]), (&json!("b"), &json!("engine.batch"), &json!(2), &json!(true)), "{r}");
|
||||
assert_ne!(e["connection"], b["connection"], "{r}");
|
||||
assert!(rows.iter().all(|row| row.get("self").is_none()), "{r}");
|
||||
assert!(!r.to_string().contains(path), "parameters stay with their connection: {r}");
|
||||
// The connection whose request timed out may ask too, and sees its own marked.
|
||||
let r = export(json!({"id": 8, "method": "control.running"}));
|
||||
let own: Vec<&Value> = r["result"]["running"].as_array().unwrap().iter().filter(|row| row["self"] == true).collect();
|
||||
assert_eq!(own.len(), 1, "{r}");
|
||||
assert_eq!(own[0]["command"], "file.export", "{r}");
|
||||
|
||||
gate_tx.send(()).unwrap();
|
||||
assert_eq!(queued.join().unwrap()["result"], "engine.batch");
|
||||
let (r, rows) = running(&mut watcher, &|rows| rows.is_empty());
|
||||
assert!(rows.is_empty(), "done: {r}");
|
||||
// Asking `control.running` did not take the export's reply from its connection.
|
||||
let r = export(json!({"id": 9, "method": "control.pending"}));
|
||||
assert_eq!((&r["result"]["pending"], &r["result"]["done"]), (&json!(7), &json!(true)), "{r}");
|
||||
}
|
||||
|
||||
/// #205: a connection runs nothing until a request carries the launch's token; a wrong or
|
||||
/// missing token, or garbage, is refused and the connection closed. Once shown, the token
|
||||
/// need not be repeated on that connection.
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
//! The graphics device was lost after the window opened: the driver was reset (on Windows a TDR,
|
||||
//! "Display driver stopped responding and has recovered") or the GPU went away (#4172). A lost
|
||||
//! device can't draw again, so the window can't show anything more, not even a message. The
|
||||
//! painter stops drawing (`egui_wgpu::DeviceLost`); the app then closes, keeping unsaved changes
|
||||
//! for recovery as a forced quit does, and starts again ([`restart`]), and the new start says what
|
||||
//! happened ([`note`]). A device lost again soon after such a restart starts the next one on the
|
||||
//! software renderer, which doesn't depend on the graphics driver.
|
||||
|
||||
use crate::startup;
|
||||
|
||||
/// Set on the start after a lost device: when the device was lost (seconds since 1970).
|
||||
pub const LOST_ENV: &str = "SOLIDCRAFT_DEVICE_LOST";
|
||||
|
||||
/// A loss this recent (seconds) counts for the start after it: its note, and a second loss
|
||||
/// within it starts on the software renderer. Inherited by later starts, an older stamp is
|
||||
/// ignored.
|
||||
const RECENT_SECS: u64 = 600;
|
||||
|
||||
/// Seconds since 1970.
|
||||
pub fn now_secs() -> u64 {
|
||||
std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).map_or(0, |d| d.as_secs())
|
||||
}
|
||||
|
||||
/// Whether `stamp` ([`LOST_ENV`]) names a loss at most [`RECENT_SECS`] before `now`.
|
||||
pub fn recent(stamp: Option<&str>, now: u64) -> bool {
|
||||
stamp.and_then(|s| s.trim().parse::<u64>().ok()).is_some_and(|at| at <= now && now - at <= RECENT_SECS)
|
||||
}
|
||||
|
||||
/// Whether the start after a lost device uses the software renderer: when this launch already
|
||||
/// followed a recent loss (the driver keeps losing it), or ran on it anyway.
|
||||
pub fn restart_on_software(after_recent_loss: bool, cpu_renderer: bool) -> bool {
|
||||
after_recent_loss || cpu_renderer
|
||||
}
|
||||
|
||||
/// What the start after a lost device tells the user, `software` when it runs on the software
|
||||
/// renderer.
|
||||
pub fn note(software: bool) -> String {
|
||||
let mut note = String::from(
|
||||
"The graphics device was reset (the graphics driver stopped responding), so SolidCraft closed and started again. Unsaved changes were kept for recovery.",
|
||||
);
|
||||
if software {
|
||||
note.push_str(" This start uses software rendering, which doesn't depend on the graphics driver.");
|
||||
}
|
||||
note
|
||||
}
|
||||
|
||||
/// Start SolidCraft again with the same arguments, the loss stamped at `lost_at`, on the software
|
||||
/// renderer when `software`.
|
||||
pub fn restart(software: bool, lost_at: u64) {
|
||||
let Ok(exe) = std::env::current_exe() else { return };
|
||||
let mut command = std::process::Command::new(exe);
|
||||
command.args(std::env::args_os().skip(1)).env(LOST_ENV, lost_at.to_string());
|
||||
if software {
|
||||
command.env(startup::RENDERER_ENV, "cpu");
|
||||
}
|
||||
#[cfg(windows)]
|
||||
{
|
||||
use std::os::windows::process::CommandExt;
|
||||
// Not tied to this process: its own process group, no console.
|
||||
command.creation_flags(0x0000_0200 | 0x0000_0008);
|
||||
}
|
||||
if let Err(e) = command.spawn() {
|
||||
log::error!("graphics: starting again after the device was lost: {e}");
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
/// Only a recent, well-formed stamp counts: a later start that inherited it says nothing.
|
||||
#[test]
|
||||
fn only_a_recent_loss_counts() {
|
||||
let now = 1_000_000;
|
||||
assert!(super::recent(Some("999990"), now));
|
||||
assert!(super::recent(Some(" 999400 "), now));
|
||||
assert!(!super::recent(Some("999399"), now), "older than ten minutes");
|
||||
assert!(!super::recent(Some("1000001"), now), "from the future");
|
||||
assert!(!super::recent(Some("soon"), now));
|
||||
assert!(!super::recent(None, now));
|
||||
}
|
||||
|
||||
/// The first loss starts again on the GPU; a second one soon after, on the software renderer.
|
||||
#[test]
|
||||
fn a_second_loss_in_a_row_starts_on_the_software_renderer() {
|
||||
assert!(!super::restart_on_software(false, false));
|
||||
assert!(super::restart_on_software(true, false));
|
||||
assert!(super::restart_on_software(false, true));
|
||||
assert!(super::note(true).contains("software rendering"));
|
||||
assert!(!super::note(false).contains("software rendering"));
|
||||
assert!(super::note(false).contains("kept for recovery"));
|
||||
}
|
||||
}
|
||||
@@ -19,42 +19,102 @@
|
||||
#[path = "../../../assets/icons/app/shared/source/app_icon.rs"]
|
||||
mod app_icon;
|
||||
mod control_server;
|
||||
mod device_lost;
|
||||
#[cfg(target_os = "windows")]
|
||||
mod native_crash;
|
||||
#[cfg(target_os = "windows")]
|
||||
mod native_frame;
|
||||
#[cfg(target_os = "macos")]
|
||||
mod native_menu;
|
||||
#[cfg(target_os = "macos")]
|
||||
mod open_documents;
|
||||
#[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
|
||||
mod space_mouse;
|
||||
mod startup;
|
||||
#[cfg(any(target_os = "windows", test))]
|
||||
mod window_fit;
|
||||
|
||||
use solidcraft_engine::{Session, io};
|
||||
use solidcraft_ui_egui::{Services, SolveApp};
|
||||
|
||||
/// Windows: put the restored window back inside the monitor's work area if it is out of reach
|
||||
/// (a gone monitor, another scale, a taskbar edge). Sizes are in points, the work area in pixels.
|
||||
#[cfg(target_os = "windows")]
|
||||
fn fit_window_to_work_area(ctx: &egui::Context, frame: &eframe::Frame) {
|
||||
use window_fit::Area;
|
||||
let Some((x, y, w, h)) = native_frame::work_area(frame) else { return };
|
||||
let (outer, inner, scale, maximized) = ctx.input(|i| {
|
||||
let v = i.viewport();
|
||||
(v.outer_rect, v.inner_rect, v.native_pixels_per_point, v.maximized.unwrap_or(false) || v.fullscreen.unwrap_or(false))
|
||||
});
|
||||
let (Some(outer), Some(inner), Some(scale)) = (outer, inner, scale.filter(|s| s.is_finite() && *s > 0.0)) else { return };
|
||||
if maximized {
|
||||
return;
|
||||
}
|
||||
let work = Area::new(x as f32 / scale, y as f32 / scale, w as f32 / scale, h as f32 / scale);
|
||||
let now = Area::new(outer.min.x, outer.min.y, outer.width(), outer.height());
|
||||
let fitted = window_fit::fit(now, work, (960.0, 600.0));
|
||||
if fitted != now {
|
||||
// The frame (title bar, borders) keeps its size; only the inner size follows.
|
||||
let inner_size = egui::vec2((inner.width() - (now.w - fitted.w)).max(1.0), (inner.height() - (now.h - fitted.h)).max(1.0));
|
||||
ctx.send_viewport_cmd(egui::ViewportCommand::InnerSize(inner_size));
|
||||
ctx.send_viewport_cmd(egui::ViewportCommand::OuterPosition(egui::pos2(fitted.x, fitted.y)));
|
||||
}
|
||||
}
|
||||
|
||||
/// `SOLIDCRAFT_PROFILE_STARTUP=1` prints the time since launch at each startup step.
|
||||
fn mark(step: &str) {
|
||||
static START: std::sync::OnceLock<(std::time::Instant, bool)> = std::sync::OnceLock::new();
|
||||
let (start, on) = START.get_or_init(|| (std::time::Instant::now(), solidcraft_engine::geom::env::var_os("PROFILE_STARTUP").is_some()));
|
||||
if *on {
|
||||
eprintln!("startup {:>6.0} ms {step}", start.elapsed().as_secs_f64() * 1000.0);
|
||||
}
|
||||
}
|
||||
|
||||
struct App {
|
||||
solve: SolveApp,
|
||||
/// The settings folder whose start marker the first frame clears (`startup::started`).
|
||||
starting: Option<std::path::PathBuf>,
|
||||
/// Frames begun; the second one means the first was drawn (startup is over).
|
||||
frames: u32,
|
||||
/// Started over the control channel: the window doesn't ask for the foreground.
|
||||
take_focus_unwanted: bool,
|
||||
/// The graphics device: lost, it can't draw again (`App::watch_device`, #4172).
|
||||
gpu: Option<LostWatch>,
|
||||
#[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
|
||||
space_mouse: space_mouse::SpaceMouse,
|
||||
#[cfg(target_os = "macos")]
|
||||
native_menu: Option<native_menu::NativeMenu>,
|
||||
}
|
||||
|
||||
impl eframe::App for App {
|
||||
fn logic(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
|
||||
if self.frames < 2 {
|
||||
self.frames += 1;
|
||||
// Before the window is shown: its title bar must be within reach (window_fit.rs).
|
||||
#[cfg(target_os = "windows")]
|
||||
if self.frames == 1 {
|
||||
fit_window_to_work_area(ctx, _frame);
|
||||
}
|
||||
mark(if self.frames == 1 { "first frame begins" } else { "second frame begins (first presented)" });
|
||||
// A second frame right away, which means the first was presented: the app is up.
|
||||
ctx.request_repaint();
|
||||
if self.frames == 2 {
|
||||
// The window is shown only once its first frame is presented, and Windows then
|
||||
// keeps a window of a process started from a shortcut or an installer behind the
|
||||
// others. Ask for the foreground once, now that it is on screen; never again, so
|
||||
// later frames don't take the focus from whatever the user moved to. Automation
|
||||
// over the control channel keeps the focus where it is.
|
||||
if !self.take_focus_unwanted {
|
||||
ctx.send_viewport_cmd(egui::ViewportCommand::Focus);
|
||||
}
|
||||
solidcraft_engine::crash::phase(solidcraft_engine::crash::RUNNING);
|
||||
if let Some(dir) = self.starting.take() {
|
||||
startup::started(&dir);
|
||||
}
|
||||
}
|
||||
}
|
||||
self.watch_device();
|
||||
// The design on screen is the one whose commands a crash report replays.
|
||||
self.solve.session.crash_journal = solidcraft_engine::crash::enabled();
|
||||
// The OS closing the window (Alt+F4, Cmd+Q, the window manager): ask about unsaved
|
||||
@@ -67,6 +127,10 @@ impl eframe::App for App {
|
||||
for f in if self.solve.file_picker_busy() { Vec::new() } else { open_documents::take() } {
|
||||
self.solve.open_path_async(&f);
|
||||
}
|
||||
#[cfg(target_os = "macos")]
|
||||
if let Some(menu) = &mut self.native_menu {
|
||||
menu.tick(&mut self.solve, ctx);
|
||||
}
|
||||
self.solve.logic(ctx);
|
||||
#[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
|
||||
if !self.solve.file_picker_busy() {
|
||||
@@ -77,6 +141,10 @@ impl eframe::App for App {
|
||||
}
|
||||
}
|
||||
fn raw_input_hook(&mut self, _ctx: &egui::Context, raw: &mut egui::RawInput) {
|
||||
#[cfg(target_os = "macos")]
|
||||
if let Some(menu) = &mut self.native_menu {
|
||||
menu.raw_input_hook(&mut self.solve, _ctx, raw);
|
||||
}
|
||||
// Before the app's own hook, which adds the control channel's events.
|
||||
#[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
|
||||
self.space_mouse.raw_input_hook(self.solve.preferences.space_mouse_enabled, raw);
|
||||
@@ -95,6 +163,9 @@ impl eframe::App for App {
|
||||
solidcraft_ui_egui::save_job::tick(&mut self.solve, true);
|
||||
solidcraft_ui_egui::recovery_ui::close(&mut self.solve);
|
||||
solidcraft_engine::crash::end_session();
|
||||
if let Some(lost_at) = self.gpu.as_ref().and_then(|g| g.lost_at) {
|
||||
device_lost::restart(self.gpu.as_ref().is_some_and(|g| g.restart_on_software), lost_at);
|
||||
}
|
||||
// An update asked to restart into the new version or to run its installer.
|
||||
if let Some((program, args)) = solidcraft_ui_egui::update::take_launch(&mut self.solve) {
|
||||
let mut command = std::process::Command::new(&program);
|
||||
@@ -114,6 +185,48 @@ impl eframe::App for App {
|
||||
}
|
||||
}
|
||||
|
||||
/// The window's graphics device, watched for its loss.
|
||||
struct LostWatch {
|
||||
lost: eframe::egui_wgpu::DeviceLost,
|
||||
/// Where the next start runs once this device is lost ([`device_lost::restart_on_software`]).
|
||||
restart_on_software: bool,
|
||||
/// When the loss was seen: the app is closing to start again.
|
||||
lost_at: Option<u64>,
|
||||
}
|
||||
|
||||
impl App {
|
||||
/// The graphics device was lost (#4172): the window can't draw again, so close, keeping
|
||||
/// unsaved changes for recovery as a forced quit does (the window can't ask about them), and
|
||||
/// start again once closed ([`device_lost::restart`]).
|
||||
fn watch_device(&mut self) {
|
||||
let Some(gpu) = self.gpu.as_mut().filter(|g| g.lost_at.is_none() && g.lost.is_lost()) else { return };
|
||||
let reason = gpu.lost.reason().unwrap_or_default();
|
||||
log::error!("graphics: the device was lost ({reason}); closing to start again");
|
||||
eprintln!("SolidCraft graphics: the device was lost ({reason}); starting again");
|
||||
solidcraft_engine::crash::phase(&format!("graphics device lost: {reason}"));
|
||||
gpu.lost_at = Some(device_lost::now_secs());
|
||||
self.solve.quit_requested = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// Linux file dialogs match patterns by case, so each extension goes in as lower and upper
|
||||
/// case, plus FreeCAD's own mixed casing.
|
||||
fn case_variants(exts: &[&str]) -> Vec<String> {
|
||||
let mut all: Vec<String> = Vec::new();
|
||||
for e in exts {
|
||||
let mut forms = vec![e.to_ascii_lowercase(), e.to_ascii_uppercase()];
|
||||
if e.eq_ignore_ascii_case("fcstd") {
|
||||
forms.push("FCStd".into());
|
||||
}
|
||||
for v in forms {
|
||||
if !all.contains(&v) {
|
||||
all.push(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
all
|
||||
}
|
||||
|
||||
fn services(cc: &eframe::CreationContext<'_>) -> Services {
|
||||
let parent = rfd::AsyncFileDialog::new().set_parent(cc);
|
||||
let open_parent = parent.clone();
|
||||
@@ -125,48 +238,14 @@ fn services(cc: &eframe::CreationContext<'_>) -> Services {
|
||||
let mut dialog = open_parent.clone();
|
||||
if !first.is_empty() {
|
||||
let label = first.iter().map(|e| e.to_uppercase()).collect::<Vec<_>>().join(", ");
|
||||
let both: Vec<String> = first.iter().flat_map(|e| [e.to_lowercase(), e.to_uppercase()]).collect();
|
||||
dialog = dialog.add_filter(label, &both);
|
||||
dialog = dialog.add_filter(label, &case_variants(first));
|
||||
}
|
||||
let future = dialog
|
||||
.add_filter(
|
||||
"Designs, CAD files and meshes",
|
||||
&[
|
||||
io::DESIGN_EXT,
|
||||
io::LEGACY_DESIGN_EXT,
|
||||
"json",
|
||||
"step",
|
||||
"stp",
|
||||
"STEP",
|
||||
"STP",
|
||||
"igs",
|
||||
"iges",
|
||||
"IGS",
|
||||
"IGES",
|
||||
"FCStd",
|
||||
"fcstd",
|
||||
"3dm",
|
||||
"3DM",
|
||||
"3mf",
|
||||
"3MF",
|
||||
"stl",
|
||||
"STL",
|
||||
"obj",
|
||||
"OBJ",
|
||||
"glb",
|
||||
"GLB",
|
||||
"gltf",
|
||||
"GLTF",
|
||||
],
|
||||
)
|
||||
.add_filter("SolidCraft design (container or JSON)", &[io::DESIGN_EXT, io::LEGACY_DESIGN_EXT, "json"])
|
||||
.add_filter("STEP", &["step", "stp", "STEP", "STP"])
|
||||
.add_filter("IGES", &["igs", "iges", "IGS", "IGES"])
|
||||
.add_filter("FreeCAD and Rhino", &["FCStd", "fcstd", "3dm", "3DM"])
|
||||
.add_filter("Mesh (3MF, STL, OBJ, glTF)", &["3mf", "3MF", "stl", "STL", "obj", "OBJ", "glb", "GLB", "gltf", "GLTF"])
|
||||
.add_filter("Sketch drawings (DXF, SVG)", &["dxf", "DXF", "svg", "SVG"])
|
||||
.add_filter("All files", &["*"])
|
||||
.pick_file();
|
||||
// The groups come from the format registry, so a new format joins this dialog by itself.
|
||||
dialog = dialog.add_filter("Designs, CAD files and meshes", &case_variants(&io::formats::open_extensions(true)));
|
||||
for (label, exts) in io::formats::import_filters(true) {
|
||||
dialog = dialog.add_filter(label, &case_variants(&exts));
|
||||
}
|
||||
let future = dialog.add_filter("All files", &["*"]).pick_file();
|
||||
Box::pin(async move { future.await.map(|p| p.path().to_string_lossy().into_owned()) })
|
||||
})),
|
||||
// One kind of file (the agent chat's attachments): only the types it names, as given and in
|
||||
@@ -431,6 +510,18 @@ fn backend_preference() -> Option<String> {
|
||||
graphics().and_then(|v| v.get("backend").and_then(serde_json::Value::as_str).map(str::to_string))
|
||||
}
|
||||
|
||||
/// The viewport scene's sample count: the app's anti-aliasing (the window's pass is 1x), clamped
|
||||
/// by the backend's policy (OpenGL renders 1x, see `effective_msaa_samples`). A count the device
|
||||
/// cannot render with falls back to the supported default.
|
||||
fn scene_samples(backend: eframe::wgpu::Backend, samples: u32, supported: &[u32]) -> u32 {
|
||||
let requested = eframe::egui_wgpu::effective_msaa_samples(backend, samples.max(1));
|
||||
if requested <= 1 || supported.is_empty() || supported.contains(&requested) {
|
||||
requested
|
||||
} else {
|
||||
supported.iter().copied().filter(|&n| n <= solidcraft_ui_egui::prefs::Prefs::default().msaa).max().unwrap_or(1)
|
||||
}
|
||||
}
|
||||
|
||||
/// Anti-aliasing samples from Preferences (4 when unset).
|
||||
fn msaa() -> u16 {
|
||||
graphics()
|
||||
@@ -477,6 +568,9 @@ fn app_viewport() -> Result<egui::ViewportBuilder, eframe::Error> {
|
||||
const APP_ID: &str = solidcraft_engine::io::APP_ID;
|
||||
|
||||
fn main() -> eframe::Result {
|
||||
#[cfg(target_os = "macos")]
|
||||
objc2_foundation::NSProcessInfo::processInfo().setProcessName(objc2_foundation::ns_string!("SolidCraft"));
|
||||
mark("main");
|
||||
adopt_legacy_settings();
|
||||
let mut safe_mode = startup::env_on(std::env::var(startup::SAFE_MODE_ENV).ok().as_deref());
|
||||
let mut control_port: Option<u16> = solidcraft_engine::geom::env::var("CONTROL_PORT").and_then(|p| p.parse().ok());
|
||||
@@ -526,6 +620,11 @@ fn main() -> eframe::Result {
|
||||
notes.push(format!("The last {failed_starts} launches stopped before the window opened, so this one is in safe mode."));
|
||||
}
|
||||
let cpu_renderer = safe_mode || startup::cpu_renderer_env(std::env::var(startup::RENDERER_ENV).ok().as_deref());
|
||||
// The launch before this one closed because its graphics device was lost (`App::watch_device`).
|
||||
let after_loss = device_lost::recent(std::env::var(device_lost::LOST_ENV).ok().as_deref(), device_lost::now_secs());
|
||||
if after_loss {
|
||||
notes.push(device_lost::note(cpu_renderer));
|
||||
}
|
||||
if safe_mode {
|
||||
notes.push("Safe mode: default settings (yours are kept for the next normal start), no recovery offer, software rendering.".into());
|
||||
}
|
||||
@@ -551,9 +650,11 @@ fn main() -> eframe::Result {
|
||||
solidcraft_engine::crash::phase("window");
|
||||
let options = eframe::NativeOptions {
|
||||
viewport: app_viewport()?,
|
||||
depth_buffer: depth_bits,
|
||||
stencil_buffer: STENCIL_BITS,
|
||||
multisampling: samples,
|
||||
// The window's pass (egui's) has no depth and one sample: the viewport draws its scene
|
||||
// offscreen with its own depth and MSAA, then blits it, so the UI pass pays for neither.
|
||||
depth_buffer: 0,
|
||||
stencil_buffer: 0,
|
||||
multisampling: 1,
|
||||
// Kept with the other settings, not in a folder named after the app id. Safe mode reads
|
||||
// and writes a scratch copy, leaving the user's settings as they were.
|
||||
persistence_path: if safe_mode {
|
||||
@@ -587,13 +688,17 @@ fn main() -> eframe::Result {
|
||||
let created = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false));
|
||||
let created_in_app = created.clone();
|
||||
let starting = settings.clone();
|
||||
mark("run_native");
|
||||
let result = eframe::run_native(
|
||||
"SolidCraft",
|
||||
options,
|
||||
Box::new(move |cc| {
|
||||
created_in_app.store(true, std::sync::atomic::Ordering::SeqCst);
|
||||
solidcraft_engine::crash::phase("app setup");
|
||||
solidcraft_ui_egui::fonts::setup_fonts(&cc.egui_ctx);
|
||||
mark("window and device ready");
|
||||
solidcraft_ui_egui::fonts::setup_bundled_fonts(&cc.egui_ctx);
|
||||
solidcraft_ui_egui::fonts::load_system_fonts_in_background(&cc.egui_ctx);
|
||||
mark("fonts");
|
||||
let mut app = SolveApp::new(Session::default(), services(cc));
|
||||
app.apply_off_thread = Some(solidcraft_ui_egui::dialogs::APPLY_AT_ONCE);
|
||||
app.custom_titlebar = CUSTOM_TITLEBAR;
|
||||
@@ -611,10 +716,17 @@ fn main() -> eframe::Result {
|
||||
if let Some(p) = cc.storage.and_then(|s| solidcraft_ui_egui::prefs::stored(|k| s.get_string(k))).filter(|_| !safe_mode) {
|
||||
app.load_prefs(&p);
|
||||
}
|
||||
mark("app state and prefs");
|
||||
let gpu = cc.wgpu_render_state.as_ref().map(|rs| LostWatch {
|
||||
lost: rs.device_lost.clone(),
|
||||
restart_on_software: device_lost::restart_on_software(after_loss, cpu_renderer),
|
||||
lost_at: None,
|
||||
});
|
||||
if let Some(rs) = &cc.wgpu_render_state {
|
||||
eprintln!("SolidCraft graphics: {:?}, MSAA {}x (requested {}x)", rs.adapter.get_info().backend, rs.msaa_samples, samples);
|
||||
let scene_samples = scene_samples(rs.adapter.get_info().backend, u32::from(samples), &rs.msaa_supported);
|
||||
eprintln!("SolidCraft graphics: {:?}, MSAA {scene_samples}x (requested {}x)", rs.adapter.get_info().backend, samples);
|
||||
solidcraft_engine::crash::phase("viewport pipelines (shader compile)");
|
||||
app.set_wgpu(rs, depth_bits, STENCIL_BITS, rs.msaa_samples);
|
||||
app.set_wgpu_split(rs, depth_bits, STENCIL_BITS, scene_samples);
|
||||
solidcraft_ui_egui::gpu::install_picture_renderer(rs);
|
||||
// The graphics driver is loaded now; it may have put its own exception filter
|
||||
// in front of ours.
|
||||
@@ -624,10 +736,11 @@ fn main() -> eframe::Result {
|
||||
solidcraft_ui_egui::prefs::check_msaa(&mut app, u32::from(samples));
|
||||
let info = rs.adapter.get_info();
|
||||
solidcraft_engine::crash::set_environment(&format!(
|
||||
"Renderer: {:?} {} ({}), MSAA {}x",
|
||||
info.backend, info.name, info.driver, rs.msaa_samples
|
||||
"Renderer: {:?} {} ({}), MSAA {scene_samples}x",
|
||||
info.backend, info.name, info.driver
|
||||
));
|
||||
}
|
||||
mark("viewport pipelines");
|
||||
if let Some(port) = control_port {
|
||||
let rx = control_server::start(port, cc.egui_ctx.clone());
|
||||
app = app.with_control(rx);
|
||||
@@ -680,13 +793,30 @@ fn main() -> eframe::Result {
|
||||
}
|
||||
#[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
|
||||
let space_mouse = space_mouse::SpaceMouse::start(&cc.egui_ctx);
|
||||
#[cfg(target_os = "macos")]
|
||||
let native_menu = match native_menu::NativeMenu::new(&app, &cc.egui_ctx) {
|
||||
Ok(menu) => Some(menu),
|
||||
Err(error) => {
|
||||
app.set_status(format!("System menu: {error}"), true);
|
||||
None
|
||||
}
|
||||
};
|
||||
#[cfg(target_os = "macos")]
|
||||
{
|
||||
app.native_file_menu = native_menu.is_some();
|
||||
}
|
||||
mark("app created");
|
||||
solidcraft_engine::crash::phase("first frame");
|
||||
Ok(Box::new(App {
|
||||
solve: app,
|
||||
starting,
|
||||
frames: 0,
|
||||
take_focus_unwanted: control_port.is_some(),
|
||||
gpu,
|
||||
#[cfg(any(target_os = "windows", target_os = "linux", target_os = "macos"))]
|
||||
space_mouse,
|
||||
#[cfg(target_os = "macos")]
|
||||
native_menu,
|
||||
}))
|
||||
}),
|
||||
);
|
||||
@@ -848,4 +978,13 @@ mod msaa_tests {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_scene_follows_the_backend_policy_too() {
|
||||
use eframe::wgpu::Backend;
|
||||
assert_eq!(super::scene_samples(Backend::Gl, 4, &[1, 4]), 1);
|
||||
assert_eq!(super::scene_samples(Backend::Gl, 4, &[]), 1);
|
||||
assert_eq!(super::scene_samples(Backend::Vulkan, 4, &[1, 4]), 4);
|
||||
assert_eq!(super::scene_samples(Backend::Dx12, 8, &[1, 2, 4]), 4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ use std::sync::atomic::{AtomicIsize, Ordering};
|
||||
use raw_window_handle::{HasWindowHandle, RawWindowHandle};
|
||||
use solidcraft_ui_egui::titlebar;
|
||||
use windows_sys::Win32::Foundation::{HWND, LPARAM, LRESULT, RECT, SIZE, WPARAM};
|
||||
use windows_sys::Win32::Graphics::Gdi::{GetMonitorInfoW, MONITOR_DEFAULTTONEAREST, MONITORINFO, MonitorFromWindow};
|
||||
use windows_sys::Win32::UI::HiDpi::{GetDpiForWindow, GetSystemMetricsForDpi};
|
||||
use windows_sys::Win32::UI::WindowsAndMessaging::{
|
||||
CallWindowProcW, GWL_STYLE, GWLP_WNDPROC, GetClientRect, GetWindowLongPtrW, GetWindowRect, HTBOTTOM, HTBOTTOMLEFT, HTBOTTOMRIGHT, HTLEFT,
|
||||
@@ -33,6 +34,26 @@ use windows_sys::Win32::UI::WindowsAndMessaging::{
|
||||
WM_NCDESTROY, WM_NCHITTEST, WNDPROC, WS_THICKFRAME,
|
||||
};
|
||||
|
||||
/// The work area (the monitor without the taskbar) of the monitor nearest the window, in physical
|
||||
/// pixels: left, top, width, height.
|
||||
pub fn work_area(window: &impl HasWindowHandle) -> Option<(i32, i32, i32, i32)> {
|
||||
let handle = window.window_handle().ok()?;
|
||||
let RawWindowHandle::Win32(w) = handle.as_raw() else { return None };
|
||||
let hwnd = w.hwnd.get() as HWND;
|
||||
// SAFETY: `hwnd` is the live main window; `info` is a MONITORINFO with its size set, as
|
||||
// GetMonitorInfoW requires, and the monitor handle comes from the call before it.
|
||||
let rc = unsafe {
|
||||
let monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
|
||||
let mut info: MONITORINFO = std::mem::zeroed();
|
||||
info.cbSize = std::mem::size_of::<MONITORINFO>() as u32;
|
||||
if monitor.is_null() || GetMonitorInfoW(monitor, &mut info) == 0 {
|
||||
return None;
|
||||
}
|
||||
info.rcWork
|
||||
};
|
||||
Some((rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top))
|
||||
}
|
||||
|
||||
/// The window procedure ours replaced (winit's), as an address; 0 before [`install`].
|
||||
static PREVIOUS: AtomicIsize = AtomicIsize::new(0);
|
||||
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
//! macOS system menus, owned and updated on eframe's main thread.
|
||||
|
||||
use std::sync::mpsc::{Receiver, sync_channel};
|
||||
|
||||
use muda::{
|
||||
AboutMetadata, Menu, MenuEvent, MenuItem, PredefinedMenuItem, Submenu,
|
||||
accelerator::{Accelerator, Code, Modifiers},
|
||||
};
|
||||
use solidcraft_ui_egui::{SolveApp, toolbar::FileAction};
|
||||
|
||||
pub struct NativeMenu {
|
||||
menu: Menu,
|
||||
actions: Vec<(MenuItem, FileAction)>,
|
||||
help_actions: Vec<(MenuItem, &'static str)>,
|
||||
events: Receiver<MenuEvent>,
|
||||
recent: Submenu,
|
||||
recent_paths: Vec<String>,
|
||||
}
|
||||
|
||||
impl NativeMenu {
|
||||
pub fn new(app: &SolveApp, ctx: &egui::Context) -> muda::Result<Self> {
|
||||
let menu = Menu::new();
|
||||
let application = Submenu::new("SolidCraft", true);
|
||||
let file = Submenu::new(app.tr("ui.file"), true);
|
||||
let edit = Submenu::new(app.tr_label("Edit"), true);
|
||||
let recent = Submenu::new(app.tr("ui.open_recent"), true);
|
||||
let window = Submenu::new("Window", true);
|
||||
let help = Submenu::new(app.tr("ui.help"), true);
|
||||
let mut help_actions = Vec::new();
|
||||
let mut actions = Vec::new();
|
||||
let mut add = |parent: &Submenu, label: &str, action: FileAction, shortcut: Option<Accelerator>| -> muda::Result<()> {
|
||||
let item = MenuItem::new(label, Self::action_enabled(&action, app, ctx), shortcut);
|
||||
parent.append(&item)?;
|
||||
actions.push((item, action));
|
||||
Ok(())
|
||||
};
|
||||
application.append(&PredefinedMenuItem::about(
|
||||
Some("About SolidCraft"),
|
||||
Some(AboutMetadata { name: Some("SolidCraft".into()), version: Some(env!("CARGO_PKG_VERSION").into()), ..Default::default() }),
|
||||
))?;
|
||||
application.append(&PredefinedMenuItem::separator())?;
|
||||
add(
|
||||
&application,
|
||||
&format!("{}\u{2026}", app.tr("ui.preferences")),
|
||||
FileAction::Settings,
|
||||
Some(Accelerator::new(Modifiers::META, Code::Comma)),
|
||||
)?;
|
||||
add(&application, &format!("{}\u{2026}", app.tr("ui.keyboard_shortcuts")), FileAction::Shortcuts, None)?;
|
||||
application.append(&PredefinedMenuItem::separator())?;
|
||||
application.append(&PredefinedMenuItem::services(None))?;
|
||||
application.append(&PredefinedMenuItem::separator())?;
|
||||
application.append_items(&[
|
||||
&PredefinedMenuItem::hide(Some("Hide SolidCraft")),
|
||||
&PredefinedMenuItem::hide_others(None),
|
||||
&PredefinedMenuItem::show_all(None),
|
||||
&PredefinedMenuItem::separator(),
|
||||
])?;
|
||||
add(&application, &format!("{} SolidCraft", app.tr("ui.quit")), FileAction::Quit, Some(Accelerator::new(Modifiers::META, Code::KeyQ)))?;
|
||||
add(&file, app.tr("ui.new_design"), FileAction::New, Some(Accelerator::new(Modifiers::META, Code::KeyN)))?;
|
||||
add(&file, &format!("{}\u{2026}", app.tr("ui.open")), FileAction::Open, Some(Accelerator::new(Modifiers::META, Code::KeyO)))?;
|
||||
file.append(&recent)?;
|
||||
file.append(&PredefinedMenuItem::separator())?;
|
||||
for (label, command) in
|
||||
[("Insert STEP\u{2026}", "file.insert_step"), ("Insert Mesh\u{2026}", "file.insert_mesh"), ("Insert Design", "component.insert_design")]
|
||||
{
|
||||
add(&file, app.tr_label(label), FileAction::Command(command), None)?;
|
||||
}
|
||||
file.append(&PredefinedMenuItem::separator())?;
|
||||
add(&file, app.tr("ui.save"), FileAction::Save, Some(Accelerator::new(Modifiers::META, Code::KeyS)))?;
|
||||
add(
|
||||
&file,
|
||||
&format!("{}\u{2026}", app.tr("ui.save_as")),
|
||||
FileAction::SaveAs,
|
||||
Some(Accelerator::new(Modifiers::META | Modifiers::SHIFT, Code::KeyS)),
|
||||
)?;
|
||||
add(&file, app.tr_label("Save As JSON\u{2026}"), FileAction::SaveJson, None)?;
|
||||
file.append(&PredefinedMenuItem::separator())?;
|
||||
for (label, action) in [
|
||||
("Export STL\u{2026}", FileAction::ExportMesh("stl")),
|
||||
("Export 3MF\u{2026}", FileAction::ExportMesh("3mf")),
|
||||
("Export STEP\u{2026}", FileAction::Export("step")),
|
||||
("Export Current View as DXF\u{2026}", FileAction::Command("file.export_view_dxf")),
|
||||
("Export OBJ\u{2026}", FileAction::Export("obj")),
|
||||
("Export URDF\u{2026}", FileAction::Export("urdf")),
|
||||
("Export Design as JSON\u{2026}", FileAction::Export("json")),
|
||||
] {
|
||||
add(&file, app.tr_label(label), action, None)?;
|
||||
}
|
||||
file.append(&PredefinedMenuItem::separator())?;
|
||||
add(&file, app.tr_label("Design Properties"), FileAction::Command("document.metadata"), None)?;
|
||||
add(&edit, app.tr("ui.undo"), FileAction::Undo, Some(Accelerator::new(Modifiers::META, Code::KeyZ)))?;
|
||||
add(&edit, app.tr("ui.redo"), FileAction::Redo, Some(Accelerator::new(Modifiers::META | Modifiers::SHIFT, Code::KeyZ)))?;
|
||||
add(&window, app.tr_label("Agent Chat"), FileAction::AgentChat, None)?;
|
||||
window.append(&PredefinedMenuItem::separator())?;
|
||||
window.append_items(&[
|
||||
&PredefinedMenuItem::minimize(None),
|
||||
&PredefinedMenuItem::maximize(None),
|
||||
&PredefinedMenuItem::fullscreen(None),
|
||||
&PredefinedMenuItem::separator(),
|
||||
&PredefinedMenuItem::bring_all_to_front(None),
|
||||
])?;
|
||||
for (action, label) in [
|
||||
("docs", "Documentation"),
|
||||
("shortcuts", "Keyboard Shortcuts"),
|
||||
("messages", "Messages\u{2026}"),
|
||||
("report", "Report an Issue\u{2026}"),
|
||||
("crashes", "Crash Reports\u{2026}"),
|
||||
] {
|
||||
let item = MenuItem::new(app.tr_label(label), true, None);
|
||||
help.append(&item)?;
|
||||
help_actions.push((item, action));
|
||||
}
|
||||
menu.append_items(&[&application, &file, &edit, &window, &help])?;
|
||||
let (sender, events) = sync_channel(64);
|
||||
let ctx = ctx.clone();
|
||||
MenuEvent::set_event_handler(Some(move |event| {
|
||||
let _ = sender.try_send(event);
|
||||
ctx.request_repaint();
|
||||
}));
|
||||
menu.init_for_nsapp();
|
||||
let mut native = Self { menu, actions, help_actions, events, recent, recent_paths: Vec::new() };
|
||||
native.update_recent(app)?;
|
||||
Ok(native)
|
||||
}
|
||||
|
||||
pub fn raw_input_hook(&mut self, app: &mut SolveApp, ctx: &egui::Context, raw: &mut egui::RawInput) {
|
||||
for event in self.events.try_iter().take(64) {
|
||||
if let Some((_, action)) = self.help_actions.iter().find(|(item, _)| item.id() == &event.id) {
|
||||
solidcraft_ui_egui::help::run(app, ctx, action);
|
||||
}
|
||||
if let Some((_, action)) = self.actions.iter().find(|(item, _)| item.id() == &event.id) {
|
||||
if matches!(action, FileAction::Undo | FileAction::Redo) && ctx.egui_wants_keyboard_input() {
|
||||
raw.events.push(egui::Event::Key {
|
||||
key: egui::Key::Z,
|
||||
physical_key: None,
|
||||
pressed: true,
|
||||
repeat: false,
|
||||
modifiers: egui::Modifiers { command: true, mac_cmd: true, shift: matches!(action, FileAction::Redo), ..Default::default() },
|
||||
});
|
||||
} else {
|
||||
action.run(app);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn action_enabled(action: &FileAction, app: &SolveApp, ctx: &egui::Context) -> bool {
|
||||
action.enabled(app)
|
||||
|| (matches!(action, FileAction::Undo | FileAction::Redo) && ctx.egui_wants_keyboard_input() && FileAction::Settings.enabled(app))
|
||||
}
|
||||
|
||||
pub fn tick(&mut self, app: &mut SolveApp, ctx: &egui::Context) {
|
||||
for (item, action) in &self.actions {
|
||||
let enabled = Self::action_enabled(action, app, ctx);
|
||||
if item.is_enabled() != enabled {
|
||||
item.set_enabled(enabled);
|
||||
}
|
||||
}
|
||||
if !self.recent_paths.iter().eq(app.home.recent.iter().take(32))
|
||||
&& let Err(error) = self.update_recent(app)
|
||||
{
|
||||
app.set_status(format!("Recent designs menu: {error}"), true);
|
||||
}
|
||||
}
|
||||
|
||||
fn update_recent(&mut self, app: &SolveApp) -> muda::Result<()> {
|
||||
while self.recent.remove_at(0).is_some() {}
|
||||
self.actions.retain(|(_, action)| !matches!(action, FileAction::OpenRecent(_) | FileAction::ClearRecent));
|
||||
self.recent_paths = app.home.recent.iter().take(32).cloned().collect();
|
||||
for path in &self.recent_paths {
|
||||
let action = FileAction::OpenRecent(path.clone());
|
||||
let item = MenuItem::new(path, action.enabled(app), None);
|
||||
self.recent.append(&item)?;
|
||||
self.actions.push((item, action));
|
||||
}
|
||||
self.recent.append(&PredefinedMenuItem::separator())?;
|
||||
let clear = MenuItem::new(app.tr("ui.clear_recent"), !self.recent_paths.is_empty(), None);
|
||||
self.recent.append(&clear)?;
|
||||
self.actions.push((clear, FileAction::ClearRecent));
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for NativeMenu {
|
||||
fn drop(&mut self) {
|
||||
MenuEvent::set_event_handler(None::<fn(MenuEvent)>);
|
||||
self.menu.remove_for_nsapp();
|
||||
}
|
||||
}
|
||||
@@ -7,21 +7,42 @@
|
||||
mod hidraw;
|
||||
#[cfg(target_os = "linux")]
|
||||
mod spacenavd;
|
||||
#[cfg(target_os = "windows")]
|
||||
mod windows_hid;
|
||||
|
||||
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
||||
use std::ffi::CString;
|
||||
#[cfg(target_os = "linux")]
|
||||
use std::sync::atomic::AtomicU8;
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
use egui::Context;
|
||||
#[cfg(target_os = "macos")]
|
||||
use hidapi::DeviceInfo;
|
||||
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
||||
use hidapi::{DeviceInfo, HidApi};
|
||||
use hidapi::HidApi;
|
||||
use quick_xml::Reader;
|
||||
use quick_xml::events::Event;
|
||||
use solidcraft_space_mouse::Layout;
|
||||
use solidcraft_ui_egui::SolveApp;
|
||||
#[cfg(target_os = "linux")]
|
||||
use solidcraft_ui_egui::prefs::SpaceMouseDriver;
|
||||
#[cfg(target_os = "linux")]
|
||||
use solidcraft_ui_egui::space_mouse::DriversPresent;
|
||||
use solidcraft_ui_egui::space_mouse::{Axes, AxisRule, Calibration, DriverMapping, WheelGuard, calibrated, calibration, navigate_frame};
|
||||
|
||||
const STALE_AFTER: Duration = Duration::from_millis(150);
|
||||
/// How long a held (spacenavd) reading that is nearly at rest may go without a new record before
|
||||
/// it reads as rest: spacenavd sends no final record when the cap springs back, only the last
|
||||
/// small leftover. Longer than `STALE_AFTER` so a light, steady hold gets a moment before it ends.
|
||||
const HELD_SETTLE_AFTER: Duration = Duration::from_millis(500);
|
||||
/// How far from rest (raw units, full deflection is 350) every axis of a held reading must be for
|
||||
/// it to settle. The dead zone is 20, but the last records of real releases reach 129 on one axis
|
||||
/// (tangency-labs/solidcraft#3523), so this sits well above it. A firmer push is a deliberate
|
||||
/// hold and stays.
|
||||
const HELD_SETTLE_BAND: u16 = 150;
|
||||
/// Whether the 3Dconnexion driver (macOS) has the device: it then reports the cap, and reading
|
||||
/// the HID device would fail or report it twice.
|
||||
static DRIVER_CONNECTED: AtomicBool = AtomicBool::new(false);
|
||||
@@ -199,9 +220,11 @@ struct Reading {
|
||||
/// When each of X, Y, Z, Rx, Ry and Rz last arrived. Each ages on its own: a device may send
|
||||
/// translation and rotation in separate reports, or spread even one group over several.
|
||||
at: [Instant; 6],
|
||||
/// The source says when the cap is back at rest, so a reading stays until the next one.
|
||||
/// A HID device repeats its report while the cap is held; spacenavd sends a record only when
|
||||
/// the values change, and a steady hold can go seconds without one.
|
||||
/// The source sends a record only when the values change, so a reading stays until the next
|
||||
/// one: a steady hold can go seconds without one. It never says when the cap springs back,
|
||||
/// though, so a reading within `HELD_SETTLE_BAND` of rest on every axis settles after
|
||||
/// `HELD_SETTLE_AFTER`. A HID device repeats its report while the cap is held, so it ages out
|
||||
/// per axis instead.
|
||||
held: bool,
|
||||
}
|
||||
|
||||
@@ -214,7 +237,14 @@ impl Reading {
|
||||
/// is calibrated, so a device that rests off zero calibrates to no motion rather than drifting.
|
||||
fn current(self, now: Instant, rest: Axes) -> Axes {
|
||||
let mut axes = self.axes;
|
||||
if !self.held {
|
||||
if self.held {
|
||||
let values = axes.translation.into_iter().chain(axes.rotation);
|
||||
let rests = rest.translation.into_iter().chain(rest.rotation);
|
||||
let near_rest = values.zip(rests).all(|(value, rest)| value.abs_diff(rest) <= HELD_SETTLE_BAND);
|
||||
if near_rest && now.duration_since(self.at[0]) >= HELD_SETTLE_AFTER {
|
||||
return rest;
|
||||
}
|
||||
} else {
|
||||
let rest = rest.translation.into_iter().chain(rest.rotation);
|
||||
for ((value, at), rest) in axes.translation.iter_mut().chain(axes.rotation.iter_mut()).zip(self.at).zip(rest) {
|
||||
if now.duration_since(at) >= STALE_AFTER {
|
||||
@@ -232,8 +262,9 @@ fn at_rest(calibration: Option<Calibration>) -> Axes {
|
||||
}
|
||||
|
||||
/// The Generic Desktop "Multi-Axis Controller" usage names a 3D mouse's motion interface, whoever
|
||||
/// made it, and excludes ordinary mice and the keyboard interfaces of 3D mice.
|
||||
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
||||
/// made it, and excludes ordinary mice and the keyboard interfaces of 3D mice. (Windows asks Plug
|
||||
/// and Play for the same usage: `windows_hid`.)
|
||||
#[cfg(target_os = "macos")]
|
||||
fn is_3d_mouse(info: &DeviceInfo) -> bool {
|
||||
info.usage_page() == 0x01 && info.usage() == 0x08
|
||||
}
|
||||
@@ -253,15 +284,18 @@ fn decode_report(report: &[u8], layout: Layout, reading: &mut Reading, now: Inst
|
||||
true
|
||||
}
|
||||
|
||||
/// Publishes one input report from the device to the egui thread.
|
||||
/// Publishes one input report from the device to the egui thread. A report that reads the same as
|
||||
/// the reading it replaces is no news — a device may repeat its report at rest — so it asks for no
|
||||
/// frame; while the cap moves, the view asks for the next frame itself.
|
||||
fn publish(ctx: &Context, shared: &Mutex<Reading>, layout: Layout, report: &[u8]) {
|
||||
if DRIVER_CONNECTED.load(Ordering::Relaxed) {
|
||||
return;
|
||||
}
|
||||
if let Ok(mut reading) = shared.lock()
|
||||
&& decode_report(report, layout, &mut reading, Instant::now())
|
||||
{
|
||||
ctx.request_repaint();
|
||||
if let Ok(mut reading) = shared.lock() {
|
||||
let before = reading.axes;
|
||||
if decode_report(report, layout, &mut reading, Instant::now()) && reading.axes != before {
|
||||
ctx.request_repaint();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -293,18 +327,48 @@ fn reset(ctx: &Context, shared: &Mutex<Reading>) {
|
||||
ctx.request_repaint();
|
||||
}
|
||||
|
||||
/// The HID interfaces that are 3D mice, by path. Windows asks Plug and Play, which sends nothing to
|
||||
/// the devices: hidapi's enumeration would ask every keyboard and mouse for its strings on each scan
|
||||
/// (#2614, `windows_hid`).
|
||||
#[cfg(target_os = "windows")]
|
||||
fn candidates(_api: &mut HidApi) -> Vec<CString> {
|
||||
windows_hid::multi_axis_controllers()
|
||||
}
|
||||
|
||||
/// The HID interfaces that are 3D mice, by path, from hidapi's enumeration (IOKit's registry).
|
||||
#[cfg(target_os = "macos")]
|
||||
fn candidates(api: &mut HidApi) -> Vec<CString> {
|
||||
if let Err(error) = api.refresh_devices() {
|
||||
log::warn!("3D mouse: device scan failed: {error}");
|
||||
return Vec::new();
|
||||
}
|
||||
api.device_list().filter(|info| is_3d_mouse(info)).map(|info| info.path().to_owned()).collect()
|
||||
}
|
||||
|
||||
/// The HID context. On Windows hidapi's own device discovery is off, so making it asks no device
|
||||
/// anything either (`candidates` finds the 3D mice). Turning discovery off panics only once a
|
||||
/// context with discovery exists; the reader is the one place the app makes a context, once.
|
||||
#[cfg(target_os = "windows")]
|
||||
fn hid_api() -> hidapi::HidResult<HidApi> {
|
||||
HidApi::disable_device_discovery();
|
||||
HidApi::new()
|
||||
}
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
fn hid_api() -> hidapi::HidResult<HidApi> {
|
||||
HidApi::new()
|
||||
}
|
||||
|
||||
#[cfg(any(target_os = "windows", target_os = "macos"))]
|
||||
fn reader(ctx: Context, shared: Arc<Mutex<Reading>>) {
|
||||
let Ok(mut api) = HidApi::new() else {
|
||||
let Ok(mut api) = hid_api() else {
|
||||
log::warn!("3D mouse: HID initialization failed");
|
||||
return;
|
||||
};
|
||||
loop {
|
||||
if let Err(error) = api.refresh_devices() {
|
||||
log::warn!("3D mouse: device scan failed: {error}");
|
||||
} else if let Some((device, layout, ids)) = api.device_list().filter(|info| is_3d_mouse(info)).find_map(|info| {
|
||||
let device = info
|
||||
.open_device(&api)
|
||||
if let Some((device, layout, ids)) = candidates(&mut api).into_iter().find_map(|path| {
|
||||
let device = api
|
||||
.open_path(&path)
|
||||
.inspect_err(|error| {
|
||||
// On macOS: missing Input Monitoring permission, or the 3DxWare helper holding the device.
|
||||
// The driver having the device is the reason it cannot be opened, not a problem.
|
||||
@@ -313,6 +377,8 @@ fn reader(ctx: Context, shared: Arc<Mutex<Reading>>) {
|
||||
}
|
||||
})
|
||||
.ok()?;
|
||||
// Read when the device was opened, from this device alone.
|
||||
let info = device.get_device_info().ok()?;
|
||||
let layout = device_layout(&device, info.vendor_id())?;
|
||||
Some((device, layout, (info.vendor_id(), info.product_id())))
|
||||
}) {
|
||||
@@ -359,39 +425,130 @@ fn device_layout(device: &hidapi::HidDevice, vendor_id: u16) -> Option<Layout> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Reads the 3D mouse through spacenavd when it runs, so what `spnavcfg` sets (swapped and inverted
|
||||
/// axes, sensitivity, dead zones) applies here as in other programs. Without the daemon it reads
|
||||
/// `/dev/hidrawN` with plain blocking reads, which end with an error when the device is unplugged.
|
||||
/// Opening needs permission: most distributions grant it to the logged-in user for devices that
|
||||
/// carry the `uaccess` udev tag, which a rule for the 3D mouse has to add.
|
||||
/// What the user chose for the reader and what the reader found, shared with the egui thread.
|
||||
#[cfg(target_os = "linux")]
|
||||
fn reader(ctx: Context, shared: Arc<Mutex<Reading>>) {
|
||||
use std::io::Read;
|
||||
#[derive(Default)]
|
||||
struct Drivers {
|
||||
/// `SpaceMouseDriver::to_u8` of the preference.
|
||||
choice: AtomicU8,
|
||||
/// `PRESENT_SPACENAVD` and `PRESENT_DIRECT`, as of the reader's last look.
|
||||
found: AtomicU8,
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
const PRESENT_SPACENAVD: u8 = 1;
|
||||
#[cfg(target_os = "linux")]
|
||||
const PRESENT_DIRECT: u8 = 2;
|
||||
/// How often a connected reader looks again at what is there, and how long a read of spacenavd
|
||||
/// waits for a record before it checks the choice.
|
||||
#[cfg(target_os = "linux")]
|
||||
const LOOK_EVERY: Duration = Duration::from_secs(1);
|
||||
#[cfg(target_os = "linux")]
|
||||
const SPACENAVD_WAKE: Duration = Duration::from_millis(250);
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
impl Drivers {
|
||||
fn choice(&self) -> SpaceMouseDriver {
|
||||
SpaceMouseDriver::from_u8(self.choice.load(Ordering::Relaxed))
|
||||
}
|
||||
|
||||
fn present(&self) -> DriversPresent {
|
||||
let found = self.found.load(Ordering::Relaxed);
|
||||
DriversPresent { spacenavd: found & PRESENT_SPACENAVD != 0, direct: found & PRESENT_DIRECT != 0 }
|
||||
}
|
||||
|
||||
fn publish(&self, present: DriversPresent) {
|
||||
let found = (u8::from(present.spacenavd) * PRESENT_SPACENAVD) | (u8::from(present.direct) * PRESENT_DIRECT);
|
||||
self.found.store(found, Ordering::Relaxed);
|
||||
}
|
||||
}
|
||||
|
||||
/// The reader that was picked.
|
||||
#[cfg(target_os = "linux")]
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
enum Pick {
|
||||
Spacenavd,
|
||||
Direct,
|
||||
}
|
||||
|
||||
/// Which reader to use: the one asked for when it is there, else the other, else none. Automatic
|
||||
/// asks for spacenavd, which is what has always been read first.
|
||||
#[cfg(target_os = "linux")]
|
||||
fn choose(wanted: SpaceMouseDriver, spacenavd: bool, direct: bool) -> Option<Pick> {
|
||||
let first = match wanted {
|
||||
SpaceMouseDriver::Automatic | SpaceMouseDriver::Spacenavd => Pick::Spacenavd,
|
||||
SpaceMouseDriver::Direct => Pick::Direct,
|
||||
};
|
||||
let there = |pick| match pick {
|
||||
Pick::Spacenavd => spacenavd,
|
||||
Pick::Direct => direct,
|
||||
};
|
||||
let other = if first == Pick::Spacenavd { Pick::Direct } else { Pick::Spacenavd };
|
||||
[first, other].into_iter().find(|&pick| there(pick))
|
||||
}
|
||||
|
||||
/// Reads the 3D mouse through spacenavd or `/dev/hidrawN`, as `Drivers::choice` says (Automatic
|
||||
/// is spacenavd when it runs, so what `spnavcfg` sets, swapped and inverted axes, sensitivity,
|
||||
/// dead zones, applies here as in other programs). Both reads wake up when idle to see whether
|
||||
/// the choice changed, which then moves to the other reader without a restart. hidraw is opened
|
||||
/// non-blocking and ends with an error when the device is unplugged. Opening needs permission:
|
||||
/// most distributions grant it to the logged-in user for devices that carry the `uaccess` udev
|
||||
/// tag, which a rule for the 3D mouse has to add.
|
||||
#[cfg(target_os = "linux")]
|
||||
fn reader(ctx: Context, shared: Arc<Mutex<Reading>>, drivers: Arc<Drivers>) {
|
||||
use std::os::unix::fs::OpenOptionsExt;
|
||||
let look = || DriversPresent { spacenavd: spacenavd::exists(), direct: hidraw::find().is_some() };
|
||||
let mut denied = None;
|
||||
let mut told = None;
|
||||
loop {
|
||||
if let Some(daemon) = spacenavd::connect() {
|
||||
log::info!("3D mouse: reading spacenavd, which applies the spnavcfg settings");
|
||||
connected(&ctx, &shared, Source::Spacenavd);
|
||||
spacenavd::read(daemon, |axes| publish_held(&ctx, &shared, axes));
|
||||
reset(&ctx, &shared);
|
||||
} else if let Some(device) = hidraw::find() {
|
||||
match std::fs::File::open(&device.path) {
|
||||
Ok(mut file) => {
|
||||
let device = hidraw::find();
|
||||
let present = DriversPresent { spacenavd: spacenavd::exists(), direct: device.is_some() };
|
||||
drivers.publish(present);
|
||||
let wanted = drivers.choice();
|
||||
let mut pick = choose(wanted, present.spacenavd, present.direct);
|
||||
// A socket file with no daemon behind it is no spacenavd.
|
||||
let daemon = if pick == Some(Pick::Spacenavd) { spacenavd::connect() } else { None };
|
||||
if pick == Some(Pick::Spacenavd) && daemon.is_none() {
|
||||
pick = choose(wanted, false, present.direct);
|
||||
}
|
||||
let asked_for = match wanted {
|
||||
SpaceMouseDriver::Automatic => None,
|
||||
SpaceMouseDriver::Spacenavd => Some(Pick::Spacenavd),
|
||||
SpaceMouseDriver::Direct => Some(Pick::Direct),
|
||||
};
|
||||
if let (Some(asked), Some(pick)) = (asked_for, pick)
|
||||
&& asked != pick
|
||||
&& told != Some((wanted, pick))
|
||||
{
|
||||
log::info!("3D mouse: {asked:?} is not available, reading {pick:?} instead");
|
||||
told = Some((wanted, pick));
|
||||
}
|
||||
// Asked at every idle moment of a read: has the choice changed, and what is there now.
|
||||
let mut looked = Instant::now();
|
||||
let mut stop = || {
|
||||
if looked.elapsed() >= LOOK_EVERY {
|
||||
looked = Instant::now();
|
||||
drivers.publish(look());
|
||||
}
|
||||
drivers.choice() != wanted
|
||||
};
|
||||
match (pick, daemon, device) {
|
||||
(Some(Pick::Spacenavd), Some(daemon), _) => {
|
||||
log::info!("3D mouse: reading spacenavd, which applies the spnavcfg settings");
|
||||
if let Err(error) = daemon.set_read_timeout(Some(SPACENAVD_WAKE)) {
|
||||
log::warn!("3D mouse: spacenavd reads cannot time out ({error}); a change of driver waits for the next event");
|
||||
}
|
||||
connected(&ctx, &shared, Source::Spacenavd);
|
||||
spacenavd::read(daemon, |axes| publish_held(&ctx, &shared, axes), &mut stop);
|
||||
reset(&ctx, &shared);
|
||||
}
|
||||
(Some(Pick::Direct), _, Some(device)) => match std::fs::OpenOptions::new().read(true).custom_flags(hidraw::O_NONBLOCK).open(&device.path)
|
||||
{
|
||||
Ok(file) => {
|
||||
denied = None;
|
||||
log::info!("3D mouse: reading {}", device.path.display());
|
||||
connected(&ctx, &shared, Source::Hid(device.ids));
|
||||
let mut report = [0_u8; REPORT_BUFFER_BYTES];
|
||||
loop {
|
||||
match file.read(&mut report) {
|
||||
Ok(0) => break,
|
||||
Ok(size) => publish(&ctx, &shared, device.layout, report.get(..size).unwrap_or_default()),
|
||||
Err(error) if error.kind() == std::io::ErrorKind::Interrupted => {}
|
||||
Err(error) => {
|
||||
log::info!("3D mouse disconnected: {error}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
hidraw::read_reports(file, |report| publish(&ctx, &shared, device.layout, report), &mut stop);
|
||||
reset(&ctx, &shared);
|
||||
}
|
||||
// Say so once per device node, not every retry.
|
||||
@@ -400,9 +557,13 @@ fn reader(ctx: Context, shared: Arc<Mutex<Reading>>) {
|
||||
denied = Some(device.path);
|
||||
}
|
||||
Err(_) => {}
|
||||
}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
// A new choice is taken up at once; anything else waits to try again.
|
||||
if drivers.choice() == wanted {
|
||||
std::thread::sleep(RETRY_AFTER);
|
||||
}
|
||||
std::thread::sleep(RETRY_AFTER);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -445,6 +606,8 @@ fn start_driver_client(ctx: &Context, shared: &Arc<Mutex<Reading>>) {
|
||||
|
||||
pub struct SpaceMouse {
|
||||
shared: Arc<Mutex<Reading>>,
|
||||
#[cfg(target_os = "linux")]
|
||||
drivers: Arc<Drivers>,
|
||||
last_frame: Instant,
|
||||
driver_mapping: DriverMapping,
|
||||
mapping_checked_at: Instant,
|
||||
@@ -462,13 +625,25 @@ impl SpaceMouse {
|
||||
let shared = Arc::new(Mutex::new(Reading::new(now)));
|
||||
let worker_state = Arc::clone(&shared);
|
||||
let worker_ctx = ctx.clone();
|
||||
if let Err(error) = std::thread::Builder::new().name("solidcraft-3d-mouse".into()).spawn(move || reader(worker_ctx, worker_state)) {
|
||||
#[cfg(target_os = "linux")]
|
||||
let drivers = Arc::new(Drivers::default());
|
||||
#[cfg(target_os = "linux")]
|
||||
let worker_drivers = Arc::clone(&drivers);
|
||||
let spawned = std::thread::Builder::new().name("solidcraft-3d-mouse".into()).spawn(move || {
|
||||
#[cfg(target_os = "linux")]
|
||||
reader(worker_ctx, worker_state, worker_drivers);
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
reader(worker_ctx, worker_state);
|
||||
});
|
||||
if let Err(error) = spawned {
|
||||
log::warn!("3D mouse: reader could not start: {error}");
|
||||
}
|
||||
#[cfg(target_os = "macos")]
|
||||
start_driver_client(ctx, &shared);
|
||||
Self {
|
||||
shared,
|
||||
#[cfg(target_os = "linux")]
|
||||
drivers,
|
||||
last_frame: now,
|
||||
driver_mapping: load_driver_mapping().unwrap_or_else(without_profile),
|
||||
mapping_checked_at: now,
|
||||
@@ -516,6 +691,11 @@ impl SpaceMouse {
|
||||
}
|
||||
self.mapping_checked_at = now;
|
||||
}
|
||||
#[cfg(target_os = "linux")]
|
||||
{
|
||||
self.drivers.choice.store(app.preferences.space_mouse_driver.to_u8(), Ordering::Relaxed);
|
||||
app.space_mouse.drivers = Some(self.drivers.present());
|
||||
}
|
||||
let Ok(reading) = self.shared.lock().map(|reading| *reading) else { return };
|
||||
app.space_mouse.device = reading.device.map(Source::key);
|
||||
let calibration = calibration(app);
|
||||
@@ -529,11 +709,108 @@ impl SpaceMouse {
|
||||
}
|
||||
}
|
||||
|
||||
/// A stream that answers reads from a script, for the timeout paths.
|
||||
#[cfg(all(test, target_os = "linux"))]
|
||||
mod fake {
|
||||
use std::collections::VecDeque;
|
||||
use std::io::{Error, ErrorKind, Read, Result};
|
||||
|
||||
enum Step {
|
||||
Data(Vec<u8>),
|
||||
Fail(ErrorKind),
|
||||
End,
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct Script(VecDeque<Step>);
|
||||
|
||||
impl Script {
|
||||
pub fn new() -> Self {
|
||||
Self::default()
|
||||
}
|
||||
|
||||
pub fn data(&mut self, bytes: &[u8]) -> &mut Self {
|
||||
self.0.push_back(Step::Data(bytes.to_vec()));
|
||||
self
|
||||
}
|
||||
|
||||
pub fn timeout(&mut self, kind: ErrorKind) -> &mut Self {
|
||||
self.fail(kind)
|
||||
}
|
||||
|
||||
pub fn fail(&mut self, kind: ErrorKind) -> &mut Self {
|
||||
self.0.push_back(Step::Fail(kind));
|
||||
self
|
||||
}
|
||||
|
||||
pub fn end(&mut self) -> &mut Self {
|
||||
self.0.push_back(Step::End);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
/// Past the script's last step the stream has ended.
|
||||
impl Read for Script {
|
||||
fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
|
||||
match self.0.pop_front() {
|
||||
Some(Step::Data(bytes)) => {
|
||||
let size = bytes.len().min(buf.len());
|
||||
buf[..size].copy_from_slice(&bytes[..size]);
|
||||
Ok(size)
|
||||
}
|
||||
Some(Step::Fail(kind)) => Err(Error::from(kind)),
|
||||
Some(Step::End) | None => Ok(0),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use solidcraft_ui_egui::space_mouse::{DeviceMotion, Motion};
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
#[test]
|
||||
fn the_reader_asked_for_is_used_when_it_is_there_and_the_other_when_it_is_not() {
|
||||
use Pick::{Direct, Spacenavd};
|
||||
use SpaceMouseDriver::{Automatic, Direct as AskDirect, Spacenavd as AskSpacenavd};
|
||||
// (asked, spacenavd there, device there) and what is read.
|
||||
let cases = [
|
||||
(Automatic, true, true, Some(Spacenavd)),
|
||||
(Automatic, true, false, Some(Spacenavd)),
|
||||
(Automatic, false, true, Some(Direct)),
|
||||
(Automatic, false, false, None),
|
||||
(AskSpacenavd, true, true, Some(Spacenavd)),
|
||||
(AskSpacenavd, true, false, Some(Spacenavd)),
|
||||
(AskSpacenavd, false, true, Some(Direct)),
|
||||
(AskSpacenavd, false, false, None),
|
||||
(AskDirect, true, true, Some(Direct)),
|
||||
(AskDirect, true, false, Some(Spacenavd)),
|
||||
(AskDirect, false, true, Some(Direct)),
|
||||
(AskDirect, false, false, None),
|
||||
];
|
||||
for (asked, spacenavd, direct, expected) in cases {
|
||||
assert_eq!(choose(asked, spacenavd, direct), expected, "{asked:?}, spacenavd {spacenavd}, device {direct}");
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
#[test]
|
||||
fn what_the_reader_found_and_the_choice_pass_between_threads() {
|
||||
let drivers = Drivers::default();
|
||||
assert_eq!(drivers.present(), DriversPresent::default());
|
||||
for (spacenavd, direct) in [(true, false), (false, true), (true, true), (false, false)] {
|
||||
drivers.publish(DriversPresent { spacenavd, direct });
|
||||
assert_eq!(drivers.present(), DriversPresent { spacenavd, direct });
|
||||
}
|
||||
assert_eq!(drivers.choice(), SpaceMouseDriver::Automatic);
|
||||
for choice in SpaceMouseDriver::ALL {
|
||||
drivers.choice.store(choice.to_u8(), Ordering::Relaxed);
|
||||
assert_eq!(drivers.choice(), choice);
|
||||
}
|
||||
}
|
||||
|
||||
/// The logical axes a reading reaches. Logical Rz rolls the view and logical Ry turns it about
|
||||
/// its vertical (`navigation::device_camera` in solidcraft-ui-egui, tested there).
|
||||
fn rotation(mapping: DriverMapping, rotation: [i16; 3]) -> [f64; 3] {
|
||||
@@ -612,6 +889,31 @@ mod tests {
|
||||
assert_eq!(reading.current(now + STALE_AFTER, Axes::default()).translation, [0; 3]);
|
||||
}
|
||||
|
||||
/// A device that repeats its reading at rest asks for no frame; a reading that changes does.
|
||||
#[test]
|
||||
fn a_repeated_report_at_rest_asks_for_no_frame() {
|
||||
let ctx = Context::default();
|
||||
let shared = Mutex::new(Reading::new(Instant::now()));
|
||||
let layout = Layout::default();
|
||||
let frame = || {
|
||||
let mut out = ctx.run_ui(egui::RawInput::default(), |_| {});
|
||||
out.textures_delta.clear();
|
||||
};
|
||||
let asked = || {
|
||||
frame();
|
||||
ctx.repaint_causes().iter().any(|c| c.file.ends_with("space_mouse.rs"))
|
||||
};
|
||||
frame();
|
||||
// Report 1 carries translation (see the split-layout test).
|
||||
let report = [1, 0x9c, 0xff, 0x2c, 0x01, 0, 0];
|
||||
publish(&ctx, &shared, layout, &report);
|
||||
assert!(asked(), "a report that moves the cap asks for a frame");
|
||||
publish(&ctx, &shared, layout, &report);
|
||||
assert!(!asked(), "the same reading at rest is no news");
|
||||
publish(&ctx, &shared, layout, &[1, 0x9d, 0xff, 0x2c, 0x01, 0, 0]);
|
||||
assert!(asked(), "a changed reading asks for a frame");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_held_reading_stays_until_the_next_one_and_a_hid_reading_goes_stale() {
|
||||
let now = Instant::now();
|
||||
@@ -625,6 +927,55 @@ mod tests {
|
||||
assert_eq!(hid.current(later, Axes::default()), Axes::default());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_held_reading_near_rest_settles_after_the_timeout() {
|
||||
// The last records of seven releases from tangency-labs/solidcraft#3523: spacenavd sends
|
||||
// nothing after them.
|
||||
let leftovers = [
|
||||
[15, -60, 13, 59, 34, 129],
|
||||
[-12, -69, 4, -26, 7, -6],
|
||||
[0, -45, -3, 16, 8, -60],
|
||||
[-31, 27, 22, -5, 6, -10],
|
||||
[0, -30, -3, 3, -6, 0],
|
||||
[5, 32, -2, 43, -8, 12],
|
||||
[3, 2, -22, 3, 6, 5],
|
||||
];
|
||||
let now = Instant::now();
|
||||
for [x, y, z, rx, ry, rz] in leftovers {
|
||||
let axes = Axes { translation: [x, y, z], rotation: [rx, ry, rz] };
|
||||
let held = Reading { axes, held: true, ..Reading::new(now) };
|
||||
assert_eq!(held.current(now + HELD_SETTLE_AFTER - Duration::from_millis(1), Axes::default()), axes);
|
||||
assert_eq!(held.current(now + HELD_SETTLE_AFTER, Axes::default()), Axes::default());
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_settled_held_reading_reads_as_the_devices_own_rest() {
|
||||
let now = Instant::now();
|
||||
let rest = Axes { translation: [10, -8, 0], rotation: [0, 5, 0] };
|
||||
// 40 from zero on X, but only 30 from this device's rest.
|
||||
let held = Reading { axes: Axes { translation: [40, -8, 0], rotation: [0, 5, 0] }, held: true, ..Reading::new(now) };
|
||||
assert_eq!(held.current(now + HELD_SETTLE_AFTER, rest), rest);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_firm_held_push_stays_however_long_it_lasts() {
|
||||
let now = Instant::now();
|
||||
let later = now + Duration::from_secs(10);
|
||||
let push = Axes { translation: [0, 350, 0], rotation: [0; 3] };
|
||||
let held = Reading { axes: push, held: true, ..Reading::new(now) };
|
||||
assert_eq!(held.current(later, Axes::default()), push);
|
||||
// One firm axis keeps the small ones with it.
|
||||
let mixed = Axes { translation: [5, 300, -10], rotation: [3, 0, 20] };
|
||||
let held = Reading { axes: mixed, held: true, ..Reading::new(now) };
|
||||
assert_eq!(held.current(later, Axes::default()), mixed);
|
||||
// The band is per reading, edge included: at it is a leftover, one past it is a hold.
|
||||
let band = HELD_SETTLE_BAND as i16;
|
||||
let twist = |value| Reading { axes: Axes { translation: [0; 3], rotation: [0, 0, value] }, held: true, ..Reading::new(now) };
|
||||
assert_eq!(twist(band).current(later, Axes::default()), Axes::default());
|
||||
assert_eq!(twist(band + 1).current(later, Axes::default()).rotation, [0, 0, band + 1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn applies_3dxware_axis_swaps_and_reversals() {
|
||||
let profile = br#"
|
||||
@@ -689,6 +1040,8 @@ mod tests {
|
||||
reading.axes.rotation = [0, 350, 0];
|
||||
let mut mouse = SpaceMouse {
|
||||
shared: Arc::new(Mutex::new(reading)),
|
||||
#[cfg(target_os = "linux")]
|
||||
drivers: Arc::default(),
|
||||
last_frame: now - Duration::from_millis(20),
|
||||
driver_mapping: DriverMapping::object_mode(),
|
||||
mapping_checked_at: now,
|
||||
@@ -717,6 +1070,8 @@ mod tests {
|
||||
fn mouse(reading: Reading, now: Instant) -> SpaceMouse {
|
||||
SpaceMouse {
|
||||
shared: Arc::new(Mutex::new(reading)),
|
||||
#[cfg(target_os = "linux")]
|
||||
drivers: Arc::default(),
|
||||
last_frame: now,
|
||||
driver_mapping: DriverMapping::object_mode(),
|
||||
mapping_checked_at: now,
|
||||
|
||||
@@ -2,13 +2,23 @@
|
||||
//! its report descriptor and ids under `/sys/class/hidraw/hidrawN/device/`. Reading them is plain
|
||||
//! file I/O, so no udev or hidapi library is needed.
|
||||
|
||||
use std::io::Read;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::time::Duration;
|
||||
|
||||
use solidcraft_space_mouse::{Descriptor, Layout};
|
||||
|
||||
const SYSFS: &str = "/sys/class/hidraw";
|
||||
const DEV: &str = "/dev";
|
||||
|
||||
/// `O_NONBLOCK` on Linux's common architectures (x86, ARM, RISC-V). The device is opened with it so
|
||||
/// a read with nothing to read returns at once and the reader can see whether it should stop.
|
||||
pub const O_NONBLOCK: i32 = 0o4000;
|
||||
|
||||
/// How long the reader waits when the device has nothing to say, which is also the most a report
|
||||
/// can be delayed.
|
||||
const IDLE_POLL: Duration = Duration::from_millis(5);
|
||||
|
||||
pub struct Device {
|
||||
pub path: PathBuf,
|
||||
pub layout: Layout,
|
||||
@@ -23,6 +33,30 @@ pub fn find() -> Option<Device> {
|
||||
names.into_iter().find_map(|name| probe(&Path::new(SYSFS).join(&name), Path::new(DEV).join(&name)))
|
||||
}
|
||||
|
||||
/// Hands every report to `publish` until the device is gone (end of file or an error) or `stop`
|
||||
/// says so. `source` is non-blocking: when it has nothing, `stop` is asked and the reader waits
|
||||
/// [`IDLE_POLL`]. Reports are read and handed over exactly as they were with blocking reads.
|
||||
pub fn read_reports(mut source: impl Read, mut publish: impl FnMut(&[u8]), mut stop: impl FnMut() -> bool) {
|
||||
let mut report = [0_u8; super::REPORT_BUFFER_BYTES];
|
||||
loop {
|
||||
match source.read(&mut report) {
|
||||
Ok(0) => return,
|
||||
Ok(size) => publish(report.get(..size).unwrap_or_default()),
|
||||
Err(error) if error.kind() == std::io::ErrorKind::Interrupted => {}
|
||||
Err(error) if error.kind() == std::io::ErrorKind::WouldBlock => {
|
||||
if stop() {
|
||||
return;
|
||||
}
|
||||
std::thread::sleep(IDLE_POLL);
|
||||
}
|
||||
Err(error) => {
|
||||
log::info!("3D mouse disconnected: {error}");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn probe(sysfs: &Path, path: PathBuf) -> Option<Device> {
|
||||
let descriptor = Descriptor::parse(&std::fs::read(sysfs.join("device/report_descriptor")).ok()?);
|
||||
// A controller that declares no motion axis (buttons only, say) isn't read.
|
||||
@@ -42,6 +76,35 @@ fn ids(uevent: &str) -> Option<(u16, u16)> {
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn reports_come_through_idle_gaps_until_the_device_ends_or_a_stop() {
|
||||
use crate::space_mouse::fake::Script;
|
||||
let mut script = Script::new();
|
||||
script.timeout(std::io::ErrorKind::WouldBlock).data(&[1, 2, 3]).timeout(std::io::ErrorKind::WouldBlock).data(&[4]).end();
|
||||
let (mut seen, mut asked) = (Vec::new(), 0);
|
||||
read_reports(
|
||||
script,
|
||||
|report| seen.push(report.to_vec()),
|
||||
|| {
|
||||
asked += 1;
|
||||
false
|
||||
},
|
||||
);
|
||||
assert_eq!(seen, [vec![1, 2, 3], vec![4]]);
|
||||
assert_eq!(asked, 2);
|
||||
let mut script = Script::new();
|
||||
script.data(&[1]).timeout(std::io::ErrorKind::WouldBlock).data(&[2]);
|
||||
let mut seen = Vec::new();
|
||||
read_reports(script, |report| seen.push(report.to_vec()), || true);
|
||||
assert_eq!(seen, [vec![1]], "a stop at an idle moment ends the read");
|
||||
// An unplugged device is an error, which ends the read as before.
|
||||
let mut script = Script::new();
|
||||
script.data(&[1]).fail(std::io::ErrorKind::BrokenPipe).data(&[2]);
|
||||
let mut seen = Vec::new();
|
||||
read_reports(script, |report| seen.push(report.to_vec()), || false);
|
||||
assert_eq!(seen, [vec![1]]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ids_come_from_the_uevent() {
|
||||
let wireless = "DRIVER=hid-generic\nHID_ID=0005:0000256F:0000C63A\nHID_NAME=SpaceMouse Wireless BT\n";
|
||||
|
||||
@@ -23,6 +23,11 @@ const RECORD_BYTES: usize = 32;
|
||||
/// sensitivity). Our axes are in the raw HID units of [`FULL_SCALE`].
|
||||
const DAEMON_FULL_SCALE: i64 = 500;
|
||||
|
||||
/// Whether the daemon's socket is there, without connecting to it.
|
||||
pub fn exists() -> bool {
|
||||
SOCKETS.iter().any(|path| Path::new(path).exists())
|
||||
}
|
||||
|
||||
pub fn connect() -> Option<UnixStream> {
|
||||
SOCKETS.iter().find_map(|path| connect_to(Path::new(path)))
|
||||
}
|
||||
@@ -56,18 +61,34 @@ fn unit(value: impl Into<i64>) -> i16 {
|
||||
i16::try_from(scaled.clamp(i64::from(i16::MIN), i64::from(i16::MAX))).unwrap_or_default()
|
||||
}
|
||||
|
||||
/// Hands every motion record to `publish` until the daemon closes the connection or fails. A
|
||||
/// partial record at the end is dropped.
|
||||
pub fn read(mut stream: impl Read, mut publish: impl FnMut(Axes)) {
|
||||
/// Hands every motion record to `publish` until the daemon closes the connection or fails, or
|
||||
/// `stop` says so. A stream with a read timeout (`set_read_timeout`) times out when the daemon is
|
||||
/// quiet, which is no record and no disconnect: `stop` is asked, and the read goes on, with what
|
||||
/// of a record had arrived kept. A partial record at the end is dropped.
|
||||
pub fn read(mut stream: impl Read, mut publish: impl FnMut(Axes), mut stop: impl FnMut() -> bool) {
|
||||
let mut record = [0_u8; RECORD_BYTES];
|
||||
let mut filled = 0;
|
||||
loop {
|
||||
match stream.read_exact(&mut record) {
|
||||
Ok(()) => {
|
||||
if let Some(axes) = decode(&record) {
|
||||
publish(axes);
|
||||
match stream.read(record.get_mut(filled..).unwrap_or_default()) {
|
||||
Ok(0) => {
|
||||
log::info!("3D mouse: spacenavd connection ended");
|
||||
return;
|
||||
}
|
||||
Ok(size) => {
|
||||
filled += size;
|
||||
if filled == RECORD_BYTES {
|
||||
filled = 0;
|
||||
if let Some(axes) = decode(&record) {
|
||||
publish(axes);
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(error) if error.kind() == std::io::ErrorKind::Interrupted => {}
|
||||
Err(error) if matches!(error.kind(), std::io::ErrorKind::WouldBlock | std::io::ErrorKind::TimedOut) => {
|
||||
if stop() {
|
||||
return;
|
||||
}
|
||||
}
|
||||
Err(error) => {
|
||||
log::info!("3D mouse: spacenavd connection ended: {error}");
|
||||
return;
|
||||
@@ -132,10 +153,41 @@ mod tests {
|
||||
daemon.write_all(&bytes).expect("written");
|
||||
drop(daemon);
|
||||
let mut seen = Vec::new();
|
||||
read(client, |axes| seen.push(axes.translation));
|
||||
read(client, |axes| seen.push(axes.translation), || false);
|
||||
assert_eq!(seen, [[70, 0, 0], [0, 0, 0]]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_quiet_daemon_times_out_without_losing_the_record_it_was_sending() {
|
||||
use crate::space_mouse::fake::Script;
|
||||
use std::io::ErrorKind::{TimedOut, WouldBlock};
|
||||
let bytes = record([0, 100, 0, 0, 0, 0, 0, 8]);
|
||||
let mut script = Script::new();
|
||||
script.timeout(WouldBlock).data(&bytes[..10]).timeout(TimedOut).timeout(WouldBlock).data(&bytes[10..]).timeout(WouldBlock).end();
|
||||
let (mut seen, mut asked) = (Vec::new(), 0);
|
||||
read(
|
||||
script,
|
||||
|axes| seen.push(axes.translation),
|
||||
|| {
|
||||
asked += 1;
|
||||
false
|
||||
},
|
||||
);
|
||||
assert_eq!(seen, [[70, 0, 0]]);
|
||||
assert_eq!(asked, 4, "each timeout asks whether to stop");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_stop_ends_the_read_at_the_next_timeout_only() {
|
||||
use crate::space_mouse::fake::Script;
|
||||
let bytes = record([0, 100, 0, 0, 0, 0, 0, 8]);
|
||||
let mut script = Script::new();
|
||||
script.data(&bytes).timeout(std::io::ErrorKind::WouldBlock).data(&bytes);
|
||||
let mut seen = 0;
|
||||
read(script, |_| seen += 1, || true);
|
||||
assert_eq!(seen, 1, "the record before the timeout arrived; the one after never was read");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn no_daemon_means_no_connection() {
|
||||
let missing = std::env::temp_dir().join(format!("sc-no-spnav-{}.sock", std::process::id()));
|
||||
|
||||
@@ -0,0 +1,172 @@
|
||||
//! Windows: finding 3D mice without asking any other device anything (#2614).
|
||||
//!
|
||||
//! hidapi's enumeration opens every HID interface and reads its serial number, manufacturer and
|
||||
//! product strings: on USB, three control requests to every keyboard, mouse and touchscreen. The
|
||||
//! reader repeated it every two seconds while no 3D mouse was plugged in, and on some machines the
|
||||
//! keyboard then kept dropping off the bus and the cursor jumped. Plug and Play already names each
|
||||
//! interface's top-level usage in its hardware IDs (`HID_DEVICE_UP:0001_U:0008`: Generic Desktop,
|
||||
//! Multi-Axis Controller), so the reader asks it, which sends nothing to any device, and opens only
|
||||
//! the interfaces that are 3D mice.
|
||||
//!
|
||||
//! The configuration manager has no safe API, hence the `unsafe_code` allowance on this module
|
||||
//! (the app crate denies it; see `native_crash.rs`).
|
||||
#![allow(unsafe_code)]
|
||||
|
||||
use std::ffi::CString;
|
||||
use std::ptr::{null, null_mut};
|
||||
|
||||
use windows_sys::Win32::Devices::DeviceAndDriverInstallation::{
|
||||
CM_GET_DEVICE_INTERFACE_LIST_PRESENT, CM_Get_DevNode_PropertyW, CM_Get_Device_Interface_List_SizeW, CM_Get_Device_Interface_ListW,
|
||||
CM_Get_Device_Interface_PropertyW, CM_LOCATE_DEVNODE_NORMAL, CM_Locate_DevNodeW, CONFIGRET, CR_BUFFER_SMALL, CR_SUCCESS,
|
||||
};
|
||||
use windows_sys::Win32::Devices::HumanInterfaceDevice::GUID_DEVINTERFACE_HID;
|
||||
use windows_sys::Win32::Devices::Properties::{
|
||||
DEVPKEY_Device_HardwareIds, DEVPKEY_Device_InstanceId, DEVPROP_TYPE_STRING, DEVPROP_TYPE_STRING_LIST, DEVPROPTYPE,
|
||||
};
|
||||
use windows_sys::Win32::Foundation::DEVPROPKEY;
|
||||
|
||||
/// The hardware ID Windows gives a top-level collection with the Generic Desktop page's
|
||||
/// Multi-Axis Controller usage.
|
||||
const MULTI_AXIS_CONTROLLER: &str = "HID_DEVICE_UP:0001_U:0008";
|
||||
/// Largest property read, in bytes: hardware IDs are a few hundred.
|
||||
const MAX_PROPERTY_BYTES: u32 = 64 * 1024;
|
||||
/// Tries at reading the interface list, which can grow between asking its size and reading it.
|
||||
const LIST_TRIES: usize = 4;
|
||||
|
||||
/// The paths of the present HID interfaces whose top-level collection is a multi-axis controller.
|
||||
pub fn multi_axis_controllers() -> Vec<CString> {
|
||||
interfaces()
|
||||
.into_iter()
|
||||
.filter(|path| {
|
||||
let Some(instance) = interface_strings(path, &DEVPKEY_Device_InstanceId).and_then(|ids| ids.into_iter().next()) else {
|
||||
return false;
|
||||
};
|
||||
devnode_strings(&instance, &DEVPKEY_Device_HardwareIds).is_some_and(|ids| is_multi_axis(&ids))
|
||||
})
|
||||
.filter_map(|path| CString::new(path).ok())
|
||||
.collect()
|
||||
}
|
||||
|
||||
/// Whether a device with these hardware IDs is a multi-axis controller.
|
||||
fn is_multi_axis(hardware_ids: &[String]) -> bool {
|
||||
hardware_ids.iter().any(|id| id.eq_ignore_ascii_case(MULTI_AXIS_CONTROLLER))
|
||||
}
|
||||
|
||||
/// The strings of a nul-separated list (`REG_MULTI_SZ`, or one string), without empty ones.
|
||||
fn split_multi_sz(buffer: &[u16]) -> Vec<String> {
|
||||
buffer.split(|c| *c == 0).filter(|s| !s.is_empty()).map(String::from_utf16_lossy).collect()
|
||||
}
|
||||
|
||||
/// `s` as a nul-terminated wide string.
|
||||
fn wide(s: &str) -> Vec<u16> {
|
||||
s.encode_utf16().chain(std::iter::once(0)).collect()
|
||||
}
|
||||
|
||||
/// The paths of the present HID interfaces.
|
||||
fn interfaces() -> Vec<String> {
|
||||
for _ in 0..LIST_TRIES {
|
||||
let mut len = 0u32;
|
||||
// SAFETY: `len` is a valid place for the size; the class GUID is a static; no device filter.
|
||||
let sized = unsafe { CM_Get_Device_Interface_List_SizeW(&mut len, &GUID_DEVINTERFACE_HID, null(), CM_GET_DEVICE_INTERFACE_LIST_PRESENT) };
|
||||
if sized != CR_SUCCESS || len == 0 {
|
||||
return Vec::new();
|
||||
}
|
||||
let mut buffer = vec![0u16; len as usize];
|
||||
// SAFETY: `buffer` holds `len` wide characters, the length the call is given.
|
||||
let listed =
|
||||
unsafe { CM_Get_Device_Interface_ListW(&GUID_DEVINTERFACE_HID, null(), buffer.as_mut_ptr(), len, CM_GET_DEVICE_INTERFACE_LIST_PRESENT) };
|
||||
match listed {
|
||||
CR_SUCCESS => return split_multi_sz(&buffer),
|
||||
CR_BUFFER_SMALL => continue,
|
||||
_ => return Vec::new(),
|
||||
}
|
||||
}
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
/// A string or string-list property, read by `get` (property type, buffer, its size in bytes) in
|
||||
/// two calls: the size, then the value.
|
||||
fn property_strings(get: impl Fn(*mut DEVPROPTYPE, *mut u8, *mut u32) -> CONFIGRET) -> Option<Vec<String>> {
|
||||
let mut kind: DEVPROPTYPE = 0;
|
||||
let mut size = 0u32;
|
||||
if get(&mut kind, null_mut(), &mut size) != CR_BUFFER_SMALL || size == 0 || size > MAX_PROPERTY_BYTES {
|
||||
return None;
|
||||
}
|
||||
let mut buffer = vec![0u16; (size as usize).div_ceil(2)];
|
||||
let mut size = (buffer.len() * 2) as u32;
|
||||
if get(&mut kind, buffer.as_mut_ptr().cast(), &mut size) != CR_SUCCESS || (kind != DEVPROP_TYPE_STRING && kind != DEVPROP_TYPE_STRING_LIST) {
|
||||
return None;
|
||||
}
|
||||
Some(split_multi_sz(&buffer))
|
||||
}
|
||||
|
||||
/// A string property of the device interface at `path`.
|
||||
fn interface_strings(path: &str, key: &DEVPROPKEY) -> Option<Vec<String>> {
|
||||
let path = wide(path);
|
||||
property_strings(|kind, buffer, size| {
|
||||
// SAFETY: `path` is nul-terminated and outlives the call; `buffer` is null (asking the size)
|
||||
// or holds `*size` bytes, as `property_strings` sets up.
|
||||
unsafe { CM_Get_Device_Interface_PropertyW(path.as_ptr(), key, kind, buffer, size, 0) }
|
||||
})
|
||||
}
|
||||
|
||||
/// A string property of the device with instance ID `instance`.
|
||||
fn devnode_strings(instance: &str, key: &DEVPROPKEY) -> Option<Vec<String>> {
|
||||
let instance = wide(instance);
|
||||
let mut devnode = 0u32;
|
||||
// SAFETY: `instance` is nul-terminated and outlives the call; `devnode` is a valid place for the result.
|
||||
if unsafe { CM_Locate_DevNodeW(&mut devnode, instance.as_ptr(), CM_LOCATE_DEVNODE_NORMAL) } != CR_SUCCESS {
|
||||
return None;
|
||||
}
|
||||
property_strings(|kind, buffer, size| {
|
||||
// SAFETY: `buffer` is null (asking the size) or holds `*size` bytes, as `property_strings` sets up.
|
||||
unsafe { CM_Get_DevNode_PropertyW(devnode, key, kind, buffer, size, 0) }
|
||||
})
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
/// The hardware IDs Windows gives a wired 3Dconnexion device's motion interface, and a
|
||||
/// keyboard's: only the first is a multi-axis controller.
|
||||
#[test]
|
||||
fn only_the_multi_axis_usage_is_a_3d_mouse() {
|
||||
let ids = |list: &[&str]| list.iter().map(|s| s.to_string()).collect::<Vec<_>>();
|
||||
let space_mouse = ids(&["HID\\VID_256F&PID_C635&REV_0437&MI_00", "HID\\VID_256F&UP:0001_U:0008", "HID_DEVICE_UP:0001_U:0008", "HID_DEVICE"]);
|
||||
let keyboard = ids(&[
|
||||
"HID\\VID_046D&PID_C31C&REV_6400&MI_00",
|
||||
"HID\\VID_046D&UP:0001_U:0006",
|
||||
"HID_DEVICE_SYSTEM_KEYBOARD",
|
||||
"HID_DEVICE_UP:0001_U:0006",
|
||||
"HID_DEVICE",
|
||||
]);
|
||||
let vendor = ids(&["HID\\VID_256F&UP:FF00_U:0001", "HID_DEVICE_UP:FF00_U:0001", "HID_DEVICE_UPR:FF00-FFFF", "HID_DEVICE"]);
|
||||
assert!(is_multi_axis(&space_mouse));
|
||||
assert!(is_multi_axis(&ids(&["hid_device_up:0001_u:0008"])), "IDs compare without regard to case");
|
||||
assert!(!is_multi_axis(&keyboard) && !is_multi_axis(&vendor) && !is_multi_axis(&[]));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn nul_separated_lists_split_into_their_strings() {
|
||||
let buffer: Vec<u16> = "a\\b\0HID_DEVICE\0\0".encode_utf16().collect();
|
||||
assert_eq!(split_multi_sz(&buffer), ["a\\b", "HID_DEVICE"]);
|
||||
assert_eq!(split_multi_sz(&wide("one")), ["one"]);
|
||||
assert!(split_multi_sz(&[0, 0]).is_empty() && split_multi_sz(&[]).is_empty());
|
||||
}
|
||||
|
||||
/// The scan asks Plug and Play only: on any machine it returns, and every path it returns is a
|
||||
/// present HID interface whose hardware IDs name the multi-axis usage.
|
||||
#[test]
|
||||
fn the_scan_returns_only_multi_axis_interfaces() {
|
||||
let found = multi_axis_controllers();
|
||||
let all = interfaces();
|
||||
for path in &found {
|
||||
let path = path.to_str().unwrap_or_default();
|
||||
assert!(all.iter().any(|p| p == path), "{path}");
|
||||
let instance = interface_strings(path, &DEVPKEY_Device_InstanceId).and_then(|ids| ids.into_iter().next()).unwrap_or_default();
|
||||
assert!(devnode_strings(&instance, &DEVPKEY_Device_HardwareIds).is_some_and(|ids| is_multi_axis(&ids)), "{path}");
|
||||
}
|
||||
eprintln!("{} HID interfaces present, {} multi-axis controllers", all.len(), found.len());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
//! Keeping the restored window reachable.
|
||||
//!
|
||||
//! The window comes back where it was left. After a monitor was unplugged, the scale changed or
|
||||
//! the settings came from a larger screen, that can put its title bar above the top edge or
|
||||
//! under the taskbar, out of reach of the mouse. [`fit`] pulls a window back into the monitor's
|
||||
//! work area (the screen without the taskbar), in whatever unit the caller measures both, as
|
||||
//! long as it is the same one.
|
||||
|
||||
/// A rectangle: left, top, width, height.
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
pub struct Area {
|
||||
pub x: f32,
|
||||
pub y: f32,
|
||||
pub w: f32,
|
||||
pub h: f32,
|
||||
}
|
||||
|
||||
impl Area {
|
||||
pub const fn new(x: f32, y: f32, w: f32, h: f32) -> Self {
|
||||
Area { x, y, w, h }
|
||||
}
|
||||
fn right(self) -> f32 {
|
||||
self.x + self.w
|
||||
}
|
||||
fn bottom(self) -> f32 {
|
||||
self.y + self.h
|
||||
}
|
||||
fn sane(self) -> bool {
|
||||
[self.x, self.y, self.w, self.h].iter().all(|v| v.is_finite()) && self.w > 0.0 && self.h > 0.0
|
||||
}
|
||||
}
|
||||
|
||||
/// How much of the title bar must stay over the work area at least, to grab it.
|
||||
pub const REACHABLE: f32 = 100.0;
|
||||
/// The size a window gets when its saved geometry is unusable, before it is fitted to the screen.
|
||||
pub const DEFAULT_SIZE: (f32, f32) = (1600.0, 1000.0);
|
||||
|
||||
/// `window` moved and shrunk so that it can be reached on `work`: no larger than the work area
|
||||
/// (but not below `min`), the title bar not above the work area's top, the window not below its
|
||||
/// bottom, and at least [`REACHABLE`] of it over the work area horizontally. A window that is
|
||||
/// fine is returned unchanged. Geometry that makes no sense (not finite, empty), or a work
|
||||
/// area that does not, gives the default size centred on the work area.
|
||||
pub fn fit(window: Area, work: Area, min: (f32, f32)) -> Area {
|
||||
if !work.sane() {
|
||||
return window;
|
||||
}
|
||||
let min = (min.0.min(work.w), min.1.min(work.h));
|
||||
if !window.sane() {
|
||||
let w = DEFAULT_SIZE.0.min(work.w * 0.9).max(min.0);
|
||||
let h = DEFAULT_SIZE.1.min(work.h * 0.9).max(min.1);
|
||||
return Area::new(work.x + (work.w - w) / 2.0, work.y + (work.h - h) / 2.0, w, h);
|
||||
}
|
||||
let w = window.w.clamp(min.0, work.w);
|
||||
let h = window.h.clamp(min.1, work.h);
|
||||
let reach = REACHABLE.min(w);
|
||||
// A window that had to shrink goes fully onto the screen; one that fits may keep straddling two.
|
||||
let x = if w < window.w { window.x.max(work.x).min(work.right() - w) } else { window.x.max(work.x + reach - w).min(work.right() - reach) };
|
||||
let y = window.y.min(work.bottom() - h).max(work.y);
|
||||
Area::new(x, y, w, h)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const WORK: Area = Area::new(0.0, 0.0, 2560.0, 1400.0);
|
||||
const MIN: (f32, f32) = (960.0, 600.0);
|
||||
|
||||
#[test]
|
||||
fn a_window_on_screen_is_left_alone() {
|
||||
let w = Area::new(300.0, 120.0, 1600.0, 1000.0);
|
||||
assert_eq!(fit(w, WORK, MIN), w);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_title_bar_above_the_top_or_under_the_taskbar_comes_back() {
|
||||
let fitted = fit(Area::new(300.0, -400.0, 1600.0, 1000.0), WORK, MIN);
|
||||
assert_eq!((fitted.y, fitted.h), (0.0, 1000.0));
|
||||
let fitted = fit(Area::new(300.0, 1300.0, 1600.0, 1000.0), WORK, MIN);
|
||||
assert_eq!(fitted.y + fitted.h, 1400.0);
|
||||
// A taskbar at the top moves the work area down.
|
||||
let below_bar = Area::new(0.0, 48.0, 2560.0, 1352.0);
|
||||
assert_eq!(fit(Area::new(300.0, 0.0, 1600.0, 1000.0), below_bar, MIN).y, 48.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_window_from_a_monitor_that_is_gone_keeps_a_grabbable_part_on_screen() {
|
||||
let right = fit(Area::new(5000.0, 100.0, 1600.0, 1000.0), WORK, MIN);
|
||||
assert_eq!(right.x, 2560.0 - REACHABLE);
|
||||
let left = fit(Area::new(-4000.0, 100.0, 1600.0, 1000.0), WORK, MIN);
|
||||
assert_eq!(left.x + left.w, REACHABLE);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn a_window_larger_than_the_screen_shrinks_to_it() {
|
||||
let small = Area::new(0.0, 0.0, 1280.0, 720.0);
|
||||
let fitted = fit(Area::new(-20.0, -30.0, 3200.0, 2000.0), small, MIN);
|
||||
assert_eq!(fitted, small);
|
||||
// Never below the minimum, unless the screen itself is smaller.
|
||||
assert_eq!(fit(Area::new(0.0, 0.0, 100.0, 100.0), WORK, MIN).w, 960.0);
|
||||
assert_eq!(fit(Area::new(0.0, 0.0, 100.0, 100.0), Area::new(0.0, 0.0, 800.0, 500.0), MIN).h, 500.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn unusable_geometry_is_centred_at_a_sensible_size() {
|
||||
for bad in [Area::new(f32::NAN, 0.0, 1600.0, 1000.0), Area::new(0.0, 0.0, 0.0, 0.0), Area::new(0.0, 0.0, f32::INFINITY, 10.0)] {
|
||||
let fitted = fit(bad, WORK, MIN);
|
||||
assert_eq!(fitted, Area::new(480.0, 200.0, 1600.0, 1000.0));
|
||||
}
|
||||
let small = Area::new(100.0, 50.0, 1366.0, 728.0);
|
||||
let fitted = fit(Area::new(f32::NAN, 0.0, 1.0, 1.0), small, MIN);
|
||||
assert!(fitted.w <= small.w && fitted.h <= small.h && fitted.x >= small.x && fitted.y >= small.y);
|
||||
// No work area to go by: nothing to change.
|
||||
let w = Area::new(1.0, 2.0, 3.0, 4.0);
|
||||
assert_eq!(fit(w, Area::new(0.0, 0.0, 0.0, 0.0), MIN), w);
|
||||
}
|
||||
}
|
||||
@@ -84,7 +84,7 @@ The CLI still supports arbitrary PNG/ICO exports with `solidcraft-cli icon`.
|
||||
## Code and provenance
|
||||
|
||||
Resources remain compiled by their owning layer through existing APIs:
|
||||
`ui-egui::icons::paint` and `Tokens` at L5, model presets in L2 `doc`, and sketch
|
||||
`ui-egui::icons::paint_icon` and `Tokens` at L5, model presets in L2 `doc`, and sketch
|
||||
fonts at L1. State, projection, interaction, commands and GPU bindings stay in
|
||||
their current modules. Embedded data uses `CARGO_MANIFEST_DIR`; application code
|
||||
needs no runtime resource registry or repository lookup.
|
||||
|
||||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 629 B After Width: | Height: | Size: 660 B |
|
Before Width: | Height: | Size: 944 B After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 4.0 KiB |
@@ -1,88 +1,93 @@
|
||||
//! Original SolidCraft mark, shared by desktop, packaging and CLI.
|
||||
//! Original SolidCraft mark, shared by desktop, packaging and CLI: the borderless mark, five
|
||||
//! faces with transparent gaps between them, drawn from the macOS icon's
|
||||
//! `macos/source/SolidCraft.icon/Assets/03-solid-blue-cutout.svg`.
|
||||
type P = (f32, f32);
|
||||
|
||||
/// One face in that SVG's units: its outline, and its linear gradient from one point and
|
||||
/// colour to another.
|
||||
struct Face {
|
||||
outline: &'static [P],
|
||||
from: (P, [u8; 3]),
|
||||
to: (P, [u8; 3]),
|
||||
}
|
||||
|
||||
const FACES: [Face; 5] = [
|
||||
// Inner side of the upper step.
|
||||
Face {
|
||||
outline: &[(547.883, 282.66), (709.797, 188.211), (709.797, 375.985)],
|
||||
from: ((619.14, 179.734), [29, 99, 198]),
|
||||
to: ((694.687, 396.761), [21, 73, 158]),
|
||||
},
|
||||
// Top of the lower step.
|
||||
Face {
|
||||
outline: &[(727.797, 593.626), (727.797, 407.136), (889.571, 500.381)],
|
||||
from: ((619.14, 413.244), [69, 159, 255]),
|
||||
to: ((790.839, 605.547), [35, 121, 231]),
|
||||
},
|
||||
// Right face, with the recess.
|
||||
Face {
|
||||
outline: &[(530.0, 521.17), (691.797, 427.912), (691.797, 655.928), (907.594, 531.545), (907.594, 740.159), (530.0, 957.8)],
|
||||
from: ((632.876, 399.508), [27, 102, 207]),
|
||||
to: ((783.971, 968.175), [18, 69, 150]),
|
||||
},
|
||||
// Left face, stepped.
|
||||
Face {
|
||||
outline: &[(116.406, 510.769), (116.406, 303.529), (494.0, 521.17), (494.0, 957.8), (314.203, 854.167), (314.203, 624.777)],
|
||||
from: ((207.063, 303.357), [37, 141, 245]),
|
||||
to: ((426.837, 968.175), [20, 97, 218]),
|
||||
},
|
||||
// Top of the extruded profile.
|
||||
Face {
|
||||
outline: &[(134.374, 272.334), (512.0, 53.364), (691.828, 157.015), (476.117, 282.846), (673.752, 396.761), (512.0, 489.993)],
|
||||
from: ((385.63, 53.364), [81, 173, 255]),
|
||||
to: ((522.989, 510.769), [43, 131, 241]),
|
||||
},
|
||||
];
|
||||
|
||||
/// The mark's extent in SVG units: left, top, width, height.
|
||||
const BOUNDS: (f32, f32, f32, f32) = (116.406, 53.364, 791.188, 904.436);
|
||||
|
||||
/// This block is the icon image data
|
||||
pub fn rgba(size: usize) -> Result<Vec<u8>, String> {
|
||||
if !(1..=2048).contains(&size) {
|
||||
return Err("icon size must be 1..=2048".into());
|
||||
}
|
||||
type P = (f32, f32);
|
||||
// Coverage buffer at 4x4 samples per pixel (2x2 for big sizes), averaged down at the end.
|
||||
let ss = if size > 512 { 2 } else { 4 };
|
||||
let n = size * ss;
|
||||
let mut buf = vec![[0u8; 4]; n * n];
|
||||
let s = n as f32 / 412.217; // SVG units -> samples: the logo fills the height
|
||||
let ox = (n as f32 - 357.0 * s) / 2.0; // and is centred sideways
|
||||
// Fill a convex polygon given in SVG units.
|
||||
let mut fill = |pts: &[P], col: [u8; 3]| {
|
||||
let v: Vec<P> = pts.iter().map(|p| (ox + p.0 * s, p.1 * s)).collect();
|
||||
let (bx, by, bw, bh) = BOUNDS;
|
||||
let s = n as f32 / bh; // SVG units -> samples: the mark fills the height
|
||||
let (ox, oy) = ((n as f32 - bw * s) / 2.0 - bx * s, -by * s); // and is centred sideways
|
||||
// Fill each face's outline (even-odd spans per row, so concave outlines work) with its gradient.
|
||||
for face in &FACES {
|
||||
let v: Vec<P> = face.outline.iter().map(|p| (ox + p.0 * s, oy + p.1 * s)).collect();
|
||||
let (((fx, fy), c0), ((tx, ty), c1)) = (face.from, face.to);
|
||||
let (gx, gy) = (tx - fx, ty - fy);
|
||||
let g2 = gx * gx + gy * gy;
|
||||
let (top, bottom) = v.iter().fold((f32::MAX, f32::MIN), |(a, b), p| (a.min(p.1), b.max(p.1)));
|
||||
let mut xs = Vec::with_capacity(v.len());
|
||||
for y in ((top - 0.5).ceil() as i32).max(0)..=((bottom - 0.5).floor() as i32).min(n as i32 - 1) {
|
||||
let cy = y as f32 + 0.5;
|
||||
let (mut lo, mut hi) = (f32::MAX, f32::MIN);
|
||||
xs.clear();
|
||||
for i in 0..v.len() {
|
||||
let (a, b) = (v[i], v[(i + 1) % v.len()]);
|
||||
if (a.1 <= cy) != (b.1 <= cy) {
|
||||
let x = a.0 + (cy - a.1) / (b.1 - a.1) * (b.0 - a.0);
|
||||
lo = lo.min(x);
|
||||
hi = hi.max(x);
|
||||
xs.push(a.0 + (cy - a.1) / (b.1 - a.1) * (b.0 - a.0));
|
||||
}
|
||||
}
|
||||
if lo > hi {
|
||||
continue;
|
||||
}
|
||||
for x in ((lo - 0.5).ceil() as i32).max(0)..=((hi - 0.5).floor() as i32).min(n as i32 - 1) {
|
||||
buf[y as usize * n + x as usize] = [col[0], col[1], col[2], 255];
|
||||
xs.sort_by(f32::total_cmp);
|
||||
for &[from, to] in xs.as_chunks::<2>().0 {
|
||||
for x in ((from - 0.5).ceil() as i32).max(0)..=((to - 0.5).floor() as i32).min(n as i32 - 1) {
|
||||
// The sample's place along the gradient, in SVG units.
|
||||
let (px, py) = ((x as f32 + 0.5 - ox) / s, (cy - oy) / s);
|
||||
let t = (((px - fx) * gx + (py - fy) * gy) / g2).clamp(0.0, 1.0);
|
||||
let mix = |k: usize| (f32::from(c0[k]) + (f32::from(c1[k]) - f32::from(c0[k])) * t).round() as u8;
|
||||
buf[y as usize * n + x as usize] = [mix(0), mix(1), mix(2), 255];
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
// Faces: each is a few overlapping convex pieces (the filler only does convex shapes).
|
||||
let (light, mid, dark) = ([96, 158, 236], [58, 136, 238], [55, 108, 197]);
|
||||
fill(&[(3.5, 105.9), (177.0, 5.8), (263.4, 55.6), (263.8, 156.0), (177.0, 406.4)], light);
|
||||
fill(&[(177.0, 206.1), (263.8, 156.0), (350.5, 206.2), (350.5, 306.3), (177.0, 406.4)], light);
|
||||
fill(&[(3.5, 105.9), (177.0, 206.1), (177.0, 406.4)], mid);
|
||||
fill(&[(3.5, 105.9), (3.5, 205.7), (90.3, 256.2), (177.0, 206.1)], mid);
|
||||
fill(&[(177.0, 206.1), (90.3, 256.2), (90.0, 356.2), (177.0, 406.4)], mid);
|
||||
fill(&[(264.1, 155.8), (177.0, 206.1), (177.0, 406.4), (263.8, 256.2)], dark);
|
||||
fill(&[(263.8, 256.2), (350.5, 206.2), (350.5, 306.3), (177.0, 406.4)], dark);
|
||||
fill(&[(177.0, 206.1), (177.0, 406.4), (350.5, 306.3)], dark);
|
||||
fill(&[(263.8, 55.9), (263.8, 156.0), (177.1, 105.9)], dark);
|
||||
// White edge lines, 10 units wide: a rectangle per segment and a disc at each inner corner.
|
||||
let white = [255, 255, 255];
|
||||
let mut stroke = |pts: &[P], closed: bool| {
|
||||
let m = pts.len();
|
||||
for i in 0..(if closed { m } else { m - 1 }) {
|
||||
let (a, b) = (pts[i], pts[(i + 1) % m]);
|
||||
let l = ((b.0 - a.0).powi(2) + (b.1 - a.1).powi(2)).sqrt();
|
||||
let (nx, ny) = (-(b.1 - a.1) / l * 5.0, (b.0 - a.0) / l * 5.0);
|
||||
fill(&[(a.0 + nx, a.1 + ny), (b.0 + nx, b.1 + ny), (b.0 - nx, b.1 - ny), (a.0 - nx, a.1 - ny)], white);
|
||||
}
|
||||
for c in &pts[if closed { 0 } else { 1 }..if closed { m } else { m - 1 }] {
|
||||
let disc: Vec<P> = (0..16)
|
||||
.map(|k| {
|
||||
let t = k as f32 * std::f32::consts::TAU / 16.0;
|
||||
(c.0 + 5.0 * t.cos(), c.1 + 5.0 * t.sin())
|
||||
})
|
||||
.collect();
|
||||
fill(&disc, white);
|
||||
}
|
||||
};
|
||||
stroke(&[(263.8, 55.9), (177.1, 105.9), (263.8, 156.0), (263.8, 256.2), (350.6, 206.1)], false);
|
||||
stroke(&[(5.0, 105.9), (178.5, 206.1), (178.5, 406.4)], false);
|
||||
stroke(&[(177.0, 206.1), (263.8, 156.0)], false);
|
||||
stroke(
|
||||
&[
|
||||
(178.5, 5.8),
|
||||
(5.0, 105.9),
|
||||
(5.0, 206.1),
|
||||
(91.7, 256.2),
|
||||
(91.7, 356.4),
|
||||
(178.5, 406.4),
|
||||
(352.0, 306.3),
|
||||
(352.0, 206.1),
|
||||
(265.2, 156.0),
|
||||
(265.2, 55.9),
|
||||
],
|
||||
true,
|
||||
);
|
||||
}
|
||||
// Average each ss x ss block down to one pixel (straight alpha = covered share).
|
||||
let mut rgba = Vec::with_capacity(size * size * 4);
|
||||
for y in 0..size {
|
||||
@@ -123,4 +128,20 @@ mod tests {
|
||||
assert!(super::rgba(0).is_err());
|
||||
assert!(super::rgba(2049).is_err());
|
||||
}
|
||||
|
||||
/// Borderless: no white edge lines, and the gaps between faces are see-through. At 256 px
|
||||
/// the gap between the left and right faces (SVG x 494..530) is transparent on the row
|
||||
/// through the middle of the mark, and no opaque pixel is white.
|
||||
#[test]
|
||||
fn shared_mark_is_borderless() {
|
||||
let size = 256;
|
||||
let pixels = super::rgba(size).expect("valid size");
|
||||
let px = |x: usize, y: usize| pixels.as_chunks::<4>().0[y * size + x];
|
||||
let s = size as f32 / 904.436;
|
||||
let gap_x = ((size as f32 - 791.188 * s) / 2.0 + (512.0 - 116.406) * s) as usize;
|
||||
let row = ((750.0 - 53.364) * s) as usize;
|
||||
assert_eq!(px(gap_x, row)[3], 0, "the seam between the left and right faces is a gap");
|
||||
assert!(px(gap_x - 8, row)[3] == 255 && px(gap_x + 8, row)[3] == 255, "faces on both sides of the gap");
|
||||
assert!(pixels.as_chunks::<4>().0.iter().all(|p| p[3] == 0 || p[0] < 200), "no white edges");
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 364 KiB After Width: | Height: | Size: 364 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 44 KiB |
@@ -91,7 +91,7 @@ Palette changes preserve accepted artwork and never update review hashes.
|
||||
| `source/` | Rust viewport glyphs, markers, navigation and pointer; not command icons |
|
||||
|
||||
`crates/ui-egui/build.rs` embeds SVGs, palette and aliases. `icon_svg.rs` parses and
|
||||
rasterises them for `icons::paint`; adding an icon still requires its registry or
|
||||
rasterises them for `icons::paint_icon`; adding an icon still requires its registry or
|
||||
UI assignment and an application rebuild. Review status never controls rendering.
|
||||
|
||||
## Checks and reports
|
||||
|
||||
@@ -203,9 +203,11 @@ scale false
|
||||
screw false
|
||||
section false
|
||||
select false
|
||||
send false
|
||||
settings false
|
||||
sheet_rules false
|
||||
shell false
|
||||
shield false
|
||||
silhouette false
|
||||
sketch false
|
||||
sketch_break false
|
||||
@@ -237,6 +239,7 @@ split_face false
|
||||
spun false
|
||||
star false
|
||||
status_error false
|
||||
status_recovery false
|
||||
style false
|
||||
suppress false
|
||||
surface_blend false
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Send message</title>
|
||||
<path d="M32 51L32 13M17 28L32 13L47 28" fill="none" stroke="currentColor" stroke-width="5.6" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 243 B |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Keyboard shortcuts</title>
|
||||
<path d="M13 16L51 16A5 5 0 0 1 56 21L56 43A5 5 0 0 1 51 48L13 48A5 5 0 0 1 8 43L8 21A5 5 0 0 1 13 16Z" fill="none" stroke="currentColor" stroke-width="5.6" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<circle cx="20" cy="27" r="2.8" fill="currentColor"/>
|
||||
<circle cx="32" cy="27" r="2.8" fill="currentColor"/>
|
||||
<circle cx="44" cy="27" r="2.8" fill="currentColor"/>
|
||||
<path d="M20 39L44 39" fill="none" stroke="currentColor" stroke-width="5.6" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 607 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Graphics display</title>
|
||||
<path d="M13 10L51 10A5 5 0 0 1 56 15L56 37A5 5 0 0 1 51 42L13 42A5 5 0 0 1 8 37L8 15A5 5 0 0 1 13 10ZM32 42L32 54M24 54L40 54" fill="none" stroke="currentColor" stroke-width="5.6" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 334 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Mouse navigation</title>
|
||||
<path d="M32 8A13 13 0 0 1 45 21L45 43A13 13 0 0 1 19 43L19 21A13 13 0 0 1 32 8ZM32 8L32 24" fill="none" stroke="currentColor" stroke-width="5.6" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 299 B |
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Interface palette</title>
|
||||
<path d="M32 8C18.75 8 8 18.75 8 32C8 45.25 18.75 56 32 56C37 56 39 52.5 36.5 49C34 45.5 36 42 40 42L45 42C51.1 42 56 37.1 56 31C56 19 45 8 32 8Z" fill="none" stroke="currentColor" stroke-width="5.6" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<circle cx="21" cy="29" r="2.8" fill="currentColor"/>
|
||||
<circle cx="29" cy="20" r="2.8" fill="currentColor"/>
|
||||
<circle cx="41" cy="23" r="2.8" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 522 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Plugins</title>
|
||||
<path d="M24 8L24 21M40 8L40 21M16 21L48 21L48 29A16 16 0 0 1 16 29L16 21ZM32 45L32 56" fill="none" stroke="currentColor" stroke-width="5.6" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 285 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Approval required</title>
|
||||
<path d="M32 9L51 16L51 31C51 43 43 51 32 56C21 51 13 43 13 31L13 16Z" fill="none" stroke="currentColor" stroke-width="5.6" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 278 B |
@@ -0,0 +1,4 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Stop response</title>
|
||||
<path d="M20 17L44 17A3 3 0 0 1 47 20L47 44A3 3 0 0 1 44 47L20 47A3 3 0 0 1 17 44L17 20A3 3 0 0 1 20 17Z" fill="currentColor"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 229 B |
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<title>Recover unsaved design</title>
|
||||
<circle cx="32" cy="33" r="22" fill="#b9ddf8"/>
|
||||
<path d="M10 33A22 22 0 1 0 16.44 17.44L10 24" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M10 12L10 24L22 24" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
<path d="M32 21L32 33L41 39" fill="none" stroke="#236ead" stroke-width="4.25" stroke-linejoin="round" stroke-linecap="round"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 563 B |
@@ -99,14 +99,23 @@ pub(crate) fn breadcrumb(p: &egui::Painter, c: egui::Pos2, col: Color32) {
|
||||
}
|
||||
|
||||
pub(crate) fn brand_mark(p: &egui::Painter, c: Pos2) {
|
||||
let s = 20.0 / 412.217;
|
||||
brand_mark_styled(p, c, 20.0, crate::theme::Tokens::get().logo, true);
|
||||
}
|
||||
|
||||
/// The same original mark as a single quiet silhouette, without face seams or outlines.
|
||||
pub(crate) fn brand_mark_silhouette(p: &egui::Painter, c: Pos2, height: f32, ink: Color32) {
|
||||
brand_mark_styled(p, c, height, [ink; 3], false);
|
||||
}
|
||||
|
||||
fn brand_mark_styled(p: &egui::Painter, c: Pos2, height: f32, colours: [Color32; 3], edges: bool) {
|
||||
let s = height / 412.217;
|
||||
let m = |pts: &[(f32, f32)]| -> Vec<egui::Pos2> { pts.iter().map(|&(x, y)| pos2(c.x + (x - 178.5) * s, c.y + (y - 206.1) * s)).collect() };
|
||||
// egui only fills convex shapes, so each face is a few overlapping convex pieces.
|
||||
let face = |col: Color32, pts: &[(f32, f32)]| {
|
||||
p.add(egui::Shape::convex_polygon(m(pts), col, Stroke::NONE));
|
||||
};
|
||||
// The faces are separated by gaps that show the application bar, not by white lines.
|
||||
let [light, mid, dark, _] = crate::theme::Tokens::get().logo;
|
||||
let [light, mid, dark] = colours;
|
||||
let edge_col = crate::theme::Tokens::get().app_bar;
|
||||
face(light, &[(3.5, 105.9), (177.0, 5.8), (263.4, 55.6), (263.8, 156.0), (177.0, 406.4)]);
|
||||
face(light, &[(177.0, 206.1), (263.8, 156.0), (350.5, 206.2), (350.5, 306.3), (177.0, 406.4)]);
|
||||
@@ -117,7 +126,10 @@ pub(crate) fn brand_mark(p: &egui::Painter, c: Pos2) {
|
||||
face(dark, &[(263.8, 256.2), (350.5, 206.2), (350.5, 306.3), (177.0, 406.4)]);
|
||||
face(dark, &[(177.0, 206.1), (177.0, 406.4), (350.5, 306.3)]);
|
||||
face(dark, &[(263.8, 55.9), (263.8, 156.0), (177.1, 105.9)]);
|
||||
// White edge lines.
|
||||
if !edges {
|
||||
return;
|
||||
}
|
||||
// The seams between the faces and around the mark, in the bar's colour, so they read as gaps.
|
||||
let edge = Stroke::new(10.0 * s, edge_col);
|
||||
let line = |pts: &[(f32, f32)]| {
|
||||
p.add(egui::Shape::line(m(pts), edge));
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "HISTORIE",
|
||||
"Height": "Výška",
|
||||
"Hidden edges": "Skryté hrany",
|
||||
"History layout": "Rozložení historie",
|
||||
"Holes": "Otvory",
|
||||
"Holes (edges on them)": "Otvory (jejich hrany)",
|
||||
"Home view": "Výchozí pohled",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "Žádná hlášení o pádech.",
|
||||
"No matching appearance presets.": "Žádné odpovídající předvolby vzhledu.",
|
||||
"No matching appearances": "Žádné odpovídající vzhledy",
|
||||
"No visible bodies to export.": "Žádná viditelná tělesa k exportu.",
|
||||
"No visible bodies or sketches to export.": "Žádná viditelná tělesa ani náčrty k exportu.",
|
||||
"None": "Žádné",
|
||||
"Not available yet": "Zatím není k dispozici",
|
||||
"Notch": "Zářez",
|
||||
@@ -831,7 +832,7 @@
|
||||
"dxf.progress.projection": "Promítání geometrie (3/5)",
|
||||
"dxf.progress.write": "Zápis DXF (5/5)",
|
||||
"dxf.tolerance": "Tolerance křivek",
|
||||
"dxf.tolerance_help": "Pouze viditelná tělesa. Křivky jsou nahrazeny úsečkami. Menší tolerance dává jemnější křivky, ale zabere více času a paměti.",
|
||||
"dxf.tolerance_help": "Pouze viditelná tělesa a zobrazené náčrty. Křivky jsou nahrazeny úsečkami. Menší tolerance dává jemnější křivky, ale zabere více času a paměti.",
|
||||
"file_load.built": "Dosud sestaveno: {built} z {total} prvků.",
|
||||
"file_load.converting": "Převod tělesa {done} z {total}",
|
||||
"file_load.inserting": "Vkládání geometrie",
|
||||
@@ -856,19 +857,57 @@
|
||||
"help.mit": "Licence MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Licence třetích stran",
|
||||
"home.back": "Zpět na {name}",
|
||||
"home.crashes": "Hlášení o pádech",
|
||||
"home.design_workspace": "Návrh",
|
||||
"home.documentation": "Dokumentace",
|
||||
"home.export": "Exportovat",
|
||||
"home.export_hint": "Vyberte formát pro aktuální návrh.",
|
||||
"home.export_json_hint": "Upravitelný návrh a historie příkazů",
|
||||
"home.export_mesh_hint": "Síť pro tisk nebo sdílení",
|
||||
"home.export_step_hint": "Přesná geometrie tělesa",
|
||||
"home.import": "Importovat…",
|
||||
"home.import_hint": "STEP, IGES nebo síť do nového návrhu",
|
||||
"home.in_this_browser": "v tomto prohlížeči",
|
||||
"home.missing": "chybí",
|
||||
"home.month_01": "led",
|
||||
"home.month_02": "úno",
|
||||
"home.month_03": "bře",
|
||||
"home.month_04": "dub",
|
||||
"home.month_05": "kvě",
|
||||
"home.month_06": "čer",
|
||||
"home.month_07": "čvc",
|
||||
"home.month_08": "srp",
|
||||
"home.month_09": "zář",
|
||||
"home.month_10": "říj",
|
||||
"home.month_11": "lis",
|
||||
"home.month_12": "pro",
|
||||
"home.new_inches": "Nový návrh v palcích",
|
||||
"home.new_inches_hint": "Palce · otevře se v pracovním prostoru Návrh",
|
||||
"home.new_mm": "Nový návrh",
|
||||
"home.new_mm_hint": "Milimetry · otevře se v pracovním prostoru Návrh",
|
||||
"home.open": "Otevřít…",
|
||||
"home.opened_days_ago": "Otevřeno před {count} dny",
|
||||
"home.opened_hours_ago": "Otevřeno před {count} h",
|
||||
"home.opened_just_now": "Otevřeno právě teď",
|
||||
"home.opened_minutes_ago": "Otevřeno před {count} min",
|
||||
"home.open_hint": "Návrh ve formátu .solidcraft ({shortcut})",
|
||||
"home.open_now": "Otevřít nyní",
|
||||
"home.opened_days_ago": "Před {count} dny",
|
||||
"home.opened_hours_ago": "Před {count} h",
|
||||
"home.opened_just_now": "Právě teď",
|
||||
"home.opened_minutes_ago": "Před {count} min",
|
||||
"home.opening": "otevírání…",
|
||||
"home.properties": "Vlastnosti návrhu",
|
||||
"home.recent": "Nedávné",
|
||||
"home.recent_empty": "Zde se zobrazí návrhy, které otevřete nebo uložíte.",
|
||||
"home.recovery_count": "Návrhy k obnovení: {count}",
|
||||
"home.recovery_empty": "Žádné návrhy k obnovení.",
|
||||
"home.recovery_hint": "SolidCraft se zavřel před uložením těchto návrhů.",
|
||||
"home.report_issue": "Nahlásit problém",
|
||||
"home.samples": "Ukázky",
|
||||
"home.settings": "Nastavení",
|
||||
"home.short_date": "{day}. {month}",
|
||||
"home.shortcuts": "Klávesové zkratky",
|
||||
"home.start_hint": "Vytvořte návrh, otevřete nedávný soubor nebo prozkoumejte ukázku.",
|
||||
"home.whats_new": "Co je nového",
|
||||
"home.yesterday": "Včera",
|
||||
"install.button_tip": "Nainstalovat SolidCraft jako aplikaci: otevře se ve vlastním okně a funguje i offline",
|
||||
"install.dock_1": "Zvolte Soubor › Přidat do Docku.",
|
||||
"install.dock_2": "Klikněte na Přidat.",
|
||||
@@ -1021,7 +1060,7 @@
|
||||
"search.try": "Zadejte název příkazu, prvek v tomto návrhu nebo parametr. Chcete-li spustit příkaz s hodnotami, zadejte jeho id a objekt JSON: {example}",
|
||||
"search.valid": "Platné",
|
||||
"settings.display_quality_note": "Jemnější úrovně kreslí zakřivené plochy a hrany hladčeji, ale síťování trvá déle. Mění se jen zobrazení, nikdy návrh ani exporty.",
|
||||
"settings.frame_rate_note": "Zobrazuje snímky za sekundu v pravém dolním rohu pohledu. Dokud je zapnuto, pohled se překresluje nepřetržitě.",
|
||||
"settings.frame_rate_note": "Zobrazuje snímky za sekundu v pravém dolním rohu pohledu.",
|
||||
"settings.measure_axis_distances": "Zobrazit vzdálenosti X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Při otevřeném měření zobrazit kromě celkové vzdálenosti i složky ve směru os.",
|
||||
"settings.msaa_applies_on_restart": "Vyhlazování se projeví při příštím spuštění SolidCraftu",
|
||||
@@ -1092,6 +1131,7 @@
|
||||
"ui.agent_chat_add": "Připojit soubory",
|
||||
"ui.agent_chat_add_file": "Vybrat soubor…",
|
||||
"ui.agent_chat_allow": "Povolit",
|
||||
"ui.agent_chat_allow_once": "Povolit jednou",
|
||||
"ui.agent_chat_allowed": "Povoleno",
|
||||
"ui.agent_chat_answered": "Odpověď: {option}",
|
||||
"ui.agent_chat_approval": "Povolit agentovi tuto akci?",
|
||||
@@ -1143,12 +1183,16 @@
|
||||
"ui.agent_chat_files_left_out": "K jedné zprávě lze připojit nejvýše {max} souborů; vynecháno: {files}",
|
||||
"ui.agent_chat_files_loading": "Čekání na přečtení souborů",
|
||||
"ui.agent_chat_files_max": "K jedné zprávě nejvýše {max} souborů",
|
||||
"ui.agent_chat_flatpak_none_found": "Nebyl nalezen žádný kódovací agent. Sandbox Flatpaku ve výchozím stavu nevidí agenty nainstalované ve vaší domovské složce a nemá přístup k síti. Chcete-li povolit Claude Code a jeho adaptér ACP nainstalované přes nvm nebo do ~/.local/bin, spusťte v terminálu tento příkaz a poté SolidCraft restartujte. Udělí přístup k uvedeným programům a přihlašovacím souborům a také přístup k síti:",
|
||||
"ui.agent_chat_import_failed": "{name}: import selhal: {error}",
|
||||
"ui.agent_chat_intro": "Chatujte s kódovacím agentem, kterého již používáte, nebo s modelem na zvoleném endpointu. Pracuje na otevřeném návrhu pomocí nástrojů SolidCraftu: jeho změny vidíte průběžně a každou zprávu lze vrátit jedním krokem. Co smí dělat bez ptaní, nastavíte v Předvolby > AI.",
|
||||
"ui.agent_chat_key_in_env": "klíč nastaven",
|
||||
"ui.agent_chat_left": "Vlevo",
|
||||
"ui.agent_chat_limit": "Agent dosáhl limitu {limit} změn na jednu zprávu. Pošlete další zprávu, aby mohl pokračovat.",
|
||||
"ui.agent_chat_minimize": "Minimalizovat do pruhu",
|
||||
"ui.agent_chat_mode_all": "Vše",
|
||||
"ui.agent_chat_mode_ask": "Ptát se",
|
||||
"ui.agent_chat_mode_edits": "Úpravy",
|
||||
"ui.agent_chat_model_tip": "Model, který agent používá. Vaše volba se pro tohoto agenta zapamatuje.",
|
||||
"ui.agent_chat_new": "Nový chat",
|
||||
"ui.agent_chat_new_confirm": "Začít nový chat? Aktuální bude vymazán.",
|
||||
@@ -1161,6 +1205,7 @@
|
||||
"ui.agent_chat_none_found_short": "Agent nenalezen",
|
||||
"ui.agent_chat_not_installed": "Není nainstalován",
|
||||
"ui.agent_chat_not_signed_in": "nepřihlášen",
|
||||
"ui.agent_chat_open_settings": "Otevřít předvolby",
|
||||
"ui.agent_chat_own_window": "Vlastní okno",
|
||||
"ui.agent_chat_paste_picture": "Vložit obrázek",
|
||||
"ui.agent_chat_permission": "Agent žádá o spuštění: {title}",
|
||||
@@ -1185,6 +1230,8 @@
|
||||
"ui.agent_chat_send": "Odeslat",
|
||||
"ui.agent_chat_send_now": "Odeslat hned",
|
||||
"ui.agent_chat_send_now_tip": "Zastavit aktuální krok agenta a poslat tuto zprávu jako další (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft komunikuje s programovacím agentem nainstalovaným v tomto počítači. Vyberte ho v části Předvolby › AI.",
|
||||
"ui.agent_chat_setup_title": "Nastavit asistenta",
|
||||
"ui.agent_chat_side": "Strana chatu s agentem",
|
||||
"ui.agent_chat_signed_in": "přihlášen",
|
||||
"ui.agent_chat_state_auth": "Vyžadováno přihlášení",
|
||||
@@ -1201,6 +1248,7 @@
|
||||
"ui.agent_chat_undo_label": "Chat s agentem: {message}",
|
||||
"ui.agent_chat_undone": "(vráceno)",
|
||||
"ui.agent_chat_view_attached": "Pohled přiložen",
|
||||
"ui.agent_chat_waiting": "Čeká na vás",
|
||||
"ui.agent_cursor": "Kurzor agenta",
|
||||
"ui.agent_cursor_speed": "Rychlost kurzoru agenta",
|
||||
"ui.ai_add": "Přidat",
|
||||
@@ -1455,6 +1503,7 @@
|
||||
"ui.grid_follows_view_hint": "Boční pohledy zobrazí mřížku na svislé rovině, která je k nim přivrácená, místo na zemi",
|
||||
"ui.ground_shadow": "Stín na podložce",
|
||||
"ui.groupSelected": "Seskupit vybrané",
|
||||
"ui.hatch": "Šrafování",
|
||||
"ui.heading_add_ins": "DOPLŇKY",
|
||||
"ui.heading_assemble": "SESTAVA",
|
||||
"ui.heading_box": "KVÁDR",
|
||||
@@ -1528,6 +1577,11 @@
|
||||
"ui.hideOrigin": "Skrýt počátek",
|
||||
"ui.hidePlanes": "Skrýt roviny",
|
||||
"ui.hideProfile": "Skrýt profil",
|
||||
"ui.history_back": "O krok zpět",
|
||||
"ui.history_below_browser": "Pod prohlížečem",
|
||||
"ui.history_first": "Přejít na začátek",
|
||||
"ui.history_forward": "O krok vpřed",
|
||||
"ui.history_last": "Přejít na konec",
|
||||
"ui.history_title": "Historie",
|
||||
"ui.hole": "Otvor",
|
||||
"ui.hole_tap_type": "Typ závitu otvoru",
|
||||
@@ -1545,6 +1599,8 @@
|
||||
"ui.joints": "Klouby",
|
||||
"ui.keyboard_shortcuts": "Klávesové zkratky",
|
||||
"ui.language": "Jazyk",
|
||||
"ui.layout_compact": "Kompaktní",
|
||||
"ui.layout_floating": "Plovoucí",
|
||||
"ui.length_decimals": "Desetinná místa délky",
|
||||
"ui.light": "Světlý",
|
||||
"ui.line": "Úsečka",
|
||||
@@ -1682,6 +1738,7 @@
|
||||
"ui.reverse_zoom_direction": "Obrátit směr přiblížení",
|
||||
"ui.revolve": "Rotace",
|
||||
"ui.ribbon_exit": "Ukončit",
|
||||
"ui.ribbon_labels": "Zobrazovat text pod ikonami pásu karet",
|
||||
"ui.ribbon_pin_footer": "Připnuté příkazy se zobrazují na pásu karet. Najetím na řádek jej připnete nebo odepnete.",
|
||||
"ui.ribbon_workspace": "Pracovní prostředí",
|
||||
"ui.right": "Zprava",
|
||||
@@ -1737,6 +1794,7 @@
|
||||
"ui.smooth_wheel_zoom": "Plynulé přiblížení kolečkem",
|
||||
"ui.smooth_wheel_zoom_tip": "Vypnutím se každý pohyb kolečka projeví okamžitě, bez dobíhání",
|
||||
"ui.snap": "Přichytávání",
|
||||
"ui.space_mouse_axes_reassigned": "Osy jsou v Předvolbách přeřazené a to platí i po této kalibraci.",
|
||||
"ui.space_mouse_calibrate": "Kalibrovat…",
|
||||
"ui.space_mouse_calibrate_tip": "Pohybujte hlavicí podle pokynů v okně, aby se SolidCraft naučil, kterým směrem a jak daleko se pohybuje každá osa této 3D myši. Uloží se pro tuto 3D myš.",
|
||||
"ui.space_mouse_calibrate_title": "Kalibrace 3D myši",
|
||||
@@ -1746,12 +1804,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Jedna osa se skoro nepohnula, takže ji nelze zkalibrovat. Začněte znovu a pokaždé hlavicí pohněte dál.",
|
||||
"ui.space_mouse_dead_zone": "Mrtvá zóna",
|
||||
"ui.space_mouse_dead_zone_tip": "Jak daleko se musí hlavice pohnout, než se pohne pohled, jako podíl jejího plného rozsahu. Zvyšte ji, pokud pohled ujíždí, i když je hlavice v klidu.",
|
||||
"ui.space_mouse_driven_by": "Který kalibrovaný pohyb zařízení ovládá tuto osu. Když vyberete pohyb, který už používá jiná osa, obě se prohodí.",
|
||||
"ui.space_mouse_driven_by_label": "ovládá",
|
||||
"ui.space_mouse_driver": "Ovladač 3D myši",
|
||||
"ui.space_mouse_driver_auto": "Automaticky",
|
||||
"ui.space_mouse_driver_direct": "Přímo (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Zařízení se čte přímo; spacenavd neběží",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Čte se přes spacenavd, jiná možnost není",
|
||||
"ui.space_mouse_forget": "Zapomenout kalibraci",
|
||||
"ui.space_mouse_hint": "Posun a otáčení pohledu současně; náčrty používají jen posun a přiblížení.",
|
||||
"ui.space_mouse_motion_rotation_x": "Rotace X",
|
||||
"ui.space_mouse_motion_rotation_y": "Rotace Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Rotace Z",
|
||||
"ui.space_mouse_motion_translation_x": "Posun X",
|
||||
"ui.space_mouse_motion_translation_y": "Posun Y",
|
||||
"ui.space_mouse_motion_translation_z": "Posun Z",
|
||||
"ui.space_mouse_navigate": "Navigace pomocí SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "3D myš nenalezena",
|
||||
"ui.space_mouse_not_calibrated": "Nezkalibrováno",
|
||||
"ui.space_mouse_reading": "Hodnoty",
|
||||
"ui.space_mouse_reset_axes": "Obnovit přiřazení os",
|
||||
"ui.space_mouse_step_lift": "Zvedněte hlavici nahoru, podržte a pusťte.",
|
||||
"ui.space_mouse_step_press": "Zatlačte hlavici dolů, podržte a pusťte.",
|
||||
"ui.space_mouse_step_pull": "Přitáhněte hlavici k sobě, podržte a pusťte.",
|
||||
@@ -1765,6 +1837,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Nakloňte hlavici doprava (pravá hrana dolů), podržte a pusťte.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Otočte hlavici po směru hodinových ručiček, podržte a pusťte.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Otočte hlavici proti směru hodinových ručiček, podržte a pusťte.",
|
||||
"ui.space_mouse_view_axis": "Osa pohledu",
|
||||
"ui.space_mouse_view_off": "Vypnuto",
|
||||
"ui.space_mouse_view_off_tip": "Profil ovladače 3D myši tuto osu vypíná, takže její pohyb s pohledem nehýbe. Když tu vyberete pohyb jiné osy, prohodí se s ní a s pohledem přestane hýbat.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Orbit vlevo / vpravo",
|
||||
"ui.space_mouse_view_orbit_up_down": "Orbit nahoru / dolů",
|
||||
"ui.space_mouse_view_pan_sideways": "Posun vlevo / vpravo",
|
||||
"ui.space_mouse_view_pan_up_down": "Posun nahoru / dolů",
|
||||
"ui.space_mouse_view_roll": "Natočení",
|
||||
"ui.space_mouse_view_unmapped": "Osa {n}",
|
||||
"ui.space_mouse_view_zoom": "Zoom",
|
||||
"ui.spacing": "Rozteč",
|
||||
"ui.spacing_2": "Rozteč 2",
|
||||
"ui.sphere": "Koule",
|
||||
@@ -1836,6 +1918,7 @@
|
||||
"ui.workspace_design_tabs": "Model · Plocha · Sestava · Vložit · Kontrola · Správa · Zobrazení",
|
||||
"ui.workspace_drawing_description": "2D výkresy s pohledy, kótami a popisovými poli",
|
||||
"ui.workspace_footer": "Všechna pracovní prostředí pracují se stejným návrhem, historií a výběrem; mění se pouze karty pásu karet. Přepínač je zamknutý, dokud se upravuje náčrt nebo prvek.",
|
||||
"ui.workspace_layout": "Rozložení pracovní plochy",
|
||||
"ui.workspace_manufacture_description": "Slicing, dráhy nástroje a nastavení",
|
||||
"ui.workspace_planned": "Plánováno",
|
||||
"ui.workspace_render_description": "Náhled produktu, nastavení scény a renderované obrázky",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "HISTORIK",
|
||||
"Height": "Højde",
|
||||
"Hidden edges": "Skjulte kanter",
|
||||
"History layout": "Historiklayout",
|
||||
"Holes": "Huller",
|
||||
"Holes (edges on them)": "Huller (kanterne omkring dem)",
|
||||
"Home view": "Hjemmevisning",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "Ingen nedbrudsrapporter.",
|
||||
"No matching appearance presets.": "Ingen matchende udseendeforudindstillinger.",
|
||||
"No matching appearances": "Ingen matchende udseender",
|
||||
"No visible bodies to export.": "Der er ingen synlige emner at eksportere.",
|
||||
"No visible bodies or sketches to export.": "Der er ingen synlige emner eller skitser at eksportere.",
|
||||
"None": "Ingen",
|
||||
"Not available yet": "Endnu ikke tilgængelig",
|
||||
"Notch": "Udskæring",
|
||||
@@ -831,7 +832,7 @@
|
||||
"dxf.progress.projection": "Projicerer geometri (3/5)",
|
||||
"dxf.progress.write": "Skriver DXF (5/5)",
|
||||
"dxf.tolerance": "Kurvetolerance",
|
||||
"dxf.tolerance_help": "Kun synlige emner. Kurver består af rette linjestykker. En mindre tolerance giver finere kurver og kræver mere tid og hukommelse.",
|
||||
"dxf.tolerance_help": "Kun synlige emner og viste skitser. Kurver består af rette linjestykker. En mindre tolerance giver finere kurver og kræver mere tid og hukommelse.",
|
||||
"file_load.built": "Bygget indtil videre: {built} af {total} features.",
|
||||
"file_load.converting": "Konverterer solid {done} af {total}",
|
||||
"file_load.inserting": "Indsætter geometri",
|
||||
@@ -856,19 +857,57 @@
|
||||
"help.mit": "MIT-licens",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Tredjepartslicenser",
|
||||
"home.back": "Tilbage til {name}",
|
||||
"home.crashes": "Nedbrudsrapporter",
|
||||
"home.design_workspace": "Design",
|
||||
"home.documentation": "Dokumentation",
|
||||
"home.export": "Eksportér",
|
||||
"home.export_hint": "Vælg et format til det aktuelle design.",
|
||||
"home.export_json_hint": "Redigerbart design og kommandohistorik",
|
||||
"home.export_mesh_hint": "Mesh til udskrivning eller deling",
|
||||
"home.export_step_hint": "Præcis geometri for massive legemer",
|
||||
"home.import": "Importér…",
|
||||
"home.import_hint": "STEP, IGES eller mesh til et nyt design",
|
||||
"home.in_this_browser": "i denne webbrowser",
|
||||
"home.missing": "mangler",
|
||||
"home.month_01": "jan.",
|
||||
"home.month_02": "feb.",
|
||||
"home.month_03": "mar.",
|
||||
"home.month_04": "apr.",
|
||||
"home.month_05": "maj",
|
||||
"home.month_06": "jun.",
|
||||
"home.month_07": "jul.",
|
||||
"home.month_08": "aug.",
|
||||
"home.month_09": "sep.",
|
||||
"home.month_10": "okt.",
|
||||
"home.month_11": "nov.",
|
||||
"home.month_12": "dec.",
|
||||
"home.new_inches": "Nyt design i tommer",
|
||||
"home.new_inches_hint": "Tommer · åbner i Design",
|
||||
"home.new_mm": "Nyt design",
|
||||
"home.new_mm_hint": "Millimeter · åbner i Design",
|
||||
"home.open": "Åbn…",
|
||||
"home.opened_days_ago": "Åbnet for {count} dage siden",
|
||||
"home.opened_hours_ago": "Åbnet for {count} t siden",
|
||||
"home.opened_just_now": "Netop åbnet",
|
||||
"home.opened_minutes_ago": "Åbnet for {count} min siden",
|
||||
"home.open_hint": "Et .solidcraft-design ({shortcut})",
|
||||
"home.open_now": "Åbn nu",
|
||||
"home.opened_days_ago": "For {count} dage siden",
|
||||
"home.opened_hours_ago": "For {count} t siden",
|
||||
"home.opened_just_now": "Lige nu",
|
||||
"home.opened_minutes_ago": "For {count} min siden",
|
||||
"home.opening": "åbner…",
|
||||
"home.properties": "Designegenskaber",
|
||||
"home.recent": "Seneste",
|
||||
"home.recent_empty": "Design, du åbner eller gemmer, vises her.",
|
||||
"home.recovery_count": "Design til gendannelse: {count}",
|
||||
"home.recovery_empty": "Ingen design kan gendannes.",
|
||||
"home.recovery_hint": "SolidCraft lukkede, før disse design blev gemt.",
|
||||
"home.report_issue": "Rapportér et problem",
|
||||
"home.samples": "Eksempler",
|
||||
"home.settings": "Indstillinger",
|
||||
"home.short_date": "{day}. {month}",
|
||||
"home.shortcuts": "Tastaturgenveje",
|
||||
"home.start_hint": "Opret et design, åbn en nylig fil, eller udforsk et eksempel.",
|
||||
"home.whats_new": "Nyheder",
|
||||
"home.yesterday": "I går",
|
||||
"install.button_tip": "Installér SolidCraft som en app: Den åbner i sit eget vindue og virker offline",
|
||||
"install.dock_1": "Vælg Arkiv › Føj til Dock.",
|
||||
"install.dock_2": "Klik på Tilføj.",
|
||||
@@ -1021,7 +1060,7 @@
|
||||
"search.try": "Skriv et kommandonavn, en feature i dette design eller en parameter. Du kører en kommando med værdier ved at skrive dens id og et JSON-objekt: {example}",
|
||||
"search.valid": "Gyldig",
|
||||
"settings.display_quality_note": "Finere niveauer viser krumme flader og kanter mere jævnt og tager længere tid at opbygge mesh til. Kun modelvisningen ændres, aldrig designet eller eksporten.",
|
||||
"settings.frame_rate_note": "Viser billeder pr. sekund nederst til højre i modelvisningen. Når dette er slået til, gentegnes visningen løbende.",
|
||||
"settings.frame_rate_note": "Viser billeder pr. sekund nederst til højre i modelvisningen.",
|
||||
"settings.measure_axis_distances": "Vis X/Y/Z-afstande",
|
||||
"settings.measure_axis_distances_help": "Vis afstanden langs X-, Y- og Z-aksen sammen med den samlede afstand i Mål.",
|
||||
"settings.msaa_applies_on_restart": "Kantudjævning træder i kraft, næste gang SolidCraft starter",
|
||||
@@ -1092,6 +1131,7 @@
|
||||
"ui.agent_chat_add": "Vedhæft filer",
|
||||
"ui.agent_chat_add_file": "Vælg en fil…",
|
||||
"ui.agent_chat_allow": "Tillad",
|
||||
"ui.agent_chat_allow_once": "Tillad én gang",
|
||||
"ui.agent_chat_allowed": "Tilladt",
|
||||
"ui.agent_chat_answered": "Svar: {option}",
|
||||
"ui.agent_chat_approval": "Tillad agenten at gøre dette?",
|
||||
@@ -1143,12 +1183,16 @@
|
||||
"ui.agent_chat_files_left_out": "Højst {max} filer pr. besked; udeladt: {files}",
|
||||
"ui.agent_chat_files_loading": "Venter på indlæsning af filerne",
|
||||
"ui.agent_chat_files_max": "Højst {max} filer i én besked",
|
||||
"ui.agent_chat_flatpak_none_found": "Ingen kodeagent fundet. Flatpak-sandkassen kan som standard ikke se agenter, der er installeret i din hjemmemappe, og har ingen netværksadgang. For at tillade Claude Code og dets ACP-adapter installeret via nvm eller i ~/.local/bin skal du køre denne kommando i en terminal og derefter genstarte SolidCraft. Den giver adgang til de nævnte programmer og loginfiler samt netværksadgang:",
|
||||
"ui.agent_chat_import_failed": "{name}: Importen mislykkedes: {error}",
|
||||
"ui.agent_chat_intro": "Chat med en kodeagent, du allerede bruger, eller en modeltjeneste, du vælger. Den arbejder på det åbne design gennem SolidCrafts værktøjer: Ændringer vises undervejs og fortrydes som ét trin pr. besked. Hvad den må gøre uden at spørge, angives i Indstillinger > AI.",
|
||||
"ui.agent_chat_key_in_env": "nøgle angivet",
|
||||
"ui.agent_chat_left": "Venstre",
|
||||
"ui.agent_chat_limit": "Agenten nåede grænsen på {limit} ændringer for én besked. Send en ny besked for at lade den fortsætte.",
|
||||
"ui.agent_chat_minimize": "Minimér til en stribe",
|
||||
"ui.agent_chat_mode_all": "Alt",
|
||||
"ui.agent_chat_mode_ask": "Spørg",
|
||||
"ui.agent_chat_mode_edits": "Ændringer",
|
||||
"ui.agent_chat_model_tip": "Modellen, som agenten bruger. Dit valg huskes for denne agent.",
|
||||
"ui.agent_chat_new": "Ny chat",
|
||||
"ui.agent_chat_new_confirm": "Start en ny chat? Den aktuelle chat ryddes.",
|
||||
@@ -1161,6 +1205,7 @@
|
||||
"ui.agent_chat_none_found_short": "Ingen agent fundet",
|
||||
"ui.agent_chat_not_installed": "Ikke installeret",
|
||||
"ui.agent_chat_not_signed_in": "ikke logget ind",
|
||||
"ui.agent_chat_open_settings": "Åbn indstillinger",
|
||||
"ui.agent_chat_own_window": "Eget vindue",
|
||||
"ui.agent_chat_paste_picture": "Indsæt et billede",
|
||||
"ui.agent_chat_permission": "Agenten beder om at køre: {title}",
|
||||
@@ -1185,6 +1230,8 @@
|
||||
"ui.agent_chat_send": "Send",
|
||||
"ui.agent_chat_send_now": "Send nu",
|
||||
"ui.agent_chat_send_now_tip": "Stop agentens aktuelle trin, og send denne som den næste (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft kommunikerer med en kodeagent, der er installeret på denne computer. Vælg en under Indstillinger › AI.",
|
||||
"ui.agent_chat_setup_title": "Opsæt en assistent",
|
||||
"ui.agent_chat_side": "Agentchattens side",
|
||||
"ui.agent_chat_signed_in": "logget ind",
|
||||
"ui.agent_chat_state_auth": "Login kræves",
|
||||
@@ -1201,6 +1248,7 @@
|
||||
"ui.agent_chat_undo_label": "Agentchat: {message}",
|
||||
"ui.agent_chat_undone": "(fortrudt)",
|
||||
"ui.agent_chat_view_attached": "Visning vedhæftet",
|
||||
"ui.agent_chat_waiting": "Venter på dig",
|
||||
"ui.agent_cursor": "Agentmarkør",
|
||||
"ui.agent_cursor_speed": "Agentmarkørens hastighed",
|
||||
"ui.ai_add": "Tilføj",
|
||||
@@ -1455,6 +1503,7 @@
|
||||
"ui.grid_follows_view_hint": "Sidevisninger viser gitteret på det lodrette plan, der vender mod dem, i stedet for grundplanet",
|
||||
"ui.ground_shadow": "Skygge på grundplan",
|
||||
"ui.groupSelected": "Gruppér valgte",
|
||||
"ui.hatch": "Skravering",
|
||||
"ui.heading_add_ins": "ADD-INS",
|
||||
"ui.heading_assemble": "SAMLING",
|
||||
"ui.heading_box": "BOKS",
|
||||
@@ -1528,6 +1577,11 @@
|
||||
"ui.hideOrigin": "Skjul nulpunkt",
|
||||
"ui.hidePlanes": "Skjul planer",
|
||||
"ui.hideProfile": "Skjul profil",
|
||||
"ui.history_back": "Gå ét trin tilbage",
|
||||
"ui.history_below_browser": "Under browseren",
|
||||
"ui.history_first": "Gå til begyndelsen",
|
||||
"ui.history_forward": "Gå ét trin frem",
|
||||
"ui.history_last": "Gå til slutningen",
|
||||
"ui.history_title": "Historik",
|
||||
"ui.hole": "Hul",
|
||||
"ui.hole_tap_type": "Hullets gevindtype",
|
||||
@@ -1545,6 +1599,8 @@
|
||||
"ui.joints": "Led",
|
||||
"ui.keyboard_shortcuts": "Tastaturgenveje",
|
||||
"ui.language": "Sprog",
|
||||
"ui.layout_compact": "Kompakt",
|
||||
"ui.layout_floating": "Flydende",
|
||||
"ui.length_decimals": "Længdedecimaler",
|
||||
"ui.light": "Lys",
|
||||
"ui.line": "Linje",
|
||||
@@ -1682,6 +1738,7 @@
|
||||
"ui.reverse_zoom_direction": "Vend zoomretning",
|
||||
"ui.revolve": "Omdrejning",
|
||||
"ui.ribbon_exit": "Afslut",
|
||||
"ui.ribbon_labels": "Vis tekst under ikonerne på båndet",
|
||||
"ui.ribbon_pin_footer": "Fastgjorte kommandoer vises på båndet. Hold musen over en række for at fastgøre eller frigøre den.",
|
||||
"ui.ribbon_workspace": "Arbejdsområde",
|
||||
"ui.right": "Fra højre",
|
||||
@@ -1836,6 +1893,7 @@
|
||||
"ui.workspace_design_tabs": "Model · Overflade · Saml · Indsæt · Undersøg · Administrér · Visning",
|
||||
"ui.workspace_drawing_description": "2D-tegninger med visninger, mål og tegningshoveder",
|
||||
"ui.workspace_footer": "Alle arbejdsområder arbejder på det samme design, den samme historik og den samme markering; kun båndets faner ændres. Skifteren er låst, mens en skitse eller feature redigeres.",
|
||||
"ui.workspace_layout": "Arbejdsområdets layout",
|
||||
"ui.workspace_manufacture_description": "Slicing, værktøjsbaner og opsætning",
|
||||
"ui.workspace_planned": "Planlagt",
|
||||
"ui.workspace_render_description": "Produktforhåndsvisning, scene-indstillinger og renderede billeder",
|
||||
|
||||
@@ -14,11 +14,15 @@
|
||||
"Active": "Aktiv",
|
||||
"Active rule": "Aktive Regel",
|
||||
"Add": "Hinzufügen",
|
||||
"Add Column": "Spalte hinzufügen",
|
||||
"Add Key": "Schlüssel hinzufügen",
|
||||
"Add Mid Radius": "Mittleren Radius hinzufügen",
|
||||
"Add Row": "Zeile hinzufügen",
|
||||
"Add a tool": "Werkzeug hinzufügen",
|
||||
"Add condition": "Bedingung hinzufügen",
|
||||
"Add or edit rule": "Regel hinzufügen oder bearbeiten",
|
||||
"Add to New Folder": "Zu neuem Ordner hinzufügen",
|
||||
"Advanced": "Erweitert",
|
||||
"Against": "Gegen",
|
||||
"Alignment": "Ausrichtung",
|
||||
"All Sketch Points": "Alle Skizzenpunkte",
|
||||
@@ -31,6 +35,7 @@
|
||||
"Appearance name": "Name des Erscheinungsbilds",
|
||||
"Applied Radius": "Angewendeter Radius",
|
||||
"Apply To": "Anwenden auf",
|
||||
"Apply library appearance": "Erscheinungsbild aus der Bibliothek anwenden",
|
||||
"Apply to selection": "Auf Auswahl anwenden",
|
||||
"Apply your appearance first. Exports assigned appearances and materials created in this design.": "Wenden Sie zuerst Ihr Erscheinungsbild an. Exportiert zugewiesene Erscheinungsbilder und in diesem Design erstellte Materialien.",
|
||||
"Arc length": "Bogenlänge",
|
||||
@@ -41,13 +46,18 @@
|
||||
"BLEND SURFACE": "ÜBERGANGSFLÄCHE",
|
||||
"BOUNDARY SURFACE": "BERANDUNGSFLÄCHE",
|
||||
"BROWSER": "BROWSER",
|
||||
"Bend Edges": "Biegekanten",
|
||||
"Bend Line Position": "Position der Biegelinie",
|
||||
"Bend Position": "Biegeposition",
|
||||
"Bend Radius": "Biegeradius",
|
||||
"Bend Table": "Biegetabelle",
|
||||
"Bends": "Biegungen",
|
||||
"Bodies": "Körper",
|
||||
"Bodies (optional)": "Körper (optional)",
|
||||
"Body": "Körper",
|
||||
"Body (last if none)": "Körper (letzter, wenn keiner)",
|
||||
"Body to split": "Zu teilender Körper",
|
||||
"Body, or faces to take out": "Körper oder zu entfernende Flächen",
|
||||
"Boundary": "Begrenzung",
|
||||
"Bounding box": "Hüllquader",
|
||||
"CHECK": "PRÜFEN",
|
||||
@@ -59,7 +69,9 @@
|
||||
"CSV or JSON: updates existing parameters, adds new ones": "CSV or JSON: updates existing parameters, adds new ones",
|
||||
"Capture All Positions": "Alle Positionen erfassen",
|
||||
"Capture Pos.": "Pos. erfassen",
|
||||
"Catch Depth": "Fangtiefe",
|
||||
"Catch Direction": "Fangrichtung",
|
||||
"Catch Length": "Fanglänge",
|
||||
"Cells": "Zellen",
|
||||
"Center X": "Mittelpunkt X",
|
||||
"Center Y": "Mittelpunkt Y",
|
||||
@@ -68,15 +80,21 @@
|
||||
"Chamfer Type": "Abschrägungstyp",
|
||||
"Check collisions": "Kollisionen prüfen",
|
||||
"Checked": "Geprüft",
|
||||
"Choose Variable radius or Spline in Type.": "Unter „Typ“ „Variable radius“ oder „Spline“ wählen.",
|
||||
"Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.": "Wählen Sie eine neue Ebene. Skizzengeometrie und Bemaßungen bleiben in ihren zweidimensionalen Koordinaten unverändert.",
|
||||
"Choose…": "Auswählen…",
|
||||
"Circular": "Kreisförmig",
|
||||
"Circumference": "Umfang",
|
||||
"Close draft": "Entwurf schließen",
|
||||
"Collapse": "Einklappen",
|
||||
"Collisions": "Kollisionen",
|
||||
"Colour": "Farbe",
|
||||
"Command": "Befehl",
|
||||
"Comment": "Kommentar",
|
||||
"Component 1": "Komponente 1",
|
||||
"Component 2": "Komponente 2",
|
||||
"Component1": "Komponente1",
|
||||
"Components": "Komponenten",
|
||||
"Config Table": "Konfigurationstabelle",
|
||||
"Configuration": "Konfiguration",
|
||||
"Configuration rules": "Configuration rules",
|
||||
@@ -84,6 +102,7 @@
|
||||
"Contact Sets": "Kontaktsätze",
|
||||
"Contact sets": "Kontaktsätze",
|
||||
"Continuity": "Stetigkeit",
|
||||
"Control Radius": "Kontrollradius",
|
||||
"Copy Error Message": "Fehlermeldung kopieren",
|
||||
"Copy Warning Message": "Warnmeldung kopieren",
|
||||
"Copy all licences": "Alle Lizenzen kopieren",
|
||||
@@ -93,8 +112,11 @@
|
||||
"Corner Relief": "Eckenentlastung",
|
||||
"Corner Relief Shape": "Form der Eckenentlastung",
|
||||
"Counterbore depth": "Tiefe der Senkung",
|
||||
"Counterbore Ø": "Tiefenbohrung Ø",
|
||||
"Countersink angle": "Winkel der Kegelsenkung",
|
||||
"Countersink Ø": "Senkung Ø",
|
||||
"Create Issue — review draft": "Issue erstellen — Entwurf prüfen",
|
||||
"Create Issue…": "Issue erstellen…",
|
||||
"Cross curves": "Querkurven",
|
||||
"Cube": "Würfel",
|
||||
"Current orthographic view (1:1 mm)": "Aktuelle orthogonale Ansicht (1:1 mm)",
|
||||
@@ -103,7 +125,11 @@
|
||||
"Curvature (G2)": "Krümmung (G2)",
|
||||
"Curvature change (G3)": "Krümmungsänderung (G3)",
|
||||
"Customize Toolbar": "Symbolleiste anpassen",
|
||||
"Customize…": "Anpassen…",
|
||||
"Cylindrical face": "Zylindrische Fläche",
|
||||
"Delete": "Löschen",
|
||||
"Delete Selected Features…": "Ausgewählte Merkmale löschen…",
|
||||
"Delete Selected Folders": "Ausgewählte Ordner löschen",
|
||||
"Delete all": "Alle löschen",
|
||||
"Delete rule": "Regel löschen",
|
||||
"Delete the row": "Zeile löschen",
|
||||
@@ -112,8 +138,11 @@
|
||||
"Dependents": "Abhängige Elemente",
|
||||
"Designs you open or save appear here.": "Designs, die Sie öffnen oder speichern, erscheinen hier.",
|
||||
"Determined by To Object. Choose Angle to edit the angular extent.": "Bestimmt durch Bis Objekt. Wählen Sie Winkel, um den Winkelbereich zu bearbeiten.",
|
||||
"Diameter": "Durchmesser",
|
||||
"Direction": "Richtung",
|
||||
"Discard": "Verwerfen",
|
||||
"Distance": "Abstand",
|
||||
"Distance 1": "Abstand 1",
|
||||
"Do not export hidden edges": "Verdeckte Kanten nicht exportieren",
|
||||
"Don't ask again": "Nicht mehr fragen",
|
||||
"Double-click to rename": "Double-click to rename",
|
||||
@@ -125,17 +154,21 @@
|
||||
"Edit Profile Sketch": "Profile-Skizze bearbeiten",
|
||||
"Enable rule": "Regel aktivieren",
|
||||
"Enabled": "Aktiviert",
|
||||
"End Radius": "Endradius",
|
||||
"End bulge": "Endausbauchung",
|
||||
"End continuity": "Endstetigkeit",
|
||||
"Expand": "Ausklappen",
|
||||
"Explode": "Explodieren",
|
||||
"Explode Text": "Text auflösen",
|
||||
"Export Animation…": "Animation exportieren…",
|
||||
"Export Bend Table…": "Biegetabelle exportieren…",
|
||||
"Export CSV…": "CSV exportieren…",
|
||||
"Export Current View as DXF": "Aktuelle Ansicht als DXF exportieren",
|
||||
"Export Current View as DXF…": "Aktuelle Ansicht als DXF exportieren…",
|
||||
"Export DXF": "DXF exportieren",
|
||||
"Export DXF…": "DXF exportieren…",
|
||||
"Export JSON…": "JSON exportieren…",
|
||||
"Export design library...": "Designbibliothek exportieren...",
|
||||
"Export hidden edges as dashed lines": "Verdeckte Kanten gestrichelt exportieren",
|
||||
"Expression": "Ausdruck",
|
||||
"Extend to meet": "Verlängern, bis sie sich treffen",
|
||||
@@ -143,30 +176,40 @@
|
||||
"FILES": "DATEIEN",
|
||||
"FLAT": "ABWICKLUNG",
|
||||
"Face": "Fläche",
|
||||
"Face Appearance": "Flächenerscheinungsbild",
|
||||
"Face attachment lost": "Flächenanbindung verloren",
|
||||
"Faces": "Flächen",
|
||||
"Faces / edges / vertices": "Flächen / Kanten / Ecken",
|
||||
"Faces to split": "Zu teilende Flächen",
|
||||
"Fastener": "Verbindungselement",
|
||||
"Favorites": "Favoriten",
|
||||
"Favourite": "Favourite",
|
||||
"Feature": "Funktion",
|
||||
"Files from many CAD programs have Y up, so they open lying on their back here (Z up).": "Dateien aus vielen CAD-Programmen haben Y nach oben und öffnen sich hier daher auf dem Rücken liegend (Z nach oben).",
|
||||
"Filter": "Filter",
|
||||
"Filter…": "Filtern…",
|
||||
"Find in Browser": "Im Browser suchen",
|
||||
"Finish": "Oberfläche",
|
||||
"First plane": "Erste Ebene",
|
||||
"Fit and G2 corners require Constant radius.": "Passung und G2-Ecken erfordern Constant radius.",
|
||||
"Fixed Face": "Feste Fläche",
|
||||
"Flat Pattern": "Flachmuster",
|
||||
"Flat size": "Abwicklungsgröße",
|
||||
"Follow camera (Look At sketches)": "Kamera folgen (Skizzen ansehen)",
|
||||
"Follow the camera (Look At sketches)": "Der Kamera folgen (Skizzen ansehen)",
|
||||
"Font": "Schriftart",
|
||||
"From": "Von",
|
||||
"From Bodies": "Aus Körpern",
|
||||
"From edges": "Ausgangskanten",
|
||||
"Full Length": "Volle Länge",
|
||||
"G2 corners require a constant radius and Exact fit. G2 corner construction is not supported yet.": "G2-Ecken erfordern einen konstanten Radius und Exact fit. Die Konstruktion von G2-Ecken wird noch nicht unterstützt.",
|
||||
"Gap": "Spalt",
|
||||
"Grid": "Raster",
|
||||
"HISTORY": "VERLAUF",
|
||||
"Height": "Höhe",
|
||||
"Hidden edges": "Verdeckte Kanten",
|
||||
"History layout": "Verlaufslayout",
|
||||
"Hole (optional)": "Bohrung (optional)",
|
||||
"Holes": "Löcher",
|
||||
"Holes (edges on them)": "Löcher (ihre Kanten)",
|
||||
"Home view": "Startansicht",
|
||||
@@ -177,14 +220,20 @@
|
||||
"In place (surfaces)": "An Ort und Stelle (Flächen)",
|
||||
"In plane": "In der Ebene",
|
||||
"Inside": "Innen",
|
||||
"Instant": "Sofort",
|
||||
"Interface font": "Schriftart der Oberfläche",
|
||||
"Interferes": "Überschneidet sich",
|
||||
"Invert": "Umkehren",
|
||||
"Isocurve": "Isokurve",
|
||||
"Issue title": "Issue-Titel",
|
||||
"Items": "Elemente",
|
||||
"JOINTS": "GELENKE",
|
||||
"Joint Origin1": "Gelenkursprung1",
|
||||
"Keep (points on it)": "Behalten (Punkte darauf)",
|
||||
"Keep Tools": "Werkzeuge behalten",
|
||||
"Keep of the other surface": "Vom anderen Flächenkörper behalten",
|
||||
"Key a joint's value at this step": "Gelenkwert in diesem Schritt als Schlüsselbild setzen",
|
||||
"Keys": "Schlüsselbilder",
|
||||
"LIBRARY": "BIBLIOTHEK",
|
||||
"LINKS": "VERKNÜPFUNGEN",
|
||||
"Later": "Später",
|
||||
@@ -195,9 +244,14 @@
|
||||
"Letter Spacing": "Zeichenabstand",
|
||||
"Library": "Bibliothek",
|
||||
"Library file": "Bibliotheksdatei",
|
||||
"Limits": "Grenzen",
|
||||
"Line Spacing": "Zeilenabstand",
|
||||
"Line Type": "Linientyp",
|
||||
"Listing the installed fonts…": "Installierte Schriftarten werden aufgelistet…",
|
||||
"Load library": "Bibliothek laden",
|
||||
"Local library": "Lokale Bibliothek",
|
||||
"Loop": "Schleife",
|
||||
"M5 or M5x0.5": "M5 oder M5x0.5",
|
||||
"MANAGE": "VERWALTEN",
|
||||
"MATERIALS": "MATERIALIEN",
|
||||
"MODEL": "MODELL",
|
||||
@@ -208,14 +262,20 @@
|
||||
"Matched restrictions check the final values.": "Zutreffende Einschränkungen prüfen die endgültigen Werte.",
|
||||
"Material": "Material",
|
||||
"Max": "Max",
|
||||
"Maximum": "Maximum",
|
||||
"Mesh body": "Netzkörper",
|
||||
"Mid Radius": "Mittlerer Radius",
|
||||
"Middle double-click": "Doppelklick mit mittlerer Taste",
|
||||
"Min": "Min",
|
||||
"Minimum": "Minimum",
|
||||
"Mirror Plane": "Spiegelebene",
|
||||
"Mitre": "Gehrung",
|
||||
"Model Parameters": "Modellparameter",
|
||||
"Modeled": "Modelliert",
|
||||
"More toolbar panels": "Weitere Symbolleistenbereiche",
|
||||
"Motion": "Bewegung",
|
||||
"Mouse gestures": "Mausgesten",
|
||||
"Mouse gestures only work with the SolidWorks mouse mode (the wheel orbits, Ctrl + wheel pans).": "Mausgesten funktionieren nur im SolidWorks-Mausmodus (das Rad dreht, Strg + Rad verschiebt).",
|
||||
"Move / Copy": "Verschieben / Kopieren",
|
||||
"Move Type": "Verschiebungstyp",
|
||||
"Move down": "Nach unten",
|
||||
@@ -232,16 +292,20 @@
|
||||
"No crash reports.": "Keine Absturzberichte.",
|
||||
"No matching appearance presets.": "Keine passenden Erscheinungsbildvorlagen.",
|
||||
"No matching appearances": "Keine passenden Erscheinungsbilder",
|
||||
"No visible bodies to export.": "Keine sichtbaren Körper zum Exportieren.",
|
||||
"No visible bodies or sketches to export.": "Keine sichtbaren Körper oder Skizzen zum Exportieren.",
|
||||
"None": "Keine",
|
||||
"Not available yet": "Noch nicht verfügbar",
|
||||
"Notch": "Ausklinkung",
|
||||
"OUTPUT": "AUSGABE",
|
||||
"Of": "Freiheitsgrad",
|
||||
"On your computer": "Auf diesem Computer",
|
||||
"Opacity": "Deckkraft",
|
||||
"Open GitHub draft": "GitHub-Entwurf öffnen",
|
||||
"Open library...": "Bibliothek öffnen...",
|
||||
"Open local libraries in the desktop app. You can export this design's library here.": "Öffnen Sie lokale Bibliotheken in der Desktop-App. Die Bibliothek dieses Designs können Sie hier exportieren.",
|
||||
"Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "Quelloffenes parametrisches 3D-CAD in Rust. Lizenziert unter MIT OR Apache-2.0.",
|
||||
"Operator": "Operator",
|
||||
"Orbit (right drag)": "Drehen (mit rechts ziehen)",
|
||||
"Other side": "Andere Seite",
|
||||
"Other surface (mutual trim)": "Anderer Flächenkörper (gegenseitig trimmen)",
|
||||
"Outside": "Außen",
|
||||
@@ -256,8 +320,10 @@
|
||||
"Pick the tool bodies": "Werkzeugkörper wählen",
|
||||
"Picked": "Ausgewählte",
|
||||
"Picked point": "Gewählter Punkt",
|
||||
"Pivot": "Drehpunkt",
|
||||
"Place at the origin instead": "Stattdessen im Ursprung platzieren",
|
||||
"Plastic Rules": "Kunststoffregeln",
|
||||
"Play the joint's motion in the view": "Die Bewegung des Gelenks in der Ansicht abspielen",
|
||||
"Playback": "Wiedergabe",
|
||||
"Plot": "Diagramm",
|
||||
"Position": "Position",
|
||||
@@ -265,14 +331,18 @@
|
||||
"Position (G0)": "Position (G0)",
|
||||
"Position along the edge, 0 at the start end, 1 at the other": "Position entlang der Kante, 0 am Anfang, 1 am anderen Ende",
|
||||
"Preferences › Design turns the offer back on": "Unter Einstellungen › Design lässt sich das Angebot wieder einschalten",
|
||||
"Preview": "Vorschau",
|
||||
"Preview Row": "Vorschauzeile",
|
||||
"Preview leaves the current design unchanged.": "Die Vorschau lässt das aktuelle Design unverändert.",
|
||||
"Profile / Edges": "Profil / Kanten",
|
||||
"Profiles or curves": "Profile oder Kurven",
|
||||
"Profiles/Curves": "Profile/Kurven",
|
||||
"Quantity": "Größe",
|
||||
"RECENT": "ZULETZT",
|
||||
"REFERENCE": "REFERENZ",
|
||||
"RULED SURFACE": "REGELFLÄCHE",
|
||||
"RULES": "REGELN",
|
||||
"Radius": "Radius",
|
||||
"Radius Fit": "Radiusanpassung",
|
||||
"Ratio": "Verhältnis",
|
||||
"Reattach selected face": "Ausgewählte Fläche neu anbinden",
|
||||
@@ -281,6 +351,8 @@
|
||||
"Rectangular": "Rechteckig",
|
||||
"Reference face": "Referenzfläche",
|
||||
"Remove Tools": "Werkzeuge entfernen",
|
||||
"Remove condition": "Bedingung entfernen",
|
||||
"Remove from Folder": "Aus Ordner entfernen",
|
||||
"Remove from list": "Aus Liste entfernen",
|
||||
"Remove override": "Überschreibung entfernen",
|
||||
"Remove private design details or paths before sharing.": "Entfernen Sie vor dem Teilen private Designdetails oder Pfade.",
|
||||
@@ -288,12 +360,16 @@
|
||||
"Remove the column": "Spalte entfernen",
|
||||
"Remove the track": "Spur entfernen",
|
||||
"Remove this point": "Diesen Punkt entfernen",
|
||||
"Rename Feature": "Merkmal umbenennen",
|
||||
"Rename Folder": "Ordner umbenennen",
|
||||
"Replace existing library file": "Vorhandene Bibliotheksdatei ersetzen",
|
||||
"Report a bug — review a screenshot and open a GitHub draft": "Fehler melden — Screenshot prüfen und einen GitHub-Entwurf öffnen",
|
||||
"Reset Toolbar": "Symbolleiste zurücksetzen",
|
||||
"Resize Part": "Teil skalieren",
|
||||
"Restore View": "Ansicht wiederherstellen",
|
||||
"Restore outer boundary": "Äußere Begrenzung wiederherstellen",
|
||||
"Restore the inherited component or physical material appearance": "Das geerbte Erscheinungsbild der Komponente oder des physikalischen Materials wiederherstellen",
|
||||
"Restore this studio's tools": "Werkzeuge dieses Studios wiederherstellen",
|
||||
"Result": "Ergebnis",
|
||||
"Retake screenshot": "Screenshot erneut aufnehmen",
|
||||
"Reverse": "Umkehren",
|
||||
@@ -303,7 +379,13 @@
|
||||
"Revert Pos.": "Pos. zurücksetzen",
|
||||
"Revert Position": "Position zurücksetzen",
|
||||
"Review the report and screenshot before opening GitHub.": "Prüfen Sie Bericht und Screenshot, bevor Sie GitHub öffnen.",
|
||||
"Rib Length": "Rippenlänge",
|
||||
"Rib Offset": "Rippenversatz",
|
||||
"Rib Thickness": "Rippendicke",
|
||||
"Ribs": "Rippen",
|
||||
"Rim Edge": "Randkante",
|
||||
"Ring of tools on the right button": "Werkzeugring auf der rechten Maustaste",
|
||||
"Roll Back Here": "Hierher zurücksetzen",
|
||||
"Roll History Marker Here": "Verlaufsmarkierung hierher verschieben",
|
||||
"Round": "Rund",
|
||||
"Rule": "Rule",
|
||||
@@ -320,13 +402,18 @@
|
||||
"Search": "Suchen",
|
||||
"Search commands": "Befehle suchen",
|
||||
"Search this library": "Diese Bibliothek durchsuchen",
|
||||
"Second plane": "Zweite Ebene",
|
||||
"Section": "Schnitt",
|
||||
"Sections (one sketch each)": "Querschnitte (je eine Skizze)",
|
||||
"Select Other": "Andere auswählen",
|
||||
"Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).": "Anderes auswählen: Halten Sie die linke Taste ruhig auf dem Modell gedrückt (oder Rechtsklick › Anderes auswählen…), um alles unter dem Cursor aufzulisten; klicken Sie erneut an dieselbe Stelle, um das nächste Element dort auszuwählen. Doppelklick mit der mittleren Taste wechselt zur Startansicht (Einstellungen › Navigation).",
|
||||
"Select bodies (a face picks its body)": "Körper auswählen (eine Fläche wählt ihren Körper)",
|
||||
"Select bodies or faces instead": "Stattdessen Körper oder Flächen auswählen",
|
||||
"Select edges": "Kanten auswählen",
|
||||
"Selection filter": "Auswahlfilter",
|
||||
"Semantic faces share their appearance across instances.": "Semantische Flächen teilen ihr Erscheinungsbild über alle Instanzen hinweg.",
|
||||
"Send your report on GitHub": "Bericht auf GitHub senden",
|
||||
"Shaded": "Schattiert",
|
||||
"Shape": "Form",
|
||||
"Sheet Rules": "Blechregeln",
|
||||
"Show Agent Cursor": "Agenten-Cursor anzeigen",
|
||||
@@ -344,6 +431,7 @@
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft wurde beendet, bevor diese Designs gespeichert wurden. Ihr letzter Autosave kann geöffnet werden.",
|
||||
"Specialise": "Spezialisieren",
|
||||
"Speed": "Geschwindigkeit",
|
||||
"Splitting tool": "Trennwerkzeug",
|
||||
"Stand it up": "Aufrichten",
|
||||
"Stand it up: a quarter turn about X, as one Move feature you can undo.": "Aufrichten: eine Vierteldrehung um X, als ein Verschieben-Merkmal, das sich rückgängig machen lässt.",
|
||||
"Stand this part up?": "Dieses Teil aufrichten?",
|
||||
@@ -353,14 +441,20 @@
|
||||
"Steps": "Schritte",
|
||||
"Stitch the kept pieces": "Behaltene Teile vernähen",
|
||||
"Stitch to both bodies": "Mit beiden Körpern vernähen",
|
||||
"Studio": "Studio",
|
||||
"Study": "Untersuchung",
|
||||
"Style": "Stil",
|
||||
"Suppress": "Unterdrücken",
|
||||
"Suppressed": "Unterdrückt",
|
||||
"Surface": "Flächenkörper",
|
||||
"Surface, or faces to turn over": "Fläche oder umzudrehende Flächen",
|
||||
"Swap Ends": "Enden vertauschen",
|
||||
"TRIM": "TRIMMEN",
|
||||
"Tangent (G1)": "Tangente (G1)",
|
||||
"Tangent Chain": "Tangentenkette",
|
||||
"Tangent chain": "Tangentialkette",
|
||||
"Target": "Ziel",
|
||||
"Target Body": "Zielkörper",
|
||||
"Tear": "Reißen",
|
||||
"The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "Die gestrichelte Skizze ist eine gespeicherte Ebenenführung. Wählen Sie eine neue Fläche, um die Anbindung zu reparieren.",
|
||||
"The saved author occurrence is missing. Select a valid author placement before rebinding.": "Das gespeicherte Autorvorkommen fehlt. Wählen Sie vor dem erneuten Anbinden eine gültige Autorplatzierung.",
|
||||
@@ -373,24 +467,31 @@
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "Dieses untergeordnete Element ist geteilt. Löschen entfernt es aus jeder Kopie des übergeordneten Elements.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "Dieses untergeordnete Element ist geteilt. Positionsänderungen gelten für jede Kopie des übergeordneten Elements.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "Diese Fläche kann keine dauerhafte Anbindung bieten. Wählen Sie eine andere Fläche oder verwenden Sie ausdrücklich eine feste Ebene.",
|
||||
"To": "Bis",
|
||||
"To Offset": "Bis Versatz",
|
||||
"To edges": "Zielkanten",
|
||||
"Tolerance": "Toleranz",
|
||||
"Too close": "Zu nah",
|
||||
"Tool Bodies": "Werkzeugkörper",
|
||||
"Tools": "Werkzeuge",
|
||||
"Tools, clockwise from the top": "Werkzeuge, im Uhrzeigersinn von oben",
|
||||
"Trimming tool (plane, face or curves)": "Trimmwerkzeug (Ebene, Fläche oder Kurven)",
|
||||
"Turn off section analysis before exporting the view.": "Deaktivieren Sie die Schnittanalyse, bevor Sie die Ansicht exportieren.",
|
||||
"Type": "Typ",
|
||||
"UNTRIM": "TRIMMEN AUFHEBEN",
|
||||
"Unit": "Einheit",
|
||||
"Unsuppress": "Unterdrückung aufheben",
|
||||
"Updating the preview": "Vorschau wird aktualisiert",
|
||||
"Use active author placement": "Aktive Autorplatzierung verwenden",
|
||||
"Use fixed plane": "Feste Ebene verwenden",
|
||||
"Use saved fixed plane": "Gespeicherte feste Ebene verwenden",
|
||||
"Use selected face as fixed plane": "Ausgewählte Fläche als feste Ebene verwenden",
|
||||
"Use the SolidWorks mouse mode": "SolidWorks-Mausmodus verwenden",
|
||||
"User Parameters": "Benutzerparameter",
|
||||
"VIEW": "ANSICHT",
|
||||
"VIEWS": "ANSICHTEN",
|
||||
"Value": "Value",
|
||||
"Variable Radius": "Variabler Radius",
|
||||
"Velocity": "Geschwindigkeit",
|
||||
"Vertices": "Scheitelpunkte",
|
||||
"View navigator": "Ansichtsnavigator",
|
||||
@@ -401,10 +502,18 @@
|
||||
"When": "When",
|
||||
"Width": "Breite",
|
||||
"Will fail": "Schlägt fehl",
|
||||
"With gestures on, the right button no longer orbits the view: hold it and move to open the ring, then touch a tool's zone. A plain right-click still opens the menu.": "Mit eingeschalteten Mausgesten dreht die rechte Maustaste die Ansicht nicht mehr: Taste gedrückt halten und bewegen öffnet den Werkzeugring, dann die Zone eines Werkzeugs berühren. Ein einfacher Rechtsklick öffnet weiterhin das Menü.",
|
||||
"X": "X",
|
||||
"X Angle": "X-Winkel",
|
||||
"X angle": "X-Winkel",
|
||||
"X distance": "X-Abstand",
|
||||
"Y": "Y",
|
||||
"Y Angle": "Y-Winkel",
|
||||
"Y angle": "Y-Winkel",
|
||||
"Y distance": "Y-Abstand",
|
||||
"Z": "Z",
|
||||
"Z Angle": "Z-Winkel",
|
||||
"Z Distance": "Z-Abstand",
|
||||
"Z angle": "Z-Winkel",
|
||||
"Z distance": "Z-Abstand",
|
||||
"Zebra": "Zebra",
|
||||
@@ -453,8 +562,10 @@
|
||||
"cmd.component_activate": "Komponente aktivieren",
|
||||
"cmd.component_break_link": "Verknüpfung trennen",
|
||||
"cmd.component_capture_position": "Position erfassen",
|
||||
"cmd.component_copies": "Identische Kopien finden",
|
||||
"cmd.component_create": "Neue Komponente",
|
||||
"cmd.component_delete": "Komponente löschen",
|
||||
"cmd.component_extract": "In Datei extrahieren",
|
||||
"cmd.component_from_bodies": "Komponenten aus Körpern erstellen",
|
||||
"cmd.component_insert_design": "Konstruktion einfügen",
|
||||
"cmd.component_links": "Verknüpfungen auflisten",
|
||||
@@ -467,6 +578,7 @@
|
||||
"cmd.component_properties": "Physikalische Eigenschaften der Komponente",
|
||||
"cmd.component_relink": "Quelle neu verknüpfen",
|
||||
"cmd.component_rename": "Komponente umbenennen",
|
||||
"cmd.component_replace_with_link": "Durch Verknüpfung ersetzen",
|
||||
"cmd.component_revert_position": "Position zurücksetzen",
|
||||
"cmd.component_unlock": "Inhalt entsperren",
|
||||
"cmd.component_update_links": "Verknüpfungen aktualisieren",
|
||||
@@ -758,6 +870,7 @@
|
||||
"cmd.view_graphics_preset": "Grafikprofil",
|
||||
"cmd.view_list": "Benannte Ansichten auflisten",
|
||||
"cmd.view_navigate": "Ansicht navigieren",
|
||||
"cmd.view_normal_to": "Senkrecht zur Auswahl",
|
||||
"cmd.view_rename": "Benannte Ansicht umbenennen",
|
||||
"cmd.view_save": "Neue benannte Ansicht",
|
||||
"color.copy": "Klicken, um Farbwerte zu kopieren",
|
||||
@@ -831,7 +944,7 @@
|
||||
"dxf.progress.projection": "Geometrie projizieren (3/5)",
|
||||
"dxf.progress.write": "DXF schreiben (5/5)",
|
||||
"dxf.tolerance": "Kurventoleranz",
|
||||
"dxf.tolerance_help": "Nur sichtbare Körper. Kurven werden durch gerade Segmente angenähert. Eine kleinere Toleranz liefert feinere Kurven und benötigt mehr Zeit und Speicher.",
|
||||
"dxf.tolerance_help": "Nur sichtbare Körper und angezeigte Skizzen. Kurven werden durch gerade Segmente angenähert. Eine kleinere Toleranz liefert feinere Kurven und benötigt mehr Zeit und Speicher.",
|
||||
"file_load.built": "Bisher erstellt: {built} von {total} Merkmalen.",
|
||||
"file_load.converting": "Volumenkörper {done} von {total} wird konvertiert",
|
||||
"file_load.inserting": "Geometrie wird eingefügt",
|
||||
@@ -856,19 +969,57 @@
|
||||
"help.mit": "MIT-Lizenz",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Drittanbieterlizenzen",
|
||||
"home.back": "Zurück zu {name}",
|
||||
"home.crashes": "Absturzberichte",
|
||||
"home.design_workspace": "Entwurf",
|
||||
"home.documentation": "Dokumentation",
|
||||
"home.export": "Exportieren",
|
||||
"home.export_hint": "Wählen Sie ein Format für den aktuellen Entwurf.",
|
||||
"home.export_json_hint": "Bearbeitbarer Entwurf und Befehlsverlauf",
|
||||
"home.export_mesh_hint": "Netz zum Drucken oder Teilen",
|
||||
"home.export_step_hint": "Präzise Volumengeometrie",
|
||||
"home.import": "Importieren…",
|
||||
"home.import_hint": "STEP, IGES oder Netz in einen neuen Entwurf",
|
||||
"home.in_this_browser": "in diesem Browser",
|
||||
"home.missing": "fehlt",
|
||||
"home.month_01": "Jan.",
|
||||
"home.month_02": "Feb.",
|
||||
"home.month_03": "März",
|
||||
"home.month_04": "Apr.",
|
||||
"home.month_05": "Mai",
|
||||
"home.month_06": "Juni",
|
||||
"home.month_07": "Juli",
|
||||
"home.month_08": "Aug.",
|
||||
"home.month_09": "Sept.",
|
||||
"home.month_10": "Okt.",
|
||||
"home.month_11": "Nov.",
|
||||
"home.month_12": "Dez.",
|
||||
"home.new_inches": "Neuer Entwurf in Zoll",
|
||||
"home.new_inches_hint": "Zoll · öffnet sich im Arbeitsbereich Entwurf",
|
||||
"home.new_mm": "Neuer Entwurf",
|
||||
"home.new_mm_hint": "Millimeter · öffnet sich im Arbeitsbereich Entwurf",
|
||||
"home.open": "Öffnen…",
|
||||
"home.opened_days_ago": "Vor {count} Tag(en) geöffnet",
|
||||
"home.opened_hours_ago": "Vor {count} Std. geöffnet",
|
||||
"home.opened_just_now": "Gerade eben geöffnet",
|
||||
"home.opened_minutes_ago": "Vor {count} Min. geöffnet",
|
||||
"home.open_hint": "Ein .solidcraft-Entwurf ({shortcut})",
|
||||
"home.open_now": "Jetzt öffnen",
|
||||
"home.opened_days_ago": "Vor {count} Tagen",
|
||||
"home.opened_hours_ago": "Vor {count} Std.",
|
||||
"home.opened_just_now": "Gerade eben",
|
||||
"home.opened_minutes_ago": "Vor {count} Min.",
|
||||
"home.opening": "wird geöffnet…",
|
||||
"home.properties": "Entwurfseigenschaften",
|
||||
"home.recent": "Zuletzt verwendet",
|
||||
"home.recent_empty": "Entwürfe, die Sie öffnen oder speichern, erscheinen hier.",
|
||||
"home.recovery_count": "Wiederherstellbare Entwürfe: {count}",
|
||||
"home.recovery_empty": "Keine wiederherstellbaren Entwürfe.",
|
||||
"home.recovery_hint": "SolidCraft wurde geschlossen, bevor diese Entwürfe gespeichert wurden.",
|
||||
"home.report_issue": "Problem melden",
|
||||
"home.samples": "Beispiele",
|
||||
"home.settings": "Einstellungen",
|
||||
"home.short_date": "{day}. {month}",
|
||||
"home.shortcuts": "Tastenkombinationen",
|
||||
"home.start_hint": "Erstellen Sie einen Entwurf, öffnen Sie eine zuletzt verwendete Datei oder erkunden Sie ein Beispiel.",
|
||||
"home.whats_new": "Neuigkeiten",
|
||||
"home.yesterday": "Gestern",
|
||||
"install.button_tip": "SolidCraft als App installieren: eigenes Fenster, funktioniert auch offline",
|
||||
"install.dock_1": "Wählen Sie Ablage › Zum Dock hinzufügen.",
|
||||
"install.dock_2": "Klicken Sie auf „Hinzufügen“.",
|
||||
@@ -926,6 +1077,15 @@
|
||||
"motion.to_end": "Zum Ende",
|
||||
"motion.to_start": "Zum Anfang",
|
||||
"motion.track_name": "Spur {number}",
|
||||
"nav.alias.help": "Umschalt+Alt+Linksziehen dreht, Umschalt+Alt+Mitte verschiebt, Umschalt+Alt+Rechtsziehen zoomt; mittleres Ziehen verschiebt ebenfalls und rechtes Ziehen dreht",
|
||||
"nav.blender.help": "Mittlere Maustaste dreht, Umschalt+Mitte verschiebt, Strg+Mitte zoomt; rechtes Ziehen lässt die Kamera unverändert",
|
||||
"nav.free_orbit.help": "Maus und 3D-Maus drehen über beide Pole hinweg und behalten die Rollneigung bei. Das Einrasten mit Umschalt ist deaktiviert.",
|
||||
"nav.free_orbit.label": "Freie Drehung",
|
||||
"nav.fusion.help": "Mittlere Maustaste verschiebt, Umschalt+Mitte dreht, rechte Maustaste dreht",
|
||||
"nav.inventor.help": "Mittlere Maustaste verschiebt, Umschalt+Mitte dreht, Strg+Mitte zoomt, rechte Maustaste dreht",
|
||||
"nav.openscad.help": "Linksziehen auf leerem Hintergrund dreht, Umschalt+Linksziehen zieht ein Auswahlrechteck auf, Skizzengeometrie wird durch Ziehen bearbeitet; rechtes oder mittleres Ziehen verschiebt, Umschalt+rechtes oder Umschalt+mittleres Ziehen zoomt",
|
||||
"nav.solidworks.help": "Mittlere Maustaste dreht, Strg+Mitte verschiebt, Umschalt+Mitte zoomt, rechte Maustaste dreht",
|
||||
"nav.tinkercad.help": "Rechte Maustaste dreht, mittlere oder Umschalt+rechte Maustaste verschiebt",
|
||||
"nav.touchpad.help": "Umschalt gedrückt halten und den Zeiger zum Verschieben bewegen; mit Alt/Option drehen. Keine Maustaste nötig. Vertikales Scrollen zoomt.",
|
||||
"nav.touchpad.label": "Touchpad",
|
||||
"nav.touchpad.orbit": "Drehen (Alt/Option halten und bewegen; ohne Maustaste)",
|
||||
@@ -1021,7 +1181,7 @@
|
||||
"search.try": "Geben Sie einen Befehlsnamen, ein Merkmal in diesem Design oder einen Parameter ein. Um einen Befehl mit Werten auszuführen, geben Sie seine ID und ein JSON-Objekt ein: {example}",
|
||||
"search.valid": "Gültig",
|
||||
"settings.display_quality_note": "Feinere Stufen zeigen gekrümmte Flächen und Kanten glatter und brauchen länger zum Vernetzen. Nur die Ansicht ändert sich, nie das Design oder Exporte.",
|
||||
"settings.frame_rate_note": "Zeigt die Bilder pro Sekunde unten rechts in der Ansicht. Solange sie an ist, wird die Ansicht fortlaufend neu gezeichnet.",
|
||||
"settings.frame_rate_note": "Zeigt die Bilder pro Sekunde unten rechts in der Ansicht.",
|
||||
"settings.measure_axis_distances": "X/Y/Z-Maße anzeigen",
|
||||
"settings.measure_axis_distances_help": "Bei geöffneter Messung die Abstände entlang der Weltachsen zusätzlich zum Gesamtabstand anzeigen.",
|
||||
"settings.msaa_applies_on_restart": "Die Kantenglättung wird beim nächsten Start von SolidCraft übernommen",
|
||||
@@ -1092,6 +1252,7 @@
|
||||
"ui.agent_chat_add": "Dateien anhängen",
|
||||
"ui.agent_chat_add_file": "Datei auswählen…",
|
||||
"ui.agent_chat_allow": "Erlauben",
|
||||
"ui.agent_chat_allow_once": "Einmal erlauben",
|
||||
"ui.agent_chat_allowed": "Erlaubt",
|
||||
"ui.agent_chat_answered": "Antwort: {option}",
|
||||
"ui.agent_chat_approval": "Darf der Agent das tun?",
|
||||
@@ -1143,12 +1304,16 @@
|
||||
"ui.agent_chat_files_left_out": "Höchstens {max} Dateien pro Nachricht; ausgelassen: {files}",
|
||||
"ui.agent_chat_files_loading": "Warten, bis die Dateien gelesen sind",
|
||||
"ui.agent_chat_files_max": "Höchstens {max} Dateien pro Nachricht",
|
||||
"ui.agent_chat_flatpak_none_found": "Kein Coding-Agent gefunden. Die Flatpak-Sandbox sieht standardmäßig keine Agenten in Ihrem Benutzerordner und hat keinen Netzwerkzugriff. Um Claude Code und seinen ACP-Adapter zu erlauben, die über nvm oder in ~/.local/bin installiert sind, führen Sie diesen Befehl in einem Terminal aus und starten Sie SolidCraft dann neu. Er gewährt Zugriff auf die genannten Programme und Anmeldedateien sowie Netzwerkzugriff:",
|
||||
"ui.agent_chat_import_failed": "{name}: Der Import ist fehlgeschlagen: {error}",
|
||||
"ui.agent_chat_intro": "Chatten Sie mit einem Coding-Agenten, den Sie schon nutzen, oder einem Modell-Endpunkt Ihrer Wahl. Er arbeitet über die Werkzeuge von SolidCraft am geöffneten Design: Seine Änderungen erscheinen sofort und lassen sich pro Nachricht in einem Schritt rückgängig machen. Was er ohne Nachfrage darf, legen Sie unter Einstellungen > KI fest.",
|
||||
"ui.agent_chat_key_in_env": "Schlüssel gesetzt",
|
||||
"ui.agent_chat_left": "Links",
|
||||
"ui.agent_chat_limit": "Der Agent hat die Grenze von {limit} Änderungen für eine Nachricht erreicht. Senden Sie eine weitere Nachricht, damit er weitermacht.",
|
||||
"ui.agent_chat_minimize": "Zu einer Leiste minimieren",
|
||||
"ui.agent_chat_mode_all": "Alles",
|
||||
"ui.agent_chat_mode_ask": "Fragen",
|
||||
"ui.agent_chat_mode_edits": "Ändern",
|
||||
"ui.agent_chat_model_tip": "Das vom Agenten verwendete Modell. Ihre Auswahl wird für diesen Agenten gespeichert.",
|
||||
"ui.agent_chat_new": "Neuer Chat",
|
||||
"ui.agent_chat_new_confirm": "Neuen Chat starten? Der aktuelle wird geleert.",
|
||||
@@ -1161,6 +1326,7 @@
|
||||
"ui.agent_chat_none_found_short": "Kein Agent gefunden",
|
||||
"ui.agent_chat_not_installed": "Nicht installiert",
|
||||
"ui.agent_chat_not_signed_in": "nicht angemeldet",
|
||||
"ui.agent_chat_open_settings": "Einstellungen öffnen",
|
||||
"ui.agent_chat_own_window": "Eigenes Fenster",
|
||||
"ui.agent_chat_paste_picture": "Bild einfügen",
|
||||
"ui.agent_chat_permission": "Der Agent möchte ausführen: {title}",
|
||||
@@ -1185,6 +1351,8 @@
|
||||
"ui.agent_chat_send": "Senden",
|
||||
"ui.agent_chat_send_now": "Jetzt senden",
|
||||
"ui.agent_chat_send_now_tip": "Den aktuellen Schritt des Agenten stoppen und dies als Nächstes senden (Strg+Eingabe)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft kommuniziert mit einem auf diesem Computer installierten Programmieragenten. Wählen Sie einen unter Einstellungen › KI aus.",
|
||||
"ui.agent_chat_setup_title": "Assistenten einrichten",
|
||||
"ui.agent_chat_side": "Seite des Agenten-Chats",
|
||||
"ui.agent_chat_signed_in": "angemeldet",
|
||||
"ui.agent_chat_state_auth": "Anmeldung nötig",
|
||||
@@ -1201,6 +1369,7 @@
|
||||
"ui.agent_chat_undo_label": "Agenten-Chat: {message}",
|
||||
"ui.agent_chat_undone": "(rückgängig gemacht)",
|
||||
"ui.agent_chat_view_attached": "Ansicht angehängt",
|
||||
"ui.agent_chat_waiting": "Wartet auf Sie",
|
||||
"ui.agent_cursor": "Agent-Cursor",
|
||||
"ui.agent_cursor_speed": "Agent-Cursor-Geschwindigkeit",
|
||||
"ui.ai_add": "Hinzufügen",
|
||||
@@ -1424,6 +1593,9 @@
|
||||
"ui.export_keymap_tip": "Tasten, S-Box-Favoriten und die Symbolleiste als Datei",
|
||||
"ui.extend": "Verlängern",
|
||||
"ui.extent_type": "Ausdehnungstyp",
|
||||
"ui.extract_component": "In Datei extrahieren…",
|
||||
"ui.extract_design_changed": "Das Design hat sich beim Wählen einer Datei geändert. Starten Sie In Datei extrahieren erneut.",
|
||||
"ui.extract_done": "Die Komponente ist jetzt ein eigenes Design und hier verknüpft.",
|
||||
"ui.extrude": "Extrudieren",
|
||||
"ui.factor": "Faktor",
|
||||
"ui.feature_history": "Feature-Verlauf",
|
||||
@@ -1455,6 +1627,7 @@
|
||||
"ui.grid_follows_view_hint": "Seitenansichten zeigen das Raster auf der aufrechten Ebene, die ihnen zugewandt ist, statt auf dem Boden",
|
||||
"ui.ground_shadow": "Bodenschatten",
|
||||
"ui.groupSelected": "Auswahl gruppieren",
|
||||
"ui.hatch": "Schraffur",
|
||||
"ui.heading_add_ins": "ADD-INS",
|
||||
"ui.heading_assemble": "ZUSAMMENBAU",
|
||||
"ui.heading_box": "BLOCK",
|
||||
@@ -1528,6 +1701,11 @@
|
||||
"ui.hideOrigin": "Ursprung ausblenden",
|
||||
"ui.hidePlanes": "Ebenen ausblenden",
|
||||
"ui.hideProfile": "Profil ausblenden",
|
||||
"ui.history_back": "Einen Schritt zurück",
|
||||
"ui.history_below_browser": "Unter dem Browser",
|
||||
"ui.history_first": "Zum Anfang",
|
||||
"ui.history_forward": "Einen Schritt vor",
|
||||
"ui.history_last": "Zum Ende",
|
||||
"ui.history_title": "Verlauf",
|
||||
"ui.hole": "Bohrung",
|
||||
"ui.hole_tap_type": "Gewindetyp",
|
||||
@@ -1545,9 +1723,15 @@
|
||||
"ui.joints": "Gelenke",
|
||||
"ui.keyboard_shortcuts": "Tastenkürzel",
|
||||
"ui.language": "Sprache",
|
||||
"ui.layout_compact": "Kompakt",
|
||||
"ui.layout_floating": "Schwebend",
|
||||
"ui.length_decimals": "Längen-Dezimalstellen",
|
||||
"ui.light": "Hell",
|
||||
"ui.line": "Linie",
|
||||
"ui.link_copies": "Identische Kopien verknüpfen",
|
||||
"ui.link_copies_keep": "Behalten",
|
||||
"ui.link_copies_link": "Verknüpfen",
|
||||
"ui.link_copies_text": "Diese Komponenten erzeugen dieselben Körper wie {name}. Sollen sie zu Platzierungen seiner Verknüpfung werden?",
|
||||
"ui.lock": "Sperren",
|
||||
"ui.loft": "Loft",
|
||||
"ui.look_at": "Ansehen",
|
||||
@@ -1671,6 +1855,7 @@
|
||||
"ui.render": "Rendern",
|
||||
"ui.renderer": "Renderer",
|
||||
"ui.repeat": "Wiederholen",
|
||||
"ui.replace_with_link_done": "Die Kopien sind jetzt Platzierungen des verknüpften Designs.",
|
||||
"ui.report_a_bug": "Fehler melden",
|
||||
"ui.reset": "Zurücksetzen",
|
||||
"ui.reset_all": "Alle zurücksetzen",
|
||||
@@ -1682,6 +1867,7 @@
|
||||
"ui.reverse_zoom_direction": "Zoomrichtung umkehren",
|
||||
"ui.revolve": "Drehen",
|
||||
"ui.ribbon_exit": "Beenden",
|
||||
"ui.ribbon_labels": "Text unter den Symbolen im Menüband anzeigen",
|
||||
"ui.ribbon_pin_footer": "Angeheftete Befehle erscheinen im Menüband. Fahren Sie über eine Zeile, um sie anzuheften oder zu lösen.",
|
||||
"ui.ribbon_workspace": "Arbeitsbereich",
|
||||
"ui.right": "Rechts",
|
||||
@@ -1737,6 +1923,7 @@
|
||||
"ui.smooth_wheel_zoom": "Sanftes Zoomen mit dem Rad",
|
||||
"ui.smooth_wheel_zoom_tip": "Ausschalten, um jedes Radereignis sofort anzuwenden, ohne Nachlauf",
|
||||
"ui.snap": "Einrasten",
|
||||
"ui.space_mouse_axes_reassigned": "Die Achsen sind in den Einstellungen neu zugeordnet, und das gilt auch nach dieser Kalibrierung.",
|
||||
"ui.space_mouse_calibrate": "Kalibrieren…",
|
||||
"ui.space_mouse_calibrate_tip": "Bewegen Sie die Kappe so, wie das Fenster es verlangt. So lernt SolidCraft, in welche Richtung und wie weit jede Achse dieser 3D-Maus geht. Wird für diese 3D-Maus gespeichert.",
|
||||
"ui.space_mouse_calibrate_title": "3D-Maus kalibrieren",
|
||||
@@ -1746,12 +1933,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Eine Achse hat sich kaum bewegt und lässt sich nicht kalibrieren. Beginnen Sie von vorn und bewegen Sie die Kappe jedes Mal weiter.",
|
||||
"ui.space_mouse_dead_zone": "Totzone",
|
||||
"ui.space_mouse_dead_zone_tip": "Wie weit sich die Kappe bewegen muss, bevor sich die Ansicht bewegt, als Anteil ihres vollen Wegs. Erhöhen Sie sie, wenn die Ansicht wandert, obwohl die Kappe ruht.",
|
||||
"ui.space_mouse_driven_by": "Welche kalibrierte Bewegung des Geräts diese Achse steuert. Wählen Sie eine, die schon eine andere Achse nutzt, werden die beiden getauscht.",
|
||||
"ui.space_mouse_driven_by_label": "gesteuert von",
|
||||
"ui.space_mouse_driver": "3D-Maus-Treiber",
|
||||
"ui.space_mouse_driver_auto": "Automatisch",
|
||||
"ui.space_mouse_driver_direct": "Direkt (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Das Gerät wird direkt gelesen; spacenavd läuft nicht",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Lesen über spacenavd, die einzige verfügbare Möglichkeit",
|
||||
"ui.space_mouse_forget": "Kalibrierung vergessen",
|
||||
"ui.space_mouse_hint": "Ansicht gleichzeitig verschieben und drehen; Skizzen verwenden nur Schwenken und Zoomen.",
|
||||
"ui.space_mouse_motion_rotation_x": "Rotation X",
|
||||
"ui.space_mouse_motion_rotation_y": "Rotation Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Rotation Z",
|
||||
"ui.space_mouse_motion_translation_x": "Translation X",
|
||||
"ui.space_mouse_motion_translation_y": "Translation Y",
|
||||
"ui.space_mouse_motion_translation_z": "Translation Z",
|
||||
"ui.space_mouse_navigate": "Mit SpaceNavigator / SpaceMouse navigieren",
|
||||
"ui.space_mouse_none": "Keine 3D-Maus gefunden",
|
||||
"ui.space_mouse_not_calibrated": "Nicht kalibriert",
|
||||
"ui.space_mouse_reading": "Werte",
|
||||
"ui.space_mouse_reset_axes": "Achsenzuordnung zurücksetzen",
|
||||
"ui.space_mouse_step_lift": "Kappe nach oben ziehen, halten, dann loslassen.",
|
||||
"ui.space_mouse_step_press": "Kappe nach unten drücken, halten, dann loslassen.",
|
||||
"ui.space_mouse_step_pull": "Kappe zu sich heranziehen, halten, dann loslassen.",
|
||||
@@ -1765,6 +1966,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Kappe nach rechts kippen (rechte Kante runter), halten, dann loslassen.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Kappe im Uhrzeigersinn drehen, halten, dann loslassen.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Kappe gegen den Uhrzeigersinn drehen, halten, dann loslassen.",
|
||||
"ui.space_mouse_view_axis": "Ansichtsachse",
|
||||
"ui.space_mouse_view_off": "Aus",
|
||||
"ui.space_mouse_view_off_tip": "Das Profil des 3D-Maus-Treibers schaltet diese Achse ab, daher bewegt ihre Bewegung die Ansicht nicht. Wählen Sie hier die Bewegung einer anderen Achse, werden die beiden getauscht und sie bewegt die Ansicht nicht mehr.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Orbit links / rechts",
|
||||
"ui.space_mouse_view_orbit_up_down": "Orbit hoch / runter",
|
||||
"ui.space_mouse_view_pan_sideways": "Schwenken links / rechts",
|
||||
"ui.space_mouse_view_pan_up_down": "Schwenken hoch / runter",
|
||||
"ui.space_mouse_view_roll": "Rollen",
|
||||
"ui.space_mouse_view_unmapped": "Achse {n}",
|
||||
"ui.space_mouse_view_zoom": "Zoom",
|
||||
"ui.spacing": "Abstand",
|
||||
"ui.spacing_2": "Abstand 2",
|
||||
"ui.sphere": "Sphäre",
|
||||
@@ -1836,6 +2047,7 @@
|
||||
"ui.workspace_design_tabs": "Modell · Fläche · Zusammenbau · Einfügen · Prüfen · Verwalten · Ansicht",
|
||||
"ui.workspace_drawing_description": "2D-Zeichnungen mit Ansichten, Bemaßungen und Schriftfeldern",
|
||||
"ui.workspace_footer": "Jeder Arbeitsbereich arbeitet am selben Design, Verlauf und derselben Auswahl; nur die Menüband-Register ändern sich. Der Umschalter ist gesperrt, solange eine Skizze oder ein Merkmal bearbeitet wird.",
|
||||
"ui.workspace_layout": "Arbeitsbereich-Layout",
|
||||
"ui.workspace_manufacture_description": "Slicing, Werkzeugbahnen und Einrichtung",
|
||||
"ui.workspace_planned": "Geplant",
|
||||
"ui.workspace_render_description": "Produktvorschau, Szeneneinstellungen und gerenderte Bilder",
|
||||
|
||||
@@ -21,7 +21,11 @@
|
||||
"ui.customizeToolbar": "Customise Toolbar…",
|
||||
"ui.design_properties.license": "Licence",
|
||||
"ui.design_properties.organization": "Organisation",
|
||||
"ui.layout_compact": "Compact",
|
||||
"ui.layout_floating": "Floating",
|
||||
"ui.ribbon_labels": "Show text under ribbon icons",
|
||||
"ui.space_mouse_step_pull": "Pull the cap towards you, hold it, then let go.",
|
||||
"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)",
|
||||
"update.prefs_flatpak": "Flatpak updates this copy ({version}): run {command} or use your software centre. SolidCraft doesn't check."
|
||||
}
|
||||
|
||||
@@ -14,11 +14,15 @@
|
||||
"Active": "Active",
|
||||
"Active rule": "Active rule",
|
||||
"Add": "Add",
|
||||
"Add Column": "Add Column",
|
||||
"Add Key": "Add Key",
|
||||
"Add Mid Radius": "Add Mid Radius",
|
||||
"Add Row": "Add Row",
|
||||
"Add a tool": "Add a tool",
|
||||
"Add condition": "Add condition",
|
||||
"Add or edit rule": "Add or edit rule",
|
||||
"Add to New Folder": "Add to New Folder",
|
||||
"Advanced": "Advanced",
|
||||
"Against": "Against",
|
||||
"Alignment": "Alignment",
|
||||
"All Sketch Points": "All Sketch Points",
|
||||
@@ -28,9 +32,11 @@
|
||||
"Also deletes": "Also deletes",
|
||||
"Angle 2": "Angle 2",
|
||||
"Animate": "Animate",
|
||||
"App/system information and command settings are included. Review private details before sharing.": "App/system information and command settings are included. Review private details before sharing.",
|
||||
"Appearance name": "Appearance name",
|
||||
"Applied Radius": "Applied Radius",
|
||||
"Apply To": "Apply To",
|
||||
"Apply library appearance": "Apply library appearance",
|
||||
"Apply to selection": "Apply to selection",
|
||||
"Apply your appearance first. Exports assigned appearances and materials created in this design.": "Apply your appearance first. Exports assigned appearances and materials created in this design.",
|
||||
"Arc length": "Arc length",
|
||||
@@ -41,13 +47,18 @@
|
||||
"BLEND SURFACE": "BLEND SURFACE",
|
||||
"BOUNDARY SURFACE": "BOUNDARY SURFACE",
|
||||
"BROWSER": "BROWSER",
|
||||
"Bend Edges": "Bend Edges",
|
||||
"Bend Line Position": "Bend Line Position",
|
||||
"Bend Position": "Bend Position",
|
||||
"Bend Radius": "Bend Radius",
|
||||
"Bend Table": "Bend Table",
|
||||
"Bends": "Bends",
|
||||
"Bodies": "Bodies",
|
||||
"Bodies (optional)": "Bodies (optional)",
|
||||
"Body": "Body",
|
||||
"Body (last if none)": "Body (last if none)",
|
||||
"Body to split": "Body to split",
|
||||
"Body, or faces to take out": "Body, or faces to take out",
|
||||
"Boundary": "Boundary",
|
||||
"Bounding box": "Bounding box",
|
||||
"CHECK": "CHECK",
|
||||
@@ -59,7 +70,9 @@
|
||||
"CSV or JSON: updates existing parameters, adds new ones": "CSV or JSON: updates existing parameters, adds new ones",
|
||||
"Capture All Positions": "Capture All Positions",
|
||||
"Capture Pos.": "Capture Pos.",
|
||||
"Catch Depth": "Catch Depth",
|
||||
"Catch Direction": "Catch Direction",
|
||||
"Catch Length": "Catch Length",
|
||||
"Cells": "Cells",
|
||||
"Center X": "Center X",
|
||||
"Center Y": "Center Y",
|
||||
@@ -68,22 +81,30 @@
|
||||
"Chamfer Type": "Chamfer Type",
|
||||
"Check collisions": "Check collisions",
|
||||
"Checked": "Checked",
|
||||
"Choose Variable radius or Spline in Type.": "Choose Variable radius or Spline in Type.",
|
||||
"Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.": "Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.",
|
||||
"Choose…": "Choose…",
|
||||
"Circular": "Circular",
|
||||
"Circumference": "Circumference",
|
||||
"Close draft": "Close draft",
|
||||
"Collapse": "Collapse",
|
||||
"Collisions": "Collisions",
|
||||
"Colour": "Colour",
|
||||
"Command": "Command",
|
||||
"Comment": "Comment",
|
||||
"Component 1": "Component 1",
|
||||
"Component 2": "Component 2",
|
||||
"Component1": "Component1",
|
||||
"Components": "Components",
|
||||
"Config Table": "Config Table",
|
||||
"Configuration": "Configuration",
|
||||
"Configuration rules": "Configuration rules",
|
||||
"Contact": "Contact",
|
||||
"Contact Sets": "Contact Sets",
|
||||
"Contact sets": "Contact sets",
|
||||
"Continue on GitHub": "Continue on GitHub",
|
||||
"Continuity": "Continuity",
|
||||
"Control Radius": "Control Radius",
|
||||
"Copy Error Message": "Copy Error Message",
|
||||
"Copy Warning Message": "Copy Warning Message",
|
||||
"Copy all licences": "Copy all licences",
|
||||
@@ -93,8 +114,11 @@
|
||||
"Corner Relief": "Corner Relief",
|
||||
"Corner Relief Shape": "Corner Relief Shape",
|
||||
"Counterbore depth": "Counterbore depth",
|
||||
"Counterbore Ø": "Counterbore Ø",
|
||||
"Countersink angle": "Countersink angle",
|
||||
"Countersink Ø": "Countersink Ø",
|
||||
"Create Issue — review draft": "Create Issue — review draft",
|
||||
"Create Issue…": "Create Issue…",
|
||||
"Cross curves": "Cross curves",
|
||||
"Cube": "Cube",
|
||||
"Current orthographic view (1:1 mm)": "Current orthographic view (1:1 mm)",
|
||||
@@ -102,18 +126,28 @@
|
||||
"Curv. Comb": "Curv. Comb",
|
||||
"Curvature (G2)": "Curvature (G2)",
|
||||
"Curvature change (G3)": "Curvature change (G3)",
|
||||
"Custom": "Custom",
|
||||
"Customize Toolbar": "Customize Toolbar",
|
||||
"Customize…": "Customize…",
|
||||
"Cylindrical face": "Cylindrical face",
|
||||
"Delete": "Delete",
|
||||
"Delete Selected Features…": "Delete Selected Features…",
|
||||
"Delete Selected Folders": "Delete Selected Folders",
|
||||
"Delete all": "Delete all",
|
||||
"Delete rule": "Delete rule",
|
||||
"Delete the row": "Delete the row",
|
||||
"Delete the set": "Delete the set",
|
||||
"Density": "Density",
|
||||
"Dependents": "Dependents",
|
||||
"Describe the problem you saw": "Describe the problem you saw",
|
||||
"Describe what happened before continuing.": "Describe what happened before continuing.",
|
||||
"Designs you open or save appear here.": "Designs you open or save appear here.",
|
||||
"Determined by To Object. Choose Angle to edit the angular extent.": "Determined by To Object. Choose Angle to edit the angular extent.",
|
||||
"Diameter": "Diameter",
|
||||
"Direction": "Direction",
|
||||
"Discard": "Discard",
|
||||
"Distance": "Distance",
|
||||
"Distance 1": "Distance 1",
|
||||
"Do not export hidden edges": "Do not export hidden edges",
|
||||
"Don't ask again": "Don't ask again",
|
||||
"Double-click to rename": "Double-click to rename",
|
||||
@@ -125,48 +159,65 @@
|
||||
"Edit Profile Sketch": "Edit Profile Sketch",
|
||||
"Enable rule": "Enable rule",
|
||||
"Enabled": "Enabled",
|
||||
"End Radius": "End Radius",
|
||||
"End bulge": "End bulge",
|
||||
"End continuity": "End continuity",
|
||||
"Expand": "Expand",
|
||||
"Expected result (optional)": "Expected result (optional)",
|
||||
"Explode": "Explode",
|
||||
"Explode Text": "Explode Text",
|
||||
"Export Animation…": "Export Animation…",
|
||||
"Export Bend Table…": "Export Bend Table…",
|
||||
"Export CSV…": "Export CSV…",
|
||||
"Export Current View as DXF": "Export Current View as DXF",
|
||||
"Export Current View as DXF…": "Export Current View as DXF…",
|
||||
"Export DXF": "Export DXF",
|
||||
"Export DXF…": "Export DXF…",
|
||||
"Export JSON…": "Export JSON…",
|
||||
"Export design library...": "Export design library...",
|
||||
"Export hidden edges as dashed lines": "Export hidden edges as dashed lines",
|
||||
"Exported by SolidWorks, which usually saves Y up": "Exported by SolidWorks, which usually saves Y up",
|
||||
"Expression": "Expression",
|
||||
"Extend to meet": "Extend to meet",
|
||||
"Extents": "Extents",
|
||||
"FILES": "FILES",
|
||||
"FLAT": "FLAT",
|
||||
"Face": "Face",
|
||||
"Face Appearance": "Face Appearance",
|
||||
"Face attachment lost": "Face attachment lost",
|
||||
"Faces": "Faces",
|
||||
"Faces / edges / vertices": "Faces / edges / vertices",
|
||||
"Faces to split": "Faces to split",
|
||||
"Fastener": "Fastener",
|
||||
"Favorites": "Favorites",
|
||||
"Favourite": "Favourite",
|
||||
"Feature": "Feature",
|
||||
"Files from many CAD programs have Y up, so they open lying on their back here (Z up).": "Files from many CAD programs have Y up, so they open lying on their back here (Z up).",
|
||||
"Filter": "Filter",
|
||||
"Filter…": "Filter…",
|
||||
"Find in Browser": "Find in Browser",
|
||||
"Finish": "Finish",
|
||||
"First plane": "First plane",
|
||||
"Fit and G2 corners require Constant radius.": "Fit and G2 corners require Constant radius.",
|
||||
"Fixed Face": "Fixed Face",
|
||||
"Flat Pattern": "Flat Pattern",
|
||||
"Flat size": "Flat size",
|
||||
"Follow camera (Look At sketches)": "Follow camera (Look At sketches)",
|
||||
"Follow the camera (Look At sketches)": "Follow the camera (Look At sketches)",
|
||||
"Font": "Font",
|
||||
"From": "From",
|
||||
"From Bodies": "From Bodies",
|
||||
"From edges": "From edges",
|
||||
"Full Length": "Full Length",
|
||||
"G2 corners require a constant radius and Exact fit. G2 corner construction is not supported yet.": "G2 corners require a constant radius and Exact fit. G2 corner construction is not supported yet.",
|
||||
"Gap": "Gap",
|
||||
"Grid": "Grid",
|
||||
"HISTORY": "HISTORY",
|
||||
"Height": "Height",
|
||||
"Hidden edges": "Hidden edges",
|
||||
"History layout": "History layout",
|
||||
"History names": "History names",
|
||||
"Hole (optional)": "Hole (optional)",
|
||||
"Holes": "Holes",
|
||||
"Holes (edges on them)": "Holes (edges on them)",
|
||||
"Home view": "Home view",
|
||||
@@ -177,14 +228,20 @@
|
||||
"In place (surfaces)": "In place (surfaces)",
|
||||
"In plane": "In plane",
|
||||
"Inside": "Inside",
|
||||
"Instant": "Instant",
|
||||
"Interface font": "Interface font",
|
||||
"Interferes": "Interferes",
|
||||
"Invert": "Invert",
|
||||
"Isocurve": "Isocurve",
|
||||
"Issue title": "Issue title",
|
||||
"Items": "Items",
|
||||
"JOINTS": "JOINTS",
|
||||
"Joint Origin1": "Joint Origin1",
|
||||
"Keep (points on it)": "Keep (points on it)",
|
||||
"Keep Tools": "Keep Tools",
|
||||
"Keep of the other surface": "Keep of the other surface",
|
||||
"Key a joint's value at this step": "Key a joint's value at this step",
|
||||
"Keys": "Keys",
|
||||
"LIBRARY": "LIBRARY",
|
||||
"LINKS": "LINKS",
|
||||
"Later": "Later",
|
||||
@@ -195,9 +252,14 @@
|
||||
"Letter Spacing": "Letter Spacing",
|
||||
"Library": "Library",
|
||||
"Library file": "Library file",
|
||||
"Limits": "Limits",
|
||||
"Line Spacing": "Line Spacing",
|
||||
"Line Type": "Line Type",
|
||||
"Listing the installed fonts…": "Listing the installed fonts…",
|
||||
"Load library": "Load library",
|
||||
"Local library": "Local library",
|
||||
"Loop": "Loop",
|
||||
"M5 or M5x0.5": "M5 or M5x0.5",
|
||||
"MANAGE": "MANAGE",
|
||||
"MATERIALS": "MATERIALS",
|
||||
"MODEL": "MODEL",
|
||||
@@ -208,14 +270,20 @@
|
||||
"Matched restrictions check the final values.": "Matched restrictions check the final values.",
|
||||
"Material": "Material",
|
||||
"Max": "Max",
|
||||
"Maximum": "Maximum",
|
||||
"Mesh body": "Mesh body",
|
||||
"Mid Radius": "Mid Radius",
|
||||
"Middle double-click": "Middle double-click",
|
||||
"Min": "Min",
|
||||
"Minimum": "Minimum",
|
||||
"Mirror Plane": "Mirror Plane",
|
||||
"Mitre": "Mitre",
|
||||
"Model Parameters": "Model Parameters",
|
||||
"Modeled": "Modeled",
|
||||
"More toolbar panels": "More toolbar panels",
|
||||
"Motion": "Motion",
|
||||
"Mouse gestures": "Mouse gestures",
|
||||
"Mouse gestures only work with the SolidWorks mouse mode (the wheel orbits, Ctrl + wheel pans).": "Mouse gestures only work with the SolidWorks mouse mode (the wheel orbits, Ctrl + wheel pans).",
|
||||
"Move / Copy": "Move / Copy",
|
||||
"Move Type": "Move Type",
|
||||
"Move down": "Move down",
|
||||
@@ -232,16 +300,23 @@
|
||||
"No crash reports.": "No crash reports.",
|
||||
"No matching appearance presets.": "No matching appearance presets.",
|
||||
"No matching appearances": "No matching appearances",
|
||||
"No visible bodies to export.": "No visible bodies to export.",
|
||||
"No visible bodies or sketches to export.": "No visible bodies or sketches to export.",
|
||||
"Nominal diameter": "Nominal diameter",
|
||||
"None": "None",
|
||||
"Not available yet": "Not available yet",
|
||||
"Notch": "Notch",
|
||||
"OUTPUT": "OUTPUT",
|
||||
"Of": "Of",
|
||||
"On your computer": "On your computer",
|
||||
"Opacity": "Opacity",
|
||||
"Open GitHub draft": "Open GitHub draft",
|
||||
"Open library...": "Open library...",
|
||||
"Open local libraries in the desktop app. You can export this design's library here.": "Open local libraries in the desktop app. You can export this design's library here.",
|
||||
"Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.",
|
||||
"Opens your browser and copies the report text for you to paste into GitHub.": "Opens your browser and copies the report text for you to paste into GitHub.",
|
||||
"Opens your browser. Review and submit your report on GitHub.": "Opens your browser. Review and submit your report on GitHub.",
|
||||
"Operator": "Operator",
|
||||
"Orbit (right drag)": "Orbit (right drag)",
|
||||
"Other side": "Other side",
|
||||
"Other surface (mutual trim)": "Other surface (mutual trim)",
|
||||
"Outside": "Outside",
|
||||
@@ -256,8 +331,11 @@
|
||||
"Pick the tool bodies": "Pick the tool bodies",
|
||||
"Picked": "Picked",
|
||||
"Picked point": "Picked point",
|
||||
"Pitch": "Pitch",
|
||||
"Pivot": "Pivot",
|
||||
"Place at the origin instead": "Place at the origin instead",
|
||||
"Plastic Rules": "Plastic Rules",
|
||||
"Play the joint's motion in the view": "Play the joint's motion in the view",
|
||||
"Playback": "Playback",
|
||||
"Plot": "Plot",
|
||||
"Position": "Position",
|
||||
@@ -265,14 +343,18 @@
|
||||
"Position (G0)": "Position (G0)",
|
||||
"Position along the edge, 0 at the start end, 1 at the other": "Position along the edge, 0 at the start end, 1 at the other",
|
||||
"Preferences › Design turns the offer back on": "Preferences › Design turns the offer back on",
|
||||
"Preview": "Preview",
|
||||
"Preview Row": "Preview Row",
|
||||
"Preview leaves the current design unchanged.": "Preview leaves the current design unchanged.",
|
||||
"Profile / Edges": "Profile / Edges",
|
||||
"Profiles or curves": "Profiles or curves",
|
||||
"Profiles/Curves": "Profiles/Curves",
|
||||
"Quantity": "Quantity",
|
||||
"RECENT": "RECENT",
|
||||
"REFERENCE": "REFERENCE",
|
||||
"RULED SURFACE": "RULED SURFACE",
|
||||
"RULES": "RULES",
|
||||
"Radius": "Radius",
|
||||
"Radius Fit": "Radius Fit",
|
||||
"Ratio": "Ratio",
|
||||
"Reattach selected face": "Reattach selected face",
|
||||
@@ -281,6 +363,8 @@
|
||||
"Rectangular": "Rectangular",
|
||||
"Reference face": "Reference face",
|
||||
"Remove Tools": "Remove Tools",
|
||||
"Remove condition": "Remove condition",
|
||||
"Remove from Folder": "Remove from Folder",
|
||||
"Remove from list": "Remove from list",
|
||||
"Remove override": "Remove override",
|
||||
"Remove private design details or paths before sharing.": "Remove private design details or paths before sharing.",
|
||||
@@ -288,12 +372,18 @@
|
||||
"Remove the column": "Remove the column",
|
||||
"Remove the track": "Remove the track",
|
||||
"Remove this point": "Remove this point",
|
||||
"Rename Feature": "Rename Feature",
|
||||
"Rename Folder": "Rename Folder",
|
||||
"Replace existing library file": "Replace existing library file",
|
||||
"Report a bug — review a screenshot and open a GitHub draft": "Report a bug — review a screenshot and open a GitHub draft",
|
||||
"Report text copied. Paste it into GitHub and submit your report there.": "Report text copied. Paste it into GitHub and submit your report there.",
|
||||
"Reports are public. A GitHub account is required.": "Reports are public. A GitHub account is required.",
|
||||
"Reset Toolbar": "Reset Toolbar",
|
||||
"Resize Part": "Resize Part",
|
||||
"Restore View": "Restore View",
|
||||
"Restore outer boundary": "Restore outer boundary",
|
||||
"Restore the inherited component or physical material appearance": "Restore the inherited component or physical material appearance",
|
||||
"Restore this studio's tools": "Restore this studio's tools",
|
||||
"Result": "Result",
|
||||
"Retake screenshot": "Retake screenshot",
|
||||
"Reverse": "Reverse",
|
||||
@@ -303,7 +393,14 @@
|
||||
"Revert Pos.": "Revert Pos.",
|
||||
"Revert Position": "Revert Position",
|
||||
"Review the report and screenshot before opening GitHub.": "Review the report and screenshot before opening GitHub.",
|
||||
"Review your report on GitHub and click Submit new issue to publish it.": "Review your report on GitHub and click Submit new issue to publish it.",
|
||||
"Rib Length": "Rib Length",
|
||||
"Rib Offset": "Rib Offset",
|
||||
"Rib Thickness": "Rib Thickness",
|
||||
"Ribs": "Ribs",
|
||||
"Rim Edge": "Rim Edge",
|
||||
"Ring of tools on the right button": "Ring of tools on the right button",
|
||||
"Roll Back Here": "Roll Back Here",
|
||||
"Roll History Marker Here": "Roll History Marker Here",
|
||||
"Round": "Round",
|
||||
"Rule": "Rule",
|
||||
@@ -313,20 +410,27 @@
|
||||
"SURFACE QUALITY": "SURFACE QUALITY",
|
||||
"Save Rule": "Save Rule",
|
||||
"Save View": "Save View",
|
||||
"Save screenshot…": "Save screenshot…",
|
||||
"Save the study as an animated GIF, seen as the viewport shows it": "Save the study as an animated GIF, seen as the viewport shows it",
|
||||
"Saved preview. Geometry is being checked before editing.": "Saved preview. Geometry is being checked before editing.",
|
||||
"Scale factor": "Scale factor",
|
||||
"Scene": "Scene",
|
||||
"Screenshot (optional)": "Screenshot (optional)",
|
||||
"Search": "Search",
|
||||
"Search commands": "Search commands",
|
||||
"Search this library": "Search this library",
|
||||
"Second plane": "Second plane",
|
||||
"Section": "Section",
|
||||
"Sections (one sketch each)": "Sections (one sketch each)",
|
||||
"Select Other": "Select Other",
|
||||
"Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).": "Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).",
|
||||
"Select bodies (a face picks its body)": "Select bodies (a face picks its body)",
|
||||
"Select bodies or faces instead": "Select bodies or faces instead",
|
||||
"Select edges": "Select edges",
|
||||
"Selection filter": "Selection filter",
|
||||
"Semantic faces share their appearance across instances.": "Semantic faces share their appearance across instances.",
|
||||
"Send your report on GitHub": "Send your report on GitHub",
|
||||
"Shaded": "Shaded",
|
||||
"Shape": "Shape",
|
||||
"Sheet Rules": "Sheet Rules",
|
||||
"Show Agent Cursor": "Show Agent Cursor",
|
||||
@@ -344,6 +448,7 @@
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft closed before these designs were saved. Their last autosave can be opened.",
|
||||
"Specialise": "Specialise",
|
||||
"Speed": "Speed",
|
||||
"Splitting tool": "Splitting tool",
|
||||
"Stand it up": "Stand it up",
|
||||
"Stand it up: a quarter turn about X, as one Move feature you can undo.": "Stand it up: a quarter turn about X, as one Move feature you can undo.",
|
||||
"Stand this part up?": "Stand this part up?",
|
||||
@@ -351,17 +456,27 @@
|
||||
"Start continuity": "Start continuity",
|
||||
"Step": "Step",
|
||||
"Steps": "Steps",
|
||||
"Steps to reproduce (optional)": "Steps to reproduce (optional)",
|
||||
"Stitch the kept pieces": "Stitch the kept pieces",
|
||||
"Stitch to both bodies": "Stitch to both bodies",
|
||||
"Studio": "Studio",
|
||||
"Study": "Study",
|
||||
"Style": "Style",
|
||||
"Summary": "Summary",
|
||||
"Suppress": "Suppress",
|
||||
"Suppressed": "Suppressed",
|
||||
"Surface": "Surface",
|
||||
"Surface, or faces to turn over": "Surface, or faces to turn over",
|
||||
"Swap Ends": "Swap Ends",
|
||||
"TRIM": "TRIM",
|
||||
"Tangent (G1)": "Tangent (G1)",
|
||||
"Tangent Chain": "Tangent Chain",
|
||||
"Tangent chain": "Tangent chain",
|
||||
"Tap drill diameter": "Tap drill diameter",
|
||||
"Target": "Target",
|
||||
"Target Body": "Target Body",
|
||||
"Tear": "Tear",
|
||||
"Technical details": "Technical details",
|
||||
"The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "The dashed sketch is a saved plane guide. Select a new face to repair the attachment.",
|
||||
"The saved author occurrence is missing. Select a valid author placement before rebinding.": "The saved author occurrence is missing. Select a valid author placement before rebinding.",
|
||||
"Then": "Then",
|
||||
@@ -373,24 +488,32 @@
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "This child is shared. Deleting it removes it from every copy of its parent.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "This child is shared. Position changes apply to every copy of its parent.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.",
|
||||
"To": "To",
|
||||
"To Offset": "To Offset",
|
||||
"To edges": "To edges",
|
||||
"Tolerance": "Tolerance",
|
||||
"Too close": "Too close",
|
||||
"Tool Bodies": "Tool Bodies",
|
||||
"Tools": "Tools",
|
||||
"Tools, clockwise from the top": "Tools, clockwise from the top",
|
||||
"Trimming tool (plane, face or curves)": "Trimming tool (plane, face or curves)",
|
||||
"Turn off section analysis before exporting the view.": "Turn off section analysis before exporting the view.",
|
||||
"Type": "Type",
|
||||
"UNTRIM": "UNTRIM",
|
||||
"Unit": "Unit",
|
||||
"Unsuppress": "Unsuppress",
|
||||
"Updating the preview": "Updating the preview",
|
||||
"Use active author placement": "Use active author placement",
|
||||
"Use fixed plane": "Use fixed plane",
|
||||
"Use saved fixed plane": "Use saved fixed plane",
|
||||
"Use selected face as fixed plane": "Use selected face as fixed plane",
|
||||
"Use the SolidWorks mouse mode": "Use the SolidWorks mouse mode",
|
||||
"User Parameters": "User Parameters",
|
||||
"VIEW": "VIEW",
|
||||
"VIEWS": "VIEWS",
|
||||
"Value": "Value",
|
||||
"Variable Radius": "Variable Radius",
|
||||
"Velocity": "Velocity",
|
||||
"Vertices": "Vertices",
|
||||
"View navigator": "View navigator",
|
||||
@@ -398,16 +521,50 @@
|
||||
"Wall": "Wall",
|
||||
"Wall Location": "Wall Location",
|
||||
"Wall Thickness": "Wall Thickness",
|
||||
"What did you do just before the problem? A short list is enough": "What did you do just before the problem? A short list is enough",
|
||||
"What did you expect to see?": "What did you expect to see?",
|
||||
"What happened?": "What happened?",
|
||||
"When": "When",
|
||||
"Width": "Width",
|
||||
"Will fail": "Will fail",
|
||||
"With gestures on, the right button no longer orbits the view: hold it and move to open the ring, then touch a tool's zone. A plain right-click still opens the menu.": "With gestures on, the right button no longer orbits the view: hold it and move to open the ring, then touch a tool's zone. A plain right-click still opens the menu.",
|
||||
"X": "X",
|
||||
"X Angle": "X Angle",
|
||||
"X angle": "X angle",
|
||||
"X distance": "X distance",
|
||||
"Y": "Y",
|
||||
"Y Angle": "Y Angle",
|
||||
"Y angle": "Y angle",
|
||||
"Y distance": "Y distance",
|
||||
"Z": "Z",
|
||||
"Z Angle": "Z Angle",
|
||||
"Z Distance": "Z Distance",
|
||||
"Z angle": "Z angle",
|
||||
"Z distance": "Z distance",
|
||||
"Zebra": "Zebra",
|
||||
"ai.prefs.availability": "Assistant controls",
|
||||
"ai.prefs.background_commands": "Run agent commands in the background",
|
||||
"ai.prefs.follow_camera": "Turn the camera to sketches",
|
||||
"ai.prefs.follow_camera_off": "Automatic camera following is off.",
|
||||
"ai.prefs.follow_camera_on": "The camera turns to face sketches the agent creates.",
|
||||
"ai.prefs.intro": "Agents, permissions and how their work appears.",
|
||||
"ai.prefs.make_default": "Use by default",
|
||||
"ai.prefs.no_agents": "No agents yet. Add an agent or refresh to find installed agents.",
|
||||
"ai.prefs.no_saved_approvals": "No saved approvals.",
|
||||
"ai.prefs.override_all_warning": "This agent may save, overwrite, export or replace the design without asking.",
|
||||
"ai.prefs.permission_all": "Allow everything",
|
||||
"ai.prefs.permission_all_summary": "Available SolidCraft tools run without asking.",
|
||||
"ai.prefs.permission_ask": "Ask before changes",
|
||||
"ai.prefs.permission_ask_summary": "Approve every design change and file action.",
|
||||
"ai.prefs.permission_edits": "Allow model edits",
|
||||
"ai.prefs.permission_edits_summary": "Model edits run; file and destructive actions still ask.",
|
||||
"ai.prefs.permission_scope": "For SolidCraft tools only. The agent’s shell and file edits use its own permissions.",
|
||||
"ai.prefs.pointer_preview_hidden": "Pointer hidden",
|
||||
"ai.prefs.pointer_preview_speed": "Agent pointer · {speed}",
|
||||
"ai.prefs.pointer_speed": "Motion speed",
|
||||
"ai.prefs.privacy_note": "Only your chosen agent or endpoint receives the conversation. Endpoint keys are stored in your system keychain.",
|
||||
"ai.prefs.show_pointer": "Show agent pointer",
|
||||
"ai.prefs.turn_limit_hint": "Maximum design-changing tool calls the Assistant may make for one message.",
|
||||
"angle, height": "angle, height",
|
||||
"appearance.dielectric_ior": "Dielectric IOR",
|
||||
"appearance.metallic": "Metallic",
|
||||
@@ -453,8 +610,10 @@
|
||||
"cmd.component_activate": "Activate Component",
|
||||
"cmd.component_break_link": "Break Link",
|
||||
"cmd.component_capture_position": "Capture Position",
|
||||
"cmd.component_copies": "Find Identical Copies",
|
||||
"cmd.component_create": "New Component",
|
||||
"cmd.component_delete": "Delete Component",
|
||||
"cmd.component_extract": "Extract to File",
|
||||
"cmd.component_from_bodies": "Create Components from Bodies",
|
||||
"cmd.component_insert_design": "Insert Design",
|
||||
"cmd.component_links": "List Links",
|
||||
@@ -467,6 +626,7 @@
|
||||
"cmd.component_properties": "Component Physical Properties",
|
||||
"cmd.component_relink": "Relink Source",
|
||||
"cmd.component_rename": "Rename Component",
|
||||
"cmd.component_replace_with_link": "Replace with Link",
|
||||
"cmd.component_revert_position": "Revert Position",
|
||||
"cmd.component_unlock": "Unlock Contents",
|
||||
"cmd.component_update_links": "Update Links",
|
||||
@@ -584,6 +744,7 @@
|
||||
"cmd.motion_plot": "Plot Motion Study",
|
||||
"cmd.motion_study": "Motion Study",
|
||||
"cmd.motion_trace": "Motion Trace",
|
||||
"cmd.motion_trace_edit": "Edit Motion Trace",
|
||||
"cmd.motion_trace_keep": "Keep Motion Trace",
|
||||
"cmd.occurrence_copy": "Paste (Instance)",
|
||||
"cmd.occurrence_ground": "Ground",
|
||||
@@ -758,6 +919,7 @@
|
||||
"cmd.view_graphics_preset": "Graphics Preset",
|
||||
"cmd.view_list": "List Named Views",
|
||||
"cmd.view_navigate": "Navigate View",
|
||||
"cmd.view_normal_to": "Normal to Selection",
|
||||
"cmd.view_rename": "Rename Named View",
|
||||
"cmd.view_save": "New Named View",
|
||||
"color.copy": "Click to copy color values",
|
||||
@@ -831,7 +993,7 @@
|
||||
"dxf.progress.projection": "Projecting geometry (3/5)",
|
||||
"dxf.progress.write": "Writing DXF (5/5)",
|
||||
"dxf.tolerance": "Curve tolerance",
|
||||
"dxf.tolerance_help": "Visible bodies only. Curves use straight segments. Smaller tolerance gives finer curves and uses more time and memory.",
|
||||
"dxf.tolerance_help": "Visible bodies and shown sketches only. Curves use straight segments. Smaller tolerance gives finer curves and uses more time and memory.",
|
||||
"file_load.built": "Built so far: {built} of {total} features.",
|
||||
"file_load.converting": "Converting solid {done} of {total}",
|
||||
"file_load.inserting": "Inserting geometry",
|
||||
@@ -862,19 +1024,57 @@
|
||||
"help.solid.revolve": "Spins a sketch profile around an axis to make a round solid. Use it for shafts, knobs, bowls and any part that is round about a centre line.",
|
||||
"help.solid.shell": "Hollows out a solid, leaving walls of the thickness you set, and can open the faces you pick. Use it for boxes, covers and other thin-walled parts.",
|
||||
"help.third_party": "Third-party licences",
|
||||
"home.back": "Back to {name}",
|
||||
"home.crashes": "Crash reports",
|
||||
"home.design_workspace": "Design",
|
||||
"home.documentation": "Documentation",
|
||||
"home.export": "Export",
|
||||
"home.export_hint": "Choose a format for the current design.",
|
||||
"home.export_json_hint": "Editable design and command history",
|
||||
"home.export_mesh_hint": "Mesh for printing or sharing",
|
||||
"home.export_step_hint": "Precise solid geometry",
|
||||
"home.import": "Import…",
|
||||
"home.import_hint": "STEP, IGES or mesh into a new design",
|
||||
"home.in_this_browser": "in this browser",
|
||||
"home.missing": "missing",
|
||||
"home.month_01": "Jan",
|
||||
"home.month_02": "Feb",
|
||||
"home.month_03": "Mar",
|
||||
"home.month_04": "Apr",
|
||||
"home.month_05": "May",
|
||||
"home.month_06": "Jun",
|
||||
"home.month_07": "Jul",
|
||||
"home.month_08": "Aug",
|
||||
"home.month_09": "Sep",
|
||||
"home.month_10": "Oct",
|
||||
"home.month_11": "Nov",
|
||||
"home.month_12": "Dec",
|
||||
"home.new_inches": "New design, inches",
|
||||
"home.new_inches_hint": "Inches · opens in Design",
|
||||
"home.new_mm": "New design",
|
||||
"home.new_mm_hint": "Millimetres · opens in Design",
|
||||
"home.open": "Open…",
|
||||
"home.opened_days_ago": "Opened {count} days ago",
|
||||
"home.opened_hours_ago": "Opened {count} h ago",
|
||||
"home.opened_just_now": "Opened just now",
|
||||
"home.opened_minutes_ago": "Opened {count} min ago",
|
||||
"home.open_hint": "A .solidcraft design ({shortcut})",
|
||||
"home.open_now": "Open now",
|
||||
"home.opened_days_ago": "{count} days ago",
|
||||
"home.opened_hours_ago": "{count} h ago",
|
||||
"home.opened_just_now": "Just now",
|
||||
"home.opened_minutes_ago": "{count} min ago",
|
||||
"home.opening": "opening…",
|
||||
"home.properties": "Design properties",
|
||||
"home.recent": "Recent",
|
||||
"home.recent_empty": "Designs you open or save appear here.",
|
||||
"home.recovery_count": "Recoverable designs: {count}",
|
||||
"home.recovery_empty": "No recoverable designs.",
|
||||
"home.recovery_hint": "SolidCraft closed before these designs were saved.",
|
||||
"home.report_issue": "Report an Issue",
|
||||
"home.samples": "Samples",
|
||||
"home.settings": "Settings",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Keyboard shortcuts",
|
||||
"home.start_hint": "Create a design, open a recent file, or explore a sample.",
|
||||
"home.whats_new": "What's new",
|
||||
"home.yesterday": "Yesterday",
|
||||
"install.button_tip": "Install SolidCraft as an app: it opens in its own window and works offline",
|
||||
"install.dock_1": "Choose File › Add to Dock.",
|
||||
"install.dock_2": "Click Add.",
|
||||
@@ -932,6 +1132,15 @@
|
||||
"motion.to_end": "To the end",
|
||||
"motion.to_start": "To the start",
|
||||
"motion.track_name": "Track {number}",
|
||||
"nav.alias.help": "Shift+Alt+left drag orbits, Shift+Alt+middle pans, Shift+Alt+right zooms; middle drag also pans and right drag orbits",
|
||||
"nav.blender.help": "Middle drag orbits, Shift+middle pans, Ctrl+middle zooms; right drag leaves the camera alone",
|
||||
"nav.free_orbit.help": "Mouse and 3D mouse rotate through both poles and preserve roll. Shift axis snapping is disabled.",
|
||||
"nav.free_orbit.label": "Free orbit",
|
||||
"nav.fusion.help": "Middle drag pans, Shift+middle orbits, right drag orbits",
|
||||
"nav.inventor.help": "Middle drag pans, Shift+middle orbits, Ctrl+middle zooms, right drag orbits",
|
||||
"nav.openscad.help": "Left drag on empty space orbits, Shift+left drag box-selects, sketch geometry drags edit; right or middle drag pans, Shift+right or Shift+middle drag zooms",
|
||||
"nav.solidworks.help": "Middle drag orbits, Ctrl+middle pans, Shift+middle zooms, right drag orbits",
|
||||
"nav.tinkercad.help": "Right drag orbits, middle or Shift+right drag pans",
|
||||
"nav.touchpad.help": "Hold Shift and move the pointer to pan; hold Alt/Option and move it to orbit. No mouse button is needed. Vertical scroll zooms.",
|
||||
"nav.touchpad.label": "Touchpad",
|
||||
"nav.touchpad.orbit": "Orbit (hold Alt/Option and move; no mouse button)",
|
||||
@@ -954,8 +1163,130 @@
|
||||
"pattern.flip_direction": "Flip direction",
|
||||
"pick a hole to seat it, or OK places it at the origin": "pick a hole to seat it, or OK places it at the origin",
|
||||
"pick one or two vertices, edges or faces": "pick one or two vertices, edges or faces",
|
||||
"prefs.add_item": "Add the item",
|
||||
"prefs.alt_frees_manipulators": "Alt / Option also frees manipulator arrows",
|
||||
"prefs.anti_aliasing_note": "Smooths jagged edges.",
|
||||
"prefs.applies_on_restart": "Applies on restart",
|
||||
"prefs.assistant": "Assistant",
|
||||
"prefs.axes": "Axes",
|
||||
"prefs.axis": "Axis",
|
||||
"prefs.bottom": "Bottom",
|
||||
"prefs.browser": "Browser",
|
||||
"prefs.built_in": "Built in",
|
||||
"prefs.button_left": "Left drag",
|
||||
"prefs.button_middle": "Middle drag",
|
||||
"prefs.button_right": "Right drag",
|
||||
"prefs.choose_font": "Choose font file…",
|
||||
"prefs.click": "Click",
|
||||
"prefs.contact_shading": "Soft contact shading",
|
||||
"prefs.contact_shading_note": "Soft shading where parts come close.",
|
||||
"prefs.context_menu": "Context menu",
|
||||
"prefs.context_menu_ring": "Context menu · hold for the radial menu",
|
||||
"prefs.cpu": "CPU (software)",
|
||||
"prefs.crash_reports": "Open crash reports…",
|
||||
"prefs.crash_reports_note": "Reports are kept on this computer, with the design and commands that reproduce the problem.",
|
||||
"prefs.ctrl_cmd": "Ctrl / Cmd",
|
||||
"prefs.curved_surfaces": "Curved surfaces",
|
||||
"prefs.curves": "Curved surfaces",
|
||||
"prefs.dead_zone_note": "The hatched band is the dead zone: motion inside it is ignored.",
|
||||
"prefs.default": "default",
|
||||
"prefs.design": "Design defaults",
|
||||
"prefs.design_note": "What new designs start with. Open designs keep their own.",
|
||||
"prefs.devices": "3D mouse",
|
||||
"prefs.display": "Display",
|
||||
"prefs.edges": "Edges and shading",
|
||||
"prefs.extend": "Extend",
|
||||
"prefs.extra_navigation": "Ctrl+left drag on empty space orbits; hold Space to pan.",
|
||||
"prefs.follows_os": "Follows the OS",
|
||||
"prefs.font": "Font",
|
||||
"prefs.font_fallback": "Glyphs the chosen font lacks fall back to the built-in font, so no label shows an empty box.",
|
||||
"prefs.font_sample": "The quick brown fox · Ø12.50 mm · 45.0° · 0123456789",
|
||||
"prefs.font_unreadable": "The selected font could not be read.",
|
||||
"prefs.general": "General",
|
||||
"prefs.general_note": "Language, saving and updates.",
|
||||
"prefs.gesture_orbit": "Orbit",
|
||||
"prefs.gesture_pan": "Pan",
|
||||
"prefs.gesture_zoom": "Zoom",
|
||||
"prefs.graphics": "Graphics",
|
||||
"prefs.graphics_note": "Trade speed for smoothness. Each choice shows its effect on a sample.",
|
||||
"prefs.graphics_presets_note": "Presets set the choices below together.",
|
||||
"prefs.history": "History",
|
||||
"prefs.hold_stop_snapping": "Hold to stop snapping",
|
||||
"prefs.icons_only": "Icons only",
|
||||
"prefs.imported_file": "Imported file",
|
||||
"prefs.input": "Input",
|
||||
"prefs.interface": "Interface",
|
||||
"prefs.interface_language": "Interface language",
|
||||
"prefs.interface_note": "How SolidCraft looks and where its parts sit.",
|
||||
"prefs.interval_minutes": "{n} min",
|
||||
"prefs.labels": "Labels",
|
||||
"prefs.layout": "Layout",
|
||||
"prefs.layout_note": "Compact docks panels to the window edges. Browser translucency is available in Floating. Change the Assistant side on the Assistant page.",
|
||||
"prefs.left": "Left",
|
||||
"prefs.left_click": "Left click",
|
||||
"prefs.live_input": "Live input",
|
||||
"prefs.live_preview": "Live preview",
|
||||
"prefs.minutes": "minutes",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "Mouse and trackpad",
|
||||
"prefs.mouse_heading": "Mouse",
|
||||
"prefs.mouse_mapping": "Mouse mapping",
|
||||
"prefs.navigation": "Navigation",
|
||||
"prefs.navigation_note": "How the mouse, trackpad and 3D mouse move the view.",
|
||||
"prefs.not_on_gpu": "not on this GPU",
|
||||
"prefs.on": "On",
|
||||
"prefs.opaque": "Opaque",
|
||||
"prefs.orbit_snap": "Hold Shift during orbit to snap to an axis.",
|
||||
"prefs.orientation": "Orientation",
|
||||
"prefs.overall_speed": "Overall speed",
|
||||
"prefs.preview_choices": "Preview of your choices",
|
||||
"prefs.quality_default": "default",
|
||||
"prefs.quality_fastest": "fastest",
|
||||
"prefs.quality_slowest": "slowest",
|
||||
"prefs.quality_smoother": "smoother",
|
||||
"prefs.reports_saved": "{n} saved",
|
||||
"prefs.right_click": "Right click",
|
||||
"prefs.saving": "Autosave and recovery",
|
||||
"prefs.scale_note": "Also Ctrl + / Ctrl − in the window. Buttons are 28 px at 100%.",
|
||||
"prefs.scale_text": "Scale and text",
|
||||
"prefs.select": "Select",
|
||||
"prefs.select_one_item": "Select one item",
|
||||
"prefs.selecting": "Selecting",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift adds only; Ctrl / Cmd toggles",
|
||||
"prefs.shift_add_note": "On: Shift adds, Ctrl / Cmd toggles. Off (default): both toggle.",
|
||||
"prefs.shortcuts": "Shortcuts",
|
||||
"prefs.sketch_selection": "Sketch & selection",
|
||||
"prefs.sketch_selection_heading": "Sketch and selection",
|
||||
"prefs.sketch_selection_note": "How sketches snap and how clicks select.",
|
||||
"prefs.sketching": "Sketching",
|
||||
"prefs.snap_drawing_note": "While drawing or dragging a sketch point.",
|
||||
"prefs.source": "Source",
|
||||
"prefs.speed": "Speed",
|
||||
"prefs.stand_up_note": "After a STEP or IGES file opens with Z up, offer a quarter turn about X.",
|
||||
"prefs.status_done": "Done",
|
||||
"prefs.status_error": "Error",
|
||||
"prefs.status_selected": "Selected",
|
||||
"prefs.status_warning": "Warning",
|
||||
"prefs.supersampling_brief": "Draws the view larger and filters it down: very crisp, and heavier.",
|
||||
"prefs.tab_accent_note": "The accent follows the active tab",
|
||||
"prefs.theme_file": "theme file",
|
||||
"prefs.timeline_half_hour": "−30 min",
|
||||
"prefs.timeline_now": "now",
|
||||
"prefs.timeline_quarter_hour": "−15",
|
||||
"prefs.toggle_item": "Add the item, or take it out again",
|
||||
"prefs.toolbar": "Toolbar",
|
||||
"prefs.translucent": "Translucent",
|
||||
"prefs.under_browser": "Under browser",
|
||||
"prefs.under_cursor": "Under cursor",
|
||||
"prefs.units_precision": "Units and precision",
|
||||
"prefs.updates": "Updates",
|
||||
"prefs.view": "View behavior",
|
||||
"prefs.viewport": "Viewport",
|
||||
"prefs.wheel": "Wheel",
|
||||
"prefs.wheel_trackpad": "Wheel and trackpad",
|
||||
"prefs.workspace": "Workspace",
|
||||
"prefs.zoom_toward_cursor": "Zoom, toward the cursor",
|
||||
"properties.title": "Properties: {name}",
|
||||
"recovery.days_ago": "{count} days ago",
|
||||
"recovery.detail": "{file} · {features} features · autosaved {when}",
|
||||
@@ -1026,8 +1357,8 @@
|
||||
"search.suggest": "Did you mean {label}?",
|
||||
"search.try": "Type a command name, a feature in this design, or a parameter. To run a command with values, type its id and a JSON object: {example}",
|
||||
"search.valid": "Valid",
|
||||
"settings.display_quality_note": "Finer levels draw curved faces and edges smoother and take longer to mesh. Only the viewport changes, never the design or exports.",
|
||||
"settings.frame_rate_note": "Shows frames per second in the view's bottom-right corner. While it is on, the view redraws continuously.",
|
||||
"settings.display_quality_note": "Only the display. Designs and exports are not affected.",
|
||||
"settings.frame_rate_note": "Shows frames per second in the view's bottom-right corner.",
|
||||
"settings.measure_axis_distances": "Show X/Y/Z distances",
|
||||
"settings.measure_axis_distances_help": "Show world-axis component dimensions alongside the total distance while Measure is open.",
|
||||
"settings.msaa_applies_on_restart": "Anti-aliasing applies the next time SolidCraft starts",
|
||||
@@ -1036,6 +1367,7 @@
|
||||
"settings.reset_intro": "These settings don't work on this computer and would keep SolidCraft from starting, so they were changed:",
|
||||
"settings.reset_title": "Settings were changed",
|
||||
"settings.supersampling_note": "Draws the view at a higher resolution and filters it down: smoother edges, lines and grid on screens below 4K. It costs GPU time: about 2.25× the pixels at 1.5× and 4× at 2×.",
|
||||
"sheet.no_body": "there is no sheet metal body: start one with Flange > Base, or turn a plate into sheet metal with Convert to Sheet Metal (pick its large flat face)",
|
||||
"shortcut.json_error": "parameters must be JSON: {error}",
|
||||
"shortcut.no_command": "no command `{id}`; the text before the JSON must be a command id",
|
||||
"shortcut.pin": "Pin to the top of the S box",
|
||||
@@ -1072,6 +1404,9 @@
|
||||
"thread.designation": "Designation",
|
||||
"thread.iso_metric": "ISO metric",
|
||||
"thread.select_size": "Select size",
|
||||
"timeline.delete_after_marker_one": "Delete 1 Feature After History Marker",
|
||||
"timeline.delete_after_marker_other": "Delete {count} Features After History Marker",
|
||||
"timeline.delete_many": "Delete {count} Selected Features",
|
||||
"timeline.group": "New Feature Folder",
|
||||
"timeline.move_many": "Move Timeline Items",
|
||||
"timeline.move_to_group": "Move Features to Folder",
|
||||
@@ -1098,6 +1433,7 @@
|
||||
"ui.agent_chat_add": "Attach files",
|
||||
"ui.agent_chat_add_file": "Choose a file…",
|
||||
"ui.agent_chat_allow": "Allow",
|
||||
"ui.agent_chat_allow_once": "Allow once",
|
||||
"ui.agent_chat_allowed": "Allowed",
|
||||
"ui.agent_chat_answered": "Answer: {option}",
|
||||
"ui.agent_chat_approval": "Allow the agent to do this?",
|
||||
@@ -1149,12 +1485,16 @@
|
||||
"ui.agent_chat_files_left_out": "At most {max} files go with one message; left out: {files}",
|
||||
"ui.agent_chat_files_loading": "Waiting for the files to be read",
|
||||
"ui.agent_chat_files_max": "At most {max} files on one message",
|
||||
"ui.agent_chat_flatpak_none_found": "No coding agent found. The Flatpak sandbox cannot see agents installed in your home folder and has no network access by default. To allow Claude Code and its ACP adapter installed through nvm or ~/.local/bin, run this command in a terminal, then restart SolidCraft. It grants access to the listed program and sign-in files, plus network access:",
|
||||
"ui.agent_chat_import_failed": "{name}: the import failed: {error}",
|
||||
"ui.agent_chat_intro": "Chat with a coding agent you already use, or a model endpoint you choose. It works on the open design through SolidCraft's tools: its changes show as it makes them and undo as one step per message. What it may do without asking is set in Preferences > AI.",
|
||||
"ui.agent_chat_key_in_env": "key set",
|
||||
"ui.agent_chat_left": "Left",
|
||||
"ui.agent_chat_limit": "The agent reached the limit of {limit} changes for one message. Send another message to let it go on.",
|
||||
"ui.agent_chat_minimize": "Minimise to a strip",
|
||||
"ui.agent_chat_mode_all": "All",
|
||||
"ui.agent_chat_mode_ask": "Ask",
|
||||
"ui.agent_chat_mode_edits": "Edits",
|
||||
"ui.agent_chat_model_tip": "The model the agent uses. Your choice is remembered for this agent.",
|
||||
"ui.agent_chat_new": "New chat",
|
||||
"ui.agent_chat_new_confirm": "Start a new chat? The current one is cleared.",
|
||||
@@ -1167,6 +1507,7 @@
|
||||
"ui.agent_chat_none_found_short": "No agent found",
|
||||
"ui.agent_chat_not_installed": "Not installed",
|
||||
"ui.agent_chat_not_signed_in": "not signed in",
|
||||
"ui.agent_chat_open_settings": "Open Preferences",
|
||||
"ui.agent_chat_own_window": "Own window",
|
||||
"ui.agent_chat_paste_picture": "Paste a picture",
|
||||
"ui.agent_chat_permission": "The agent asks to run: {title}",
|
||||
@@ -1191,6 +1532,8 @@
|
||||
"ui.agent_chat_send": "Send",
|
||||
"ui.agent_chat_send_now": "Send now",
|
||||
"ui.agent_chat_send_now_tip": "Stop the agent's current step and send this next (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft talks to a coding agent installed on this computer. Pick one in Preferences › AI.",
|
||||
"ui.agent_chat_setup_title": "Set up an assistant",
|
||||
"ui.agent_chat_side": "Agent chat side",
|
||||
"ui.agent_chat_signed_in": "signed in",
|
||||
"ui.agent_chat_state_auth": "Sign-in needed",
|
||||
@@ -1207,13 +1550,18 @@
|
||||
"ui.agent_chat_undo_label": "Agent chat: {message}",
|
||||
"ui.agent_chat_undone": "(undone)",
|
||||
"ui.agent_chat_view_attached": "View attached",
|
||||
"ui.agent_chat_waiting": "Waiting for you",
|
||||
"ui.agent_cursor": "Agent cursor",
|
||||
"ui.agent_cursor_speed": "Agent cursor speed",
|
||||
"ui.agent_off_thread": "Keep the window responsive while agents run commands",
|
||||
"ui.agent_off_thread_note": "An agent's slow commands (from the AI panel or an MCP client) compute beside the window: you can keep turning and inspecting the view, and stop one from the chip in the view. Off: each runs on the window's thread and the window waits for it.",
|
||||
"ui.ai_add": "Add",
|
||||
"ui.ai_add_agent": "Add agent…",
|
||||
"ui.ai_add_agent_title": "Add agent",
|
||||
"ui.ai_add_anthropic": "Anthropic-compatible API",
|
||||
"ui.ai_add_api": "OpenAI-compatible API",
|
||||
"ui.ai_add_custom": "Custom command",
|
||||
"ui.ai_add_endpoint": "API endpoint",
|
||||
"ui.ai_add_installed": "Installed agent",
|
||||
"ui.ai_add_installed_note": "An entry of your own for an installed agent, for example with other arguments. Installed agents are listed by themselves.",
|
||||
"ui.ai_added": "added",
|
||||
@@ -1242,6 +1590,7 @@
|
||||
"ui.ai_key_needs_https": "A key is only sent over HTTPS, or to this computer.",
|
||||
"ui.ai_key_note": "Stored in the system keychain, never in SolidCraft's settings. Leave it empty for a local server.",
|
||||
"ui.ai_keychain_error": "The system keychain refused: {error}",
|
||||
"ui.ai_kind": "Kind",
|
||||
"ui.ai_mode_all": "Allow everything",
|
||||
"ui.ai_mode_all_note": "Nothing asks first. Crash reports stay off limits and the folder limits still apply.",
|
||||
"ui.ai_mode_all_warning": "The agent can save, overwrite, export and replace your design without asking. Use this only with an agent you trust, on designs you have saved.",
|
||||
@@ -1263,6 +1612,7 @@
|
||||
"ui.ai_panel": "Panel",
|
||||
"ui.ai_permissions": "Permissions",
|
||||
"ui.ai_preset": "Preset",
|
||||
"ui.ai_protocol": "Protocol",
|
||||
"ui.ai_remove": "Remove",
|
||||
"ui.ai_request_limit": "stopped after 24 requests for one message; send another message to go on",
|
||||
"ui.ai_reset": "Reset",
|
||||
@@ -1273,6 +1623,8 @@
|
||||
"ui.ai_test": "Test",
|
||||
"ui.ai_test_acp_ok": "Answers: {agent}",
|
||||
"ui.ai_test_acp_tip": "Starts the agent briefly and asks it for a session; ends it again",
|
||||
"ui.ai_test_answered": "Reached: {model} answered",
|
||||
"ui.ai_test_anthropic_tip": "Sends a short message to the endpoint",
|
||||
"ui.ai_test_api_tip": "Asks the endpoint for its models",
|
||||
"ui.ai_test_no_model": "Reached: {count} models, but not {model}",
|
||||
"ui.ai_test_ok": "Reached: {count} models",
|
||||
@@ -1430,6 +1782,9 @@
|
||||
"ui.export_keymap_tip": "Keys, S box favourites and the toolbar, as a file",
|
||||
"ui.extend": "Extend",
|
||||
"ui.extent_type": "Extent Type",
|
||||
"ui.extract_component": "Extract to File…",
|
||||
"ui.extract_design_changed": "The design changed while choosing a file. Start Extract to File again.",
|
||||
"ui.extract_done": "The component is now its own design, linked here.",
|
||||
"ui.extrude": "Extrude",
|
||||
"ui.factor": "Factor",
|
||||
"ui.feature_history": "Feature history",
|
||||
@@ -1461,6 +1816,7 @@
|
||||
"ui.grid_follows_view_hint": "Side views show the grid on the upright plane facing them instead of the ground",
|
||||
"ui.ground_shadow": "Ground shadow",
|
||||
"ui.groupSelected": "Group Selected",
|
||||
"ui.hatch": "Hatch",
|
||||
"ui.heading_add_ins": "ADD-INS",
|
||||
"ui.heading_assemble": "ASSEMBLE",
|
||||
"ui.heading_box": "BOX",
|
||||
@@ -1534,7 +1890,19 @@
|
||||
"ui.hideOrigin": "Hide Origin",
|
||||
"ui.hidePlanes": "Hide Planes",
|
||||
"ui.hideProfile": "Hide Profile",
|
||||
"ui.history_back": "Go back one step",
|
||||
"ui.history_below_browser": "Below browser",
|
||||
"ui.history_edge_hint": "double-click the edge",
|
||||
"ui.history_first": "Go to beginning",
|
||||
"ui.history_forward": "Go forward one step",
|
||||
"ui.history_hide_names": "Hide names",
|
||||
"ui.history_last": "Go to end",
|
||||
"ui.history_marker_tip": "History marker: drag to roll the model back; new features go here",
|
||||
"ui.history_names": "Names",
|
||||
"ui.history_play": "Play to the end",
|
||||
"ui.history_show_names": "Show names",
|
||||
"ui.history_title": "History",
|
||||
"ui.history_toggle_names": "Show or hide feature names",
|
||||
"ui.hole": "Hole",
|
||||
"ui.hole_tap_type": "Hole Tap Type",
|
||||
"ui.hole_type": "Hole Type",
|
||||
@@ -1551,9 +1919,15 @@
|
||||
"ui.joints": "Joints",
|
||||
"ui.keyboard_shortcuts": "Keyboard Shortcuts",
|
||||
"ui.language": "Language",
|
||||
"ui.layout_compact": "Compact",
|
||||
"ui.layout_floating": "Floating",
|
||||
"ui.length_decimals": "Length decimals",
|
||||
"ui.light": "Light",
|
||||
"ui.line": "Line",
|
||||
"ui.link_copies": "Link Identical Copies",
|
||||
"ui.link_copies_keep": "Keep",
|
||||
"ui.link_copies_link": "Link",
|
||||
"ui.link_copies_text": "These components build the same bodies as {name}. Make them placements of its link?",
|
||||
"ui.lock": "Lock",
|
||||
"ui.loft": "Loft",
|
||||
"ui.look_at": "Look At",
|
||||
@@ -1677,6 +2051,7 @@
|
||||
"ui.render": "Render",
|
||||
"ui.renderer": "Renderer",
|
||||
"ui.repeat": "Repeat",
|
||||
"ui.replace_with_link_done": "The copies are now placements of the linked design.",
|
||||
"ui.report_a_bug": "Report a bug",
|
||||
"ui.reset": "Reset",
|
||||
"ui.reset_all": "Reset All",
|
||||
@@ -1688,6 +2063,7 @@
|
||||
"ui.reverse_zoom_direction": "Reverse zoom direction",
|
||||
"ui.revolve": "Revolve",
|
||||
"ui.ribbon_exit": "Exit",
|
||||
"ui.ribbon_labels": "Show text under ribbon icons",
|
||||
"ui.ribbon_pin_footer": "Pinned commands show on the ribbon. Hover a row to pin or unpin it.",
|
||||
"ui.ribbon_workspace": "Workspace",
|
||||
"ui.right": "Right",
|
||||
@@ -1743,6 +2119,7 @@
|
||||
"ui.smooth_wheel_zoom": "Smooth wheel zoom",
|
||||
"ui.smooth_wheel_zoom_tip": "Turn off to apply each wheel event immediately, without a smoothing tail",
|
||||
"ui.snap": "Snap",
|
||||
"ui.space_mouse_axes_reassigned": "Axes are reassigned in Preferences, and that still applies on top of this calibration.",
|
||||
"ui.space_mouse_calibrate": "Calibrate…",
|
||||
"ui.space_mouse_calibrate_tip": "Move the cap as the window asks, so SolidCraft learns which way each axis of this 3D mouse goes and how far. Saved for this 3D mouse.",
|
||||
"ui.space_mouse_calibrate_title": "Calibrate 3D mouse",
|
||||
@@ -1752,12 +2129,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "One axis barely moved, so it can't be calibrated. Start over and move the cap further each time.",
|
||||
"ui.space_mouse_dead_zone": "Dead zone",
|
||||
"ui.space_mouse_dead_zone_tip": "How far the cap has to move before the view does, as a share of its full travel. Raise it if the view drifts while the cap is at rest.",
|
||||
"ui.space_mouse_driven_by": "Which calibrated motion of the device drives this axis. Picking a motion another axis already uses swaps the two.",
|
||||
"ui.space_mouse_driven_by_label": "driven by",
|
||||
"ui.space_mouse_driver": "3D mouse driver",
|
||||
"ui.space_mouse_driver_auto": "Automatic",
|
||||
"ui.space_mouse_driver_direct": "Direct (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Reading the device directly; spacenavd is not running",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Reading through spacenavd, the only way available",
|
||||
"ui.space_mouse_forget": "Forget calibration",
|
||||
"ui.space_mouse_hint": "Move and rotate the view together; sketches use pan and zoom only.",
|
||||
"ui.space_mouse_motion_rotation_x": "Rotation X",
|
||||
"ui.space_mouse_motion_rotation_y": "Rotation Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Rotation Z",
|
||||
"ui.space_mouse_motion_translation_x": "Translation X",
|
||||
"ui.space_mouse_motion_translation_y": "Translation Y",
|
||||
"ui.space_mouse_motion_translation_z": "Translation Z",
|
||||
"ui.space_mouse_navigate": "Navigate with SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "No 3D mouse found",
|
||||
"ui.space_mouse_not_calibrated": "Not calibrated",
|
||||
"ui.space_mouse_reading": "Reading",
|
||||
"ui.space_mouse_reset_axes": "Reset axis assignment",
|
||||
"ui.space_mouse_step_lift": "Lift the cap up, hold it, then let go.",
|
||||
"ui.space_mouse_step_press": "Press the cap down, hold it, then let go.",
|
||||
"ui.space_mouse_step_pull": "Pull the cap toward you, hold it, then let go.",
|
||||
@@ -1771,6 +2162,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Tilt the cap right (right edge down), hold it, then let go.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Twist the cap clockwise, hold it, then let go.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Twist the cap anticlockwise, hold it, then let go.",
|
||||
"ui.space_mouse_view_axis": "View axis",
|
||||
"ui.space_mouse_view_off": "Off",
|
||||
"ui.space_mouse_view_off_tip": "The 3D mouse driver's profile turns this axis off, so its motion doesn't move the view. Picking another axis's motion here swaps the two, and that motion stops moving the view.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Orbit left / right",
|
||||
"ui.space_mouse_view_orbit_up_down": "Orbit up / down",
|
||||
"ui.space_mouse_view_pan_sideways": "Pan left / right",
|
||||
"ui.space_mouse_view_pan_up_down": "Pan up / down",
|
||||
"ui.space_mouse_view_roll": "Roll",
|
||||
"ui.space_mouse_view_unmapped": "Axis {n}",
|
||||
"ui.space_mouse_view_zoom": "Zoom",
|
||||
"ui.spacing": "Spacing",
|
||||
"ui.spacing_2": "Spacing 2",
|
||||
"ui.sphere": "Sphere",
|
||||
@@ -1804,7 +2205,7 @@
|
||||
"ui.tie_ends": "Tie",
|
||||
"ui.tie_ends_tip": "Constrain all untied ends",
|
||||
"ui.timeline_bottom": "Bottom timeline",
|
||||
"ui.timeline_left_note": "The left layout shows the rollback bar above the parts and scene browser.",
|
||||
"ui.timeline_left_note": "The vertical history sits to the left of the browser. Toggle feature names on the strip.",
|
||||
"ui.timeline_left_sidebar": "Left sidebar",
|
||||
"ui.tip_angle": "Tip Angle",
|
||||
"ui.to_object": "To Object",
|
||||
@@ -1842,6 +2243,7 @@
|
||||
"ui.workspace_design_tabs": "Model · Surface · Assemble · Insert · Inspect · Manage · View",
|
||||
"ui.workspace_drawing_description": "2D drawings with views, dimensions and title blocks",
|
||||
"ui.workspace_footer": "Every workspace works on the same design, history and selection; only the ribbon tabs change. The switcher is locked while a sketch or feature is being edited.",
|
||||
"ui.workspace_layout": "Workspace layout",
|
||||
"ui.workspace_manufacture_description": "Slicing, toolpaths and setup",
|
||||
"ui.workspace_planned": "Planned",
|
||||
"ui.workspace_render_description": "Product preview, scene settings and rendered images",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "HISTORIAL",
|
||||
"Height": "Altura",
|
||||
"Hidden edges": "Aristas ocultas",
|
||||
"History layout": "Disposición del historial",
|
||||
"Holes": "Agujeros",
|
||||
"Holes (edges on them)": "Agujeros (aristas que contienen)",
|
||||
"Home view": "Vista de inicio",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "No hay informes de fallos.",
|
||||
"No matching appearance presets.": "No hay preajustes de apariencia coincidentes.",
|
||||
"No matching appearances": "No hay apariencias coincidentes",
|
||||
"No visible bodies to export.": "No hay cuerpos visibles para exportar.",
|
||||
"No visible bodies or sketches to export.": "No hay cuerpos ni bocetos visibles para exportar.",
|
||||
"None": "Ninguno",
|
||||
"Not available yet": "Todavía no disponible",
|
||||
"Notch": "Muesca",
|
||||
@@ -831,7 +832,7 @@
|
||||
"dxf.progress.projection": "Proyectando geometría (3/5)",
|
||||
"dxf.progress.write": "Escribiendo DXF (5/5)",
|
||||
"dxf.tolerance": "Tolerancia de curva",
|
||||
"dxf.tolerance_help": "Solo cuerpos visibles. Las curvas usan segmentos rectos. Una tolerancia menor da curvas más finas y consume más tiempo y memoria.",
|
||||
"dxf.tolerance_help": "Solo cuerpos visibles y bocetos mostrados. Las curvas usan segmentos rectos. Una tolerancia menor da curvas más finas y consume más tiempo y memoria.",
|
||||
"file_load.built": "Construido hasta ahora: {built} de {total} operaciones.",
|
||||
"file_load.converting": "Convirtiendo sólido {done} de {total}",
|
||||
"file_load.inserting": "Insertando geometría",
|
||||
@@ -856,19 +857,57 @@
|
||||
"help.mit": "Licencia MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Licencias de terceros",
|
||||
"home.back": "Volver a {name}",
|
||||
"home.crashes": "Informes de fallos",
|
||||
"home.design_workspace": "Diseño",
|
||||
"home.documentation": "Documentación",
|
||||
"home.export": "Exportar",
|
||||
"home.export_hint": "Elige un formato para el diseño actual.",
|
||||
"home.export_json_hint": "Diseño editable e historial de comandos",
|
||||
"home.export_mesh_hint": "Malla para imprimir o compartir",
|
||||
"home.export_step_hint": "Geometría sólida precisa",
|
||||
"home.import": "Importar…",
|
||||
"home.import_hint": "STEP, IGES o malla en un nuevo diseño",
|
||||
"home.in_this_browser": "en este navegador",
|
||||
"home.missing": "no disponible",
|
||||
"home.month_01": "ene",
|
||||
"home.month_02": "feb",
|
||||
"home.month_03": "mar",
|
||||
"home.month_04": "abr",
|
||||
"home.month_05": "may",
|
||||
"home.month_06": "jun",
|
||||
"home.month_07": "jul",
|
||||
"home.month_08": "ago",
|
||||
"home.month_09": "sept",
|
||||
"home.month_10": "oct",
|
||||
"home.month_11": "nov",
|
||||
"home.month_12": "dic",
|
||||
"home.new_inches": "Nuevo diseño en pulgadas",
|
||||
"home.new_inches_hint": "Pulgadas · se abre en Diseño",
|
||||
"home.new_mm": "Nuevo diseño",
|
||||
"home.new_mm_hint": "Milímetros · se abre en Diseño",
|
||||
"home.open": "Abrir…",
|
||||
"home.opened_days_ago": "Abierto hace {count} días",
|
||||
"home.opened_hours_ago": "Abierto hace {count} h",
|
||||
"home.opened_just_now": "Acaba de abrirse",
|
||||
"home.opened_minutes_ago": "Abierto hace {count} min",
|
||||
"home.open_hint": "Un diseño .solidcraft ({shortcut})",
|
||||
"home.open_now": "Abrir ahora",
|
||||
"home.opened_days_ago": "Hace {count} días",
|
||||
"home.opened_hours_ago": "Hace {count} h",
|
||||
"home.opened_just_now": "Ahora mismo",
|
||||
"home.opened_minutes_ago": "Hace {count} min",
|
||||
"home.opening": "abriendo…",
|
||||
"home.properties": "Propiedades del diseño",
|
||||
"home.recent": "Recientes",
|
||||
"home.recent_empty": "Los diseños que abras o guardes aparecerán aquí.",
|
||||
"home.recovery_count": "Diseños recuperables: {count}",
|
||||
"home.recovery_empty": "No hay diseños recuperables.",
|
||||
"home.recovery_hint": "SolidCraft se cerró antes de guardar estos diseños.",
|
||||
"home.report_issue": "Notificar un problema",
|
||||
"home.samples": "Ejemplos",
|
||||
"home.settings": "Configuración",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Atajos de teclado",
|
||||
"home.start_hint": "Crea un diseño, abre un archivo reciente o explora un ejemplo.",
|
||||
"home.whats_new": "Novedades",
|
||||
"home.yesterday": "Ayer",
|
||||
"install.button_tip": "Instalar SolidCraft como aplicación: se abre en una ventana propia y funciona sin conexión",
|
||||
"install.dock_1": "Elige Archivo › Añadir al Dock.",
|
||||
"install.dock_2": "Haz clic en Añadir.",
|
||||
@@ -1021,7 +1060,7 @@
|
||||
"search.try": "Escribe el nombre de un comando, una operación de este diseño o un parámetro. Para ejecutar un comando con valores, escribe su id y un objeto JSON: {example}",
|
||||
"search.valid": "Válido",
|
||||
"settings.display_quality_note": "Los niveles más finos muestran las caras y aristas curvas con mayor suavidad, pero tardan más en generar la malla. Solo cambia el visor, nunca el diseño ni las exportaciones.",
|
||||
"settings.frame_rate_note": "Muestra los fotogramas por segundo en la esquina inferior derecha de la vista. Mientras esté activado, la vista se redibuja continuamente.",
|
||||
"settings.frame_rate_note": "Muestra los fotogramas por segundo en la esquina inferior derecha de la vista.",
|
||||
"settings.measure_axis_distances": "Mostrar distancias X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Mostrar las cotas de cada eje global junto a la distancia total mientras está abierta la herramienta Medir.",
|
||||
"settings.msaa_applies_on_restart": "El suavizado de bordes se aplicará la próxima vez que se inicie SolidCraft",
|
||||
@@ -1092,6 +1131,7 @@
|
||||
"ui.agent_chat_add": "Adjuntar archivos",
|
||||
"ui.agent_chat_add_file": "Elegir un archivo…",
|
||||
"ui.agent_chat_allow": "Permitir",
|
||||
"ui.agent_chat_allow_once": "Permitir una vez",
|
||||
"ui.agent_chat_allowed": "Permitido",
|
||||
"ui.agent_chat_answered": "Respuesta: {option}",
|
||||
"ui.agent_chat_approval": "¿Permitir que el agente haga esto?",
|
||||
@@ -1143,12 +1183,16 @@
|
||||
"ui.agent_chat_files_left_out": "Se pueden enviar como máximo {max} archivos con un mensaje; omitidos: {files}",
|
||||
"ui.agent_chat_files_loading": "Esperando a que se lean los archivos",
|
||||
"ui.agent_chat_files_max": "Como máximo {max} archivos por mensaje",
|
||||
"ui.agent_chat_flatpak_none_found": "No se ha encontrado ningún agente de programación. De forma predeterminada, el entorno aislado de Flatpak no ve los agentes instalados en tu carpeta personal y no tiene acceso a la red. Para permitir Claude Code y su adaptador ACP instalados con nvm o en ~/.local/bin, ejecuta este comando en un terminal y reinicia SolidCraft. Concede acceso a los programas y archivos de inicio de sesión indicados, además de acceso a la red:",
|
||||
"ui.agent_chat_import_failed": "{name}: la importación falló: {error}",
|
||||
"ui.agent_chat_intro": "Habla con un agente de programación que ya utilices o con un servicio de modelos que elijas. Trabaja sobre el diseño abierto mediante las herramientas de SolidCraft: sus cambios se muestran al realizarlos y pueden deshacerse de una vez por mensaje. Lo que puede hacer sin preguntar se configura en Preferencias > IA.",
|
||||
"ui.agent_chat_key_in_env": "clave configurada",
|
||||
"ui.agent_chat_left": "Izquierda",
|
||||
"ui.agent_chat_limit": "El agente ha alcanzado el límite de {limit} cambios por mensaje. Envía otro mensaje para que continúe.",
|
||||
"ui.agent_chat_minimize": "Minimizar a una franja",
|
||||
"ui.agent_chat_mode_all": "Todo",
|
||||
"ui.agent_chat_mode_ask": "Preguntar",
|
||||
"ui.agent_chat_mode_edits": "Ediciones",
|
||||
"ui.agent_chat_model_tip": "Modelo que utiliza el agente. Se recuerda tu elección para este agente.",
|
||||
"ui.agent_chat_new": "Nuevo chat",
|
||||
"ui.agent_chat_new_confirm": "¿Iniciar un nuevo chat? Se borrará la conversación actual.",
|
||||
@@ -1161,6 +1205,7 @@
|
||||
"ui.agent_chat_none_found_short": "No se ha encontrado ningún agente",
|
||||
"ui.agent_chat_not_installed": "No instalado",
|
||||
"ui.agent_chat_not_signed_in": "sesión no iniciada",
|
||||
"ui.agent_chat_open_settings": "Abrir preferencias",
|
||||
"ui.agent_chat_own_window": "Ventana propia",
|
||||
"ui.agent_chat_paste_picture": "Pegar una imagen",
|
||||
"ui.agent_chat_permission": "El agente solicita ejecutar: {title}",
|
||||
@@ -1185,6 +1230,8 @@
|
||||
"ui.agent_chat_send": "Enviar",
|
||||
"ui.agent_chat_send_now": "Enviar ahora",
|
||||
"ui.agent_chat_send_now_tip": "Detener el paso actual del agente y enviar esto a continuación (Ctrl+Intro)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft se comunica con un agente de programación instalado en este equipo. Elige uno en Preferencias › AI.",
|
||||
"ui.agent_chat_setup_title": "Configurar un asistente",
|
||||
"ui.agent_chat_side": "Lado del chat del agente",
|
||||
"ui.agent_chat_signed_in": "sesión iniciada",
|
||||
"ui.agent_chat_state_auth": "Se requiere iniciar sesión",
|
||||
@@ -1201,6 +1248,7 @@
|
||||
"ui.agent_chat_undo_label": "Chat del agente: {message}",
|
||||
"ui.agent_chat_undone": "(deshecho)",
|
||||
"ui.agent_chat_view_attached": "Vista adjunta",
|
||||
"ui.agent_chat_waiting": "Esperando tu respuesta",
|
||||
"ui.agent_cursor": "Cursor del agente",
|
||||
"ui.agent_cursor_speed": "Velocidad del cursor del agente",
|
||||
"ui.ai_add": "Añadir",
|
||||
@@ -1455,6 +1503,7 @@
|
||||
"ui.grid_follows_view_hint": "Las vistas laterales muestran la cuadrícula en el plano vertical que tienen enfrente, en lugar del suelo",
|
||||
"ui.ground_shadow": "Sombra en el suelo",
|
||||
"ui.groupSelected": "Agrupar selección",
|
||||
"ui.hatch": "Rayado",
|
||||
"ui.heading_add_ins": "COMPLEMENTOS",
|
||||
"ui.heading_assemble": "ENSAMBLAR",
|
||||
"ui.heading_box": "CAJA",
|
||||
@@ -1528,6 +1577,11 @@
|
||||
"ui.hideOrigin": "Ocultar origen",
|
||||
"ui.hidePlanes": "Ocultar planos",
|
||||
"ui.hideProfile": "Ocultar perfil",
|
||||
"ui.history_back": "Retroceder un paso",
|
||||
"ui.history_below_browser": "Debajo del explorador",
|
||||
"ui.history_first": "Ir al principio",
|
||||
"ui.history_forward": "Avanzar un paso",
|
||||
"ui.history_last": "Ir al final",
|
||||
"ui.history_title": "Historial",
|
||||
"ui.hole": "Agujero",
|
||||
"ui.hole_tap_type": "Tipo de roscado del agujero",
|
||||
@@ -1545,6 +1599,8 @@
|
||||
"ui.joints": "Uniones",
|
||||
"ui.keyboard_shortcuts": "Atajos de teclado",
|
||||
"ui.language": "Idioma",
|
||||
"ui.layout_compact": "Compacta",
|
||||
"ui.layout_floating": "Flotante",
|
||||
"ui.length_decimals": "Decimales de longitud",
|
||||
"ui.light": "Claro",
|
||||
"ui.line": "Línea",
|
||||
@@ -1682,6 +1738,7 @@
|
||||
"ui.reverse_zoom_direction": "Invertir dirección del zoom",
|
||||
"ui.revolve": "Revolución",
|
||||
"ui.ribbon_exit": "Salir",
|
||||
"ui.ribbon_labels": "Mostrar texto bajo los iconos de la cinta",
|
||||
"ui.ribbon_pin_footer": "Los comandos anclados se muestran en la cinta. Pasa el ratón sobre una fila para anclarla o desanclarla.",
|
||||
"ui.ribbon_workspace": "Espacio de trabajo",
|
||||
"ui.right": "Derecha",
|
||||
@@ -1737,6 +1794,7 @@
|
||||
"ui.smooth_wheel_zoom": "Zoom suave con la rueda",
|
||||
"ui.smooth_wheel_zoom_tip": "Desactívalo para aplicar cada movimiento de la rueda inmediatamente, sin suavizado posterior",
|
||||
"ui.snap": "Referencia a objetos",
|
||||
"ui.space_mouse_axes_reassigned": "Los ejes están reasignados en Preferencias, y eso sigue aplicándose sobre esta calibración.",
|
||||
"ui.space_mouse_calibrate": "Calibrar…",
|
||||
"ui.space_mouse_calibrate_tip": "Mueve el capuchón como pide la ventana para que SolidCraft aprenda hacia dónde y hasta dónde va cada eje de este ratón 3D. Se guarda para este ratón 3D.",
|
||||
"ui.space_mouse_calibrate_title": "Calibrar ratón 3D",
|
||||
@@ -1746,12 +1804,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Un eje apenas se movió, así que no se puede calibrar. Vuelve a empezar y mueve el capuchón más lejos cada vez.",
|
||||
"ui.space_mouse_dead_zone": "Zona muerta",
|
||||
"ui.space_mouse_dead_zone_tip": "Cuánto tiene que moverse el capuchón antes de que se mueva la vista, como parte de su recorrido completo. Auméntala si la vista se desplaza con el capuchón en reposo.",
|
||||
"ui.space_mouse_driven_by": "Qué movimiento calibrado del dispositivo controla este eje. Si eliges uno que ya usa otro eje, se intercambian.",
|
||||
"ui.space_mouse_driven_by_label": "controlado por",
|
||||
"ui.space_mouse_driver": "Controlador del ratón 3D",
|
||||
"ui.space_mouse_driver_auto": "Automático",
|
||||
"ui.space_mouse_driver_direct": "Directo (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Lectura directa del dispositivo; spacenavd no se está ejecutando",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Lectura mediante spacenavd, la única opción disponible",
|
||||
"ui.space_mouse_forget": "Olvidar calibración",
|
||||
"ui.space_mouse_hint": "Desplaza y gira la vista a la vez; los bocetos solo permiten desplazamiento y zoom.",
|
||||
"ui.space_mouse_motion_rotation_x": "Rotación X",
|
||||
"ui.space_mouse_motion_rotation_y": "Rotación Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Rotación Z",
|
||||
"ui.space_mouse_motion_translation_x": "Traslación X",
|
||||
"ui.space_mouse_motion_translation_y": "Traslación Y",
|
||||
"ui.space_mouse_motion_translation_z": "Traslación Z",
|
||||
"ui.space_mouse_navigate": "Navegar con SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "No se encontró ningún ratón 3D",
|
||||
"ui.space_mouse_not_calibrated": "Sin calibrar",
|
||||
"ui.space_mouse_reading": "Lectura",
|
||||
"ui.space_mouse_reset_axes": "Restablecer asignación de ejes",
|
||||
"ui.space_mouse_step_lift": "Levanta el capuchón, mantenlo y suéltalo.",
|
||||
"ui.space_mouse_step_press": "Presiona el capuchón hacia abajo, mantenlo y suéltalo.",
|
||||
"ui.space_mouse_step_pull": "Tira del capuchón hacia ti, mantenlo y suéltalo.",
|
||||
@@ -1765,6 +1837,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Inclina el capuchón a la derecha (borde derecho abajo), mantenlo y suéltalo.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Gira el capuchón en sentido horario, mantenlo y suéltalo.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Gira el capuchón en sentido antihorario, mantenlo y suéltalo.",
|
||||
"ui.space_mouse_view_axis": "Eje de la vista",
|
||||
"ui.space_mouse_view_off": "Desactivado",
|
||||
"ui.space_mouse_view_off_tip": "El perfil del controlador del ratón 3D desactiva este eje, así que su movimiento no mueve la vista. Si eliges aquí el movimiento de otro eje, se intercambian y ese movimiento deja de mover la vista.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Orbitar izquierda / derecha",
|
||||
"ui.space_mouse_view_orbit_up_down": "Orbitar arriba / abajo",
|
||||
"ui.space_mouse_view_pan_sideways": "Desplazar izquierda / derecha",
|
||||
"ui.space_mouse_view_pan_up_down": "Desplazar arriba / abajo",
|
||||
"ui.space_mouse_view_roll": "Girar sobre la vista",
|
||||
"ui.space_mouse_view_unmapped": "Eje {n}",
|
||||
"ui.space_mouse_view_zoom": "Zoom",
|
||||
"ui.spacing": "Espaciado",
|
||||
"ui.spacing_2": "Espaciado 2",
|
||||
"ui.sphere": "Esfera",
|
||||
@@ -1836,6 +1918,7 @@
|
||||
"ui.workspace_design_tabs": "Modelo · Superficie · Ensamblaje · Insertar · Inspeccionar · Gestionar · Vista",
|
||||
"ui.workspace_drawing_description": "Dibujos 2D con vistas, cotas y cajetines",
|
||||
"ui.workspace_footer": "Todos los espacios de trabajo usan el mismo diseño, historial y selección; solo cambian las pestañas de la cinta. El selector está bloqueado mientras se edita un boceto o una operación.",
|
||||
"ui.workspace_layout": "Disposición del espacio de trabajo",
|
||||
"ui.workspace_manufacture_description": "Laminado, trayectorias de herramienta y configuración",
|
||||
"ui.workspace_planned": "Previsto",
|
||||
"ui.workspace_render_description": "Vista previa del producto, ajustes de escena e imágenes renderizadas",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "HISTORIQUE",
|
||||
"Height": "Hauteur",
|
||||
"Hidden edges": "Arêtes cachées",
|
||||
"History layout": "Disposition de l’historique",
|
||||
"Holes": "Trous",
|
||||
"Holes (edges on them)": "Trous (par leurs arêtes)",
|
||||
"Home view": "Vue d'accueil",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "Aucun rapport de plantage.",
|
||||
"No matching appearance presets.": "Aucun préréglage d’apparence correspondant.",
|
||||
"No matching appearances": "Aucune apparence correspondante",
|
||||
"No visible bodies to export.": "Aucun corps visible à exporter.",
|
||||
"No visible bodies or sketches to export.": "Aucun corps ni esquisse visible à exporter.",
|
||||
"None": "Aucun",
|
||||
"Not available yet": "Pas encore disponible",
|
||||
"Notch": "Encoche",
|
||||
@@ -831,7 +832,7 @@
|
||||
"dxf.progress.projection": "Projection de la géométrie (3/5)",
|
||||
"dxf.progress.write": "Écriture du DXF (5/5)",
|
||||
"dxf.tolerance": "Tolérance des courbes",
|
||||
"dxf.tolerance_help": "Corps visibles uniquement. Les courbes sont approchées par des segments de droite. Une tolérance plus faible donne des courbes plus fines, au prix de plus de temps et de mémoire.",
|
||||
"dxf.tolerance_help": "Corps visibles et esquisses affichées uniquement. Les courbes sont approchées par des segments de droite. Une tolérance plus faible donne des courbes plus fines, au prix de plus de temps et de mémoire.",
|
||||
"file_load.built": "Construit jusqu’ici : {built} entités sur {total}.",
|
||||
"file_load.converting": "Conversion du solide {done} sur {total}",
|
||||
"file_load.inserting": "Insertion de la géométrie",
|
||||
@@ -862,19 +863,57 @@
|
||||
"help.solid.revolve": "Fait tourner le profil d'une esquisse autour d'un axe pour obtenir un solide de révolution. À utiliser pour les arbres, boutons, bols et toute pièce ronde autour d'une ligne centrale.",
|
||||
"help.solid.shell": "Évide un solide en laissant des parois de l'épaisseur indiquée, et peut ouvrir les faces choisies. À utiliser pour les boîtes, couvercles et autres pièces à parois minces.",
|
||||
"help.third_party": "Licences tierces",
|
||||
"home.back": "Revenir à {name}",
|
||||
"home.crashes": "Rapports de plantage",
|
||||
"home.design_workspace": "Conception",
|
||||
"home.documentation": "Documentation",
|
||||
"home.export": "Exporter",
|
||||
"home.export_hint": "Choisissez un format pour la conception actuelle.",
|
||||
"home.export_json_hint": "Conception modifiable et historique des commandes",
|
||||
"home.export_mesh_hint": "Maillage pour l’impression ou le partage",
|
||||
"home.export_step_hint": "Géométrie solide précise",
|
||||
"home.import": "Importer…",
|
||||
"home.import_hint": "STEP, IGES ou maillage dans une nouvelle conception",
|
||||
"home.in_this_browser": "dans ce navigateur",
|
||||
"home.missing": "introuvable",
|
||||
"home.month_01": "janv.",
|
||||
"home.month_02": "févr.",
|
||||
"home.month_03": "mars",
|
||||
"home.month_04": "avr.",
|
||||
"home.month_05": "mai",
|
||||
"home.month_06": "juin",
|
||||
"home.month_07": "juil.",
|
||||
"home.month_08": "août",
|
||||
"home.month_09": "sept.",
|
||||
"home.month_10": "oct.",
|
||||
"home.month_11": "nov.",
|
||||
"home.month_12": "déc.",
|
||||
"home.new_inches": "Nouvelle conception en pouces",
|
||||
"home.new_inches_hint": "Pouces · ouvre l’espace Conception",
|
||||
"home.new_mm": "Nouvelle conception",
|
||||
"home.new_mm_hint": "Millimètres · ouvre l’espace Conception",
|
||||
"home.open": "Ouvrir…",
|
||||
"home.opened_days_ago": "Ouvert il y a {count} j",
|
||||
"home.opened_hours_ago": "Ouvert il y a {count} h",
|
||||
"home.opened_just_now": "Ouvert à l'instant",
|
||||
"home.opened_minutes_ago": "Ouvert il y a {count} min",
|
||||
"home.open_hint": "Une conception .solidcraft ({shortcut})",
|
||||
"home.open_now": "Ouvrir maintenant",
|
||||
"home.opened_days_ago": "Il y a {count} j",
|
||||
"home.opened_hours_ago": "Il y a {count} h",
|
||||
"home.opened_just_now": "À l’instant",
|
||||
"home.opened_minutes_ago": "Il y a {count} min",
|
||||
"home.opening": "ouverture…",
|
||||
"home.properties": "Propriétés de la conception",
|
||||
"home.recent": "Récents",
|
||||
"home.recent_empty": "Les conceptions que vous ouvrez ou enregistrez apparaissent ici.",
|
||||
"home.recovery_count": "Conceptions récupérables : {count}",
|
||||
"home.recovery_empty": "Aucune conception récupérable.",
|
||||
"home.recovery_hint": "SolidCraft s’est fermé avant l’enregistrement de ces conceptions.",
|
||||
"home.report_issue": "Signaler un problème",
|
||||
"home.samples": "Exemples",
|
||||
"home.settings": "Paramètres",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Raccourcis clavier",
|
||||
"home.start_hint": "Créez une conception, ouvrez un fichier récent ou explorez un exemple.",
|
||||
"home.whats_new": "Nouveautés",
|
||||
"home.yesterday": "Hier",
|
||||
"install.button_tip": "Installer SolidCraft comme une app : il s'ouvre dans sa propre fenêtre et fonctionne hors ligne",
|
||||
"install.dock_1": "Choisissez Fichier › Ajouter au Dock.",
|
||||
"install.dock_2": "Cliquez sur Ajouter.",
|
||||
@@ -1005,13 +1044,13 @@
|
||||
"sample.bracket.name": "Équerre en tôle",
|
||||
"sample.enclosure.about": "Boîte en coque avec lèvre, bossages de vis, appui et clip",
|
||||
"sample.enclosure.name": "Boîtier plastique",
|
||||
"sample.flange.about": "Moyeu et bride avec un réseau circulaire piloté par un paramètre",
|
||||
"sample.flange.about": "Moyeu et bride avec une répétition circulaire pilotée par un paramètre",
|
||||
"sample.flange.name": "Bride boulonnée",
|
||||
"sample.hinge.about": "Deux composants et une liaison pivot, entraînée à 60°",
|
||||
"sample.hinge.name": "Assemblage de charnière",
|
||||
"sample.plate.about": "Plaque paramétrique avec congés, perçages et un bossage alésé",
|
||||
"sample.plate.name": "Plaque d'exemple",
|
||||
"sample.vents.about": "Rainures en réseau rectangulaire : lignes, colonnes et pas sont des paramètres",
|
||||
"sample.vents.about": "Rainures en répétition rectangulaire : lignes, colonnes et pas sont des paramètres",
|
||||
"sample.vents.name": "Plaque d'aération",
|
||||
"search.command_keys": "Entrée exécuter Maj+Entrée exécuter et garder ouvert Échap fermer",
|
||||
"search.commands": "Commandes",
|
||||
@@ -1027,7 +1066,7 @@
|
||||
"search.try": "Saisissez un nom de commande, une entité de cette conception ou un paramètre. Pour exécuter une commande avec des valeurs, saisissez son id et un objet JSON : {example}",
|
||||
"search.valid": "Valide",
|
||||
"settings.display_quality_note": "Les niveaux plus fins affichent plus lisses les faces et arêtes courbes, mais leur maillage prend plus de temps. Seule la vue change, jamais la conception ni les exports.",
|
||||
"settings.frame_rate_note": "Affiche les images par seconde dans le coin inférieur droit de la vue. Tant qu'elle est activée, la vue est redessinée en continu.",
|
||||
"settings.frame_rate_note": "Affiche les images par seconde dans le coin inférieur droit de la vue.",
|
||||
"settings.measure_axis_distances": "Afficher les cotes X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Afficher les cotes suivant les axes du repère global en plus de la distance totale pendant la mesure.",
|
||||
"settings.msaa_applies_on_restart": "L'anticrénelage s'appliquera au prochain démarrage de SolidCraft",
|
||||
@@ -1098,6 +1137,7 @@
|
||||
"ui.agent_chat_add": "Joindre des fichiers",
|
||||
"ui.agent_chat_add_file": "Choisir un fichier…",
|
||||
"ui.agent_chat_allow": "Autoriser",
|
||||
"ui.agent_chat_allow_once": "Autoriser une fois",
|
||||
"ui.agent_chat_allowed": "Autorisé",
|
||||
"ui.agent_chat_answered": "Réponse : {option}",
|
||||
"ui.agent_chat_approval": "Autoriser l'agent à effectuer cette action ?",
|
||||
@@ -1149,12 +1189,16 @@
|
||||
"ui.agent_chat_files_left_out": "Un message ne peut contenir que {max} fichiers au plus ; non joints : {files}",
|
||||
"ui.agent_chat_files_loading": "Lecture des fichiers en cours",
|
||||
"ui.agent_chat_files_max": "{max} fichiers au plus par message",
|
||||
"ui.agent_chat_flatpak_none_found": "Aucun agent de programmation trouvé. Par défaut, le bac à sable Flatpak ne voit pas les agents installés dans votre dossier personnel et n’a pas accès au réseau. Pour autoriser Claude Code et son adaptateur ACP installés avec nvm ou dans ~/.local/bin, exécuter cette commande dans un terminal, puis redémarrer SolidCraft. Elle donne accès aux programmes et fichiers de connexion indiqués, ainsi qu’au réseau :",
|
||||
"ui.agent_chat_import_failed": "{name} : l'importation a échoué : {error}",
|
||||
"ui.agent_chat_intro": "Discuter avec un agent de programmation que vous utilisez déjà, ou avec un point d'accès de modèle de votre choix. Il travaille sur la conception ouverte avec les outils de SolidCraft : ses modifications apparaissent au fur et à mesure et s'annulent en une seule étape par message. Ce qu'il peut faire sans demander se règle dans Préférences › IA.",
|
||||
"ui.agent_chat_key_in_env": "clé définie",
|
||||
"ui.agent_chat_left": "Gauche",
|
||||
"ui.agent_chat_limit": "L'agent a atteint la limite de {limit} modifications pour un message. Envoyez un autre message pour qu'il poursuive.",
|
||||
"ui.agent_chat_minimize": "Réduire en bandeau",
|
||||
"ui.agent_chat_mode_all": "Tout",
|
||||
"ui.agent_chat_mode_ask": "Demander",
|
||||
"ui.agent_chat_mode_edits": "Édition",
|
||||
"ui.agent_chat_model_tip": "Le modèle utilisé par l'agent. Votre choix est mémorisé pour cet agent.",
|
||||
"ui.agent_chat_new": "Nouveau chat",
|
||||
"ui.agent_chat_new_confirm": "Démarrer un nouveau chat ? Le chat actuel sera effacé.",
|
||||
@@ -1167,6 +1211,7 @@
|
||||
"ui.agent_chat_none_found_short": "Aucun agent trouvé",
|
||||
"ui.agent_chat_not_installed": "Non installé",
|
||||
"ui.agent_chat_not_signed_in": "non authentifié",
|
||||
"ui.agent_chat_open_settings": "Ouvrir les préférences",
|
||||
"ui.agent_chat_own_window": "Fenêtre séparée",
|
||||
"ui.agent_chat_paste_picture": "Coller une image",
|
||||
"ui.agent_chat_permission": "L'agent demande à exécuter : {title}",
|
||||
@@ -1191,6 +1236,8 @@
|
||||
"ui.agent_chat_send": "Envoyer",
|
||||
"ui.agent_chat_send_now": "Envoyer maintenant",
|
||||
"ui.agent_chat_send_now_tip": "Arrêter l'étape en cours de l'agent et envoyer celui-ci ensuite (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft communique avec un agent de programmation installé sur cet ordinateur. Choisissez-en un dans Préférences › IA.",
|
||||
"ui.agent_chat_setup_title": "Configurer un assistant",
|
||||
"ui.agent_chat_side": "Côté du chat de l'agent",
|
||||
"ui.agent_chat_signed_in": "authentifié",
|
||||
"ui.agent_chat_state_auth": "Authentification requise",
|
||||
@@ -1207,6 +1254,7 @@
|
||||
"ui.agent_chat_undo_label": "Chat de l'agent : {message}",
|
||||
"ui.agent_chat_undone": "(annulé)",
|
||||
"ui.agent_chat_view_attached": "Vue jointe",
|
||||
"ui.agent_chat_waiting": "En attente de votre réponse",
|
||||
"ui.agent_cursor": "Curseur de l'agent",
|
||||
"ui.agent_cursor_speed": "Vitesse du curseur de l'agent",
|
||||
"ui.ai_add": "Ajouter",
|
||||
@@ -1326,7 +1374,7 @@
|
||||
"ui.chamfer_type": "Type de chanfrein",
|
||||
"ui.change_workspace": "Changer d'espace de travail",
|
||||
"ui.circle": "Cercle",
|
||||
"ui.circular_pattern": "Réseau circulaire",
|
||||
"ui.circular_pattern": "Répétition circulaire",
|
||||
"ui.clear": "Effacer",
|
||||
"ui.clear_recent": "Effacer les récents",
|
||||
"ui.clear_the_selection": "Effacer la sélection",
|
||||
@@ -1461,11 +1509,12 @@
|
||||
"ui.grid_follows_view_hint": "Dans les vues de côté, la grille s'affiche sur le plan vertical qui leur fait face plutôt que sur le sol",
|
||||
"ui.ground_shadow": "Ombre au sol",
|
||||
"ui.groupSelected": "Grouper la sélection",
|
||||
"ui.hatch": "Hachures",
|
||||
"ui.heading_add_ins": "COMPLÉMENTS",
|
||||
"ui.heading_assemble": "ASSEMBLER",
|
||||
"ui.heading_box": "BOÎTE",
|
||||
"ui.heading_chamfer": "CHANFREIN",
|
||||
"ui.heading_circular_pattern": "RÉSEAU CIRCULAIRE",
|
||||
"ui.heading_circular_pattern": "RÉPÉTITION CIRCULAIRE",
|
||||
"ui.heading_coil": "HÉLICE",
|
||||
"ui.heading_combine": "COMBINER",
|
||||
"ui.heading_configure": "CONFIGURER",
|
||||
@@ -1498,14 +1547,14 @@
|
||||
"ui.heading_offset_plane": "PLAN DÉCALÉ",
|
||||
"ui.heading_ok": "OK",
|
||||
"ui.heading_parameters": "PARAMÈTRES",
|
||||
"ui.heading_pattern": "RÉSEAU",
|
||||
"ui.heading_pattern_on_path": "RÉSEAU SUR TRAJECTOIRE",
|
||||
"ui.heading_pattern": "RÉPÉTITION",
|
||||
"ui.heading_pattern_on_path": "RÉPÉTITION SUR TRAJECTOIRE",
|
||||
"ui.heading_pipe": "TUYAU",
|
||||
"ui.heading_plane_at_angle": "PLAN INCLINÉ",
|
||||
"ui.heading_plastic": "PLASTIQUE",
|
||||
"ui.heading_position": "POSITION",
|
||||
"ui.heading_prepare": "PRÉPARER",
|
||||
"ui.heading_rectangular_pattern": "RÉSEAU RECTANGULAIRE",
|
||||
"ui.heading_rectangular_pattern": "RÉPÉTITION RECTANGULAIRE",
|
||||
"ui.heading_revolve": "RÉVOLUTION",
|
||||
"ui.heading_right": "DROITE",
|
||||
"ui.heading_save_mesh": "ENREGISTRER COMME MAILLAGE",
|
||||
@@ -1534,6 +1583,11 @@
|
||||
"ui.hideOrigin": "Masquer l'origine",
|
||||
"ui.hidePlanes": "Masquer les plans",
|
||||
"ui.hideProfile": "Masquer le profil",
|
||||
"ui.history_back": "Reculer d’une étape",
|
||||
"ui.history_below_browser": "Sous le navigateur",
|
||||
"ui.history_first": "Aller au début",
|
||||
"ui.history_forward": "Avancer d’une étape",
|
||||
"ui.history_last": "Aller à la fin",
|
||||
"ui.history_title": "Historique",
|
||||
"ui.hole": "Perçage",
|
||||
"ui.hole_tap_type": "Type de taraudage",
|
||||
@@ -1551,6 +1605,8 @@
|
||||
"ui.joints": "Liaisons",
|
||||
"ui.keyboard_shortcuts": "Raccourcis clavier",
|
||||
"ui.language": "Langue",
|
||||
"ui.layout_compact": "Compacte",
|
||||
"ui.layout_floating": "Flottante",
|
||||
"ui.length_decimals": "Décimales des longueurs",
|
||||
"ui.light": "Clair",
|
||||
"ui.line": "Ligne",
|
||||
@@ -1628,7 +1684,7 @@
|
||||
"ui.part_size_shared": "Reconstruit la pièce en remplaçant les entités ajoutées. Toutes les occurrences de ce composant sont mises à jour.",
|
||||
"ui.paste": "Coller",
|
||||
"ui.path": "Trajectoire",
|
||||
"ui.pattern_on_path": "Réseau sur trajectoire",
|
||||
"ui.pattern_on_path": "Répétition sur trajectoire",
|
||||
"ui.perpendicular": "Perpendicularité",
|
||||
"ui.perspective_view": "Vue en perspective",
|
||||
"ui.pinToShortcuts": "Épingler aux raccourcis",
|
||||
@@ -1665,7 +1721,7 @@
|
||||
"ui.rail_fit": "Ajustement au rail",
|
||||
"ui.reachable": "Accessible",
|
||||
"ui.rectangle": "Rectangle",
|
||||
"ui.rectangular_pattern": "Réseau rectangulaire",
|
||||
"ui.rectangular_pattern": "Répétition rectangulaire",
|
||||
"ui.redo": "Rétablir",
|
||||
"ui.relink_design_changed": "L’assemblage a changé pendant le choix d’une source. Relancez Relier à nouveau la source.",
|
||||
"ui.relink_done": "Source reliée à nouveau pour toutes les instances.",
|
||||
@@ -1688,6 +1744,7 @@
|
||||
"ui.reverse_zoom_direction": "Inverser le sens du zoom",
|
||||
"ui.revolve": "Révolution",
|
||||
"ui.ribbon_exit": "Quitter",
|
||||
"ui.ribbon_labels": "Afficher le texte sous les icônes du ruban",
|
||||
"ui.ribbon_pin_footer": "Les commandes épinglées s’affichent dans le ruban. Survolez une ligne pour l’épingler ou la détacher.",
|
||||
"ui.ribbon_workspace": "Espace de travail",
|
||||
"ui.right": "Droite",
|
||||
@@ -1743,6 +1800,7 @@
|
||||
"ui.smooth_wheel_zoom": "Zoom fluide à la molette",
|
||||
"ui.smooth_wheel_zoom_tip": "Désactiver pour appliquer chaque cran de molette immédiatement, sans lissage",
|
||||
"ui.snap": "Accrochage",
|
||||
"ui.space_mouse_axes_reassigned": "Les axes sont réattribués dans les Préférences, et cela s'applique toujours en plus de ce calibrage.",
|
||||
"ui.space_mouse_calibrate": "Calibrer…",
|
||||
"ui.space_mouse_calibrate_tip": "Déplacez le capuchon comme la fenêtre le demande, pour que SolidCraft apprenne dans quel sens et jusqu'où va chaque axe de cette souris 3D. Enregistré pour cette souris 3D.",
|
||||
"ui.space_mouse_calibrate_title": "Calibrer la souris 3D",
|
||||
@@ -1752,12 +1810,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Un axe a à peine bougé, il ne peut donc pas être calibré. Recommencez en déplaçant le capuchon plus loin à chaque fois.",
|
||||
"ui.space_mouse_dead_zone": "Zone morte",
|
||||
"ui.space_mouse_dead_zone_tip": "De combien le capuchon doit bouger avant que la vue ne bouge, en part de sa course complète. Augmentez-la si la vue dérive alors que le capuchon est au repos.",
|
||||
"ui.space_mouse_driven_by": "Quel mouvement calibré de l'appareil pilote cet axe. Choisir un mouvement déjà utilisé par un autre axe les échange.",
|
||||
"ui.space_mouse_driven_by_label": "piloté par",
|
||||
"ui.space_mouse_driver": "Pilote de la souris 3D",
|
||||
"ui.space_mouse_driver_auto": "Automatique",
|
||||
"ui.space_mouse_driver_direct": "Direct (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Lecture directe du périphérique ; spacenavd n'est pas lancé",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Lecture via spacenavd, seule possibilité disponible",
|
||||
"ui.space_mouse_forget": "Oublier le calibrage",
|
||||
"ui.space_mouse_hint": "Déplace et fait pivoter la vue en même temps ; dans les esquisses, seuls le panoramique et le zoom sont utilisés.",
|
||||
"ui.space_mouse_motion_rotation_x": "Rotation X",
|
||||
"ui.space_mouse_motion_rotation_y": "Rotation Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Rotation Z",
|
||||
"ui.space_mouse_motion_translation_x": "Translation X",
|
||||
"ui.space_mouse_motion_translation_y": "Translation Y",
|
||||
"ui.space_mouse_motion_translation_z": "Translation Z",
|
||||
"ui.space_mouse_navigate": "Naviguer avec SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "Aucune souris 3D trouvée",
|
||||
"ui.space_mouse_not_calibrated": "Non calibrée",
|
||||
"ui.space_mouse_reading": "Lecture",
|
||||
"ui.space_mouse_reset_axes": "Réinitialiser l'attribution des axes",
|
||||
"ui.space_mouse_step_lift": "Soulevez le capuchon, maintenez, puis relâchez.",
|
||||
"ui.space_mouse_step_press": "Appuyez sur le capuchon, maintenez, puis relâchez.",
|
||||
"ui.space_mouse_step_pull": "Tirez le capuchon vers vous, maintenez, puis relâchez.",
|
||||
@@ -1771,6 +1843,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Inclinez le capuchon vers la droite (bord droit vers le bas), maintenez, puis relâchez.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Tournez le capuchon dans le sens horaire, maintenez, puis relâchez.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Tournez le capuchon dans le sens antihoraire, maintenez, puis relâchez.",
|
||||
"ui.space_mouse_view_axis": "Axe de la vue",
|
||||
"ui.space_mouse_view_off": "Désactivé",
|
||||
"ui.space_mouse_view_off_tip": "Le profil du pilote de la souris 3D désactive cet axe : son mouvement ne déplace pas la vue. Choisir ici le mouvement d'un autre axe les échange, et ce mouvement cesse de déplacer la vue.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Orbite gauche / droite",
|
||||
"ui.space_mouse_view_orbit_up_down": "Orbite haut / bas",
|
||||
"ui.space_mouse_view_pan_sideways": "Panoramique gauche / droite",
|
||||
"ui.space_mouse_view_pan_up_down": "Panoramique haut / bas",
|
||||
"ui.space_mouse_view_roll": "Roulis",
|
||||
"ui.space_mouse_view_unmapped": "Axe {n}",
|
||||
"ui.space_mouse_view_zoom": "Zoom",
|
||||
"ui.spacing": "Espacement",
|
||||
"ui.spacing_2": "Espacement 2",
|
||||
"ui.sphere": "Sphère",
|
||||
@@ -1842,6 +1924,7 @@
|
||||
"ui.workspace_design_tabs": "Modèle · Surface · Assemblage · Insérer · Inspecter · Gérer · Vue",
|
||||
"ui.workspace_drawing_description": "Mises en plan 2D avec vues, cotes et cartouches",
|
||||
"ui.workspace_footer": "Chaque espace de travail s’applique à la même conception, au même historique et à la même sélection ; seuls les onglets du ruban changent. Le sélecteur est verrouillé pendant la modification d’une esquisse ou d’une entité.",
|
||||
"ui.workspace_layout": "Disposition de l’espace de travail",
|
||||
"ui.workspace_manufacture_description": "Tranchage, parcours d’outil et configuration",
|
||||
"ui.workspace_planned": "Prévu",
|
||||
"ui.workspace_render_description": "Aperçu du produit, paramètres de scène et images rendues",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "HISTORIAL",
|
||||
"Height": "Altura",
|
||||
"Hidden edges": "Arestas ocultas",
|
||||
"History layout": "Disposición do historial",
|
||||
"Holes": "Furados",
|
||||
"Holes (edges on them)": "Furados (arestas sobre eles)",
|
||||
"Home view": "Vista de inicio",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "Non hai informes de fallos.",
|
||||
"No matching appearance presets.": "Non hai preaxustes de aparencia coincidentes.",
|
||||
"No matching appearances": "Non hai aparencias coincidentes",
|
||||
"No visible bodies to export.": "Non hai corpos visibles para exportar.",
|
||||
"No visible bodies or sketches to export.": "Non hai corpos nin bosquexos visibles para exportar.",
|
||||
"None": "Ningún",
|
||||
"Not available yet": "Aínda non dispoñible",
|
||||
"Notch": "Entalle",
|
||||
@@ -831,7 +832,7 @@
|
||||
"dxf.progress.projection": "Proxectando a xeometría (3/5)",
|
||||
"dxf.progress.write": "Escribindo o DXF (5/5)",
|
||||
"dxf.tolerance": "Tolerancia da curva",
|
||||
"dxf.tolerance_help": "Só os corpos visibles. As curvas usan segmentos rectos. Unha tolerancia menor dá curvas máis finas e usa máis tempo e memoria.",
|
||||
"dxf.tolerance_help": "Só os corpos visibles e os bosquexos amosados. As curvas usan segmentos rectos. Unha tolerancia menor dá curvas máis finas e usa máis tempo e memoria.",
|
||||
"file_load.built": "Construído ata agora: {built} de {total} operacións.",
|
||||
"file_load.converting": "Convertendo o sólido {done} de {total}",
|
||||
"file_load.inserting": "Inserindo a xeometría",
|
||||
@@ -856,19 +857,57 @@
|
||||
"help.mit": "Licenza MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Licenzas de terceiros",
|
||||
"home.back": "Volver a {name}",
|
||||
"home.crashes": "Informes de fallos",
|
||||
"home.design_workspace": "Deseño",
|
||||
"home.documentation": "Documentación",
|
||||
"home.export": "Exportar",
|
||||
"home.export_hint": "Escolle un formato para o deseño actual.",
|
||||
"home.export_json_hint": "Deseño editable e historial de comandos",
|
||||
"home.export_mesh_hint": "Malla para imprimir ou compartir",
|
||||
"home.export_step_hint": "Xeometría sólida precisa",
|
||||
"home.import": "Importar…",
|
||||
"home.import_hint": "STEP, IGES ou malla nun novo deseño",
|
||||
"home.in_this_browser": "neste navegador",
|
||||
"home.missing": "non atopado",
|
||||
"home.month_01": "xan.",
|
||||
"home.month_02": "feb.",
|
||||
"home.month_03": "mar.",
|
||||
"home.month_04": "abr.",
|
||||
"home.month_05": "maio",
|
||||
"home.month_06": "xuño",
|
||||
"home.month_07": "xul.",
|
||||
"home.month_08": "ago.",
|
||||
"home.month_09": "set.",
|
||||
"home.month_10": "out.",
|
||||
"home.month_11": "nov.",
|
||||
"home.month_12": "dec.",
|
||||
"home.new_inches": "Novo deseño en polgadas",
|
||||
"home.new_inches_hint": "Polgadas · ábrese en Deseño",
|
||||
"home.new_mm": "Novo deseño",
|
||||
"home.new_mm_hint": "Milímetros · ábrese en Deseño",
|
||||
"home.open": "Abrir…",
|
||||
"home.opened_days_ago": "Aberto hai {count} días",
|
||||
"home.opened_hours_ago": "Aberto hai {count} h",
|
||||
"home.opened_just_now": "Aberto agora mesmo",
|
||||
"home.opened_minutes_ago": "Aberto hai {count} min",
|
||||
"home.open_hint": "Un deseño .solidcraft ({shortcut})",
|
||||
"home.open_now": "Abrir agora",
|
||||
"home.opened_days_ago": "Hai {count} días",
|
||||
"home.opened_hours_ago": "Hai {count} h",
|
||||
"home.opened_just_now": "Agora mesmo",
|
||||
"home.opened_minutes_ago": "Hai {count} min",
|
||||
"home.opening": "abrindo…",
|
||||
"home.properties": "Propiedades do deseño",
|
||||
"home.recent": "Recentes",
|
||||
"home.recent_empty": "Os deseños que abras ou gardes aparecerán aquí.",
|
||||
"home.recovery_count": "Deseños recuperables: {count}",
|
||||
"home.recovery_empty": "Non hai deseños recuperables.",
|
||||
"home.recovery_hint": "SolidCraft pechouse antes de gardar estes deseños.",
|
||||
"home.report_issue": "Informar dunha incidencia",
|
||||
"home.samples": "Exemplos",
|
||||
"home.settings": "Configuración",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Atallos de teclado",
|
||||
"home.start_hint": "Crea un deseño, abre un ficheiro recente ou explora un exemplo.",
|
||||
"home.whats_new": "Novidades",
|
||||
"home.yesterday": "Onte",
|
||||
"install.button_tip": "Instala SolidCraft como aplicación: ábrese na súa propia xanela e funciona sen conexión",
|
||||
"install.dock_1": "Escolle Ficheiro › Engadir ao Dock.",
|
||||
"install.dock_2": "Fai clic en Engadir.",
|
||||
@@ -1021,7 +1060,7 @@
|
||||
"search.try": "Escribe o nome dunha orde, unha operación deste deseño ou un parámetro. Para executar unha orde con valores, escribe o seu id e un obxecto JSON: {example}",
|
||||
"search.valid": "Válido",
|
||||
"settings.display_quality_note": "Os niveis máis finos debuxan as caras e arestas curvas máis suaves e tardan máis en xerar a malla. Só cambia a vista, nunca o deseño nin as exportacións.",
|
||||
"settings.frame_rate_note": "Mostra as imaxes por segundo na esquina inferior dereita da vista. Mentres está activado, a vista redebúxase continuamente.",
|
||||
"settings.frame_rate_note": "Mostra as imaxes por segundo na esquina inferior dereita da vista.",
|
||||
"settings.measure_axis_distances": "Mostrar as distancias en X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Mostra as compoñentes da distancia segundo os eixes do mundo xunto á distancia total mentres Medir está aberto.",
|
||||
"settings.msaa_applies_on_restart": "O antialiasing aplicarase a próxima vez que se inicie SolidCraft",
|
||||
@@ -1092,6 +1131,7 @@
|
||||
"ui.agent_chat_add": "Anexar ficheiros",
|
||||
"ui.agent_chat_add_file": "Escoller un ficheiro…",
|
||||
"ui.agent_chat_allow": "Permitir",
|
||||
"ui.agent_chat_allow_once": "Permitir unha vez",
|
||||
"ui.agent_chat_allowed": "Permitido",
|
||||
"ui.agent_chat_answered": "Resposta: {option}",
|
||||
"ui.agent_chat_approval": "Permitir que o axente faga isto?",
|
||||
@@ -1143,12 +1183,16 @@
|
||||
"ui.agent_chat_files_left_out": "Cunha mensaxe van como máximo {max} ficheiros; deixados fóra: {files}",
|
||||
"ui.agent_chat_files_loading": "Agardando a que se lean os ficheiros",
|
||||
"ui.agent_chat_files_max": "Como máximo {max} ficheiros por mensaxe",
|
||||
"ui.agent_chat_flatpak_none_found": "Non se atopou ningún axente de programación. De forma predeterminada, o illamento de Flatpak non ve os axentes instalados no teu cartafol persoal e non ten acceso á rede. Para permitir Claude Code e o seu adaptador ACP instalados con nvm ou en ~/.local/bin, executa esta orde nun terminal e despois reinicia SolidCraft. Concede acceso aos programas e ficheiros de inicio de sesión indicados, ademais de acceso á rede:",
|
||||
"ui.agent_chat_import_failed": "{name}: fallou a importación: {error}",
|
||||
"ui.agent_chat_intro": "Conversa cun axente de programación que xa uses, ou cun punto de acceso de modelo que escollas. Traballa no deseño aberto a través das ferramentas de SolidCraft: os seus cambios vense mentres os fai e desfanse nun paso por mensaxe. O que pode facer sen preguntar defínese en Preferencias > IA.",
|
||||
"ui.agent_chat_key_in_env": "clave configurada",
|
||||
"ui.agent_chat_left": "Esquerda",
|
||||
"ui.agent_chat_limit": "O axente chegou ao límite de {limit} cambios por mensaxe. Envía outra mensaxe para que continúe.",
|
||||
"ui.agent_chat_minimize": "Minimizar nunha franxa",
|
||||
"ui.agent_chat_mode_all": "Todo",
|
||||
"ui.agent_chat_mode_ask": "Preguntar",
|
||||
"ui.agent_chat_mode_edits": "Edicións",
|
||||
"ui.agent_chat_model_tip": "O modelo que usa o axente. A túa escolla lémbrase para este axente.",
|
||||
"ui.agent_chat_new": "Chat novo",
|
||||
"ui.agent_chat_new_confirm": "Comezar un chat novo? Borrarase o actual.",
|
||||
@@ -1161,6 +1205,7 @@
|
||||
"ui.agent_chat_none_found_short": "Non se atopou ningún axente",
|
||||
"ui.agent_chat_not_installed": "Non instalado",
|
||||
"ui.agent_chat_not_signed_in": "sen sesión iniciada",
|
||||
"ui.agent_chat_open_settings": "Abrir preferencias",
|
||||
"ui.agent_chat_own_window": "Xanela propia",
|
||||
"ui.agent_chat_paste_picture": "Pegar unha imaxe",
|
||||
"ui.agent_chat_permission": "O axente pide executar: {title}",
|
||||
@@ -1185,6 +1230,8 @@
|
||||
"ui.agent_chat_send": "Enviar",
|
||||
"ui.agent_chat_send_now": "Enviar agora",
|
||||
"ui.agent_chat_send_now_tip": "Detén o paso actual do axente e envía isto a continuación (Ctrl+Intro)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft comunícase cun axente de programación instalado neste equipo. Escolle un en Preferencias › IA.",
|
||||
"ui.agent_chat_setup_title": "Configurar un asistente",
|
||||
"ui.agent_chat_side": "Lado do chat co axente",
|
||||
"ui.agent_chat_signed_in": "sesión iniciada",
|
||||
"ui.agent_chat_state_auth": "Hai que iniciar sesión",
|
||||
@@ -1201,6 +1248,7 @@
|
||||
"ui.agent_chat_undo_label": "Chat co axente: {message}",
|
||||
"ui.agent_chat_undone": "(desfeito)",
|
||||
"ui.agent_chat_view_attached": "Vista achegada",
|
||||
"ui.agent_chat_waiting": "Agardando a túa resposta",
|
||||
"ui.agent_cursor": "Cursor do axente",
|
||||
"ui.agent_cursor_speed": "Velocidade do cursor do axente",
|
||||
"ui.ai_add": "Engadir",
|
||||
@@ -1455,6 +1503,7 @@
|
||||
"ui.grid_follows_view_hint": "As vistas laterais mostran a grella no plano vertical que ten diante en vez do chan",
|
||||
"ui.ground_shadow": "Sombra no chan",
|
||||
"ui.groupSelected": "Agrupar a selección",
|
||||
"ui.hatch": "Raiado",
|
||||
"ui.heading_add_ins": "COMPLEMENTOS",
|
||||
"ui.heading_assemble": "ENSAMBLAR",
|
||||
"ui.heading_box": "CAIXA",
|
||||
@@ -1528,6 +1577,11 @@
|
||||
"ui.hideOrigin": "Ocultar a orixe",
|
||||
"ui.hidePlanes": "Ocultar os planos",
|
||||
"ui.hideProfile": "Ocultar o perfil",
|
||||
"ui.history_back": "Retroceder un paso",
|
||||
"ui.history_below_browser": "Debaixo do explorador",
|
||||
"ui.history_first": "Ir ao comezo",
|
||||
"ui.history_forward": "Avanzar un paso",
|
||||
"ui.history_last": "Ir ao final",
|
||||
"ui.history_title": "Historial",
|
||||
"ui.hole": "Furado",
|
||||
"ui.hole_tap_type": "Tipo de roscado do furado",
|
||||
@@ -1545,6 +1599,8 @@
|
||||
"ui.joints": "Unións",
|
||||
"ui.keyboard_shortcuts": "Atallos de teclado",
|
||||
"ui.language": "Idioma",
|
||||
"ui.layout_compact": "Compacta",
|
||||
"ui.layout_floating": "Flotante",
|
||||
"ui.length_decimals": "Decimais das lonxitudes",
|
||||
"ui.light": "Claro",
|
||||
"ui.line": "Liña",
|
||||
@@ -1682,6 +1738,7 @@
|
||||
"ui.reverse_zoom_direction": "Inverter a dirección do zoom",
|
||||
"ui.revolve": "Revolución",
|
||||
"ui.ribbon_exit": "Saír",
|
||||
"ui.ribbon_labels": "Mostrar texto baixo as iconas da cinta",
|
||||
"ui.ribbon_pin_footer": "As ordes fixadas móstranse na cinta. Pasa o cursor sobre unha fila para fixala ou soltala.",
|
||||
"ui.ribbon_workspace": "Espazo de traballo",
|
||||
"ui.right": "Dereita",
|
||||
@@ -1737,6 +1794,7 @@
|
||||
"ui.smooth_wheel_zoom": "Zoom suave coa roda",
|
||||
"ui.smooth_wheel_zoom_tip": "Desactívao para aplicar cada movemento da roda de inmediato, sen suavizado",
|
||||
"ui.snap": "Axuste",
|
||||
"ui.space_mouse_axes_reassigned": "Os eixes están reasignados en Preferencias, e iso segue aplicándose sobre esta calibración.",
|
||||
"ui.space_mouse_calibrate": "Calibrar…",
|
||||
"ui.space_mouse_calibrate_tip": "Move o capuchón como pide a xanela para que SolidCraft aprenda cara a onde e ata onde vai cada eixe deste rato 3D. Gárdase para este rato 3D.",
|
||||
"ui.space_mouse_calibrate_title": "Calibrar o rato 3D",
|
||||
@@ -1746,12 +1804,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Un eixe case non se moveu, así que non se pode calibrar. Volve comezar e move o capuchón máis lonxe cada vez.",
|
||||
"ui.space_mouse_dead_zone": "Zona morta",
|
||||
"ui.space_mouse_dead_zone_tip": "Canto ten que moverse o capuchón antes de que se mova a vista, como parte do seu percorrido completo. Auméntaa se a vista se despraza co capuchón en repouso.",
|
||||
"ui.space_mouse_driven_by": "Que movemento calibrado do dispositivo controla este eixe. Se escolles un que xa usa outro eixe, intercámbianse.",
|
||||
"ui.space_mouse_driven_by_label": "controlado por",
|
||||
"ui.space_mouse_driver": "Controlador do rato 3D",
|
||||
"ui.space_mouse_driver_auto": "Automático",
|
||||
"ui.space_mouse_driver_direct": "Directo (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Lectura directa do dispositivo; spacenavd non está en execución",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Lectura mediante spacenavd, a única opción dispoñible",
|
||||
"ui.space_mouse_forget": "Esquecer a calibración",
|
||||
"ui.space_mouse_hint": "Move e rota a vista á vez; os bosquexos só usan desprazamento e zoom.",
|
||||
"ui.space_mouse_motion_rotation_x": "Rotación X",
|
||||
"ui.space_mouse_motion_rotation_y": "Rotación Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Rotación Z",
|
||||
"ui.space_mouse_motion_translation_x": "Translación X",
|
||||
"ui.space_mouse_motion_translation_y": "Translación Y",
|
||||
"ui.space_mouse_motion_translation_z": "Translación Z",
|
||||
"ui.space_mouse_navigate": "Navegar con SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "Non se atopou ningún rato 3D",
|
||||
"ui.space_mouse_not_calibrated": "Sen calibrar",
|
||||
"ui.space_mouse_reading": "Lectura",
|
||||
"ui.space_mouse_reset_axes": "Restablecer asignación de eixes",
|
||||
"ui.space_mouse_step_lift": "Levanta o capuchón, mantéño e sóltao.",
|
||||
"ui.space_mouse_step_press": "Preme o capuchón cara abaixo, mantéño e sóltao.",
|
||||
"ui.space_mouse_step_pull": "Tira do capuchón cara a ti, mantéño e sóltao.",
|
||||
@@ -1765,6 +1837,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Inclina o capuchón á dereita (bordo dereito abaixo), mantéño e sóltao.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Xira o capuchón no sentido horario, mantéño e sóltao.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Xira o capuchón no sentido antihorario, mantéño e sóltao.",
|
||||
"ui.space_mouse_view_axis": "Eixe da vista",
|
||||
"ui.space_mouse_view_off": "Desactivado",
|
||||
"ui.space_mouse_view_off_tip": "O perfil do controlador do rato 3D desactiva este eixe, así que o seu movemento non move a vista. Se escolles aquí o movemento doutro eixe, intercámbianse e ese movemento deixa de mover a vista.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Orbitar á esquerda / dereita",
|
||||
"ui.space_mouse_view_orbit_up_down": "Orbitar arriba / abaixo",
|
||||
"ui.space_mouse_view_pan_sideways": "Desprazar á esquerda / dereita",
|
||||
"ui.space_mouse_view_pan_up_down": "Desprazar arriba / abaixo",
|
||||
"ui.space_mouse_view_roll": "Xirar sobre a vista",
|
||||
"ui.space_mouse_view_unmapped": "Eixe {n}",
|
||||
"ui.space_mouse_view_zoom": "Zoom",
|
||||
"ui.spacing": "Espazado",
|
||||
"ui.spacing_2": "Espazado 2",
|
||||
"ui.sphere": "Esfera",
|
||||
@@ -1836,6 +1918,7 @@
|
||||
"ui.workspace_design_tabs": "Modelo · Superficie · Montaxe · Inserir · Inspeccionar · Xestionar · Vista",
|
||||
"ui.workspace_drawing_description": "Planos 2D con vistas, cotas e cartelas",
|
||||
"ui.workspace_footer": "Todos os espazos de traballo usan o mesmo deseño, historial e selección; só cambian as pestanas da cinta. O selector bloquéase mentres se edita un bosquexo ou unha operación.",
|
||||
"ui.workspace_layout": "Disposición do espazo de traballo",
|
||||
"ui.workspace_manufacture_description": "Laminado, traxectorias de ferramenta e configuración",
|
||||
"ui.workspace_planned": "Previsto",
|
||||
"ui.workspace_render_description": "Vista previa do produto, axustes de escena e imaxes renderizadas",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "ELŐZMÉNYEK",
|
||||
"Height": "Magasság",
|
||||
"Hidden edges": "Rejtett élek",
|
||||
"History layout": "Előzmények elrendezése",
|
||||
"Holes": "Furatok",
|
||||
"Holes (edges on them)": "Furatok (rajtuk lévő élek)",
|
||||
"Home view": "Kezdőnézet",
|
||||
@@ -232,7 +233,6 @@
|
||||
"No crash reports.": "Nincsenek összeomlási jelentések.",
|
||||
"No matching appearance presets.": "Nincs egyező megjelenés-előbeállítás.",
|
||||
"No matching appearances": "Nincs egyező megjelenés",
|
||||
"No visible bodies to export.": "Nincs exportálható látható test.",
|
||||
"None": "Nincs",
|
||||
"Not available yet": "Még nem érhető el",
|
||||
"Notch": "Bevágás",
|
||||
@@ -856,19 +856,57 @@
|
||||
"help.mit": "MIT licenc",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Harmadik felek licencei",
|
||||
"home.back": "Vissza ide: {name}",
|
||||
"home.crashes": "Összeomlási jelentések",
|
||||
"home.design_workspace": "Tervezés",
|
||||
"home.documentation": "Dokumentáció",
|
||||
"home.export": "Exportálás",
|
||||
"home.export_hint": "Válasszon formátumot az aktuális tervhez.",
|
||||
"home.export_json_hint": "Szerkeszthető terv és parancselőzmények",
|
||||
"home.export_mesh_hint": "Háló nyomtatáshoz vagy megosztáshoz",
|
||||
"home.export_step_hint": "Pontos testgeometria",
|
||||
"home.import": "Importálás…",
|
||||
"home.import_hint": "STEP, IGES vagy háló importálása új tervbe",
|
||||
"home.in_this_browser": "ebben a böngészőben",
|
||||
"home.missing": "hiányzik",
|
||||
"home.month_01": "jan.",
|
||||
"home.month_02": "febr.",
|
||||
"home.month_03": "márc.",
|
||||
"home.month_04": "ápr.",
|
||||
"home.month_05": "máj.",
|
||||
"home.month_06": "jún.",
|
||||
"home.month_07": "júl.",
|
||||
"home.month_08": "aug.",
|
||||
"home.month_09": "szept.",
|
||||
"home.month_10": "okt.",
|
||||
"home.month_11": "nov.",
|
||||
"home.month_12": "dec.",
|
||||
"home.new_inches": "Új terv hüvelykben",
|
||||
"home.new_inches_hint": "Hüvelyk · a Tervezés munkaterületen nyílik meg",
|
||||
"home.new_mm": "Új terv",
|
||||
"home.new_mm_hint": "Milliméter · a Tervezés munkaterületen nyílik meg",
|
||||
"home.open": "Megnyitás…",
|
||||
"home.opened_days_ago": "Megnyitva {count} napja",
|
||||
"home.opened_hours_ago": "Megnyitva {count} órája",
|
||||
"home.opened_just_now": "Épp most megnyitva",
|
||||
"home.opened_minutes_ago": "Megnyitva {count} perce",
|
||||
"home.open_hint": "Egy .solidcraft terv ({shortcut})",
|
||||
"home.open_now": "Jelenleg megnyitva",
|
||||
"home.opened_days_ago": "{count} napja",
|
||||
"home.opened_hours_ago": "{count} órája",
|
||||
"home.opened_just_now": "Épp most",
|
||||
"home.opened_minutes_ago": "{count} perce",
|
||||
"home.opening": "megnyitás…",
|
||||
"home.properties": "Terv tulajdonságai",
|
||||
"home.recent": "Legutóbbi",
|
||||
"home.recent_empty": "A megnyitott vagy mentett tervek itt jelennek meg.",
|
||||
"home.recovery_count": "Helyreállítható tervek: {count}",
|
||||
"home.recovery_empty": "Nincs helyreállítható terv.",
|
||||
"home.recovery_hint": "A SolidCraft a tervek mentése előtt bezárult.",
|
||||
"home.report_issue": "Hiba jelentése",
|
||||
"home.samples": "Minták",
|
||||
"home.settings": "Beállítások",
|
||||
"home.short_date": "{month} {day}.",
|
||||
"home.shortcuts": "Billentyűparancsok",
|
||||
"home.start_hint": "Hozzon létre egy tervet, nyisson meg egy legutóbbi fájlt, vagy fedezzen fel egy mintát.",
|
||||
"home.whats_new": "Újdonságok",
|
||||
"home.yesterday": "Tegnap",
|
||||
"install.button_tip": "A SolidCraft telepítése alkalmazásként: saját ablakban nyílik meg, és offline is működik",
|
||||
"install.dock_1": "Válassza a Fájl › Hozzáadás a Dockhoz lehetőséget.",
|
||||
"install.dock_2": "Kattintson a Hozzáadás gombra.",
|
||||
@@ -1021,7 +1059,7 @@
|
||||
"search.try": "Írja be egy parancs nevét, a terv egy elemét vagy egy paramétert. Parancs értékekkel való futtatásához írja be az azonosítóját és egy JSON-objektumot: {example}",
|
||||
"search.valid": "Érvényes",
|
||||
"settings.display_quality_note": "A finomabb szintek simábban rajzolják az ívelt lapokat és éleket, de tovább tart a hálózás. Csak a nézetablak változik, a terv és az exportok soha.",
|
||||
"settings.frame_rate_note": "Megjeleníti a másodpercenkénti képkockaszámot a nézet jobb alsó sarkában. Bekapcsolt állapotban a nézet folyamatosan újrarajzolódik.",
|
||||
"settings.frame_rate_note": "Megjeleníti a másodpercenkénti képkockaszámot a nézet jobb alsó sarkában.",
|
||||
"settings.measure_axis_distances": "X/Y/Z távolságok megjelenítése",
|
||||
"settings.measure_axis_distances_help": "A világtengely-összetevők méreteit is megjeleníti a teljes távolság mellett, amíg a Mérés nyitva van.",
|
||||
"settings.msaa_applies_on_restart": "Az élsimítás a SolidCraft következő indításakor lép érvénybe",
|
||||
@@ -1092,6 +1130,7 @@
|
||||
"ui.agent_chat_add": "Fájlok csatolása",
|
||||
"ui.agent_chat_add_file": "Válasszon fájlt…",
|
||||
"ui.agent_chat_allow": "Engedélyezés",
|
||||
"ui.agent_chat_allow_once": "Egyszer engedélyezi",
|
||||
"ui.agent_chat_allowed": "Engedélyezve",
|
||||
"ui.agent_chat_answered": "Válasz: {option}",
|
||||
"ui.agent_chat_approval": "Engedélyezi az ügynöknek ezt?",
|
||||
@@ -1143,12 +1182,16 @@
|
||||
"ui.agent_chat_files_left_out": "Egy üzenethez legfeljebb {max} fájl tartozhat; kihagyva: {files}",
|
||||
"ui.agent_chat_files_loading": "Várakozás a fájlok beolvasására",
|
||||
"ui.agent_chat_files_max": "Egy üzenetben legfeljebb {max} fájl lehet",
|
||||
"ui.agent_chat_flatpak_none_found": "Nem található kódolóügynök. A Flatpak homokozó alapértelmezés szerint nem látja a saját mappájába telepített ügynököket, és nincs hálózati hozzáférése. Az nvm-mel vagy a ~/.local/bin mappába telepített Claude Code és ACP-adaptere engedélyezéséhez futtassa ezt a parancsot egy terminálban, majd indítsa újra a SolidCraftot. Hozzáférést ad a felsorolt programokhoz és bejelentkezési fájlokhoz, valamint a hálózathoz:",
|
||||
"ui.agent_chat_import_failed": "{name}: az importálás sikertelen: {error}",
|
||||
"ui.agent_chat_intro": "Csevegjen egy már használt kódolóügynökkel vagy egy választott modellvégponttal. A megnyitott terven a SolidCraft eszközein keresztül dolgozik: a módosításai láthatók közben, és üzenetenként egy lépésben vonhatók vissza. Hogy mit tehet kérdés nélkül, azt a Beállítások > AI menüpontban adhatja meg.",
|
||||
"ui.agent_chat_key_in_env": "kulcs beállítva",
|
||||
"ui.agent_chat_left": "Bal",
|
||||
"ui.agent_chat_limit": "Az ügynök elérte az egy üzenetre eső {limit} módosítás korlátját. Küldjön újabb üzenetet a folytatáshoz.",
|
||||
"ui.agent_chat_minimize": "Összecsukás sávvá",
|
||||
"ui.agent_chat_mode_all": "Minden",
|
||||
"ui.agent_chat_mode_ask": "Kérdez",
|
||||
"ui.agent_chat_mode_edits": "Szerkesztés",
|
||||
"ui.agent_chat_model_tip": "Az ügynök által használt modell. A választás megmarad ennél az ügynöknél.",
|
||||
"ui.agent_chat_new": "Új csevegés",
|
||||
"ui.agent_chat_new_confirm": "Új csevegést indít? A jelenlegi törlődik.",
|
||||
@@ -1161,6 +1204,7 @@
|
||||
"ui.agent_chat_none_found_short": "Nincs ügynök",
|
||||
"ui.agent_chat_not_installed": "Nincs telepítve",
|
||||
"ui.agent_chat_not_signed_in": "nincs bejelentkezve",
|
||||
"ui.agent_chat_open_settings": "Beállítások megnyitása",
|
||||
"ui.agent_chat_own_window": "Saját ablak",
|
||||
"ui.agent_chat_paste_picture": "Kép beillesztése",
|
||||
"ui.agent_chat_permission": "Az ügynök futtatást kér: {title}",
|
||||
@@ -1185,6 +1229,8 @@
|
||||
"ui.agent_chat_send": "Küldés",
|
||||
"ui.agent_chat_send_now": "Küldés most",
|
||||
"ui.agent_chat_send_now_tip": "Az ügynök jelenlegi lépésének leállítása és ennek küldése következőként (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "A SolidCraft a számítógépre telepített programozóügynökkel kommunikál. Válasszon egyet itt: Beállítások › AI.",
|
||||
"ui.agent_chat_setup_title": "Asszisztens beállítása",
|
||||
"ui.agent_chat_side": "Ügynök-csevegés oldala",
|
||||
"ui.agent_chat_signed_in": "bejelentkezve",
|
||||
"ui.agent_chat_state_auth": "Bejelentkezés szükséges",
|
||||
@@ -1201,6 +1247,7 @@
|
||||
"ui.agent_chat_undo_label": "Ügynök-csevegés: {message}",
|
||||
"ui.agent_chat_undone": "(visszavonva)",
|
||||
"ui.agent_chat_view_attached": "Nézet csatolva",
|
||||
"ui.agent_chat_waiting": "Önre vár",
|
||||
"ui.agent_cursor": "Ügynök kurzora",
|
||||
"ui.agent_cursor_speed": "Ügynök kurzorának sebessége",
|
||||
"ui.ai_add": "Hozzáadás",
|
||||
@@ -1455,6 +1502,7 @@
|
||||
"ui.grid_follows_view_hint": "Az oldalnézetek a talaj helyett a feléjük néző függőleges síkon mutatják a rácsot",
|
||||
"ui.ground_shadow": "Talajárnyék",
|
||||
"ui.groupSelected": "Kijelöltek csoportosítása",
|
||||
"ui.hatch": "Sraffozás",
|
||||
"ui.heading_add_ins": "BŐVÍTMÉNYEK",
|
||||
"ui.heading_assemble": "ÖSSZESZERELÉS",
|
||||
"ui.heading_box": "DOBOZ",
|
||||
@@ -1528,6 +1576,11 @@
|
||||
"ui.hideOrigin": "Origó elrejtése",
|
||||
"ui.hidePlanes": "Síkok elrejtése",
|
||||
"ui.hideProfile": "Profil elrejtése",
|
||||
"ui.history_back": "Egy lépéssel vissza",
|
||||
"ui.history_below_browser": "Böngésző alatt",
|
||||
"ui.history_first": "Ugrás az elejére",
|
||||
"ui.history_forward": "Egy lépéssel előre",
|
||||
"ui.history_last": "Ugrás a végére",
|
||||
"ui.history_title": "Előzmények",
|
||||
"ui.hole": "Furat",
|
||||
"ui.hole_tap_type": "Furat menettípusa",
|
||||
@@ -1545,6 +1598,8 @@
|
||||
"ui.joints": "Csuklók",
|
||||
"ui.keyboard_shortcuts": "Billentyűparancsok",
|
||||
"ui.language": "Nyelv",
|
||||
"ui.layout_compact": "Kompakt",
|
||||
"ui.layout_floating": "Lebegő",
|
||||
"ui.length_decimals": "Hossz tizedesjegyei",
|
||||
"ui.light": "Világos",
|
||||
"ui.line": "Vonal",
|
||||
@@ -1682,6 +1737,7 @@
|
||||
"ui.reverse_zoom_direction": "Nagyítási irány megfordítása",
|
||||
"ui.revolve": "Forgatás",
|
||||
"ui.ribbon_exit": "Kilépés",
|
||||
"ui.ribbon_labels": "Szöveg megjelenítése a menüszalag ikonjai alatt",
|
||||
"ui.ribbon_pin_footer": "A rögzített parancsok megjelennek a menüszalagon. Egy sor fölé víve rögzíthető vagy feloldható.",
|
||||
"ui.ribbon_workspace": "Munkaterület",
|
||||
"ui.right": "Jobb",
|
||||
@@ -1836,6 +1892,7 @@
|
||||
"ui.workspace_design_tabs": "Modell · Felület · Összeszerelés · Beszúrás · Vizsgálat · Kezelés · Nézet",
|
||||
"ui.workspace_drawing_description": "2D rajzok nézetekkel, méretekkel és címblokkokkal",
|
||||
"ui.workspace_footer": "Minden munkaterület ugyanazon a terven, előzményeken és kijelölésen dolgozik; csak a menüszalag lapjai változnak. A váltó zárolva van, amíg vázlatot vagy elemet szerkeszt.",
|
||||
"ui.workspace_layout": "Munkaterület elrendezése",
|
||||
"ui.workspace_manufacture_description": "Szeletelés, szerszámutak és beállítás",
|
||||
"ui.workspace_planned": "Tervezett",
|
||||
"ui.workspace_render_description": "Terméknézet, jelenetbeállítások és renderelt képek",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "RIWAYAT",
|
||||
"Height": "Tinggi",
|
||||
"Hidden edges": "Tepi tersembunyi",
|
||||
"History layout": "Tata letak riwayat",
|
||||
"Holes": "Lubang",
|
||||
"Holes (edges on them)": "Lubang (tepi di atasnya)",
|
||||
"Home view": "Tampilan awal",
|
||||
@@ -232,7 +233,6 @@
|
||||
"No crash reports.": "Tidak ada laporan crash.",
|
||||
"No matching appearance presets.": "Tidak ada preset tampilan yang cocok.",
|
||||
"No matching appearances": "Tidak ada tampilan yang cocok",
|
||||
"No visible bodies to export.": "Tidak ada bodi terlihat untuk diekspor.",
|
||||
"None": "Tidak ada",
|
||||
"Not available yet": "Belum tersedia",
|
||||
"Notch": "Takik",
|
||||
@@ -856,19 +856,57 @@
|
||||
"help.mit": "Lisensi MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Lisensi pihak ketiga",
|
||||
"home.back": "Kembali ke {name}",
|
||||
"home.crashes": "Laporan kerusakan",
|
||||
"home.design_workspace": "Desain",
|
||||
"home.documentation": "Dokumentasi",
|
||||
"home.export": "Ekspor",
|
||||
"home.export_hint": "Pilih format untuk desain saat ini.",
|
||||
"home.export_json_hint": "Desain yang dapat diedit dan riwayat perintah",
|
||||
"home.export_mesh_hint": "Mesh untuk pencetakan atau berbagi",
|
||||
"home.export_step_hint": "Geometri benda padat yang presisi",
|
||||
"home.import": "Impor…",
|
||||
"home.import_hint": "STEP, IGES, atau mesh ke dalam desain baru",
|
||||
"home.in_this_browser": "di peramban ini",
|
||||
"home.missing": "hilang",
|
||||
"home.month_01": "Jan",
|
||||
"home.month_02": "Feb",
|
||||
"home.month_03": "Mar",
|
||||
"home.month_04": "Apr",
|
||||
"home.month_05": "Mei",
|
||||
"home.month_06": "Jun",
|
||||
"home.month_07": "Jul",
|
||||
"home.month_08": "Agu",
|
||||
"home.month_09": "Sep",
|
||||
"home.month_10": "Okt",
|
||||
"home.month_11": "Nov",
|
||||
"home.month_12": "Des",
|
||||
"home.new_inches": "Desain baru dalam inci",
|
||||
"home.new_inches_hint": "Inci · terbuka di Desain",
|
||||
"home.new_mm": "Desain baru",
|
||||
"home.new_mm_hint": "Milimeter · terbuka di Desain",
|
||||
"home.open": "Buka…",
|
||||
"home.opened_days_ago": "Dibuka {count} hari lalu",
|
||||
"home.opened_hours_ago": "Dibuka {count} jam lalu",
|
||||
"home.opened_just_now": "Baru saja dibuka",
|
||||
"home.opened_minutes_ago": "Dibuka {count} mnt lalu",
|
||||
"home.open_hint": "Desain .solidcraft ({shortcut})",
|
||||
"home.open_now": "Sedang terbuka",
|
||||
"home.opened_days_ago": "{count} hari lalu",
|
||||
"home.opened_hours_ago": "{count} jam lalu",
|
||||
"home.opened_just_now": "Baru saja",
|
||||
"home.opened_minutes_ago": "{count} mnt lalu",
|
||||
"home.opening": "membuka…",
|
||||
"home.properties": "Properti desain",
|
||||
"home.recent": "Terbaru",
|
||||
"home.recent_empty": "Desain yang Anda buka atau simpan akan muncul di sini.",
|
||||
"home.recovery_count": "Desain yang dapat dipulihkan: {count}",
|
||||
"home.recovery_empty": "Tidak ada desain yang dapat dipulihkan.",
|
||||
"home.recovery_hint": "SolidCraft ditutup sebelum desain ini disimpan.",
|
||||
"home.report_issue": "Laporkan Masalah",
|
||||
"home.samples": "Contoh",
|
||||
"home.settings": "Pengaturan",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Pintasan papan ketik",
|
||||
"home.start_hint": "Buat desain, buka berkas terbaru, atau jelajahi contoh.",
|
||||
"home.whats_new": "Yang baru",
|
||||
"home.yesterday": "Kemarin",
|
||||
"install.button_tip": "Pasang SolidCraft sebagai aplikasi: terbuka di jendelanya sendiri dan berfungsi offline",
|
||||
"install.dock_1": "Pilih File › Add to Dock.",
|
||||
"install.dock_2": "Klik Add.",
|
||||
@@ -1021,7 +1059,7 @@
|
||||
"search.try": "Ketik nama perintah, fitur di desain ini, atau parameter. Untuk menjalankan perintah dengan nilai, ketik id-nya dan objek JSON: {example}",
|
||||
"search.valid": "Valid",
|
||||
"settings.display_quality_note": "Level lebih halus menggambar muka dan tepi lengkung lebih mulus dan butuh waktu meshing lebih lama. Hanya viewport yang berubah, tidak pernah desain atau ekspor.",
|
||||
"settings.frame_rate_note": "Menampilkan frame per detik di sudut kanan bawah tampilan. Saat aktif, tampilan digambar ulang terus-menerus.",
|
||||
"settings.frame_rate_note": "Menampilkan frame per detik di sudut kanan bawah tampilan.",
|
||||
"settings.measure_axis_distances": "Tampilkan jarak X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Tampilkan dimensi komponen sumbu dunia di samping jarak total saat Ukur terbuka.",
|
||||
"settings.msaa_applies_on_restart": "Anti-aliasing berlaku saat SolidCraft dimulai berikutnya",
|
||||
@@ -1092,6 +1130,7 @@
|
||||
"ui.agent_chat_add": "Lampirkan file",
|
||||
"ui.agent_chat_add_file": "Pilih file…",
|
||||
"ui.agent_chat_allow": "Izinkan",
|
||||
"ui.agent_chat_allow_once": "Izinkan sekali",
|
||||
"ui.agent_chat_allowed": "Diizinkan",
|
||||
"ui.agent_chat_answered": "Jawaban: {option}",
|
||||
"ui.agent_chat_approval": "Izinkan agen melakukan ini?",
|
||||
@@ -1143,12 +1182,16 @@
|
||||
"ui.agent_chat_files_left_out": "Maksimal {max} file per pesan; tidak disertakan: {files}",
|
||||
"ui.agent_chat_files_loading": "Menunggu file selesai dibaca",
|
||||
"ui.agent_chat_files_max": "Maksimal {max} file per pesan",
|
||||
"ui.agent_chat_flatpak_none_found": "Agen coding tidak ditemukan. Secara bawaan, sandbox Flatpak tidak dapat melihat agen yang terpasang di folder rumah Anda dan tidak memiliki akses jaringan. Untuk mengizinkan Claude Code dan adaptor ACP-nya yang dipasang melalui nvm atau di ~/.local/bin, jalankan perintah ini di terminal, lalu mulai ulang SolidCraft. Perintah ini memberi akses ke program dan berkas masuk yang disebutkan, serta akses jaringan:",
|
||||
"ui.agent_chat_import_failed": "{name}: impor gagal: {error}",
|
||||
"ui.agent_chat_intro": "Mengobrol dengan agen coding yang sudah Anda pakai, atau endpoint model pilihan Anda. Agen bekerja pada desain yang terbuka lewat alat SolidCraft: perubahannya tampil saat dibuat dan dapat diurungkan satu langkah per pesan. Yang boleh dilakukannya tanpa bertanya diatur di Preferensi > AI.",
|
||||
"ui.agent_chat_key_in_env": "key diatur",
|
||||
"ui.agent_chat_left": "Kiri",
|
||||
"ui.agent_chat_limit": "Agen mencapai batas {limit} perubahan untuk satu pesan. Kirim pesan lain agar agen melanjutkan.",
|
||||
"ui.agent_chat_minimize": "Kecilkan menjadi strip",
|
||||
"ui.agent_chat_mode_all": "Semua",
|
||||
"ui.agent_chat_mode_ask": "Tanya",
|
||||
"ui.agent_chat_mode_edits": "Edit",
|
||||
"ui.agent_chat_model_tip": "Model yang dipakai agen. Pilihan Anda diingat untuk agen ini.",
|
||||
"ui.agent_chat_new": "Chat baru",
|
||||
"ui.agent_chat_new_confirm": "Mulai chat baru? Chat saat ini akan dibersihkan.",
|
||||
@@ -1161,6 +1204,7 @@
|
||||
"ui.agent_chat_none_found_short": "Agen tidak ditemukan",
|
||||
"ui.agent_chat_not_installed": "Belum terpasang",
|
||||
"ui.agent_chat_not_signed_in": "belum masuk",
|
||||
"ui.agent_chat_open_settings": "Buka preferensi",
|
||||
"ui.agent_chat_own_window": "Jendela sendiri",
|
||||
"ui.agent_chat_paste_picture": "Tempel gambar",
|
||||
"ui.agent_chat_permission": "Agen meminta menjalankan: {title}",
|
||||
@@ -1185,6 +1229,8 @@
|
||||
"ui.agent_chat_send": "Kirim",
|
||||
"ui.agent_chat_send_now": "Kirim sekarang",
|
||||
"ui.agent_chat_send_now_tip": "Hentikan langkah agen saat ini dan kirim ini berikutnya (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft berkomunikasi dengan agen pemrograman yang terpasang di komputer ini. Pilih agen di Preferensi › AI.",
|
||||
"ui.agent_chat_setup_title": "Siapkan asisten",
|
||||
"ui.agent_chat_side": "Sisi chat agen",
|
||||
"ui.agent_chat_signed_in": "sudah masuk",
|
||||
"ui.agent_chat_state_auth": "Perlu masuk",
|
||||
@@ -1201,6 +1247,7 @@
|
||||
"ui.agent_chat_undo_label": "Chat agen: {message}",
|
||||
"ui.agent_chat_undone": "(diurungkan)",
|
||||
"ui.agent_chat_view_attached": "Tampilan dilampirkan",
|
||||
"ui.agent_chat_waiting": "Menunggu Anda",
|
||||
"ui.agent_cursor": "Kursor agen",
|
||||
"ui.agent_cursor_speed": "Kecepatan kursor agen",
|
||||
"ui.ai_add": "Tambah",
|
||||
@@ -1455,6 +1502,7 @@
|
||||
"ui.grid_follows_view_hint": "Tampilan samping menampilkan grid pada bidang tegak yang menghadapnya, bukan pada dasar",
|
||||
"ui.ground_shadow": "Bayangan dasar",
|
||||
"ui.groupSelected": "Kelompokkan yang Dipilih",
|
||||
"ui.hatch": "Arsir",
|
||||
"ui.heading_add_ins": "ADD-IN",
|
||||
"ui.heading_assemble": "RAKIT",
|
||||
"ui.heading_box": "KOTAK",
|
||||
@@ -1528,6 +1576,11 @@
|
||||
"ui.hideOrigin": "Sembunyikan Origin",
|
||||
"ui.hidePlanes": "Sembunyikan Bidang",
|
||||
"ui.hideProfile": "Sembunyikan Profil",
|
||||
"ui.history_back": "Mundur satu langkah",
|
||||
"ui.history_below_browser": "Di bawah browser",
|
||||
"ui.history_first": "Ke awal",
|
||||
"ui.history_forward": "Maju satu langkah",
|
||||
"ui.history_last": "Ke akhir",
|
||||
"ui.history_title": "Riwayat",
|
||||
"ui.hole": "Lubang",
|
||||
"ui.hole_tap_type": "Tipe Tap Lubang",
|
||||
@@ -1545,6 +1598,8 @@
|
||||
"ui.joints": "Sambungan",
|
||||
"ui.keyboard_shortcuts": "Pintasan Keyboard",
|
||||
"ui.language": "Bahasa",
|
||||
"ui.layout_compact": "Ringkas",
|
||||
"ui.layout_floating": "Mengambang",
|
||||
"ui.length_decimals": "Desimal panjang",
|
||||
"ui.light": "Terang",
|
||||
"ui.line": "Garis",
|
||||
@@ -1682,6 +1737,7 @@
|
||||
"ui.reverse_zoom_direction": "Balik arah zoom",
|
||||
"ui.revolve": "Revolve",
|
||||
"ui.ribbon_exit": "Keluar",
|
||||
"ui.ribbon_labels": "Tampilkan teks di bawah ikon pita",
|
||||
"ui.ribbon_pin_footer": "Perintah yang disematkan tampil di ribbon. Arahkan kursor ke baris untuk menyematkan atau melepas sematan.",
|
||||
"ui.ribbon_workspace": "Workspace",
|
||||
"ui.right": "Kanan",
|
||||
@@ -1836,6 +1892,7 @@
|
||||
"ui.workspace_design_tabs": "Model · Permukaan · Rakit · Sisipkan · Inspeksi · Kelola · Tampilan",
|
||||
"ui.workspace_drawing_description": "Gambar kerja 2D dengan tampilan, dimensi, dan title block",
|
||||
"ui.workspace_footer": "Setiap workspace bekerja pada desain, riwayat, dan pilihan yang sama; hanya tab ribbon yang berubah. Pengalih terkunci saat sketsa atau fitur sedang diedit.",
|
||||
"ui.workspace_layout": "Tata letak ruang kerja",
|
||||
"ui.workspace_manufacture_description": "Slicing, toolpath, dan setup",
|
||||
"ui.workspace_planned": "Direncanakan",
|
||||
"ui.workspace_render_description": "Pratinjau produk, pengaturan scene, dan gambar render",
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
"Curv. Comb": "Pettine curv.",
|
||||
"Curvature (G2)": "Curvatura (G2)",
|
||||
"Curvature change (G3)": "Variazione di curvatura (G3)",
|
||||
"Custom": "Personalizzato",
|
||||
"Customize Toolbar": "Personalizza barra degli strumenti",
|
||||
"Delete": "Elimina",
|
||||
"Delete all": "Elimina tutto",
|
||||
@@ -167,6 +168,7 @@
|
||||
"HISTORY": "CRONOLOGIA",
|
||||
"Height": "Altezza",
|
||||
"Hidden edges": "Spigoli nascosti",
|
||||
"History layout": "Disposizione cronologia",
|
||||
"Holes": "Fori",
|
||||
"Holes (edges on them)": "Fori (spigoli dei fori)",
|
||||
"Home view": "Vista iniziale",
|
||||
@@ -232,7 +234,8 @@
|
||||
"No crash reports.": "Nessun rapporto di arresto anomalo.",
|
||||
"No matching appearance presets.": "Nessun predefinito di aspetto corrispondente.",
|
||||
"No matching appearances": "Nessun aspetto corrispondente",
|
||||
"No visible bodies to export.": "Nessun corpo visibile da esportare.",
|
||||
"No visible bodies or sketches to export.": "Nessun corpo o schizzo visibile da esportare.",
|
||||
"Nominal diameter": "Diametro nominale",
|
||||
"None": "Nessuno",
|
||||
"Not available yet": "Non ancora disponibile",
|
||||
"Notch": "Intaglio",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Pick the tool bodies": "Seleziona i corpi utensile",
|
||||
"Picked": "Selezionato",
|
||||
"Picked point": "Punto selezionato",
|
||||
"Pitch": "Passo",
|
||||
"Place at the origin instead": "Posiziona invece nell'origine",
|
||||
"Plastic Rules": "Regole per plastica",
|
||||
"Playback": "Riproduzione",
|
||||
@@ -831,7 +835,7 @@
|
||||
"dxf.progress.projection": "Proiezione della geometria (3/5)",
|
||||
"dxf.progress.write": "Scrittura DXF (5/5)",
|
||||
"dxf.tolerance": "Tolleranza delle curve",
|
||||
"dxf.tolerance_help": "Solo corpi visibili. Le curve usano segmenti rettilinei. Una tolleranza minore produce curve più precise e richiede più tempo e memoria.",
|
||||
"dxf.tolerance_help": "Solo corpi visibili e schizzi mostrati. Le curve usano segmenti rettilinei. Una tolleranza minore produce curve più precise e richiede più tempo e memoria.",
|
||||
"file_load.built": "Costruite finora: {built} di {total} feature.",
|
||||
"file_load.converting": "Conversione del solido {done} di {total}",
|
||||
"file_load.inserting": "Inserimento della geometria",
|
||||
@@ -856,19 +860,57 @@
|
||||
"help.mit": "Licenza MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Licenze di terze parti",
|
||||
"home.back": "Torna a {name}",
|
||||
"home.crashes": "Rapporti di arresto anomalo",
|
||||
"home.design_workspace": "Progettazione",
|
||||
"home.documentation": "Documentazione",
|
||||
"home.export": "Esporta",
|
||||
"home.export_hint": "Scegli un formato per il progetto attuale.",
|
||||
"home.export_json_hint": "Progetto modificabile e cronologia dei comandi",
|
||||
"home.export_mesh_hint": "Mesh per la stampa o la condivisione",
|
||||
"home.export_step_hint": "Geometria solida precisa",
|
||||
"home.import": "Importa…",
|
||||
"home.import_hint": "STEP, IGES o mesh in un nuovo progetto",
|
||||
"home.in_this_browser": "in questo browser",
|
||||
"home.missing": "non presente",
|
||||
"home.month_01": "gen",
|
||||
"home.month_02": "feb",
|
||||
"home.month_03": "mar",
|
||||
"home.month_04": "apr",
|
||||
"home.month_05": "mag",
|
||||
"home.month_06": "giu",
|
||||
"home.month_07": "lug",
|
||||
"home.month_08": "ago",
|
||||
"home.month_09": "set",
|
||||
"home.month_10": "ott",
|
||||
"home.month_11": "nov",
|
||||
"home.month_12": "dic",
|
||||
"home.new_inches": "Nuovo progetto in pollici",
|
||||
"home.new_inches_hint": "Pollici · si apre in Progettazione",
|
||||
"home.new_mm": "Nuovo progetto",
|
||||
"home.new_mm_hint": "Millimetri · si apre in Progettazione",
|
||||
"home.open": "Apri…",
|
||||
"home.opened_days_ago": "Aperto {count} giorni fa",
|
||||
"home.opened_hours_ago": "Aperto {count} h fa",
|
||||
"home.opened_just_now": "Appena aperto",
|
||||
"home.opened_minutes_ago": "Aperto {count} min fa",
|
||||
"home.open_hint": "Un progetto .solidcraft ({shortcut})",
|
||||
"home.open_now": "Apri ora",
|
||||
"home.opened_days_ago": "{count} giorni fa",
|
||||
"home.opened_hours_ago": "{count} h fa",
|
||||
"home.opened_just_now": "Adesso",
|
||||
"home.opened_minutes_ago": "{count} min fa",
|
||||
"home.opening": "apertura…",
|
||||
"home.properties": "Proprietà del progetto",
|
||||
"home.recent": "Recenti",
|
||||
"home.recent_empty": "I progetti che apri o salvi vengono visualizzati qui.",
|
||||
"home.recovery_count": "Progetti recuperabili: {count}",
|
||||
"home.recovery_empty": "Nessun progetto recuperabile.",
|
||||
"home.recovery_hint": "SolidCraft si è chiuso prima del salvataggio di questi progetti.",
|
||||
"home.report_issue": "Segnala un problema",
|
||||
"home.samples": "Esempi",
|
||||
"home.settings": "Impostazioni",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Scorciatoie da tastiera",
|
||||
"home.start_hint": "Crea un progetto, apri un file recente o esplora un esempio.",
|
||||
"home.whats_new": "Novità",
|
||||
"home.yesterday": "Ieri",
|
||||
"install.button_tip": "Installa SolidCraft come applicazione: si apre in una finestra dedicata e funziona offline",
|
||||
"install.dock_1": "Scegli File › Aggiungi al Dock.",
|
||||
"install.dock_2": "Fai clic su Aggiungi.",
|
||||
@@ -1021,7 +1063,7 @@
|
||||
"search.try": "Digita il nome di un comando, una feature di questo progetto o un parametro. Per eseguire un comando con dei valori, digita il suo id e un oggetto JSON: {example}",
|
||||
"search.valid": "Valido",
|
||||
"settings.display_quality_note": "I livelli più fini rendono più uniformi le facce curve e gli spigoli e richiedono più tempo per la mesh. Cambia solo la vista, mai il progetto o le esportazioni.",
|
||||
"settings.frame_rate_note": "Mostra i fotogrammi al secondo nell'angolo inferiore destro della vista. Quando è attivo, la vista viene ridisegnata continuamente.",
|
||||
"settings.frame_rate_note": "Mostra i fotogrammi al secondo nell'angolo inferiore destro della vista.",
|
||||
"settings.measure_axis_distances": "Mostra distanze X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Mostra le componenti lungo gli assi globali accanto alla distanza totale quando Misura è aperto.",
|
||||
"settings.msaa_applies_on_restart": "L'antialiasing verrà applicato al prossimo avvio di SolidCraft",
|
||||
@@ -1092,6 +1134,7 @@
|
||||
"ui.agent_chat_add": "Allega file",
|
||||
"ui.agent_chat_add_file": "Scegli un file…",
|
||||
"ui.agent_chat_allow": "Consenti",
|
||||
"ui.agent_chat_allow_once": "Consenti una volta",
|
||||
"ui.agent_chat_allowed": "Consentito",
|
||||
"ui.agent_chat_answered": "Risposta: {option}",
|
||||
"ui.agent_chat_approval": "Consentire questa azione all'agente?",
|
||||
@@ -1143,12 +1186,16 @@
|
||||
"ui.agent_chat_files_left_out": "Un messaggio può contenere al massimo {max} file; esclusi: {files}",
|
||||
"ui.agent_chat_files_loading": "In attesa della lettura dei file",
|
||||
"ui.agent_chat_files_max": "Al massimo {max} file per messaggio",
|
||||
"ui.agent_chat_flatpak_none_found": "Nessun agente di programmazione trovato. Per impostazione predefinita, la sandbox Flatpak non vede gli agenti installati nella tua cartella home e non ha accesso alla rete. Per consentire Claude Code e il suo adattatore ACP installati con nvm o in ~/.local/bin, esegui questo comando in un terminale, poi riavvia SolidCraft. Concede l’accesso ai programmi e ai file di accesso elencati, oltre all’accesso alla rete:",
|
||||
"ui.agent_chat_import_failed": "{name}: importazione non riuscita: {error}",
|
||||
"ui.agent_chat_intro": "Conversa con un agente di programmazione che già usi o con un endpoint di modello a tua scelta. Opera sul progetto aperto tramite gli strumenti di SolidCraft: le modifiche sono visibili mentre vengono eseguite e si annullano in un solo passo per messaggio. Le azioni consentite senza conferma si impostano in Preferenze > IA.",
|
||||
"ui.agent_chat_key_in_env": "chiave impostata",
|
||||
"ui.agent_chat_left": "Sinistra",
|
||||
"ui.agent_chat_limit": "L'agente ha raggiunto il limite di {limit} modifiche per messaggio. Invia un altro messaggio per farlo proseguire.",
|
||||
"ui.agent_chat_minimize": "Riduci a una striscia",
|
||||
"ui.agent_chat_mode_all": "Tutto",
|
||||
"ui.agent_chat_mode_ask": "Chiedi",
|
||||
"ui.agent_chat_mode_edits": "Modifiche",
|
||||
"ui.agent_chat_model_tip": "Il modello usato dall'agente. La scelta viene memorizzata per questo agente.",
|
||||
"ui.agent_chat_new": "Nuova chat",
|
||||
"ui.agent_chat_new_confirm": "Avviare una nuova chat? Quella corrente verrà cancellata.",
|
||||
@@ -1161,6 +1208,7 @@
|
||||
"ui.agent_chat_none_found_short": "Nessun agente trovato",
|
||||
"ui.agent_chat_not_installed": "Non installato",
|
||||
"ui.agent_chat_not_signed_in": "accesso non effettuato",
|
||||
"ui.agent_chat_open_settings": "Apri preferenze",
|
||||
"ui.agent_chat_own_window": "Finestra separata",
|
||||
"ui.agent_chat_paste_picture": "Incolla un'immagine",
|
||||
"ui.agent_chat_permission": "L'agente chiede di eseguire: {title}",
|
||||
@@ -1185,6 +1233,8 @@
|
||||
"ui.agent_chat_send": "Invia",
|
||||
"ui.agent_chat_send_now": "Invia subito",
|
||||
"ui.agent_chat_send_now_tip": "Interrompi il passo corrente dell'agente e invia questo messaggio come successivo (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft comunica con un agente di programmazione installato su questo computer. Scegline uno in Preferenze › IA.",
|
||||
"ui.agent_chat_setup_title": "Configura un assistente",
|
||||
"ui.agent_chat_side": "Lato della chat con l'agente",
|
||||
"ui.agent_chat_signed_in": "accesso effettuato",
|
||||
"ui.agent_chat_state_auth": "Accesso richiesto",
|
||||
@@ -1201,6 +1251,7 @@
|
||||
"ui.agent_chat_undo_label": "Chat con l'agente: {message}",
|
||||
"ui.agent_chat_undone": "(annullato)",
|
||||
"ui.agent_chat_view_attached": "Vista allegata",
|
||||
"ui.agent_chat_waiting": "In attesa della tua risposta",
|
||||
"ui.agent_cursor": "Cursore dell'agente",
|
||||
"ui.agent_cursor_speed": "Velocità del cursore dell'agente",
|
||||
"ui.ai_add": "Aggiungi",
|
||||
@@ -1455,6 +1506,7 @@
|
||||
"ui.grid_follows_view_hint": "Le viste laterali mostrano la griglia sul piano verticale rivolto verso di esse anziché sul piano di appoggio",
|
||||
"ui.ground_shadow": "Ombra sul piano di appoggio",
|
||||
"ui.groupSelected": "Raggruppa selezionati",
|
||||
"ui.hatch": "Tratteggio",
|
||||
"ui.heading_add_ins": "COMPONENTI AGGIUNTIVI",
|
||||
"ui.heading_assemble": "ASSEMBLA",
|
||||
"ui.heading_box": "PARALLELEPIPEDO",
|
||||
@@ -1528,6 +1580,11 @@
|
||||
"ui.hideOrigin": "Nascondi origine",
|
||||
"ui.hidePlanes": "Nascondi piani",
|
||||
"ui.hideProfile": "Nascondi profilo",
|
||||
"ui.history_back": "Indietro di un passaggio",
|
||||
"ui.history_below_browser": "Sotto il browser",
|
||||
"ui.history_first": "Vai all’inizio",
|
||||
"ui.history_forward": "Avanti di un passaggio",
|
||||
"ui.history_last": "Vai alla fine",
|
||||
"ui.history_title": "Cronologia",
|
||||
"ui.hole": "Foro",
|
||||
"ui.hole_tap_type": "Tipo di maschiatura del foro",
|
||||
@@ -1545,6 +1602,8 @@
|
||||
"ui.joints": "Giunti",
|
||||
"ui.keyboard_shortcuts": "Scorciatoie da tastiera",
|
||||
"ui.language": "Lingua",
|
||||
"ui.layout_compact": "Compatta",
|
||||
"ui.layout_floating": "Flottante",
|
||||
"ui.length_decimals": "Decimali delle lunghezze",
|
||||
"ui.light": "Chiaro",
|
||||
"ui.line": "Linea",
|
||||
@@ -1682,6 +1741,7 @@
|
||||
"ui.reverse_zoom_direction": "Inverti direzione dello zoom",
|
||||
"ui.revolve": "Rivoluzione",
|
||||
"ui.ribbon_exit": "Esci",
|
||||
"ui.ribbon_labels": "Mostra il testo sotto le icone della barra multifunzione",
|
||||
"ui.ribbon_pin_footer": "I comandi fissati compaiono sulla barra multifunzione. Passa sopra una riga per fissarla o rimuoverla.",
|
||||
"ui.ribbon_workspace": "Area di lavoro",
|
||||
"ui.right": "Destra",
|
||||
@@ -1737,6 +1797,7 @@
|
||||
"ui.smooth_wheel_zoom": "Zoom fluido con rotellina",
|
||||
"ui.smooth_wheel_zoom_tip": "Disattiva per applicare immediatamente ogni evento della rotellina, senza coda di interpolazione",
|
||||
"ui.snap": "Aggancio",
|
||||
"ui.space_mouse_axes_reassigned": "Gli assi sono riassegnati nelle Preferenze, e questo vale anche dopo questa calibrazione.",
|
||||
"ui.space_mouse_calibrate": "Calibra…",
|
||||
"ui.space_mouse_calibrate_tip": "Muovi la manopola come chiede la finestra, così SolidCraft impara in che direzione e quanto va ogni asse di questo mouse 3D. Viene salvata per questo mouse 3D.",
|
||||
"ui.space_mouse_calibrate_title": "Calibra mouse 3D",
|
||||
@@ -1746,12 +1807,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Un asse si è mosso appena, quindi non si può calibrare. Ricomincia e muovi la manopola più a fondo ogni volta.",
|
||||
"ui.space_mouse_dead_zone": "Zona morta",
|
||||
"ui.space_mouse_dead_zone_tip": "Quanto deve muoversi la manopola prima che si muova la vista, come quota della sua corsa completa. Aumentala se la vista si sposta con la manopola a riposo.",
|
||||
"ui.space_mouse_driven_by": "Quale movimento calibrato del dispositivo comanda questo asse. Se ne scegli uno già usato da un altro asse, i due si scambiano.",
|
||||
"ui.space_mouse_driven_by_label": "comandato da",
|
||||
"ui.space_mouse_driver": "Driver del mouse 3D",
|
||||
"ui.space_mouse_driver_auto": "Automatico",
|
||||
"ui.space_mouse_driver_direct": "Diretto (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Lettura diretta del dispositivo; spacenavd non è in esecuzione",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Lettura tramite spacenavd, l'unica possibilità disponibile",
|
||||
"ui.space_mouse_forget": "Dimentica calibrazione",
|
||||
"ui.space_mouse_hint": "Sposta e ruota la vista insieme; gli schizzi usano solo panoramica e zoom.",
|
||||
"ui.space_mouse_motion_rotation_x": "Rotazione X",
|
||||
"ui.space_mouse_motion_rotation_y": "Rotazione Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Rotazione Z",
|
||||
"ui.space_mouse_motion_translation_x": "Traslazione X",
|
||||
"ui.space_mouse_motion_translation_y": "Traslazione Y",
|
||||
"ui.space_mouse_motion_translation_z": "Traslazione Z",
|
||||
"ui.space_mouse_navigate": "Naviga con SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "Nessun mouse 3D trovato",
|
||||
"ui.space_mouse_not_calibrated": "Non calibrato",
|
||||
"ui.space_mouse_reading": "Lettura",
|
||||
"ui.space_mouse_reset_axes": "Ripristina assegnazione assi",
|
||||
"ui.space_mouse_step_lift": "Solleva la manopola, tienila, poi lasciala.",
|
||||
"ui.space_mouse_step_press": "Premi la manopola verso il basso, tienila, poi lasciala.",
|
||||
"ui.space_mouse_step_pull": "Tira la manopola verso di te, tienila, poi lasciala.",
|
||||
@@ -1765,6 +1840,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Inclina la manopola a destra (bordo destro in basso), tienila, poi lasciala.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Ruota la manopola in senso orario, tienila, poi lasciala.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Ruota la manopola in senso antiorario, tienila, poi lasciala.",
|
||||
"ui.space_mouse_view_axis": "Asse della vista",
|
||||
"ui.space_mouse_view_off": "Disattivato",
|
||||
"ui.space_mouse_view_off_tip": "Il profilo del driver del mouse 3D disattiva questo asse, quindi il suo movimento non muove la vista. Se qui scegli il movimento di un altro asse, i due si scambiano e quel movimento smette di muovere la vista.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Orbita sinistra / destra",
|
||||
"ui.space_mouse_view_orbit_up_down": "Orbita su / giù",
|
||||
"ui.space_mouse_view_pan_sideways": "Panoramica sinistra / destra",
|
||||
"ui.space_mouse_view_pan_up_down": "Panoramica su / giù",
|
||||
"ui.space_mouse_view_roll": "Rollio",
|
||||
"ui.space_mouse_view_unmapped": "Asse {n}",
|
||||
"ui.space_mouse_view_zoom": "Zoom",
|
||||
"ui.spacing": "Spaziatura",
|
||||
"ui.spacing_2": "Spaziatura 2",
|
||||
"ui.sphere": "Sfera",
|
||||
@@ -1836,6 +1921,7 @@
|
||||
"ui.workspace_design_tabs": "Modello · Superficie · Assembla · Inserisci · Ispeziona · Gestisci · Vista",
|
||||
"ui.workspace_drawing_description": "Disegni 2D con viste, quote e cartigli",
|
||||
"ui.workspace_footer": "Ogni area di lavoro opera sullo stesso progetto, cronologia e selezione; cambiano solo le schede della barra multifunzione. Il selettore è bloccato durante la modifica di uno schizzo o di una feature.",
|
||||
"ui.workspace_layout": "Disposizione dello spazio di lavoro",
|
||||
"ui.workspace_manufacture_description": "Slicing, percorsi utensile e impostazione",
|
||||
"ui.workspace_planned": "Pianificata",
|
||||
"ui.workspace_render_description": "Anteprima del prodotto, impostazioni della scena e immagini renderizzate",
|
||||
|
||||
@@ -14,11 +14,15 @@
|
||||
"Active": "アクティブ",
|
||||
"Active rule": "有効なルール",
|
||||
"Add": "追加",
|
||||
"Add Column": "列を追加",
|
||||
"Add Key": "キーを追加",
|
||||
"Add Mid Radius": "中間半径を追加",
|
||||
"Add Row": "行を追加",
|
||||
"Add a tool": "ツールを追加",
|
||||
"Add condition": "条件を追加",
|
||||
"Add or edit rule": "ルールを追加または編集",
|
||||
"Add to New Folder": "新しいフォルダーに追加",
|
||||
"Advanced": "詳細",
|
||||
"Against": "相手",
|
||||
"Alignment": "配置",
|
||||
"All Sketch Points": "すべてのスケッチ点",
|
||||
@@ -28,9 +32,11 @@
|
||||
"Also deletes": "同時に削除される要素:",
|
||||
"Angle 2": "角度 2",
|
||||
"Animate": "アニメーション",
|
||||
"App/system information and command settings are included. Review private details before sharing.": "アプリ・システム情報とコマンド設定が含まれます。共有前に非公開の情報を確認してください。",
|
||||
"Appearance name": "外観名",
|
||||
"Applied Radius": "適用半径",
|
||||
"Apply To": "適用先",
|
||||
"Apply library appearance": "ライブラリの外観を適用",
|
||||
"Apply to selection": "選択項目に適用",
|
||||
"Apply your appearance first. Exports assigned appearances and materials created in this design.": "先に外観を適用してください。割り当てた外観と、このデザインで作成したマテリアルを書き出します。",
|
||||
"Arc length": "円弧の長さ",
|
||||
@@ -41,13 +47,18 @@
|
||||
"BLEND SURFACE": "ブレンドサーフェス",
|
||||
"BOUNDARY SURFACE": "境界サーフェス",
|
||||
"BROWSER": "ブラウザ",
|
||||
"Bend Edges": "曲げエッジ",
|
||||
"Bend Line Position": "曲げ線位置",
|
||||
"Bend Position": "曲げ位置",
|
||||
"Bend Radius": "曲げ半径",
|
||||
"Bend Table": "曲げテーブル",
|
||||
"Bends": "曲げ",
|
||||
"Bodies": "ボディ",
|
||||
"Bodies (optional)": "ボディ (オプション)",
|
||||
"Body": "ボディ",
|
||||
"Body (last if none)": "ボディ (未指定時は最後)",
|
||||
"Body to split": "分割するボディ",
|
||||
"Body, or faces to take out": "ボディ、または取り除く面",
|
||||
"Boundary": "境界",
|
||||
"Bounding box": "境界ボックス",
|
||||
"CHECK": "チェック",
|
||||
@@ -59,7 +70,9 @@
|
||||
"CSV or JSON: updates existing parameters, adds new ones": "CSVまたはJSON:既存のパラメータを更新し、新しいパラメータを追加します",
|
||||
"Capture All Positions": "すべての位置をキャプチャ",
|
||||
"Capture Pos.": "位置を記録",
|
||||
"Catch Depth": "キャッチ深さ",
|
||||
"Catch Direction": "キャッチ方向",
|
||||
"Catch Length": "キャッチ長さ",
|
||||
"Cells": "セル",
|
||||
"Center X": "中心 X",
|
||||
"Center Y": "中心 Y",
|
||||
@@ -68,22 +81,30 @@
|
||||
"Chamfer Type": "面取りタイプ",
|
||||
"Check collisions": "衝突チェック",
|
||||
"Checked": "チェック済み",
|
||||
"Choose Variable radius or Spline in Type.": "タイプで Variable radius またはスプラインを選択してください。",
|
||||
"Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.": "新しい平面を選択してください。スケッチジオメトリと寸法は2次元座標系のまま維持されます。",
|
||||
"Choose…": "選択…",
|
||||
"Circular": "円形",
|
||||
"Circumference": "円周",
|
||||
"Close draft": "下書きを閉じる",
|
||||
"Collapse": "折りたたむ",
|
||||
"Collisions": "衝突",
|
||||
"Colour": "色",
|
||||
"Command": "コマンド",
|
||||
"Comment": "コメント",
|
||||
"Component 1": "コンポーネント 1",
|
||||
"Component 2": "コンポーネント 2",
|
||||
"Component1": "コンポーネント1",
|
||||
"Components": "コンポーネント",
|
||||
"Config Table": "構成テーブル",
|
||||
"Configuration": "構成",
|
||||
"Configuration rules": "構成ルール",
|
||||
"Contact": "接触",
|
||||
"Contact Sets": "接触セット",
|
||||
"Contact sets": "接触セット",
|
||||
"Continue on GitHub": "GitHubで続ける",
|
||||
"Continuity": "連続性",
|
||||
"Control Radius": "制御半径",
|
||||
"Copy Error Message": "エラーメッセージをコピー",
|
||||
"Copy Warning Message": "警告メッセージをコピー",
|
||||
"Copy all licences": "すべてのライセンスをコピー",
|
||||
@@ -93,8 +114,11 @@
|
||||
"Corner Relief": "コーナーリリーフ",
|
||||
"Corner Relief Shape": "コーナーリリーフ形状",
|
||||
"Counterbore depth": "座ぐり深さ",
|
||||
"Counterbore Ø": "座ぐり Ø",
|
||||
"Countersink angle": "皿穴角度",
|
||||
"Countersink Ø": "皿穴 Ø",
|
||||
"Create Issue — review draft": "Issueを作成 — 下書きの確認",
|
||||
"Create Issue…": "Issueを作成…",
|
||||
"Cross curves": "交差する曲線",
|
||||
"Cube": "キューブ",
|
||||
"Current orthographic view (1:1 mm)": "現在の平行投影(実寸・mm)",
|
||||
@@ -102,18 +126,28 @@
|
||||
"Curv. Comb": "曲率コーム",
|
||||
"Curvature (G2)": "曲率 (G2)",
|
||||
"Curvature change (G3)": "曲率変化 (G3)",
|
||||
"Custom": "カスタム",
|
||||
"Customize Toolbar": "ツールバーのカスタマイズ",
|
||||
"Customize…": "カスタマイズ…",
|
||||
"Cylindrical face": "円筒面",
|
||||
"Delete": "削除",
|
||||
"Delete Selected Features…": "選択したフィーチャーを削除…",
|
||||
"Delete Selected Folders": "選択したフォルダーを削除",
|
||||
"Delete all": "すべて削除",
|
||||
"Delete rule": "ルールを削除",
|
||||
"Delete the row": "行を削除",
|
||||
"Delete the set": "セットを削除",
|
||||
"Density": "密度",
|
||||
"Dependents": "依存先",
|
||||
"Describe the problem you saw": "発生した問題を説明してください",
|
||||
"Describe what happened before continuing.": "続ける前に、何が起きたか記入してください。",
|
||||
"Designs you open or save appear here.": "開いたデザインや保存したデザインがここに表示されます。",
|
||||
"Determined by To Object. Choose Angle to edit the angular extent.": "「対象オブジェクトまで」により決定されます。角度範囲を編集するには「角度」を選択してください。",
|
||||
"Diameter": "直径",
|
||||
"Direction": "方向",
|
||||
"Discard": "破棄",
|
||||
"Distance": "距離",
|
||||
"Distance 1": "距離 1",
|
||||
"Do not export hidden edges": "出力しない",
|
||||
"Don't ask again": "今後確認しない",
|
||||
"Double-click to rename": "ダブルクリックで名前変更",
|
||||
@@ -125,48 +159,65 @@
|
||||
"Edit Profile Sketch": "プロファイルスケッチを編集",
|
||||
"Enable rule": "ルールを有効化",
|
||||
"Enabled": "有効",
|
||||
"End Radius": "終了半径",
|
||||
"End bulge": "終了側の膨らみ",
|
||||
"End continuity": "終了側の連続性",
|
||||
"Expand": "展開",
|
||||
"Expected result (optional)": "期待した結果(任意)",
|
||||
"Explode": "分解",
|
||||
"Explode Text": "テキストを分解",
|
||||
"Export Animation…": "アニメーションをエクスポート…",
|
||||
"Export Bend Table…": "曲げテーブルを書き出す…",
|
||||
"Export CSV…": "CSVを書き出し…",
|
||||
"Export Current View as DXF": "現在の表示をDXFでエクスポート",
|
||||
"Export Current View as DXF…": "現在の表示をDXFでエクスポート…",
|
||||
"Export DXF": "DXF出力",
|
||||
"Export DXF…": "DXFをエクスポート…",
|
||||
"Export JSON…": "JSONを書き出し…",
|
||||
"Export design library...": "デザインライブラリを書き出す...",
|
||||
"Export hidden edges as dashed lines": "点線で出力",
|
||||
"Exported by SolidWorks, which usually saves Y up": "SolidWorks で書き出されたファイルです。通常は Y 軸が上になります",
|
||||
"Expression": "式",
|
||||
"Extend to meet": "交わるまで延長",
|
||||
"Extents": "範囲",
|
||||
"FILES": "ファイル",
|
||||
"FLAT": "展開",
|
||||
"Face": "面",
|
||||
"Face Appearance": "面の外観",
|
||||
"Face attachment lost": "面アタッチメントが失われました",
|
||||
"Faces": "面",
|
||||
"Faces / edges / vertices": "面 / エッジ / 頂点",
|
||||
"Faces to split": "分割する面",
|
||||
"Fastener": "締結部品",
|
||||
"Favorites": "お気に入り",
|
||||
"Favourite": "お気に入り",
|
||||
"Feature": "フィーチャー",
|
||||
"Files from many CAD programs have Y up, so they open lying on their back here (Z up).": "多くのCADではY軸を上向きとしているため、Z軸を上向きとするSolidCraftでは、読み込んだモデルが横倒しの向きで表示されることがあります。",
|
||||
"Filter": "フィルター",
|
||||
"Filter…": "フィルター…",
|
||||
"Find in Browser": "ブラウザで検索",
|
||||
"Finish": "終了",
|
||||
"First plane": "第1平面",
|
||||
"Fit and G2 corners require Constant radius.": "フィットと G2 コーナーには Constant radius が必要です。",
|
||||
"Fixed Face": "固定面",
|
||||
"Flat Pattern": "フラットパターン",
|
||||
"Flat size": "展開サイズ",
|
||||
"Follow camera (Look At sketches)": "カメラ追従(スケッチを正面視)",
|
||||
"Follow the camera (Look At sketches)": "カメラ追従(スケッチを正面視)",
|
||||
"Font": "フォント",
|
||||
"From": "開始",
|
||||
"From Bodies": "ボディから",
|
||||
"From edges": "開始側エッジ",
|
||||
"Full Length": "全長",
|
||||
"G2 corners require a constant radius and Exact fit. G2 corner construction is not supported yet.": "G2 コーナーには一定半径と Exact fit が必要です。G2 コーナーの構築はまだサポートされていません。",
|
||||
"Gap": "間隔",
|
||||
"Grid": "グリッド",
|
||||
"HISTORY": "履歴",
|
||||
"Height": "高さ",
|
||||
"Hidden edges": "隠線",
|
||||
"History layout": "履歴のレイアウト",
|
||||
"History names": "履歴名",
|
||||
"Hole (optional)": "穴 (オプション)",
|
||||
"Holes": "穴",
|
||||
"Holes (edges on them)": "穴(そのエッジ)",
|
||||
"Home view": "ホームビュー",
|
||||
@@ -177,14 +228,20 @@
|
||||
"In place (surfaces)": "その場で(サーフェス)",
|
||||
"In plane": "平面内",
|
||||
"Inside": "内側",
|
||||
"Instant": "即時",
|
||||
"Interface font": "インターフェースフォント",
|
||||
"Interferes": "干渉あり",
|
||||
"Invert": "反転",
|
||||
"Isocurve": "等パラメータ線",
|
||||
"Issue title": "Issueタイトル",
|
||||
"Items": "項目",
|
||||
"JOINTS": "ジョイント",
|
||||
"Joint Origin1": "ジョイント原点1",
|
||||
"Keep (points on it)": "残す部分(その上の点)",
|
||||
"Keep Tools": "ツールボディを保持",
|
||||
"Keep of the other surface": "相手のサーフェスで残す部分",
|
||||
"Key a joint's value at this step": "このステップでジョイントの値をキー設定",
|
||||
"Keys": "キー",
|
||||
"LIBRARY": "ライブラリ",
|
||||
"LINKS": "リンク",
|
||||
"Later": "後で",
|
||||
@@ -195,9 +252,14 @@
|
||||
"Letter Spacing": "文字間隔",
|
||||
"Library": "ライブラリ",
|
||||
"Library file": "ライブラリファイル",
|
||||
"Limits": "制限",
|
||||
"Line Spacing": "行間",
|
||||
"Line Type": "線種",
|
||||
"Listing the installed fonts…": "インストール済みフォントを一覧表示中…",
|
||||
"Load library": "ライブラリを読み込む",
|
||||
"Local library": "ローカルライブラリ",
|
||||
"Loop": "ループ",
|
||||
"M5 or M5x0.5": "M5 または M5x0.5",
|
||||
"MANAGE": "管理",
|
||||
"MATERIALS": "材料",
|
||||
"MODEL": "モデル",
|
||||
@@ -208,14 +270,20 @@
|
||||
"Matched restrictions check the final values.": "条件に一致する制限ルールが最終値を確認します。",
|
||||
"Material": "材料",
|
||||
"Max": "最大",
|
||||
"Maximum": "最大",
|
||||
"Mesh body": "メッシュボディ",
|
||||
"Mid Radius": "中間半径",
|
||||
"Middle double-click": "中ボタンのダブルクリック",
|
||||
"Min": "最小",
|
||||
"Minimum": "最小",
|
||||
"Mirror Plane": "ミラー平面",
|
||||
"Mitre": "留め継ぎ",
|
||||
"Model Parameters": "モデルパラメータ",
|
||||
"Modeled": "モデル化済み",
|
||||
"More toolbar panels": "その他のツールバーパネル",
|
||||
"Motion": "モーション",
|
||||
"Mouse gestures": "マウス ジェスチャ",
|
||||
"Mouse gestures only work with the SolidWorks mouse mode (the wheel orbits, Ctrl + wheel pans).": "マウス ジェスチャは SolidWorks マウス モードでのみ機能します(ホイールで回転、Ctrl + ホイールでパン)。",
|
||||
"Move / Copy": "移動 / コピー",
|
||||
"Move Type": "移動タイプ",
|
||||
"Move down": "下へ移動",
|
||||
@@ -232,16 +300,23 @@
|
||||
"No crash reports.": "クラッシュレポートはありません。",
|
||||
"No matching appearance presets.": "一致する外観プリセットはありません。",
|
||||
"No matching appearances": "一致する外観がありません",
|
||||
"No visible bodies to export.": "出力する表示中のボディがありません。",
|
||||
"No visible bodies or sketches to export.": "出力する表示中のボディまたはスケッチがありません。",
|
||||
"Nominal diameter": "呼び径",
|
||||
"None": "なし",
|
||||
"Not available yet": "まだ利用できません",
|
||||
"Notch": "ノッチ",
|
||||
"OUTPUT": "出力",
|
||||
"Of": "の値",
|
||||
"On your computer": "このコンピューター上",
|
||||
"Opacity": "不透明度",
|
||||
"Open GitHub draft": "GitHubの下書きを開く",
|
||||
"Open library...": "ライブラリを開く...",
|
||||
"Open local libraries in the desktop app. You can export this design's library here.": "ローカルライブラリはデスクトップアプリで開いてください。このデザインのライブラリはここで書き出せます。",
|
||||
"Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "Rust製オープンソース・パラメトリック3D CAD。ライセンス: MIT または Apache-2.0。",
|
||||
"Opens your browser and copies the report text for you to paste into GitHub.": "ブラウザーを開き、GitHubに貼り付ける報告本文をコピーします。",
|
||||
"Opens your browser. Review and submit your report on GitHub.": "ブラウザーを開きます。GitHubで内容を確認して投稿してください。",
|
||||
"Operator": "演算子",
|
||||
"Orbit (right drag)": "回転(右ドラッグ)",
|
||||
"Other side": "反対側",
|
||||
"Other surface (mutual trim)": "相手のサーフェス(相互トリム)",
|
||||
"Outside": "外側",
|
||||
@@ -256,8 +331,11 @@
|
||||
"Pick the tool bodies": "ツールボディを選択",
|
||||
"Picked": "選択したもの",
|
||||
"Picked point": "選択した点",
|
||||
"Pitch": "ピッチ",
|
||||
"Pivot": "ピボット",
|
||||
"Place at the origin instead": "代わりに原点に配置",
|
||||
"Plastic Rules": "樹脂ルール",
|
||||
"Play the joint's motion in the view": "ビューでジョイントの動きを再生",
|
||||
"Playback": "再生",
|
||||
"Plot": "グラフ",
|
||||
"Position": "位置",
|
||||
@@ -265,14 +343,18 @@
|
||||
"Position (G0)": "位置 (G0)",
|
||||
"Position along the edge, 0 at the start end, 1 at the other": "エッジ上の位置(始点が0、終点が1)",
|
||||
"Preferences › Design turns the offer back on": "環境設定 › デザイン で再びオンにできます",
|
||||
"Preview": "プレビュー",
|
||||
"Preview Row": "行をプレビュー",
|
||||
"Preview leaves the current design unchanged.": "プレビューは現在のデザインを変更しません。",
|
||||
"Profile / Edges": "プロファイル / エッジ",
|
||||
"Profiles or curves": "プロファイルまたは曲線",
|
||||
"Profiles/Curves": "プロファイル/曲線",
|
||||
"Quantity": "量",
|
||||
"RECENT": "最近使用した項目",
|
||||
"REFERENCE": "参照",
|
||||
"RULED SURFACE": "ルールドサーフェス",
|
||||
"RULES": "ルール",
|
||||
"Radius": "半径",
|
||||
"Radius Fit": "半径フィット",
|
||||
"Ratio": "比率",
|
||||
"Reattach selected face": "選択した面を再アタッチ",
|
||||
@@ -281,6 +363,8 @@
|
||||
"Rectangular": "長方形",
|
||||
"Reference face": "参照面",
|
||||
"Remove Tools": "ツールボディを削除",
|
||||
"Remove condition": "条件を削除",
|
||||
"Remove from Folder": "フォルダーから削除",
|
||||
"Remove from list": "リストから削除",
|
||||
"Remove override": "オーバーライドを削除",
|
||||
"Remove private design details or paths before sharing.": "共有前に、非公開の設計情報やファイルパスを削除してください。",
|
||||
@@ -288,12 +372,18 @@
|
||||
"Remove the column": "列を削除",
|
||||
"Remove the track": "トラックを削除",
|
||||
"Remove this point": "この点を削除",
|
||||
"Rename Feature": "フィーチャーの名前を変更",
|
||||
"Rename Folder": "フォルダーの名前を変更",
|
||||
"Replace existing library file": "既存のライブラリファイルを置き換える",
|
||||
"Report a bug — review a screenshot and open a GitHub draft": "バグを報告 — スクリーンショットを確認してGitHub下書きを作成",
|
||||
"Report text copied. Paste it into GitHub and submit your report there.": "報告本文をコピーしました。GitHubに貼り付けて投稿してください。",
|
||||
"Reports are public. A GitHub account is required.": "報告は公開されます。GitHubアカウントが必要です。",
|
||||
"Reset Toolbar": "ツールバーをリセット",
|
||||
"Resize Part": "部品サイズ変更",
|
||||
"Restore View": "ビューを復元",
|
||||
"Restore outer boundary": "外側の境界を復元",
|
||||
"Restore the inherited component or physical material appearance": "コンポーネントまたは物理マテリアルから継承した外観に戻す",
|
||||
"Restore this studio's tools": "このスタジオのツールを復元",
|
||||
"Result": "結果",
|
||||
"Retake screenshot": "スクリーンショットを再取得",
|
||||
"Reverse": "反転",
|
||||
@@ -303,7 +393,14 @@
|
||||
"Revert Pos.": "位置を復元",
|
||||
"Revert Position": "位置を元に戻す",
|
||||
"Review the report and screenshot before opening GitHub.": "GitHubを開く前にレポートとスクリーンショットを確認してください。",
|
||||
"Review your report on GitHub and click Submit new issue to publish it.": "GitHubで内容を確認し、Submit new issueをクリックすると公開されます。",
|
||||
"Rib Length": "リブの長さ",
|
||||
"Rib Offset": "リブのオフセット",
|
||||
"Rib Thickness": "リブの厚さ",
|
||||
"Ribs": "リブ",
|
||||
"Rim Edge": "リムエッジ",
|
||||
"Ring of tools on the right button": "右ボタンのツールリング",
|
||||
"Roll Back Here": "ここまでロールバック",
|
||||
"Roll History Marker Here": "履歴マーカーをここに移動",
|
||||
"Round": "丸め",
|
||||
"Rule": "ルール",
|
||||
@@ -313,20 +410,27 @@
|
||||
"SURFACE QUALITY": "サーフェス品質",
|
||||
"Save Rule": "ルールを保存",
|
||||
"Save View": "ビューを保存",
|
||||
"Save screenshot…": "スクリーンショットを保存…",
|
||||
"Save the study as an animated GIF, seen as the viewport shows it": "ビューポートの表示どおりにスタディをアニメーション GIF として保存",
|
||||
"Saved preview. Geometry is being checked before editing.": "保存済みのプレビューです。編集前にジオメトリを検証しています。",
|
||||
"Scale factor": "尺度係数",
|
||||
"Scene": "シーン",
|
||||
"Screenshot (optional)": "スクリーンショット(任意)",
|
||||
"Search": "検索",
|
||||
"Search commands": "コマンドを検索",
|
||||
"Search this library": "このライブラリを検索",
|
||||
"Second plane": "第2平面",
|
||||
"Section": "断面",
|
||||
"Sections (one sketch each)": "セクション (各1スケッチ)",
|
||||
"Select Other": "その他を選択",
|
||||
"Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).": "その他を選択: モデル上で左ボタンを長押し(または右クリック › その他を選択…)するとカーソル下の要素が一覧表示されます。同じ場所を再度クリックすると次の要素が選択されます。中ボタンをダブルクリックするとホームビューに戻ります(環境設定 › ナビゲーション)。",
|
||||
"Select bodies (a face picks its body)": "ボディを選択(面をクリックするとそのボディが選択されます)",
|
||||
"Select bodies or faces instead": "代わりにボディまたは面を選択",
|
||||
"Select edges": "エッジを選択",
|
||||
"Selection filter": "選択フィルター",
|
||||
"Semantic faces share their appearance across instances.": "セマンティック面はインスタンス間で外観を共有します。",
|
||||
"Send your report on GitHub": "GitHubでレポートを送信",
|
||||
"Shaded": "シェーディング",
|
||||
"Shape": "形状",
|
||||
"Sheet Rules": "板金ルール",
|
||||
"Show Agent Cursor": "エージェントカーソルを表示",
|
||||
@@ -344,6 +448,7 @@
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "これらのデザインが保存される前にSolidCraftが終了しました。最後の自動保存ファイルを開くことができます。",
|
||||
"Specialise": "特殊操作",
|
||||
"Speed": "速度",
|
||||
"Splitting tool": "分割ツール",
|
||||
"Stand it up": "正立させる",
|
||||
"Stand it up: a quarter turn about X, as one Move feature you can undo.": "正立させる: 取り消し可能な1つの移動フィーチャーとして、X軸周りに90度回転します。",
|
||||
"Stand this part up?": "このパーツを正立させますか?",
|
||||
@@ -351,17 +456,27 @@
|
||||
"Start continuity": "開始側の連続性",
|
||||
"Step": "ステップ",
|
||||
"Steps": "ステップ数",
|
||||
"Steps to reproduce (optional)": "再現手順(任意)",
|
||||
"Stitch the kept pieces": "残した部分をステッチ",
|
||||
"Stitch to both bodies": "両方のボディにステッチ",
|
||||
"Studio": "スタジオ",
|
||||
"Study": "スタディ",
|
||||
"Style": "スタイル",
|
||||
"Summary": "概要",
|
||||
"Suppress": "抑制",
|
||||
"Suppressed": "抑制",
|
||||
"Surface": "サーフェス",
|
||||
"Surface, or faces to turn over": "サーフェス、または裏返す面",
|
||||
"Swap Ends": "端点を入れ替え",
|
||||
"TRIM": "トリム",
|
||||
"Tangent (G1)": "接線 (G1)",
|
||||
"Tangent Chain": "正接チェーン",
|
||||
"Tangent chain": "接線チェーン",
|
||||
"Tap drill diameter": "タップ下穴径",
|
||||
"Target": "ターゲット",
|
||||
"Target Body": "ターゲットボディ",
|
||||
"Tear": "引き裂き",
|
||||
"Technical details": "技術情報",
|
||||
"The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "破線のスケッチは保存された平面ガイドです。新しい面を選択してアタッチメントを修復してください。",
|
||||
"The saved author occurrence is missing. Select a valid author placement before rebinding.": "保存された作成元のオカレンスが見つかりません。再バインドする前に有効な作成元配置を選択してください。",
|
||||
"Then": "次を実行 (Then)",
|
||||
@@ -373,24 +488,32 @@
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "この子要素は共有されています。削除すると親のすべてのコピーから削除されます。",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "この子要素は共有されています。位置の変更は親のすべてのコピーに適用されます。",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "この面は安定したアタッチメントを提供できません。別の面を選択するか、固定平面を明示的に使用してください。",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "この画像はまだGitHubに添付されていません。コピーまたは保存し、GitHubで添付してください。",
|
||||
"To": "終了",
|
||||
"To Offset": "オフセットまで",
|
||||
"To edges": "終了側エッジ",
|
||||
"Tolerance": "公差",
|
||||
"Too close": "近すぎる",
|
||||
"Tool Bodies": "ツールボディ",
|
||||
"Tools": "ツール",
|
||||
"Tools, clockwise from the top": "上から時計回りにツール",
|
||||
"Trimming tool (plane, face or curves)": "トリムツール(平面、面、または曲線)",
|
||||
"Turn off section analysis before exporting the view.": "断面解析をオフにしてからエクスポートしてください。",
|
||||
"Type": "タイプ",
|
||||
"UNTRIM": "トリム解除",
|
||||
"Unit": "単位",
|
||||
"Unsuppress": "抑制を解除",
|
||||
"Updating the preview": "プレビューを更新中",
|
||||
"Use active author placement": "アクティブな作成元配置を使用",
|
||||
"Use fixed plane": "固定平面を使用",
|
||||
"Use saved fixed plane": "保存された固定平面を使用",
|
||||
"Use selected face as fixed plane": "選択した面を固定平面として使用",
|
||||
"Use the SolidWorks mouse mode": "SolidWorks マウス モードを使用",
|
||||
"User Parameters": "ユーザーパラメータ",
|
||||
"VIEW": "表示",
|
||||
"VIEWS": "ビュー",
|
||||
"Value": "値",
|
||||
"Variable Radius": "可変半径",
|
||||
"Velocity": "速度",
|
||||
"Vertices": "頂点",
|
||||
"View navigator": "ビューナビゲーター",
|
||||
@@ -398,16 +521,50 @@
|
||||
"Wall": "肉厚",
|
||||
"Wall Location": "壁の位置",
|
||||
"Wall Thickness": "壁の厚さ",
|
||||
"What did you do just before the problem? A short list is enough": "問題の直前に行った操作を簡単に記入してください",
|
||||
"What did you expect to see?": "どのような結果を期待していましたか?",
|
||||
"What happened?": "何が起きましたか?",
|
||||
"When": "条件 (When)",
|
||||
"Width": "幅",
|
||||
"Will fail": "失敗します",
|
||||
"With gestures on, the right button no longer orbits the view: hold it and move to open the ring, then touch a tool's zone. A plain right-click still opens the menu.": "マウス ジェスチャがオンのとき、右ボタンではビューを回転しません。押したまま動かすとツールリングが開くので、ツールのゾーンに触れてください。通常の右クリックでは引き続きメニューが開きます。",
|
||||
"X": "X",
|
||||
"X Angle": "X 角度",
|
||||
"X angle": "X角度",
|
||||
"X distance": "X距離",
|
||||
"Y": "Y",
|
||||
"Y Angle": "Y 角度",
|
||||
"Y angle": "Y角度",
|
||||
"Y distance": "Y距離",
|
||||
"Z": "Z",
|
||||
"Z Angle": "Z 角度",
|
||||
"Z Distance": "Z 距離",
|
||||
"Z angle": "Z角度",
|
||||
"Z distance": "Z距離",
|
||||
"Zebra": "ゼブラ",
|
||||
"ai.prefs.availability": "アシスタントの操作",
|
||||
"ai.prefs.background_commands": "エージェントのコマンドをバックグラウンドで実行",
|
||||
"ai.prefs.follow_camera": "カメラをスケッチに向ける",
|
||||
"ai.prefs.follow_camera_off": "カメラの自動追従はオフです。",
|
||||
"ai.prefs.follow_camera_on": "エージェントが作成するスケッチにカメラを向けます。",
|
||||
"ai.prefs.intro": "エージェント、権限、作業の表示方法を設定します。",
|
||||
"ai.prefs.make_default": "既定にする",
|
||||
"ai.prefs.no_agents": "エージェントはまだありません。追加するか、更新してインストール済みのエージェントを検索してください。",
|
||||
"ai.prefs.no_saved_approvals": "保存された許可はありません。",
|
||||
"ai.prefs.override_all_warning": "このエージェントは確認せずに設計を保存、上書き、書き出し、置換できます。",
|
||||
"ai.prefs.permission_all": "すべて許可",
|
||||
"ai.prefs.permission_all_summary": "利用可能なSolidCraftツールを確認せず実行します。",
|
||||
"ai.prefs.permission_ask": "変更前に確認",
|
||||
"ai.prefs.permission_ask_summary": "設計の変更とファイル操作を毎回確認します。",
|
||||
"ai.prefs.permission_edits": "モデル編集を許可",
|
||||
"ai.prefs.permission_edits_summary": "モデル編集は自動実行。ファイル操作や破壊的な操作は確認します。",
|
||||
"ai.prefs.permission_scope": "SolidCraftツールのみに適用されます。エージェントのシェルやファイル編集には、そのエージェント自身の権限設定が適用されます。",
|
||||
"ai.prefs.pointer_preview_hidden": "ポインターは非表示",
|
||||
"ai.prefs.pointer_preview_speed": "エージェントのポインター · {speed}",
|
||||
"ai.prefs.pointer_speed": "移動速度",
|
||||
"ai.prefs.privacy_note": "会話は選択したエージェントまたはエンドポイントにのみ送信されます。エンドポイントのキーはシステムのキーチェーンに保存されます。",
|
||||
"ai.prefs.show_pointer": "エージェントのポインターを表示",
|
||||
"ai.prefs.turn_limit_hint": "アシスタントが1件のメッセージで行える、設計を変更するツール呼び出しの上限です。",
|
||||
"angle, height": "角度, 高さ",
|
||||
"appearance.dielectric_ior": "誘電体の屈折率",
|
||||
"appearance.metallic": "金属度",
|
||||
@@ -453,8 +610,10 @@
|
||||
"cmd.component_activate": "コンポーネントをアクティブ化",
|
||||
"cmd.component_break_link": "リンクを解除",
|
||||
"cmd.component_capture_position": "位置をキャプチャ",
|
||||
"cmd.component_copies": "同一のコピーを検索",
|
||||
"cmd.component_create": "新規コンポーネント",
|
||||
"cmd.component_delete": "コンポーネントを削除",
|
||||
"cmd.component_extract": "ファイルに抽出",
|
||||
"cmd.component_from_bodies": "ボディからコンポーネントを作成",
|
||||
"cmd.component_insert_design": "デザインを挿入",
|
||||
"cmd.component_links": "リンクを一覧表示",
|
||||
@@ -467,6 +626,7 @@
|
||||
"cmd.component_properties": "コンポーネントの物理的プロパティ",
|
||||
"cmd.component_relink": "参照元を再リンク",
|
||||
"cmd.component_rename": "コンポーネントの名前を変更",
|
||||
"cmd.component_replace_with_link": "リンクに置き換え",
|
||||
"cmd.component_revert_position": "位置を元に戻す",
|
||||
"cmd.component_unlock": "内容のロックを解除",
|
||||
"cmd.component_update_links": "リンクを更新",
|
||||
@@ -584,6 +744,7 @@
|
||||
"cmd.motion_plot": "モーション スタディのグラフ",
|
||||
"cmd.motion_study": "モーション スタディ",
|
||||
"cmd.motion_trace": "モーション トレース",
|
||||
"cmd.motion_trace_edit": "モーション トレースを編集",
|
||||
"cmd.motion_trace_keep": "モーション トレースを保持",
|
||||
"cmd.occurrence_copy": "貼り付け(インスタンス)",
|
||||
"cmd.occurrence_ground": "空間固定",
|
||||
@@ -758,6 +919,7 @@
|
||||
"cmd.view_graphics_preset": "グラフィックスプリセット",
|
||||
"cmd.view_list": "名前付きビューを一覧表示",
|
||||
"cmd.view_navigate": "ビューナビゲーション",
|
||||
"cmd.view_normal_to": "選択アイテムに垂直",
|
||||
"cmd.view_rename": "名前付きビューの名前を変更",
|
||||
"cmd.view_save": "新規名前付きビュー",
|
||||
"color.copy": "クリックして色の値をコピー",
|
||||
@@ -831,7 +993,7 @@
|
||||
"dxf.progress.projection": "形状を投影中 (3/5)",
|
||||
"dxf.progress.write": "DXFを書き込み中 (5/5)",
|
||||
"dxf.tolerance": "曲線の許容誤差",
|
||||
"dxf.tolerance_help": "表示中のボディを出力し、曲線は線分で近似します。許容誤差を小さくすると曲線が滑らかになりますが、処理時間とメモリ使用量が増えます。",
|
||||
"dxf.tolerance_help": "表示中のボディとスケッチを出力し、曲線は線分で近似します。許容誤差を小さくすると曲線が滑らかになりますが、処理時間とメモリ使用量が増えます。",
|
||||
"file_load.built": "構築済み: 全{total}フィーチャー中{built}件。",
|
||||
"file_load.converting": "ソリッドを変換中: {done}/{total}",
|
||||
"file_load.inserting": "ジオメトリを挿入中",
|
||||
@@ -862,19 +1024,57 @@
|
||||
"help.solid.revolve": "スケッチの輪郭を軸のまわりに回転させ、丸い立体を作ります。軸、つまみ、ボウルなど、中心線まわりに丸い部品に使います。",
|
||||
"help.solid.shell": "立体の中をくり抜き、指定した厚さの壁を残します。選んだ面を開口にすることもできます。箱、カバーなどの薄肉の部品に使います。",
|
||||
"help.third_party": "サードパーティライセンス",
|
||||
"home.back": "{name} に戻る",
|
||||
"home.crashes": "クラッシュレポート",
|
||||
"home.design_workspace": "デザイン",
|
||||
"home.documentation": "ドキュメント",
|
||||
"home.export": "エクスポート",
|
||||
"home.export_hint": "現在のデザインの出力形式を選択してください。",
|
||||
"home.export_json_hint": "編集可能なデザインとコマンド履歴",
|
||||
"home.export_mesh_hint": "印刷や共有用のメッシュ",
|
||||
"home.export_step_hint": "精密なソリッド形状",
|
||||
"home.import": "インポート…",
|
||||
"home.import_hint": "STEP、IGES、またはメッシュを新しいデザインに読み込みます",
|
||||
"home.in_this_browser": "このブラウザ内",
|
||||
"home.missing": "見つかりません",
|
||||
"home.month_01": "1月",
|
||||
"home.month_02": "2月",
|
||||
"home.month_03": "3月",
|
||||
"home.month_04": "4月",
|
||||
"home.month_05": "5月",
|
||||
"home.month_06": "6月",
|
||||
"home.month_07": "7月",
|
||||
"home.month_08": "8月",
|
||||
"home.month_09": "9月",
|
||||
"home.month_10": "10月",
|
||||
"home.month_11": "11月",
|
||||
"home.month_12": "12月",
|
||||
"home.new_inches": "新しいデザイン(インチ)",
|
||||
"home.new_inches_hint": "インチ · デザインで開きます",
|
||||
"home.new_mm": "新しいデザイン",
|
||||
"home.new_mm_hint": "ミリメートル · デザインで開きます",
|
||||
"home.open": "開く…",
|
||||
"home.opened_days_ago": "{count} 日前に開きました",
|
||||
"home.opened_hours_ago": "{count} 時間前に開きました",
|
||||
"home.opened_just_now": "たった今開きました",
|
||||
"home.opened_minutes_ago": "{count} 分前に開きました",
|
||||
"home.open_hint": ".solidcraft 形式のデザイン ({shortcut})",
|
||||
"home.open_now": "今すぐ開く",
|
||||
"home.opened_days_ago": "{count} 日前",
|
||||
"home.opened_hours_ago": "{count} 時間前",
|
||||
"home.opened_just_now": "たった今",
|
||||
"home.opened_minutes_ago": "{count} 分前",
|
||||
"home.opening": "開いています…",
|
||||
"home.properties": "デザインのプロパティ",
|
||||
"home.recent": "最近使用した項目",
|
||||
"home.recent_empty": "開いたり保存したデザインがここに表示されます。",
|
||||
"home.recovery_count": "復元可能なデザイン: {count} 件",
|
||||
"home.recovery_empty": "復元可能なデザインはありません。",
|
||||
"home.recovery_hint": "これらのデザインが保存される前に SolidCraft が終了しました。",
|
||||
"home.report_issue": "問題を報告",
|
||||
"home.samples": "サンプル",
|
||||
"home.settings": "設定",
|
||||
"home.short_date": "{month}{day}日",
|
||||
"home.shortcuts": "キーボードショートカット",
|
||||
"home.start_hint": "デザインを作成するか、最近使ったファイルを開くか、サンプルをご覧ください。",
|
||||
"home.whats_new": "新機能",
|
||||
"home.yesterday": "昨日",
|
||||
"install.button_tip": "SolidCraft をアプリとしてインストールします。専用のウィンドウで開き、オフラインでも使えます",
|
||||
"install.dock_1": "「ファイル」›「Dockに追加」を選びます。",
|
||||
"install.dock_2": "「追加」をクリックします。",
|
||||
@@ -932,6 +1132,15 @@
|
||||
"motion.to_end": "最後へ",
|
||||
"motion.to_start": "最初へ",
|
||||
"motion.track_name": "トラック {number}",
|
||||
"nav.alias.help": "Shift+Alt+左ドラッグで回転、Shift+Alt+中ドラッグでパン、Shift+Alt+右ドラッグでズーム。中ドラッグでもパン、右ドラッグで回転。",
|
||||
"nav.blender.help": "中ドラッグで回転、Shift+中ドラッグでパン、Ctrl+中ドラッグでズーム。右ドラッグではカメラは動きません。",
|
||||
"nav.free_orbit.help": "マウスと3Dマウスで、極点を越えて回転し、ロールを保ちます。\nShiftによる軸スナップは無効になります。",
|
||||
"nav.free_orbit.label": "自由回転",
|
||||
"nav.fusion.help": "中ドラッグでパン、Shift+中ドラッグで回転、右ドラッグで回転。",
|
||||
"nav.inventor.help": "中ドラッグでパン、Shift+中ドラッグで回転、Ctrl+中ドラッグでズーム、右ドラッグで回転。",
|
||||
"nav.openscad.help": "空きスペースで左ドラッグすると回転、Shift+左ドラッグで矩形選択、スケッチ ジオメトリはドラッグで編集。右または中ドラッグでパン、Shift+右または Shift+中ドラッグでズーム。",
|
||||
"nav.solidworks.help": "中ドラッグで回転、Ctrl+中ドラッグでパン、Shift+中ドラッグでズーム、右ドラッグで回転。",
|
||||
"nav.tinkercad.help": "右ドラッグで回転、中ドラッグまたは Shift+右ドラッグでパン。",
|
||||
"nav.touchpad.help": "Shift を押しながらポインターを動かすとパン、Alt/Option を押しながら動かすと回転します。マウスボタンは不要です。縦スクロールでズームします。",
|
||||
"nav.touchpad.label": "タッチパッド",
|
||||
"nav.touchpad.orbit": "回転(Alt/Option を押しながら移動、マウスボタン不要)",
|
||||
@@ -954,8 +1163,130 @@
|
||||
"pattern.flip_direction": "方向を反転",
|
||||
"pick a hole to seat it, or OK places it at the origin": "配置先の穴を選択するか、[OK]を押すと原点に配置します。",
|
||||
"pick one or two vertices, edges or faces": "1つまたは2つの頂点、エッジ、面を選択",
|
||||
"prefs.add_item": "項目を追加",
|
||||
"prefs.alt_frees_manipulators": "Alt / Option でマニピュレーターの矢印も自由に動かす",
|
||||
"prefs.anti_aliasing_note": "輪郭のぎざぎざを滑らかにします。",
|
||||
"prefs.applies_on_restart": "再起動後に適用",
|
||||
"prefs.assistant": "アシスタント",
|
||||
"prefs.axes": "軸",
|
||||
"prefs.axis": "軸",
|
||||
"prefs.bottom": "下",
|
||||
"prefs.browser": "ブラウザー",
|
||||
"prefs.built_in": "組み込み",
|
||||
"prefs.button_left": "左ドラッグ",
|
||||
"prefs.button_middle": "中央ドラッグ",
|
||||
"prefs.button_right": "右ドラッグ",
|
||||
"prefs.choose_font": "フォントファイルを選択…",
|
||||
"prefs.click": "クリック",
|
||||
"prefs.contact_shading": "柔らかな接触陰影",
|
||||
"prefs.contact_shading_note": "部品が近接する部分に柔らかな陰影を付けます。",
|
||||
"prefs.context_menu": "コンテキストメニュー",
|
||||
"prefs.context_menu_ring": "コンテキストメニュー · 長押しで放射状メニュー",
|
||||
"prefs.cpu": "CPU(ソフトウェア)",
|
||||
"prefs.crash_reports": "クラッシュレポートを開く…",
|
||||
"prefs.crash_reports_note": "問題を再現する設計とコマンドを含むレポートをこのコンピューターに保存します。",
|
||||
"prefs.ctrl_cmd": "Ctrl / Cmd",
|
||||
"prefs.curved_surfaces": "曲面",
|
||||
"prefs.curves": "曲面",
|
||||
"prefs.dead_zone_note": "斜線の帯はデッドゾーンです。この範囲内の動きは無視されます。",
|
||||
"prefs.default": "既定",
|
||||
"prefs.design": "設計の既定値",
|
||||
"prefs.design_note": "新しいデザインの初期設定です。開いているデザインはそれぞれの設定を保持します。",
|
||||
"prefs.devices": "3D マウス",
|
||||
"prefs.display": "表示",
|
||||
"prefs.edges": "エッジと陰影",
|
||||
"prefs.extend": "拡張",
|
||||
"prefs.extra_navigation": "何もない場所でCtrl+左ドラッグすると回転し、Spaceを押しながらドラッグすると移動します。",
|
||||
"prefs.follows_os": "OS の設定に従う",
|
||||
"prefs.font": "フォント",
|
||||
"prefs.font_fallback": "選択したフォントにない文字は組み込みフォントで表示し、ラベルが空の四角になるのを防ぎます。",
|
||||
"prefs.font_sample": "いろはにほへと · Ø12.50 mm · 45.0° · 0123456789",
|
||||
"prefs.font_unreadable": "選択したフォントを読み込めませんでした。",
|
||||
"prefs.general": "一般",
|
||||
"prefs.general_note": "言語、保存、更新。",
|
||||
"prefs.gesture_orbit": "回転",
|
||||
"prefs.gesture_pan": "移動",
|
||||
"prefs.gesture_zoom": "ズーム",
|
||||
"prefs.graphics": "グラフィックス",
|
||||
"prefs.graphics_note": "速度と滑らかさのバランスを調整します。各選択肢の効果をサンプルで確認できます。",
|
||||
"prefs.graphics_presets_note": "プリセットは以下の設定をまとめて変更します。",
|
||||
"prefs.history": "履歴",
|
||||
"prefs.hold_stop_snapping": "押している間スナップを解除",
|
||||
"prefs.icons_only": "アイコンのみ",
|
||||
"prefs.imported_file": "読み込んだファイル",
|
||||
"prefs.input": "入力",
|
||||
"prefs.interface": "インターフェース",
|
||||
"prefs.interface_language": "表示言語",
|
||||
"prefs.interface_note": "SolidCraft の外観と各パネルの配置。",
|
||||
"prefs.interval_minutes": "{n} 分",
|
||||
"prefs.labels": "ラベル",
|
||||
"prefs.layout": "レイアウト",
|
||||
"prefs.layout_note": "コンパクトではパネルをウィンドウの端に固定します。ブラウザーの半透明表示はフローティングで使用できます。アシスタントの配置はアシスタントページで変更します。",
|
||||
"prefs.left": "左",
|
||||
"prefs.left_click": "左クリック",
|
||||
"prefs.live_input": "現在の入力",
|
||||
"prefs.live_preview": "ライブプレビュー",
|
||||
"prefs.minutes": "分",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "マウスとトラックパッド",
|
||||
"prefs.mouse_heading": "マウス",
|
||||
"prefs.mouse_mapping": "マウスの割り当て",
|
||||
"prefs.navigation": "ナビゲーション",
|
||||
"prefs.navigation_note": "マウス、トラックパッド、3Dマウスによるビューの操作。",
|
||||
"prefs.not_on_gpu": "この GPU は非対応",
|
||||
"prefs.on": "オン",
|
||||
"prefs.opaque": "不透明",
|
||||
"prefs.orbit_snap": "回転中にShiftを押すと軸にスナップします。",
|
||||
"prefs.orientation": "方向",
|
||||
"prefs.overall_speed": "全体の速度",
|
||||
"prefs.preview_choices": "選択した設定のプレビュー",
|
||||
"prefs.quality_default": "既定",
|
||||
"prefs.quality_fastest": "最速",
|
||||
"prefs.quality_slowest": "最も低速",
|
||||
"prefs.quality_smoother": "より滑らか",
|
||||
"prefs.reports_saved": "{n} 件保存済み",
|
||||
"prefs.right_click": "右クリック",
|
||||
"prefs.saving": "自動保存と復元",
|
||||
"prefs.scale_note": "ウィンドウ内では Ctrl + / Ctrl − でも変更できます。100% のボタンは 28 px です。",
|
||||
"prefs.scale_text": "拡大率と文字",
|
||||
"prefs.select": "選択",
|
||||
"prefs.select_one_item": "項目を 1 つ選択",
|
||||
"prefs.selecting": "選択",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift は追加のみ、Ctrl / Cmd は選択を切り替え",
|
||||
"prefs.shift_add_note": "オン:Shift は追加、Ctrl / Cmd は選択を切り替えます。オフ(既定):どちらも選択を切り替えます。",
|
||||
"prefs.shortcuts": "ショートカット",
|
||||
"prefs.sketch_selection": "スケッチと選択",
|
||||
"prefs.sketch_selection_heading": "スケッチと選択",
|
||||
"prefs.sketch_selection_note": "スケッチのスナップとクリックによる選択。",
|
||||
"prefs.sketching": "スケッチ",
|
||||
"prefs.snap_drawing_note": "スケッチの描画中または点のドラッグ中に使用します。",
|
||||
"prefs.source": "入力元",
|
||||
"prefs.speed": "速度",
|
||||
"prefs.stand_up_note": "STEP または IGES ファイルを Z 上向きで開いた後、X 軸周りに 90° 回転するか確認します。",
|
||||
"prefs.status_done": "完了",
|
||||
"prefs.status_error": "エラー",
|
||||
"prefs.status_selected": "選択中",
|
||||
"prefs.status_warning": "警告",
|
||||
"prefs.supersampling_brief": "大きく描画して縮小するため、非常に鮮明になりますが負荷も増えます。",
|
||||
"prefs.tab_accent_note": "アクセント色はアクティブなタブに従います",
|
||||
"prefs.theme_file": "テーマファイル",
|
||||
"prefs.timeline_half_hour": "−30 分",
|
||||
"prefs.timeline_now": "現在",
|
||||
"prefs.timeline_quarter_hour": "−15",
|
||||
"prefs.toggle_item": "項目を追加、または選択から外す",
|
||||
"prefs.toolbar": "ツールバー",
|
||||
"prefs.translucent": "半透明",
|
||||
"prefs.under_browser": "ブラウザー下",
|
||||
"prefs.under_cursor": "カーソル下",
|
||||
"prefs.units_precision": "単位と精度",
|
||||
"prefs.updates": "更新",
|
||||
"prefs.view": "ビューの動作",
|
||||
"prefs.viewport": "ビューポート",
|
||||
"prefs.wheel": "ホイール",
|
||||
"prefs.wheel_trackpad": "ホイールとトラックパッド",
|
||||
"prefs.workspace": "ワークスペース",
|
||||
"prefs.zoom_toward_cursor": "カーソルに向かってズーム",
|
||||
"properties.title": "プロパティ: {name}",
|
||||
"recovery.days_ago": "{count}日前",
|
||||
"recovery.detail": "{file} · {features}フィーチャー · 自動保存: {when}",
|
||||
@@ -1026,8 +1357,8 @@
|
||||
"search.suggest": "{label} ですか?",
|
||||
"search.try": "コマンド名、このデザインのフィーチャー、またはパラメーターを入力します。値を指定して実行するには、IDとJSONオブジェクトを入力します:{example}",
|
||||
"search.valid": "有効",
|
||||
"settings.display_quality_note": "細かいほど曲面とエッジが滑らかに表示されますが、メッシュの生成に時間がかかります。変わるのはビューポートだけで、設計やエクスポートは変わりません。",
|
||||
"settings.frame_rate_note": "ビューの右下に 1 秒あたりのフレーム数を表示します。オンの間、ビューは常に再描画されます。",
|
||||
"settings.display_quality_note": "表示だけに影響します。設計や書き出しは変わりません。",
|
||||
"settings.frame_rate_note": "ビューの右下に 1 秒あたりのフレーム数を表示します。",
|
||||
"settings.measure_axis_distances": "計測のX・Y・Z距離を表示",
|
||||
"settings.measure_axis_distances_help": "計測ダイアログを開いている間、2点間距離に加えてワールドX・Y・Z軸方向の寸法線と距離を表示します。",
|
||||
"settings.msaa_applies_on_restart": "アンチエイリアスは次回 SolidCraft を起動したときに適用されます",
|
||||
@@ -1036,6 +1367,7 @@
|
||||
"settings.reset_intro": "次の設定はこのコンピューターでは使用できず、SolidCraft が起動できなくなるため変更されました:",
|
||||
"settings.reset_title": "設定が変更されました",
|
||||
"settings.supersampling_note": "ビューを高い解像度で描画してから縮小します。4K 未満の画面でエッジ、線、グリッドが滑らかになります。GPU の負荷が増えます(1.5× で約 2.25 倍、2× で 4 倍のピクセル)。",
|
||||
"sheet.no_body": "板金ボディがありません。フランジ > Base で作成するか、板金に変換でプレートを板金に変換してください(広い平面を選択)。",
|
||||
"shortcut.json_error": "パラメータはJSON形式で指定してください: {error}",
|
||||
"shortcut.no_command": "コマンド`{id}`がありません。JSONの前のテキストはコマンドIDである必要があります",
|
||||
"shortcut.pin": "Sボックスの先頭にピン留め",
|
||||
@@ -1072,6 +1404,9 @@
|
||||
"thread.designation": "ねじの呼び",
|
||||
"thread.iso_metric": "ISOメートルねじ",
|
||||
"thread.select_size": "サイズを選択",
|
||||
"timeline.delete_after_marker_one": "履歴マーカー以降の 1 個のフィーチャーを削除",
|
||||
"timeline.delete_after_marker_other": "履歴マーカー以降の {count} 個のフィーチャーを削除",
|
||||
"timeline.delete_many": "選択した {count} 個のフィーチャーを削除",
|
||||
"timeline.group": "フィーチャーフォルダを新規作成",
|
||||
"timeline.move_many": "タイムライン項目を移動",
|
||||
"timeline.move_to_group": "フィーチャーをフォルダへ移動",
|
||||
@@ -1098,6 +1433,7 @@
|
||||
"ui.agent_chat_add": "ファイルを添付",
|
||||
"ui.agent_chat_add_file": "ファイルを選択…",
|
||||
"ui.agent_chat_allow": "許可",
|
||||
"ui.agent_chat_allow_once": "今回のみ許可",
|
||||
"ui.agent_chat_allowed": "許可しました",
|
||||
"ui.agent_chat_answered": "回答: {option}",
|
||||
"ui.agent_chat_approval": "エージェントにこの操作を許可しますか?",
|
||||
@@ -1149,12 +1485,16 @@
|
||||
"ui.agent_chat_files_left_out": "1 つのメッセージで送れるファイルは {max} 個までです。送らなかったファイル: {files}",
|
||||
"ui.agent_chat_files_loading": "ファイルの読み込みを待っています",
|
||||
"ui.agent_chat_files_max": "1 つのメッセージに添付できるのは {max} 個までです",
|
||||
"ui.agent_chat_flatpak_none_found": "コーディングエージェントが見つかりません。Flatpak のサンドボックスは、既定ではホームフォルダー内のエージェントにアクセスできず、ネットワークにも接続できません。nvm または ~/.local/bin にインストールした Claude Code と ACP アダプターを許可するには、端末で次のコマンドを実行し、SolidCraft を再起動してください。指定したプログラムとログインファイルへのアクセス、およびネットワーク接続を許可します:",
|
||||
"ui.agent_chat_import_failed": "{name}: インポートに失敗しました: {error}",
|
||||
"ui.agent_chat_intro": "普段使っているコーディングエージェント、または選んだモデルのエンドポイントとチャットできます。SolidCraft のツールで開いているデザインを操作し、変更はその場で表示され、メッセージごとに1回で元に戻せます。確認なしで許可する範囲は「環境設定 > AI」で設定します。",
|
||||
"ui.agent_chat_key_in_env": "キー設定済み",
|
||||
"ui.agent_chat_left": "左",
|
||||
"ui.agent_chat_limit": "エージェントが1メッセージあたりの変更上限 {limit} に達しました。続けさせるには、もう一度メッセージを送ってください。",
|
||||
"ui.agent_chat_minimize": "細いバーに最小化",
|
||||
"ui.agent_chat_mode_all": "すべて",
|
||||
"ui.agent_chat_mode_ask": "確認",
|
||||
"ui.agent_chat_mode_edits": "編集",
|
||||
"ui.agent_chat_model_tip": "エージェントが使うモデル。選択はこのエージェントに対して記憶されます。",
|
||||
"ui.agent_chat_new": "新しいチャット",
|
||||
"ui.agent_chat_new_confirm": "新しいチャットを始めますか? 現在のチャットは消去されます。",
|
||||
@@ -1167,6 +1507,7 @@
|
||||
"ui.agent_chat_none_found_short": "エージェントが見つかりません",
|
||||
"ui.agent_chat_not_installed": "未インストール",
|
||||
"ui.agent_chat_not_signed_in": "未サインイン",
|
||||
"ui.agent_chat_open_settings": "環境設定を開く",
|
||||
"ui.agent_chat_own_window": "独立したウィンドウ",
|
||||
"ui.agent_chat_paste_picture": "画像を貼り付け",
|
||||
"ui.agent_chat_permission": "エージェントが実行の許可を求めています: {title}",
|
||||
@@ -1191,6 +1532,8 @@
|
||||
"ui.agent_chat_send": "送信",
|
||||
"ui.agent_chat_send_now": "今すぐ送信",
|
||||
"ui.agent_chat_send_now_tip": "エージェントの現在のステップを止めて、これを次に送信します(Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft は、このコンピューターにインストールされたコーディングエージェントと連携します。「環境設定 › AI」で選択してください。",
|
||||
"ui.agent_chat_setup_title": "アシスタントを設定",
|
||||
"ui.agent_chat_side": "エージェントチャットの位置",
|
||||
"ui.agent_chat_signed_in": "サインイン済み",
|
||||
"ui.agent_chat_state_auth": "サインインが必要",
|
||||
@@ -1207,13 +1550,18 @@
|
||||
"ui.agent_chat_undo_label": "エージェントチャット: {message}",
|
||||
"ui.agent_chat_undone": "(元に戻しました)",
|
||||
"ui.agent_chat_view_attached": "ビューを添付済み",
|
||||
"ui.agent_chat_waiting": "確認待ち",
|
||||
"ui.agent_cursor": "エージェントカーソル",
|
||||
"ui.agent_cursor_speed": "エージェントカーソル速度",
|
||||
"ui.agent_off_thread": "エージェントのコマンド実行中もウィンドウを操作可能にする",
|
||||
"ui.agent_off_thread_note": "エージェント(AI パネルまたは MCP クライアント)の時間のかかるコマンドをウィンドウとは別に計算します。実行中もビューの回転や確認ができ、ビュー内の表示から停止できます。オフ:各コマンドはウィンドウのスレッドで実行され、終わるまでウィンドウは待ちます。",
|
||||
"ui.ai_add": "追加",
|
||||
"ui.ai_add_agent": "エージェントを追加…",
|
||||
"ui.ai_add_agent_title": "エージェントを追加",
|
||||
"ui.ai_add_anthropic": "Anthropic 互換 API",
|
||||
"ui.ai_add_api": "OpenAI 互換 API",
|
||||
"ui.ai_add_custom": "カスタムコマンド",
|
||||
"ui.ai_add_endpoint": "API エンドポイント",
|
||||
"ui.ai_add_installed": "インストール済みエージェント",
|
||||
"ui.ai_add_installed_note": "インストール済みエージェントの独自エントリ(例: 別の引数で起動)。インストール済みのエージェントは自動で一覧に表示されます。",
|
||||
"ui.ai_added": "追加済み",
|
||||
@@ -1242,6 +1590,7 @@
|
||||
"ui.ai_key_needs_https": "キーは HTTPS 経由、またはこのコンピューター宛てにのみ送信されます。",
|
||||
"ui.ai_key_note": "システムのキーチェーンに保存され、SolidCraft の設定には保存されません。ローカルサーバーの場合は空欄のままにします。",
|
||||
"ui.ai_keychain_error": "システムのキーチェーンが拒否しました: {error}",
|
||||
"ui.ai_kind": "種類",
|
||||
"ui.ai_mode_all": "すべて許可",
|
||||
"ui.ai_mode_all_note": "確認なしで実行します。クラッシュレポートは引き続き対象外で、フォルダー制限も有効です。",
|
||||
"ui.ai_mode_all_warning": "エージェントは確認なしでデザインの保存・上書き・エクスポート・置き換えができます。信頼できるエージェントで、保存済みのデザインに対してのみ使ってください。",
|
||||
@@ -1263,6 +1612,7 @@
|
||||
"ui.ai_panel": "パネル",
|
||||
"ui.ai_permissions": "権限",
|
||||
"ui.ai_preset": "プリセット",
|
||||
"ui.ai_protocol": "プロトコル",
|
||||
"ui.ai_remove": "削除",
|
||||
"ui.ai_request_limit": "1メッセージあたり24リクエストで停止しました。続けるには、もう一度メッセージを送ってください",
|
||||
"ui.ai_reset": "リセット",
|
||||
@@ -1273,6 +1623,8 @@
|
||||
"ui.ai_test": "テスト",
|
||||
"ui.ai_test_acp_ok": "応答あり: {agent}",
|
||||
"ui.ai_test_acp_tip": "エージェントを短時間起動してセッションを要求し、終了します",
|
||||
"ui.ai_test_answered": "接続成功: {model} が応答しました",
|
||||
"ui.ai_test_anthropic_tip": "エンドポイントに短いメッセージを送信します",
|
||||
"ui.ai_test_api_tip": "エンドポイントにモデル一覧を問い合わせます",
|
||||
"ui.ai_test_no_model": "接続成功: {count} 個のモデル({model} はありません)",
|
||||
"ui.ai_test_ok": "接続成功: {count} 個のモデル",
|
||||
@@ -1430,6 +1782,9 @@
|
||||
"ui.export_keymap_tip": "ショートカット、Sボックスのお気に入り、ツールバー設定をファイルに保存",
|
||||
"ui.extend": "延長",
|
||||
"ui.extent_type": "範囲タイプ",
|
||||
"ui.extract_component": "ファイルに抽出…",
|
||||
"ui.extract_design_changed": "ファイルの選択中にデザインが変更されました。ファイルへの抽出をやり直してください。",
|
||||
"ui.extract_done": "コンポーネントは独立したデザインになり、ここにリンクされました。",
|
||||
"ui.extrude": "押し出し",
|
||||
"ui.factor": "倍率",
|
||||
"ui.feature_history": "フィーチャー履歴",
|
||||
@@ -1461,6 +1816,7 @@
|
||||
"ui.grid_follows_view_hint": "側面ビューでは、グリッドを地面ではなく、そのビューに向いた垂直平面に表示します",
|
||||
"ui.ground_shadow": "地面の影",
|
||||
"ui.groupSelected": "選択をグループ化",
|
||||
"ui.hatch": "ハッチング",
|
||||
"ui.heading_add_ins": "アドイン",
|
||||
"ui.heading_assemble": "アセンブリ",
|
||||
"ui.heading_box": "直方体",
|
||||
@@ -1534,7 +1890,19 @@
|
||||
"ui.hideOrigin": "原点を非表示",
|
||||
"ui.hidePlanes": "平面を非表示",
|
||||
"ui.hideProfile": "プロファイルを非表示",
|
||||
"ui.history_back": "1ステップ戻る",
|
||||
"ui.history_below_browser": "ブラウザーの下",
|
||||
"ui.history_edge_hint": "端をダブルクリック",
|
||||
"ui.history_first": "先頭に移動",
|
||||
"ui.history_forward": "1ステップ進む",
|
||||
"ui.history_hide_names": "名前を非表示",
|
||||
"ui.history_last": "末尾に移動",
|
||||
"ui.history_marker_tip": "履歴マーカー:ドラッグしてモデルをロールバックします。新しいフィーチャーはここに追加されます",
|
||||
"ui.history_names": "名前",
|
||||
"ui.history_play": "最後まで再生",
|
||||
"ui.history_show_names": "名前を表示",
|
||||
"ui.history_title": "履歴",
|
||||
"ui.history_toggle_names": "フィーチャー名を表示・非表示",
|
||||
"ui.hole": "穴",
|
||||
"ui.hole_tap_type": "ねじ穴タイプ",
|
||||
"ui.hole_type": "穴タイプ",
|
||||
@@ -1551,9 +1919,15 @@
|
||||
"ui.joints": "ジョイント",
|
||||
"ui.keyboard_shortcuts": "キーボードショートカット",
|
||||
"ui.language": "言語",
|
||||
"ui.layout_compact": "コンパクト",
|
||||
"ui.layout_floating": "フローティング",
|
||||
"ui.length_decimals": "長さの小数点以下の桁数",
|
||||
"ui.light": "ライト",
|
||||
"ui.line": "線分",
|
||||
"ui.link_copies": "同一のコピーをリンク",
|
||||
"ui.link_copies_keep": "そのまま",
|
||||
"ui.link_copies_link": "リンク",
|
||||
"ui.link_copies_text": "これらのコンポーネントは {name} と同じボディを作成します。そのリンクの配置にしますか?",
|
||||
"ui.lock": "ロック",
|
||||
"ui.loft": "ロフト",
|
||||
"ui.look_at": "正面視",
|
||||
@@ -1677,6 +2051,7 @@
|
||||
"ui.render": "レンダリング",
|
||||
"ui.renderer": "レンダラー",
|
||||
"ui.repeat": "繰り返し",
|
||||
"ui.replace_with_link_done": "コピーはリンクされたデザインの配置になりました。",
|
||||
"ui.report_a_bug": "不具合を報告",
|
||||
"ui.reset": "リセット",
|
||||
"ui.reset_all": "すべてリセット",
|
||||
@@ -1688,6 +2063,7 @@
|
||||
"ui.reverse_zoom_direction": "ズーム方向を反転",
|
||||
"ui.revolve": "回転",
|
||||
"ui.ribbon_exit": "終了",
|
||||
"ui.ribbon_labels": "リボンのアイコンの下にテキストを表示",
|
||||
"ui.ribbon_pin_footer": "ピン留めしたコマンドはリボンに表示されます。行にポインターを合わせて、ピン留めや解除ができます。",
|
||||
"ui.ribbon_workspace": "ワークスペース",
|
||||
"ui.right": "右側面",
|
||||
@@ -1743,6 +2119,7 @@
|
||||
"ui.smooth_wheel_zoom": "滑らかなホイールズーム",
|
||||
"ui.smooth_wheel_zoom_tip": "オフにすると、ホイール操作のたびにズームが即座に反映され、滑らかな減速効果は適用されません。",
|
||||
"ui.snap": "スナップ",
|
||||
"ui.space_mouse_axes_reassigned": "軸の割り当ては環境設定で変更されており、このキャリブレーションの後も適用されます。",
|
||||
"ui.space_mouse_calibrate": "キャリブレーション…",
|
||||
"ui.space_mouse_calibrate_tip": "ウィンドウの指示どおりにキャップを動かすと、この3Dマウスの各軸の向きと移動量をSolidCraftが学習します。この3Dマウス用に保存されます。",
|
||||
"ui.space_mouse_calibrate_title": "3Dマウスのキャリブレーション",
|
||||
@@ -1752,12 +2129,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "ほとんど動かなかった軸があるため、キャリブレーションできません。最初からやり直し、毎回キャップをもっと大きく動かしてください。",
|
||||
"ui.space_mouse_dead_zone": "デッドゾーン",
|
||||
"ui.space_mouse_dead_zone_tip": "視点が動き出すまでにキャップを動かす量(全ストロークに対する割合)。キャップに触れていないのに視点が動く場合は大きくしてください。",
|
||||
"ui.space_mouse_driven_by": "この軸を操作するデバイスのキャリブレーション済みの動き。他の軸で使われている動きを選ぶと、2つが入れ替わります。",
|
||||
"ui.space_mouse_driven_by_label": "操作元",
|
||||
"ui.space_mouse_driver": "3Dマウスのドライバー",
|
||||
"ui.space_mouse_driver_auto": "自動",
|
||||
"ui.space_mouse_driver_direct": "直接 (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "デバイスを直接読み取り中(spacenavd は起動していません)",
|
||||
"ui.space_mouse_driver_only_spacenavd": "spacenavd 経由で読み取り中(他の方法はありません)",
|
||||
"ui.space_mouse_forget": "キャリブレーションを削除",
|
||||
"ui.space_mouse_hint": "視点の移動と回転を同時に行います(スケッチ中はパンとズームのみ)",
|
||||
"ui.space_mouse_motion_rotation_x": "回転 X",
|
||||
"ui.space_mouse_motion_rotation_y": "回転 Y",
|
||||
"ui.space_mouse_motion_rotation_z": "回転 Z",
|
||||
"ui.space_mouse_motion_translation_x": "平行移動 X",
|
||||
"ui.space_mouse_motion_translation_y": "平行移動 Y",
|
||||
"ui.space_mouse_motion_translation_z": "平行移動 Z",
|
||||
"ui.space_mouse_navigate": "SpaceNavigator / SpaceMouseで視点を操作",
|
||||
"ui.space_mouse_none": "3Dマウスが見つかりません",
|
||||
"ui.space_mouse_not_calibrated": "未キャリブレーション",
|
||||
"ui.space_mouse_reading": "読み取り値",
|
||||
"ui.space_mouse_reset_axes": "軸の割り当てをリセット",
|
||||
"ui.space_mouse_step_lift": "キャップを持ち上げて保持し、離してください。",
|
||||
"ui.space_mouse_step_press": "キャップを押し下げて保持し、離してください。",
|
||||
"ui.space_mouse_step_pull": "キャップを手前に引いて保持し、離してください。",
|
||||
@@ -1771,6 +2162,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "キャップを右に傾け(右の縁を下げて)保持し、離してください。",
|
||||
"ui.space_mouse_step_twist_clockwise": "キャップを時計回りにひねって保持し、離してください。",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "キャップを反時計回りにひねって保持し、離してください。",
|
||||
"ui.space_mouse_view_axis": "ビューの軸",
|
||||
"ui.space_mouse_view_off": "オフ",
|
||||
"ui.space_mouse_view_off_tip": "3D マウスのドライバーのプロファイルがこの軸をオフにしているため、この軸の動きではビューは動きません。ここで他の軸の動きを選ぶと 2 つが入れ替わり、その動きではビューが動かなくなります。",
|
||||
"ui.space_mouse_view_orbit_sideways": "左右オービット",
|
||||
"ui.space_mouse_view_orbit_up_down": "上下オービット",
|
||||
"ui.space_mouse_view_pan_sideways": "左右パン",
|
||||
"ui.space_mouse_view_pan_up_down": "上下パン",
|
||||
"ui.space_mouse_view_roll": "ロール",
|
||||
"ui.space_mouse_view_unmapped": "軸 {n}",
|
||||
"ui.space_mouse_view_zoom": "ズーム",
|
||||
"ui.spacing": "間隔",
|
||||
"ui.spacing_2": "間隔 2",
|
||||
"ui.sphere": "球",
|
||||
@@ -1804,7 +2205,7 @@
|
||||
"ui.tie_ends": "拘束",
|
||||
"ui.tie_ends_tip": "未拘束をすべて拘束",
|
||||
"ui.timeline_bottom": "下部タイムライン",
|
||||
"ui.timeline_left_note": "左レイアウトでは、ロールバックバーがパーツとシーンブラウザーの上に表示されます。",
|
||||
"ui.timeline_left_note": "縦の履歴はブラウザーの左に表示されます。ストリップでフィーチャー名の表示を切り替えられます。",
|
||||
"ui.timeline_left_sidebar": "左サイドバー",
|
||||
"ui.tip_angle": "先端角度",
|
||||
"ui.to_object": "オブジェクトまで",
|
||||
@@ -1842,6 +2243,7 @@
|
||||
"ui.workspace_design_tabs": "モデル · サーフェス · アセンブリ · 挿入 · 検査 · 管理 · 表示",
|
||||
"ui.workspace_drawing_description": "ビュー、寸法、表題欄を含む2D図面",
|
||||
"ui.workspace_footer": "すべてのワークスペースで同じデザイン、履歴、選択を使用し、リボンのタブだけが変わります。スケッチやフィーチャーの編集中は切り替えできません。",
|
||||
"ui.workspace_layout": "ワークスペースのレイアウト",
|
||||
"ui.workspace_manufacture_description": "スライス、ツールパス、セットアップ",
|
||||
"ui.workspace_planned": "予定",
|
||||
"ui.workspace_render_description": "製品プレビュー、シーン設定、レンダリング画像",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "이력",
|
||||
"Height": "높이",
|
||||
"Hidden edges": "숨겨진 모서리",
|
||||
"History layout": "기록 레이아웃",
|
||||
"Holes": "구멍",
|
||||
"Holes (edges on them)": "구멍 (구멍의 모서리)",
|
||||
"Home view": "홈 뷰",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "충돌 보고서가 없습니다.",
|
||||
"No matching appearance presets.": "일치하는 외관 프리셋이 없습니다.",
|
||||
"No matching appearances": "일치하는 외관 없음",
|
||||
"No visible bodies to export.": "표시된 바디가 없어 내보낼 수 없습니다.",
|
||||
"No visible bodies or sketches to export.": "표시된 바디나 스케치가 없어 내보낼 수 없습니다.",
|
||||
"None": "없음",
|
||||
"Not available yet": "아직 사용할 수 없음",
|
||||
"Notch": "노치",
|
||||
@@ -242,6 +243,7 @@
|
||||
"Open local libraries in the desktop app. You can export this design's library here.": "로컬 라이브러리는 데스크톱 앱에서 여세요. 이 디자인의 라이브러리는 여기서 내보낼 수 있습니다.",
|
||||
"Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "Rust로 만든 오픈 소스 매개변수 3D CAD. 라이선스: MIT OR Apache-2.0.",
|
||||
"Operator": "연산자",
|
||||
"Orbit (right drag)": "회전 (오른쪽 드래그)",
|
||||
"Other side": "반대쪽",
|
||||
"Other surface (mutual trim)": "다른 곡면(상호 트림)",
|
||||
"Outside": "바깥쪽",
|
||||
@@ -758,6 +760,7 @@
|
||||
"cmd.view_graphics_preset": "그래픽 프리셋",
|
||||
"cmd.view_list": "이름 있는 보기 목록",
|
||||
"cmd.view_navigate": "보기 탐색",
|
||||
"cmd.view_normal_to": "선택 항목에 수직",
|
||||
"cmd.view_rename": "이름 있는 보기 이름 변경",
|
||||
"cmd.view_save": "새 이름 있는 보기",
|
||||
"color.copy": "클릭하여 색상 값 복사",
|
||||
@@ -831,7 +834,7 @@
|
||||
"dxf.progress.projection": "형상 투영 중 (3/5)",
|
||||
"dxf.progress.write": "DXF 쓰는 중 (5/5)",
|
||||
"dxf.tolerance": "곡선 허용 오차",
|
||||
"dxf.tolerance_help": "표시된 바디만 내보내며 곡선은 직선 구간으로 근사합니다. 허용 오차가 작을수록 곡선이 매끄러워지지만 처리 시간과 메모리 사용량이 늘어납니다.",
|
||||
"dxf.tolerance_help": "표시된 바디와 스케치만 내보내며 곡선은 직선 구간으로 근사합니다. 허용 오차가 작을수록 곡선이 매끄러워지지만 처리 시간과 메모리 사용량이 늘어납니다.",
|
||||
"file_load.built": "지금까지 빌드됨: 피처 {total}개 중 {built}개.",
|
||||
"file_load.converting": "솔리드 변환 중 {done}/{total}",
|
||||
"file_load.inserting": "기하 삽입 중",
|
||||
@@ -856,19 +859,57 @@
|
||||
"help.mit": "MIT 라이선스",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "타사 라이선스",
|
||||
"home.back": "{name}(으)로 돌아가기",
|
||||
"home.crashes": "충돌 보고서",
|
||||
"home.design_workspace": "설계",
|
||||
"home.documentation": "문서",
|
||||
"home.export": "내보내기",
|
||||
"home.export_hint": "현재 설계의 형식을 선택하세요.",
|
||||
"home.export_json_hint": "편집 가능한 설계 및 명령 기록",
|
||||
"home.export_mesh_hint": "인쇄 또는 공유용 메시",
|
||||
"home.export_step_hint": "정밀한 솔리드 형상",
|
||||
"home.import": "가져오기…",
|
||||
"home.import_hint": "STEP, IGES 또는 메시를 새 설계로 가져오기",
|
||||
"home.in_this_browser": "이 브라우저에 저장됨",
|
||||
"home.missing": "찾을 수 없음",
|
||||
"home.month_01": "1월",
|
||||
"home.month_02": "2월",
|
||||
"home.month_03": "3월",
|
||||
"home.month_04": "4월",
|
||||
"home.month_05": "5월",
|
||||
"home.month_06": "6월",
|
||||
"home.month_07": "7월",
|
||||
"home.month_08": "8월",
|
||||
"home.month_09": "9월",
|
||||
"home.month_10": "10월",
|
||||
"home.month_11": "11월",
|
||||
"home.month_12": "12월",
|
||||
"home.new_inches": "새 설계(인치)",
|
||||
"home.new_inches_hint": "인치 · 설계 작업 공간에서 열기",
|
||||
"home.new_mm": "새 설계",
|
||||
"home.new_mm_hint": "밀리미터 · 설계 작업 공간에서 열기",
|
||||
"home.open": "열기…",
|
||||
"home.opened_days_ago": "{count}일 전에 열림",
|
||||
"home.opened_hours_ago": "{count}시간 전에 열림",
|
||||
"home.opened_just_now": "방금 열림",
|
||||
"home.opened_minutes_ago": "{count}분 전에 열림",
|
||||
"home.open_hint": ".solidcraft 설계 ({shortcut})",
|
||||
"home.open_now": "지금 열기",
|
||||
"home.opened_days_ago": "{count}일 전",
|
||||
"home.opened_hours_ago": "{count}시간 전",
|
||||
"home.opened_just_now": "방금",
|
||||
"home.opened_minutes_ago": "{count}분 전",
|
||||
"home.opening": "여는 중…",
|
||||
"home.properties": "설계 속성",
|
||||
"home.recent": "최근 항목",
|
||||
"home.recent_empty": "열거나 저장한 설계가 여기에 표시됩니다.",
|
||||
"home.recovery_count": "복구 가능한 설계: {count}개",
|
||||
"home.recovery_empty": "복구 가능한 설계가 없습니다.",
|
||||
"home.recovery_hint": "이 설계가 저장되기 전에 SolidCraft가 종료되었습니다.",
|
||||
"home.report_issue": "문제 신고",
|
||||
"home.samples": "샘플",
|
||||
"home.settings": "설정",
|
||||
"home.short_date": "{month} {day}일",
|
||||
"home.shortcuts": "키보드 단축키",
|
||||
"home.start_hint": "설계를 만들거나, 최근 파일을 열거나, 예제를 살펴보세요.",
|
||||
"home.whats_new": "새로운 기능",
|
||||
"home.yesterday": "어제",
|
||||
"install.button_tip": "SolidCraft를 앱으로 설치합니다. 별도 창에서 열리며 오프라인에서도 작동합니다",
|
||||
"install.dock_1": "파일 › Dock에 추가를 선택합니다.",
|
||||
"install.dock_2": "추가를 클릭합니다.",
|
||||
@@ -926,6 +967,8 @@
|
||||
"motion.to_end": "끝으로",
|
||||
"motion.to_start": "처음으로",
|
||||
"motion.track_name": "트랙 {number}",
|
||||
"nav.free_orbit.help": "마우스와 3D 마우스로 롤을 유지하며 양 극점을 넘어 회전합니다. Shift 축 스냅은 비활성화됩니다.",
|
||||
"nav.free_orbit.label": "자유 회전",
|
||||
"nav.touchpad.help": "Shift를 누른 채 포인터를 움직이면 화면이 이동하고, Alt/Option을 누른 채 움직이면 회전합니다. 마우스 버튼은 필요 없습니다. 세로 스크롤로 확대/축소합니다.",
|
||||
"nav.touchpad.label": "터치패드",
|
||||
"nav.touchpad.orbit": "회전 (Alt/Option을 누르고 이동, 마우스 버튼 불필요)",
|
||||
@@ -1021,7 +1064,7 @@
|
||||
"search.try": "명령 이름, 이 디자인의 피처 또는 매개변수를 입력하세요. 값과 함께 명령을 실행하려면 명령 ID와 JSON 객체를 입력하세요: {example}",
|
||||
"search.valid": "올바름",
|
||||
"settings.display_quality_note": "세밀할수록 곡면과 모서리가 더 매끄럽게 표시되지만 메시 생성 시간이 늘어납니다. 뷰포트만 바뀌며 설계나 내보내기는 바뀌지 않습니다.",
|
||||
"settings.frame_rate_note": "뷰의 오른쪽 아래에 초당 프레임 수를 표시합니다. 켜져 있는 동안 뷰를 계속 다시 그립니다.",
|
||||
"settings.frame_rate_note": "뷰의 오른쪽 아래에 초당 프레임 수를 표시합니다.",
|
||||
"settings.measure_axis_distances": "X/Y/Z 거리 표시",
|
||||
"settings.measure_axis_distances_help": "측정 대화상자가 열려 있는 동안 전체 거리와 함께 월드 축 방향 치수와 거리를 표시합니다.",
|
||||
"settings.msaa_applies_on_restart": "안티앨리어싱은 다음에 SolidCraft를 시작할 때 적용됩니다",
|
||||
@@ -1092,6 +1135,7 @@
|
||||
"ui.agent_chat_add": "파일 첨부",
|
||||
"ui.agent_chat_add_file": "파일 선택…",
|
||||
"ui.agent_chat_allow": "허용",
|
||||
"ui.agent_chat_allow_once": "한 번 허용",
|
||||
"ui.agent_chat_allowed": "허용함",
|
||||
"ui.agent_chat_answered": "응답: {option}",
|
||||
"ui.agent_chat_approval": "에이전트가 이 작업을 하도록 허용할까요?",
|
||||
@@ -1143,12 +1187,16 @@
|
||||
"ui.agent_chat_files_left_out": "메시지 하나에는 파일을 최대 {max}개까지 보낼 수 있습니다. 제외됨: {files}",
|
||||
"ui.agent_chat_files_loading": "파일을 읽는 동안 기다리는 중",
|
||||
"ui.agent_chat_files_max": "메시지 하나에 파일은 최대 {max}개",
|
||||
"ui.agent_chat_flatpak_none_found": "코딩 에이전트를 찾지 못했습니다. Flatpak 샌드박스는 기본적으로 홈 폴더에 설치된 에이전트를 볼 수 없고 네트워크에도 접근할 수 없습니다. nvm 또는 ~/.local/bin에 설치한 Claude Code와 ACP 어댑터를 허용하려면 터미널에서 다음 명령을 실행한 뒤 SolidCraft를 다시 시작하세요. 나열된 프로그램과 로그인 파일에 대한 접근 권한 및 네트워크 접근 권한을 부여합니다:",
|
||||
"ui.agent_chat_import_failed": "{name}: 가져오기 실패: {error}",
|
||||
"ui.agent_chat_intro": "이미 사용 중인 코딩 에이전트나 선택한 모델 엔드포인트와 채팅하세요. SolidCraft 도구로 열린 디자인을 다루며, 변경 사항은 바로 보이고 메시지마다 한 번에 실행 취소할 수 있습니다. 묻지 않고 할 수 있는 일은 환경 설정 > AI에서 정합니다.",
|
||||
"ui.agent_chat_key_in_env": "키 설정됨",
|
||||
"ui.agent_chat_left": "왼쪽",
|
||||
"ui.agent_chat_limit": "에이전트가 메시지당 변경 한도 {limit}에 도달했습니다. 계속하게 하려면 메시지를 하나 더 보내세요.",
|
||||
"ui.agent_chat_minimize": "얇은 막대로 최소화",
|
||||
"ui.agent_chat_mode_all": "모두",
|
||||
"ui.agent_chat_mode_ask": "확인",
|
||||
"ui.agent_chat_mode_edits": "편집",
|
||||
"ui.agent_chat_model_tip": "에이전트가 사용하는 모델입니다. 선택은 이 에이전트에 기억됩니다.",
|
||||
"ui.agent_chat_new": "새 채팅",
|
||||
"ui.agent_chat_new_confirm": "새 채팅을 시작할까요? 현재 채팅은 지워집니다.",
|
||||
@@ -1161,6 +1209,7 @@
|
||||
"ui.agent_chat_none_found_short": "에이전트를 찾지 못함",
|
||||
"ui.agent_chat_not_installed": "설치되지 않음",
|
||||
"ui.agent_chat_not_signed_in": "로그인 안 됨",
|
||||
"ui.agent_chat_open_settings": "환경 설정 열기",
|
||||
"ui.agent_chat_own_window": "별도 창",
|
||||
"ui.agent_chat_paste_picture": "이미지 붙여넣기",
|
||||
"ui.agent_chat_permission": "에이전트가 실행 허락을 요청합니다: {title}",
|
||||
@@ -1185,6 +1234,8 @@
|
||||
"ui.agent_chat_send": "보내기",
|
||||
"ui.agent_chat_send_now": "지금 보내기",
|
||||
"ui.agent_chat_send_now_tip": "에이전트의 현재 단계를 중지하고 이것을 다음으로 보냅니다 (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft는 이 컴퓨터에 설치된 코딩 에이전트와 통신합니다. 환경 설정 › AI에서 에이전트를 선택하세요.",
|
||||
"ui.agent_chat_setup_title": "어시스턴트 설정",
|
||||
"ui.agent_chat_side": "에이전트 채팅 위치",
|
||||
"ui.agent_chat_signed_in": "로그인됨",
|
||||
"ui.agent_chat_state_auth": "로그인 필요",
|
||||
@@ -1201,6 +1252,7 @@
|
||||
"ui.agent_chat_undo_label": "에이전트 채팅: {message}",
|
||||
"ui.agent_chat_undone": "(취소됨)",
|
||||
"ui.agent_chat_view_attached": "뷰 첨부됨",
|
||||
"ui.agent_chat_waiting": "확인 대기 중",
|
||||
"ui.agent_cursor": "에이전트 커서",
|
||||
"ui.agent_cursor_speed": "에이전트 커서 속도",
|
||||
"ui.ai_add": "추가",
|
||||
@@ -1455,6 +1507,7 @@
|
||||
"ui.grid_follows_view_hint": "측면 뷰에서는 지면 대신 마주 보는 수직 평면에 격자를 표시합니다",
|
||||
"ui.ground_shadow": "바닥 그림자",
|
||||
"ui.groupSelected": "선택 항목 그룹화",
|
||||
"ui.hatch": "해칭",
|
||||
"ui.heading_add_ins": "애드인",
|
||||
"ui.heading_assemble": "조립",
|
||||
"ui.heading_box": "박스",
|
||||
@@ -1528,6 +1581,11 @@
|
||||
"ui.hideOrigin": "원점 숨기기",
|
||||
"ui.hidePlanes": "평면 숨기기",
|
||||
"ui.hideProfile": "윤곽 숨기기",
|
||||
"ui.history_back": "한 단계 뒤로",
|
||||
"ui.history_below_browser": "브라우저 아래",
|
||||
"ui.history_first": "처음으로 이동",
|
||||
"ui.history_forward": "한 단계 앞으로",
|
||||
"ui.history_last": "끝으로 이동",
|
||||
"ui.history_title": "기록",
|
||||
"ui.hole": "구멍",
|
||||
"ui.hole_tap_type": "탭 유형",
|
||||
@@ -1545,6 +1603,8 @@
|
||||
"ui.joints": "조인트",
|
||||
"ui.keyboard_shortcuts": "키보드 단축키",
|
||||
"ui.language": "언어",
|
||||
"ui.layout_compact": "컴팩트",
|
||||
"ui.layout_floating": "플로팅",
|
||||
"ui.length_decimals": "길이 소수점 자릿수",
|
||||
"ui.light": "밝게",
|
||||
"ui.line": "선",
|
||||
@@ -1682,6 +1742,7 @@
|
||||
"ui.reverse_zoom_direction": "확대/축소 방향 반전",
|
||||
"ui.revolve": "회전",
|
||||
"ui.ribbon_exit": "종료",
|
||||
"ui.ribbon_labels": "리본 아이콘 아래에 텍스트 표시",
|
||||
"ui.ribbon_pin_footer": "고정된 명령은 리본에 표시됩니다. 행 위에 마우스를 올려 고정하거나 해제하세요.",
|
||||
"ui.ribbon_workspace": "작업 공간",
|
||||
"ui.right": "우측면",
|
||||
@@ -1737,6 +1798,7 @@
|
||||
"ui.smooth_wheel_zoom": "부드러운 휠 확대/축소",
|
||||
"ui.smooth_wheel_zoom_tip": "끄면 휠 이벤트를 부드러운 꼬리 없이 즉시 적용합니다",
|
||||
"ui.snap": "스냅",
|
||||
"ui.space_mouse_axes_reassigned": "축이 환경설정에서 다시 지정되어 있으며, 이 보정 후에도 적용됩니다.",
|
||||
"ui.space_mouse_calibrate": "보정…",
|
||||
"ui.space_mouse_calibrate_tip": "창의 안내대로 캡을 움직이면 SolidCraft가 이 3D 마우스의 각 축이 어느 방향으로 얼마나 움직이는지 학습합니다. 이 3D 마우스에 저장됩니다.",
|
||||
"ui.space_mouse_calibrate_title": "3D 마우스 보정",
|
||||
@@ -1746,12 +1808,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "거의 움직이지 않은 축이 있어 보정할 수 없습니다. 처음부터 다시 하고 매번 캡을 더 멀리 움직이세요.",
|
||||
"ui.space_mouse_dead_zone": "데드존",
|
||||
"ui.space_mouse_dead_zone_tip": "보기가 움직이기 전에 캡이 움직여야 하는 정도로, 전체 이동 범위에 대한 비율입니다. 캡을 건드리지 않았는데 보기가 움직이면 높이세요.",
|
||||
"ui.space_mouse_driven_by": "이 축을 움직이는 장치의 보정된 동작입니다. 다른 축이 이미 쓰는 동작을 고르면 둘이 서로 바뀝니다.",
|
||||
"ui.space_mouse_driven_by_label": "제어 동작",
|
||||
"ui.space_mouse_driver": "3D 마우스 드라이버",
|
||||
"ui.space_mouse_driver_auto": "자동",
|
||||
"ui.space_mouse_driver_direct": "직접 (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "장치를 직접 읽는 중 (spacenavd가 실행 중이 아님)",
|
||||
"ui.space_mouse_driver_only_spacenavd": "spacenavd로 읽는 중 (다른 방법이 없음)",
|
||||
"ui.space_mouse_forget": "보정 삭제",
|
||||
"ui.space_mouse_hint": "뷰를 함께 이동하고 회전합니다. 스케치는 이동과 확대/축소만 사용합니다.",
|
||||
"ui.space_mouse_motion_rotation_x": "회전 X",
|
||||
"ui.space_mouse_motion_rotation_y": "회전 Y",
|
||||
"ui.space_mouse_motion_rotation_z": "회전 Z",
|
||||
"ui.space_mouse_motion_translation_x": "이동 X",
|
||||
"ui.space_mouse_motion_translation_y": "이동 Y",
|
||||
"ui.space_mouse_motion_translation_z": "이동 Z",
|
||||
"ui.space_mouse_navigate": "SpaceNavigator / SpaceMouse로 탐색",
|
||||
"ui.space_mouse_none": "3D 마우스를 찾을 수 없음",
|
||||
"ui.space_mouse_not_calibrated": "보정 안 됨",
|
||||
"ui.space_mouse_reading": "읽은 값",
|
||||
"ui.space_mouse_reset_axes": "축 지정 초기화",
|
||||
"ui.space_mouse_step_lift": "캡을 위로 들어 유지한 다음 놓으세요.",
|
||||
"ui.space_mouse_step_press": "캡을 아래로 눌러 유지한 다음 놓으세요.",
|
||||
"ui.space_mouse_step_pull": "캡을 몸 쪽으로 당겨 유지한 다음 놓으세요.",
|
||||
@@ -1765,6 +1841,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "캡을 오른쪽으로 기울여(오른쪽 가장자리를 아래로) 유지한 다음 놓으세요.",
|
||||
"ui.space_mouse_step_twist_clockwise": "캡을 시계 방향으로 돌려 유지한 다음 놓으세요.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "캡을 시계 반대 방향으로 돌려 유지한 다음 놓으세요.",
|
||||
"ui.space_mouse_view_axis": "보기 축",
|
||||
"ui.space_mouse_view_off": "끔",
|
||||
"ui.space_mouse_view_off_tip": "3D 마우스 드라이버 프로필이 이 축을 끄므로, 이 축의 동작으로는 뷰가 움직이지 않습니다. 여기서 다른 축의 동작을 고르면 둘이 바뀌고, 그 동작은 더 이상 뷰를 움직이지 않습니다.",
|
||||
"ui.space_mouse_view_orbit_sideways": "좌우 궤도",
|
||||
"ui.space_mouse_view_orbit_up_down": "상하 궤도",
|
||||
"ui.space_mouse_view_pan_sideways": "좌우 이동",
|
||||
"ui.space_mouse_view_pan_up_down": "상하 이동",
|
||||
"ui.space_mouse_view_roll": "롤",
|
||||
"ui.space_mouse_view_unmapped": "축 {n}",
|
||||
"ui.space_mouse_view_zoom": "확대/축소",
|
||||
"ui.spacing": "간격",
|
||||
"ui.spacing_2": "간격 2",
|
||||
"ui.sphere": "구",
|
||||
@@ -1836,6 +1922,7 @@
|
||||
"ui.workspace_design_tabs": "모델 · 곡면 · 조립 · 삽입 · 검사 · 관리 · 보기",
|
||||
"ui.workspace_drawing_description": "뷰, 치수, 표제란이 있는 2D 도면",
|
||||
"ui.workspace_footer": "모든 작업 공간은 같은 디자인, 히스토리, 선택 항목에서 작동하며 리본 탭만 바뀝니다. 스케치나 피처를 편집하는 동안에는 전환기가 잠깁니다.",
|
||||
"ui.workspace_layout": "작업 공간 레이아웃",
|
||||
"ui.workspace_manufacture_description": "슬라이싱, 툴패스 및 설정",
|
||||
"ui.workspace_planned": "예정",
|
||||
"ui.workspace_render_description": "제품 미리보기, 장면 설정 및 렌더링 이미지",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "SEJARAH",
|
||||
"Height": "Ketinggian",
|
||||
"Hidden edges": "Tepi tersembunyi",
|
||||
"History layout": "Susun atur sejarah",
|
||||
"Holes": "Lubang",
|
||||
"Holes (edges on them)": "Lubang (tepi lubang)",
|
||||
"Home view": "Pandangan utama",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "Tiada laporan ranap.",
|
||||
"No matching appearance presets.": "Tiada pratetap penampilan yang sepadan.",
|
||||
"No matching appearances": "Tiada penampilan yang sepadan",
|
||||
"No visible bodies to export.": "Tiada jasad kelihatan untuk dieksport.",
|
||||
"No visible bodies or sketches to export.": "Tiada jasad atau lakaran kelihatan untuk dieksport.",
|
||||
"None": "Tiada",
|
||||
"Not available yet": "Belum tersedia",
|
||||
"Notch": "Takuk",
|
||||
@@ -831,7 +832,7 @@
|
||||
"dxf.progress.projection": "Mengunjurkan geometri (3/5)",
|
||||
"dxf.progress.write": "Menulis DXF (5/5)",
|
||||
"dxf.tolerance": "Toleransi lengkung",
|
||||
"dxf.tolerance_help": "Jasad kelihatan sahaja. Lengkung guna segmen lurus. Toleransi kecil lebih halus tetapi guna lebih masa dan memori.",
|
||||
"dxf.tolerance_help": "Jasad kelihatan dan lakaran yang ditunjukkan sahaja. Lengkung guna segmen lurus. Toleransi kecil lebih halus tetapi guna lebih masa dan memori.",
|
||||
"file_load.built": "Dibina setakat ini: {built} daripada {total} ciri.",
|
||||
"file_load.converting": "Menukar pepejal {done} daripada {total}",
|
||||
"file_load.inserting": "Menyisip geometri",
|
||||
@@ -856,19 +857,57 @@
|
||||
"help.mit": "Lesen MIT",
|
||||
"help.notice": "NOTIS",
|
||||
"help.third_party": "Lesen pihak ketiga",
|
||||
"home.back": "Kembali ke {name}",
|
||||
"home.crashes": "Laporan ranap",
|
||||
"home.design_workspace": "Reka Bentuk",
|
||||
"home.documentation": "Dokumentasi",
|
||||
"home.export": "Eksport",
|
||||
"home.export_hint": "Pilih format untuk reka bentuk semasa.",
|
||||
"home.export_json_hint": "Reka bentuk boleh sunting dan sejarah perintah",
|
||||
"home.export_mesh_hint": "Jejaring untuk pencetakan atau perkongsian",
|
||||
"home.export_step_hint": "Geometri pepejal yang tepat",
|
||||
"home.import": "Import…",
|
||||
"home.import_hint": "STEP, IGES atau jejaring ke dalam reka bentuk baharu",
|
||||
"home.in_this_browser": "dalam pelayar ini",
|
||||
"home.missing": "tiada",
|
||||
"home.month_01": "Jan",
|
||||
"home.month_02": "Feb",
|
||||
"home.month_03": "Mac",
|
||||
"home.month_04": "Apr",
|
||||
"home.month_05": "Mei",
|
||||
"home.month_06": "Jun",
|
||||
"home.month_07": "Jul",
|
||||
"home.month_08": "Ogo",
|
||||
"home.month_09": "Sep",
|
||||
"home.month_10": "Okt",
|
||||
"home.month_11": "Nov",
|
||||
"home.month_12": "Dis",
|
||||
"home.new_inches": "Reka bentuk baharu dalam inci",
|
||||
"home.new_inches_hint": "Inci · dibuka dalam Reka Bentuk",
|
||||
"home.new_mm": "Reka bentuk baharu",
|
||||
"home.new_mm_hint": "Milimeter · dibuka dalam Reka Bentuk",
|
||||
"home.open": "Buka…",
|
||||
"home.opened_days_ago": "Dibuka {count} hari lalu",
|
||||
"home.opened_hours_ago": "Dibuka {count} jam lalu",
|
||||
"home.opened_just_now": "Baru dibuka",
|
||||
"home.opened_minutes_ago": "Dibuka {count} minit lalu",
|
||||
"home.open_hint": "Reka bentuk .solidcraft ({shortcut})",
|
||||
"home.open_now": "Buka sekarang",
|
||||
"home.opened_days_ago": "{count} hari lalu",
|
||||
"home.opened_hours_ago": "{count} jam lalu",
|
||||
"home.opened_just_now": "Baru sahaja",
|
||||
"home.opened_minutes_ago": "{count} minit lalu",
|
||||
"home.opening": "membuka…",
|
||||
"home.properties": "Sifat reka bentuk",
|
||||
"home.recent": "Terkini",
|
||||
"home.recent_empty": "Reka bentuk yang anda buka atau simpan dipaparkan di sini.",
|
||||
"home.recovery_count": "Reka bentuk boleh dipulihkan: {count}",
|
||||
"home.recovery_empty": "Tiada reka bentuk yang boleh dipulihkan.",
|
||||
"home.recovery_hint": "SolidCraft ditutup sebelum reka bentuk ini disimpan.",
|
||||
"home.report_issue": "Laporkan Isu",
|
||||
"home.samples": "Contoh",
|
||||
"home.settings": "Tetapan",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Pintasan papan kekunci",
|
||||
"home.start_hint": "Cipta reka bentuk, buka fail terkini atau terokai contoh.",
|
||||
"home.whats_new": "Apa yang baharu",
|
||||
"home.yesterday": "Semalam",
|
||||
"install.button_tip": "Pasang SolidCraft: tetingkap sendiri dan boleh guna di luar talian",
|
||||
"install.dock_1": "Pilih File › Add to Dock.",
|
||||
"install.dock_2": "Klik Add.",
|
||||
@@ -1021,7 +1060,7 @@
|
||||
"search.try": "Taip nama arahan, ciri dalam reka bentuk ini, atau parameter. Untuk menjalankan arahan dengan nilai, taip ID-nya dan objek JSON: {example}",
|
||||
"search.valid": "Sah",
|
||||
"settings.display_quality_note": "Tahap halus melicinkan muka dan tepi melengkung, tetapi mesh lebih lambat disiapkan. Hanya paparan berubah, bukan reka bentuk atau eksport.",
|
||||
"settings.frame_rate_note": "Papar bingkai sesaat di kanan bawah. Jika diaktifkan, pandangan dilukis semula tanpa henti.",
|
||||
"settings.frame_rate_note": "Papar bingkai sesaat di kanan bawah.",
|
||||
"settings.measure_axis_distances": "Papar jarak X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Papar jarak paksi dunia X/Y/Z bersama jarak keseluruhan semasa Ukur dibuka.",
|
||||
"settings.msaa_applies_on_restart": "Antialias digunakan apabila SolidCraft dimulakan semula",
|
||||
@@ -1092,6 +1131,7 @@
|
||||
"ui.agent_chat_add": "Lampirkan fail",
|
||||
"ui.agent_chat_add_file": "Pilih fail…",
|
||||
"ui.agent_chat_allow": "Benarkan",
|
||||
"ui.agent_chat_allow_once": "Benarkan sekali",
|
||||
"ui.agent_chat_allowed": "Dibenarkan",
|
||||
"ui.agent_chat_answered": "Jawapan: {option}",
|
||||
"ui.agent_chat_approval": "Benarkan ejen melakukan ini?",
|
||||
@@ -1143,12 +1183,16 @@
|
||||
"ui.agent_chat_files_left_out": "Paling banyak {max} fail bersama satu mesej; ditinggalkan: {files}",
|
||||
"ui.agent_chat_files_loading": "Menunggu fail dibaca",
|
||||
"ui.agent_chat_files_max": "Paling banyak {max} fail pada satu mesej",
|
||||
"ui.agent_chat_flatpak_none_found": "Tiada ejen pengekodan. Secara lalai, kotak pasir Flatpak tidak dapat melihat ejen yang dipasang dalam folder rumah anda dan tiada akses rangkaian. Untuk membenarkan Claude Code dan penyesuai ACP-nya yang dipasang melalui nvm atau dalam ~/.local/bin, jalankan arahan ini dalam terminal, kemudian mulakan semula SolidCraft. Ia memberi akses kepada program dan fail log masuk yang disenaraikan, serta akses rangkaian:",
|
||||
"ui.agent_chat_import_failed": "{name}: import gagal: {error}",
|
||||
"ui.agent_chat_intro": "Sembang dengan ejen pengekodan biasa anda atau titik akhir model pilihan. Ejen mengubah reka bentuk melalui alat SolidCraft; perubahan dipaparkan terus dan boleh dibatalkan sekali bagi setiap mesej. Tetapkan kebenaran di Tetapan > AI.",
|
||||
"ui.agent_chat_key_in_env": "kunci tersedia",
|
||||
"ui.agent_chat_left": "Kiri",
|
||||
"ui.agent_chat_limit": "Ejen telah mencapai had {limit} perubahan untuk satu mesej. Hantar mesej lain untuk meneruskan.",
|
||||
"ui.agent_chat_minimize": "Kecilkan kepada bar",
|
||||
"ui.agent_chat_mode_all": "Semua",
|
||||
"ui.agent_chat_mode_ask": "Tanya",
|
||||
"ui.agent_chat_mode_edits": "Suntingan",
|
||||
"ui.agent_chat_model_tip": "Model yang digunakan oleh ejen. Pilihan anda disimpan untuk ejen ini.",
|
||||
"ui.agent_chat_new": "Sembang baharu",
|
||||
"ui.agent_chat_new_confirm": "Mulakan sembang baharu? Sembang semasa akan dikosongkan.",
|
||||
@@ -1161,6 +1205,7 @@
|
||||
"ui.agent_chat_none_found_short": "Tiada ejen ditemui",
|
||||
"ui.agent_chat_not_installed": "Tidak dipasang",
|
||||
"ui.agent_chat_not_signed_in": "belum log masuk",
|
||||
"ui.agent_chat_open_settings": "Buka tetapan",
|
||||
"ui.agent_chat_own_window": "Tetingkap sendiri",
|
||||
"ui.agent_chat_paste_picture": "Tampal gambar",
|
||||
"ui.agent_chat_permission": "Benarkan ejen jalankan: {title}",
|
||||
@@ -1185,6 +1230,8 @@
|
||||
"ui.agent_chat_send": "Hantar",
|
||||
"ui.agent_chat_send_now": "Hantar terus",
|
||||
"ui.agent_chat_send_now_tip": "Hentikan langkah semasa ejen dan hantar mesej ini selepas itu (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft berkomunikasi dengan ejen pengekodan yang dipasang pada komputer ini. Pilih ejen dalam Tetapan › AI.",
|
||||
"ui.agent_chat_setup_title": "Sediakan pembantu",
|
||||
"ui.agent_chat_side": "Sisi sembang ejen",
|
||||
"ui.agent_chat_signed_in": "sudah log masuk",
|
||||
"ui.agent_chat_state_auth": "Perlu log masuk",
|
||||
@@ -1201,6 +1248,7 @@
|
||||
"ui.agent_chat_undo_label": "Sembang ejen: {message}",
|
||||
"ui.agent_chat_undone": "(dibatalkan)",
|
||||
"ui.agent_chat_view_attached": "Paparan dilampirkan",
|
||||
"ui.agent_chat_waiting": "Menunggu anda",
|
||||
"ui.agent_cursor": "Kursor ejen",
|
||||
"ui.agent_cursor_speed": "Kelajuan kursor ejen",
|
||||
"ui.ai_add": "Tambah",
|
||||
@@ -1455,6 +1503,7 @@
|
||||
"ui.grid_follows_view_hint": "Pandangan sisi guna grid satah tegak yang menghadapnya, bukan satah tanah",
|
||||
"ui.ground_shadow": "Bayang tanah",
|
||||
"ui.groupSelected": "Kumpulkan Pilihan",
|
||||
"ui.hatch": "Lorek",
|
||||
"ui.heading_add_ins": "TAMBAHAN",
|
||||
"ui.heading_assemble": "PASANG",
|
||||
"ui.heading_box": "KOTAK",
|
||||
@@ -1528,6 +1577,11 @@
|
||||
"ui.hideOrigin": "Sembunyi Titik Asal",
|
||||
"ui.hidePlanes": "Sembunyi Satah",
|
||||
"ui.hideProfile": "Sembunyi Profil",
|
||||
"ui.history_back": "Undur satu langkah",
|
||||
"ui.history_below_browser": "Di bawah pelayar",
|
||||
"ui.history_first": "Pergi ke permulaan",
|
||||
"ui.history_forward": "Maju satu langkah",
|
||||
"ui.history_last": "Pergi ke penghujung",
|
||||
"ui.history_title": "Sejarah",
|
||||
"ui.hole": "Lubang",
|
||||
"ui.hole_tap_type": "Jenis Bebenang Lubang",
|
||||
@@ -1545,6 +1599,8 @@
|
||||
"ui.joints": "Sendi",
|
||||
"ui.keyboard_shortcuts": "Pintasan Kekunci",
|
||||
"ui.language": "Bahasa",
|
||||
"ui.layout_compact": "Padat",
|
||||
"ui.layout_floating": "Terapung",
|
||||
"ui.length_decimals": "Perpuluhan panjang",
|
||||
"ui.light": "Cerah",
|
||||
"ui.line": "Garis",
|
||||
@@ -1682,6 +1738,7 @@
|
||||
"ui.reverse_zoom_direction": "Songsangkan arah zum",
|
||||
"ui.revolve": "Putar",
|
||||
"ui.ribbon_exit": "Keluar",
|
||||
"ui.ribbon_labels": "Tunjukkan teks di bawah ikon reben",
|
||||
"ui.ribbon_pin_footer": "Arahan tersemat dipaparkan pada reben. Lalukan tetikus pada baris untuk menyemat atau menyahsemat.",
|
||||
"ui.ribbon_workspace": "Ruang kerja",
|
||||
"ui.right": "Kanan",
|
||||
@@ -1836,6 +1893,7 @@
|
||||
"ui.workspace_design_tabs": "Model · Permukaan · Pasang · Sisip · Periksa · Urus · Pandangan",
|
||||
"ui.workspace_drawing_description": "Lukisan 2D dengan pandangan, dimensi dan blok tajuk",
|
||||
"ui.workspace_footer": "Setiap ruang kerja berfungsi pada reka bentuk, sejarah dan pilihan yang sama; hanya tab reben berubah. Penukar dikunci semasa lakaran atau ciri sedang disunting.",
|
||||
"ui.workspace_layout": "Susun atur ruang kerja",
|
||||
"ui.workspace_manufacture_description": "Pemotongan lapisan, laluan alat dan persediaan",
|
||||
"ui.workspace_planned": "Dirancang",
|
||||
"ui.workspace_render_description": "Pratonton produk, tetapan adegan dan imej render",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "GESCHIEDENIS",
|
||||
"Height": "Hoogte",
|
||||
"Hidden edges": "Verborgen randen",
|
||||
"History layout": "Geschiedenisindeling",
|
||||
"Holes": "Gaten",
|
||||
"Holes (edges on them)": "Gaten (randen erop)",
|
||||
"Home view": "Beginweergave",
|
||||
@@ -232,7 +233,6 @@
|
||||
"No crash reports.": "Geen crashrapporten.",
|
||||
"No matching appearance presets.": "Geen overeenkomende uiterlijkvoorinstellingen.",
|
||||
"No matching appearances": "Geen overeenkomende uiterlijken",
|
||||
"No visible bodies to export.": "Geen zichtbare lichamen om te exporteren.",
|
||||
"None": "Geen",
|
||||
"Not available yet": "Nog niet beschikbaar",
|
||||
"Notch": "Inkeping",
|
||||
@@ -856,19 +856,57 @@
|
||||
"help.mit": "MIT-licentie",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Licenties van derden",
|
||||
"home.back": "Terug naar {name}",
|
||||
"home.crashes": "Crashrapporten",
|
||||
"home.design_workspace": "Ontwerp",
|
||||
"home.documentation": "Documentatie",
|
||||
"home.export": "Exporteren",
|
||||
"home.export_hint": "Kies een indeling voor het huidige ontwerp.",
|
||||
"home.export_json_hint": "Bewerkbaar ontwerp en opdrachtgeschiedenis",
|
||||
"home.export_mesh_hint": "Mesh om af te drukken of te delen",
|
||||
"home.export_step_hint": "Nauwkeurige volumegeometrie",
|
||||
"home.import": "Importeren…",
|
||||
"home.import_hint": "STEP, IGES of een mesh in een nieuw ontwerp",
|
||||
"home.in_this_browser": "in deze browser",
|
||||
"home.missing": "ontbreekt",
|
||||
"home.month_01": "jan.",
|
||||
"home.month_02": "feb.",
|
||||
"home.month_03": "mrt.",
|
||||
"home.month_04": "apr.",
|
||||
"home.month_05": "mei",
|
||||
"home.month_06": "jun.",
|
||||
"home.month_07": "jul.",
|
||||
"home.month_08": "aug.",
|
||||
"home.month_09": "sep.",
|
||||
"home.month_10": "okt.",
|
||||
"home.month_11": "nov.",
|
||||
"home.month_12": "dec.",
|
||||
"home.new_inches": "Nieuw ontwerp in inches",
|
||||
"home.new_inches_hint": "Inches · opent in Ontwerp",
|
||||
"home.new_mm": "Nieuw ontwerp",
|
||||
"home.new_mm_hint": "Millimeters · opent in Ontwerp",
|
||||
"home.open": "Openen…",
|
||||
"home.opened_days_ago": "{count} dagen geleden geopend",
|
||||
"home.opened_hours_ago": "{count} u geleden geopend",
|
||||
"home.opened_just_now": "Zojuist geopend",
|
||||
"home.opened_minutes_ago": "{count} min geleden geopend",
|
||||
"home.open_hint": "Een .solidcraft-ontwerp ({shortcut})",
|
||||
"home.open_now": "Momenteel geopend",
|
||||
"home.opened_days_ago": "{count} dagen geleden",
|
||||
"home.opened_hours_ago": "{count} u geleden",
|
||||
"home.opened_just_now": "Zojuist",
|
||||
"home.opened_minutes_ago": "{count} min geleden",
|
||||
"home.opening": "openen…",
|
||||
"home.properties": "Ontwerpeigenschappen",
|
||||
"home.recent": "Recent",
|
||||
"home.recent_empty": "Ontwerpen die u opent of opslaat, verschijnen hier.",
|
||||
"home.recovery_count": "Herstelbare ontwerpen: {count}",
|
||||
"home.recovery_empty": "Geen herstelbare ontwerpen.",
|
||||
"home.recovery_hint": "SolidCraft is gesloten voordat deze ontwerpen werden opgeslagen.",
|
||||
"home.report_issue": "Probleem melden",
|
||||
"home.samples": "Voorbeelden",
|
||||
"home.settings": "Instellingen",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Sneltoetsen",
|
||||
"home.start_hint": "Maak een ontwerp, open een recent bestand of bekijk een voorbeeld.",
|
||||
"home.whats_new": "Wat is er nieuw",
|
||||
"home.yesterday": "Gisteren",
|
||||
"install.button_tip": "Installeer SolidCraft als app: deze opent in een eigen venster en werkt offline",
|
||||
"install.dock_1": "Kies Bestand › Toevoegen aan Dock.",
|
||||
"install.dock_2": "Klik op Voeg toe.",
|
||||
@@ -1021,7 +1059,7 @@
|
||||
"search.try": "Typ een opdrachtnaam, een kenmerk in dit ontwerp of een parameter. Om een opdracht met waarden uit te voeren, typt u de id en een JSON-object: {example}",
|
||||
"search.valid": "Geldig",
|
||||
"settings.display_quality_note": "Fijnere niveaus tekenen gebogen vlakken en randen vloeiender en kosten meer tijd om te meshen. Alleen de viewport verandert, nooit het ontwerp of de exports.",
|
||||
"settings.frame_rate_note": "Toont frames per seconde in de rechteronderhoek van de weergave. Zolang dit aan staat, wordt de weergave continu opnieuw getekend.",
|
||||
"settings.frame_rate_note": "Toont frames per seconde in de rechteronderhoek van de weergave.",
|
||||
"settings.measure_axis_distances": "X/Y/Z-afstanden tonen",
|
||||
"settings.measure_axis_distances_help": "Toon de componentmaten langs de wereldassen naast de totale afstand terwijl Meten open is.",
|
||||
"settings.msaa_applies_on_restart": "Anti-aliasing wordt toegepast bij de volgende start van SolidCraft",
|
||||
@@ -1092,6 +1130,7 @@
|
||||
"ui.agent_chat_add": "Bestanden bijvoegen",
|
||||
"ui.agent_chat_add_file": "Een bestand kiezen…",
|
||||
"ui.agent_chat_allow": "Toestaan",
|
||||
"ui.agent_chat_allow_once": "Eenmalig toestaan",
|
||||
"ui.agent_chat_allowed": "Toegestaan",
|
||||
"ui.agent_chat_answered": "Antwoord: {option}",
|
||||
"ui.agent_chat_approval": "De agent dit laten doen?",
|
||||
@@ -1143,12 +1182,16 @@
|
||||
"ui.agent_chat_files_left_out": "Maximaal {max} bestanden per bericht; weggelaten: {files}",
|
||||
"ui.agent_chat_files_loading": "Wachten tot de bestanden zijn gelezen",
|
||||
"ui.agent_chat_files_max": "Maximaal {max} bestanden per bericht",
|
||||
"ui.agent_chat_flatpak_none_found": "Geen codeeragent gevonden. De Flatpak-sandbox ziet standaard geen agents die in je persoonlijke map zijn geïnstalleerd en heeft geen netwerktoegang. Voer dit commando uit in een terminal en start SolidCraft daarna opnieuw om Claude Code en de ACP-adapter toe te staan die via nvm of in ~/.local/bin zijn geïnstalleerd. Het geeft toegang tot de genoemde programma’s en aanmeldbestanden, plus netwerktoegang:",
|
||||
"ui.agent_chat_import_failed": "{name}: importeren mislukt: {error}",
|
||||
"ui.agent_chat_intro": "Chat met een codeeragent die u al gebruikt, of met een modeleindpunt naar keuze. De agent werkt aan het geopende ontwerp via de tools van SolidCraft: de wijzigingen verschijnen terwijl ze worden gemaakt en worden per bericht als één stap ongedaan gemaakt. Wat hij zonder te vragen mag doen, stelt u in via Voorkeuren > AI.",
|
||||
"ui.agent_chat_key_in_env": "sleutel ingesteld",
|
||||
"ui.agent_chat_left": "Links",
|
||||
"ui.agent_chat_limit": "De agent heeft de limiet van {limit} wijzigingen voor één bericht bereikt. Stuur nog een bericht om hem verder te laten gaan.",
|
||||
"ui.agent_chat_minimize": "Minimaliseren tot een strook",
|
||||
"ui.agent_chat_mode_all": "Alles",
|
||||
"ui.agent_chat_mode_ask": "Vragen",
|
||||
"ui.agent_chat_mode_edits": "Bewerken",
|
||||
"ui.agent_chat_model_tip": "Het model dat de agent gebruikt. Uw keuze wordt voor deze agent onthouden.",
|
||||
"ui.agent_chat_new": "Nieuwe chat",
|
||||
"ui.agent_chat_new_confirm": "Een nieuwe chat starten? De huidige wordt gewist.",
|
||||
@@ -1161,6 +1204,7 @@
|
||||
"ui.agent_chat_none_found_short": "Geen agent gevonden",
|
||||
"ui.agent_chat_not_installed": "Niet geïnstalleerd",
|
||||
"ui.agent_chat_not_signed_in": "niet aangemeld",
|
||||
"ui.agent_chat_open_settings": "Voorkeuren openen",
|
||||
"ui.agent_chat_own_window": "Eigen venster",
|
||||
"ui.agent_chat_paste_picture": "Een afbeelding plakken",
|
||||
"ui.agent_chat_permission": "De agent vraagt om uit te voeren: {title}",
|
||||
@@ -1185,6 +1229,8 @@
|
||||
"ui.agent_chat_send": "Verzenden",
|
||||
"ui.agent_chat_send_now": "Nu verzenden",
|
||||
"ui.agent_chat_send_now_tip": "De huidige stap van de agent stoppen en dit nu verzenden (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft communiceert met een programmeeragent die op deze computer is geïnstalleerd. Kies er een via Voorkeuren › AI.",
|
||||
"ui.agent_chat_setup_title": "Een assistent instellen",
|
||||
"ui.agent_chat_side": "Zijde van agentchat",
|
||||
"ui.agent_chat_signed_in": "aangemeld",
|
||||
"ui.agent_chat_state_auth": "Aanmelden vereist",
|
||||
@@ -1201,6 +1247,7 @@
|
||||
"ui.agent_chat_undo_label": "Agentchat: {message}",
|
||||
"ui.agent_chat_undone": "(ongedaan gemaakt)",
|
||||
"ui.agent_chat_view_attached": "Weergave bijgevoegd",
|
||||
"ui.agent_chat_waiting": "Wacht op jou",
|
||||
"ui.agent_cursor": "Agentcursor",
|
||||
"ui.agent_cursor_speed": "Snelheid agentcursor",
|
||||
"ui.ai_add": "Toevoegen",
|
||||
@@ -1455,6 +1502,7 @@
|
||||
"ui.grid_follows_view_hint": "Zijaanzichten tonen het raster op het rechtopstaande vlak dat naar hen toe gericht is in plaats van op de grond",
|
||||
"ui.ground_shadow": "Grondschaduw",
|
||||
"ui.groupSelected": "Selectie groeperen",
|
||||
"ui.hatch": "Arcering",
|
||||
"ui.heading_add_ins": "INVOEGMODULES",
|
||||
"ui.heading_assemble": "SAMENSTELLEN",
|
||||
"ui.heading_box": "KUB",
|
||||
@@ -1528,6 +1576,11 @@
|
||||
"ui.hideOrigin": "Oorsprong verbergen",
|
||||
"ui.hidePlanes": "Vlakken verbergen",
|
||||
"ui.hideProfile": "Profiel verbergen",
|
||||
"ui.history_back": "Eén stap terug",
|
||||
"ui.history_below_browser": "Onder de browser",
|
||||
"ui.history_first": "Naar het begin",
|
||||
"ui.history_forward": "Eén stap vooruit",
|
||||
"ui.history_last": "Naar het einde",
|
||||
"ui.history_title": "Geschiedenis",
|
||||
"ui.hole": "Gat",
|
||||
"ui.hole_tap_type": "Type tapgat",
|
||||
@@ -1545,6 +1598,8 @@
|
||||
"ui.joints": "Verbindingen",
|
||||
"ui.keyboard_shortcuts": "Sneltoetsen",
|
||||
"ui.language": "Taal",
|
||||
"ui.layout_compact": "Compact",
|
||||
"ui.layout_floating": "Zwevend",
|
||||
"ui.length_decimals": "Lengtedecimalen",
|
||||
"ui.light": "Licht",
|
||||
"ui.line": "Lijn",
|
||||
@@ -1682,6 +1737,7 @@
|
||||
"ui.reverse_zoom_direction": "Zoomrichting omkeren",
|
||||
"ui.revolve": "Revolve",
|
||||
"ui.ribbon_exit": "Afsluiten",
|
||||
"ui.ribbon_labels": "Tekst onder lintpictogrammen tonen",
|
||||
"ui.ribbon_pin_footer": "Vastgepinde opdrachten verschijnen in het lint. Beweeg over een rij om vast te pinnen of los te maken.",
|
||||
"ui.ribbon_workspace": "Werkruimte",
|
||||
"ui.right": "Rechts",
|
||||
@@ -1836,6 +1892,7 @@
|
||||
"ui.workspace_design_tabs": "Model · Oppervlak · Assembleren · Invoegen · Inspecteren · Beheren · Beeld",
|
||||
"ui.workspace_drawing_description": "2D-tekeningen met weergaven, maatvoering en titelblokken",
|
||||
"ui.workspace_footer": "Elke werkruimte werkt op hetzelfde ontwerp, dezelfde geschiedenis en selectie; alleen de lintabbladen veranderen. De schakelaar is vergrendeld terwijl een schets of kenmerk wordt bewerkt.",
|
||||
"ui.workspace_layout": "Werkruimte-indeling",
|
||||
"ui.workspace_manufacture_description": "Slicen, gereedschapspaden en opstelling",
|
||||
"ui.workspace_planned": "Gepland",
|
||||
"ui.workspace_render_description": "Productvoorbeeld, sceneinstellingen en gerenderde afbeeldingen",
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
"Also deletes": "Usuwa również",
|
||||
"Angle 2": "Kąt 2",
|
||||
"Animate": "Animuj",
|
||||
"App/system information and command settings are included. Review private details before sharing.": "Dołączone są informacje o aplikacji i systemie oraz ustawienia poleceń. Przed udostępnieniem sprawdź, czy nie ma tam prywatnych danych.",
|
||||
"Appearance name": "Nazwa wyglądu",
|
||||
"Applied Radius": "Zastosowany promień",
|
||||
"Apply To": "Zastosuj do",
|
||||
@@ -83,6 +84,7 @@
|
||||
"Contact": "Kontakt",
|
||||
"Contact Sets": "Zestawy kontaktów",
|
||||
"Contact sets": "Zestawy kontaktów",
|
||||
"Continue on GitHub": "Kontynuuj na GitHubie",
|
||||
"Continuity": "Ciągłość",
|
||||
"Copy Error Message": "Kopiuj komunikat błędu",
|
||||
"Copy Warning Message": "Kopiuj komunikat ostrzeżenia",
|
||||
@@ -102,6 +104,7 @@
|
||||
"Curv. Comb": "Grzebień krzyw.",
|
||||
"Curvature (G2)": "Krzywizna (G2)",
|
||||
"Curvature change (G3)": "Zmiana krzywizny (G3)",
|
||||
"Custom": "Niestandardowy",
|
||||
"Customize Toolbar": "Dostosuj pasek narzędzi",
|
||||
"Delete": "Usuń",
|
||||
"Delete all": "Usuń wszystko",
|
||||
@@ -110,6 +113,8 @@
|
||||
"Delete the set": "Usuń zestaw",
|
||||
"Density": "Gęstość",
|
||||
"Dependents": "Elementy zależne",
|
||||
"Describe the problem you saw": "Opisz zauważony problem",
|
||||
"Describe what happened before continuing.": "Zanim przejdziesz dalej, opisz, co się stało.",
|
||||
"Designs you open or save appear here.": "Tutaj pojawiają się otwierane lub zapisywane projekty.",
|
||||
"Determined by To Object. Choose Angle to edit the angular extent.": "Wynika z opcji Do obiektu. Wybierz Kąt, aby edytować zakres kątowy.",
|
||||
"Direction": "Kierunek",
|
||||
@@ -127,6 +132,7 @@
|
||||
"Enabled": "Włączone",
|
||||
"End bulge": "Wybrzuszenie końca",
|
||||
"End continuity": "Ciągłość końca",
|
||||
"Expected result (optional)": "Oczekiwany wynik (opcjonalnie)",
|
||||
"Explode": "Rozstrzel",
|
||||
"Explode Text": "Rozbij tekst",
|
||||
"Export Animation…": "Eksportuj animację…",
|
||||
@@ -167,6 +173,8 @@
|
||||
"HISTORY": "HISTORIA",
|
||||
"Height": "Wysokość",
|
||||
"Hidden edges": "Krawędzie niewidoczne",
|
||||
"History layout": "Układ historii",
|
||||
"History names": "Nazwy w historii",
|
||||
"Holes": "Otwory",
|
||||
"Holes (edges on them)": "Otwory (krawędzie na nich)",
|
||||
"Home view": "Widok główny",
|
||||
@@ -232,7 +240,8 @@
|
||||
"No crash reports.": "Brak raportów o awariach.",
|
||||
"No matching appearance presets.": "Brak pasujących ustawień wyglądu.",
|
||||
"No matching appearances": "Brak pasujących wyglądów",
|
||||
"No visible bodies to export.": "Brak widocznych brył do wyeksportowania.",
|
||||
"No visible bodies or sketches to export.": "Brak widocznych brył lub szkiców do wyeksportowania.",
|
||||
"Nominal diameter": "Średnica nominalna",
|
||||
"None": "Brak",
|
||||
"Not available yet": "Jeszcze niedostępne",
|
||||
"Notch": "Wycięcie",
|
||||
@@ -241,7 +250,10 @@
|
||||
"Open GitHub draft": "Otwórz szkic zgłoszenia na GitHubie",
|
||||
"Open local libraries in the desktop app. You can export this design's library here.": "Otwórz biblioteki lokalne w aplikacji komputerowej. Tutaj możesz wyeksportować bibliotekę tego projektu.",
|
||||
"Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "Otwartoźródłowy parametryczny CAD 3D w języku Rust. Licencja MIT OR Apache-2.0.",
|
||||
"Opens your browser and copies the report text for you to paste into GitHub.": "Otwiera przeglądarkę internetową i kopiuje treść raportu, którą wkleisz na GitHubie.",
|
||||
"Opens your browser. Review and submit your report on GitHub.": "Otwiera przeglądarkę internetową. Sprawdź raport i wyślij go na GitHubie.",
|
||||
"Operator": "Operator",
|
||||
"Orbit (right drag)": "Obracanie widoku (przeciąganie prawym przyciskiem)",
|
||||
"Other side": "Druga strona",
|
||||
"Other surface (mutual trim)": "Druga powierzchnia (wzajemne przycięcie)",
|
||||
"Outside": "Na zewnątrz",
|
||||
@@ -256,6 +268,7 @@
|
||||
"Pick the tool bodies": "Wybierz bryły narzędziowe",
|
||||
"Picked": "Wybrane",
|
||||
"Picked point": "Wybrany punkt",
|
||||
"Pitch": "Skok",
|
||||
"Place at the origin instead": "Zamiast tego umieść w początku układu",
|
||||
"Plastic Rules": "Reguły tworzyw",
|
||||
"Playback": "Odtwarzanie",
|
||||
@@ -289,6 +302,8 @@
|
||||
"Remove the track": "Usuń ścieżkę",
|
||||
"Remove this point": "Usuń ten punkt",
|
||||
"Report a bug — review a screenshot and open a GitHub draft": "Zgłoś błąd — sprawdź zrzut ekranu i otwórz szkic zgłoszenia na GitHubie",
|
||||
"Report text copied. Paste it into GitHub and submit your report there.": "Skopiowano treść raportu. Wklej ją na GitHubie i tam wyślij raport.",
|
||||
"Reports are public. A GitHub account is required.": "Raporty są publiczne. Wymagane jest konto GitHub.",
|
||||
"Reset Toolbar": "Przywróć pasek narzędzi",
|
||||
"Resize Part": "Zmień rozmiar części",
|
||||
"Restore View": "Przywróć widok",
|
||||
@@ -303,6 +318,7 @@
|
||||
"Revert Pos.": "Przywróć poł.",
|
||||
"Revert Position": "Przywróć położenie",
|
||||
"Review the report and screenshot before opening GitHub.": "Przed otwarciem GitHuba sprawdź raport i zrzut ekranu.",
|
||||
"Review your report on GitHub and click Submit new issue to publish it.": "Sprawdź raport na GitHubie i kliknij Submit new issue, aby go opublikować.",
|
||||
"Rim Edge": "Krawędź obrzeża",
|
||||
"Roll History Marker Here": "Przesuń tutaj znacznik historii",
|
||||
"Round": "Okrągłe",
|
||||
@@ -313,10 +329,12 @@
|
||||
"SURFACE QUALITY": "JAKOŚĆ POWIERZCHNI",
|
||||
"Save Rule": "Zapisz regułę",
|
||||
"Save View": "Zapisz widok",
|
||||
"Save screenshot…": "Zapisz zrzut ekranu…",
|
||||
"Save the study as an animated GIF, seen as the viewport shows it": "Zapisz badanie jako animowany GIF, tak jak widać je w widoku",
|
||||
"Saved preview. Geometry is being checked before editing.": "Zapisany podgląd. Geometria jest sprawdzana przed edycją.",
|
||||
"Scale factor": "Współczynnik skali",
|
||||
"Scene": "Scena",
|
||||
"Screenshot (optional)": "Zrzut ekranu (opcjonalnie)",
|
||||
"Search": "Szukaj",
|
||||
"Search commands": "Szukaj poleceń",
|
||||
"Search this library": "Przeszukaj tę bibliotekę",
|
||||
@@ -351,17 +369,21 @@
|
||||
"Start continuity": "Ciągłość początku",
|
||||
"Step": "Krok",
|
||||
"Steps": "Kroki",
|
||||
"Steps to reproduce (optional)": "Kroki do odtworzenia (opcjonalnie)",
|
||||
"Stitch the kept pieces": "Zszyj zachowane części",
|
||||
"Stitch to both bodies": "Zszyj z obiema bryłami",
|
||||
"Study": "Badanie",
|
||||
"Style": "Styl",
|
||||
"Summary": "Podsumowanie",
|
||||
"Suppressed": "Wygaszone",
|
||||
"Surface": "Powierzchnia",
|
||||
"Swap Ends": "Zamień końce",
|
||||
"TRIM": "PRZYCINANIE",
|
||||
"Tangent (G1)": "Styczność (G1)",
|
||||
"Tangent Chain": "Łańcuch styczny",
|
||||
"Tap drill diameter": "Średnica wiertła pod gwint",
|
||||
"Tear": "Rozdarcie",
|
||||
"Technical details": "Szczegóły techniczne",
|
||||
"The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "Przerywany szkic to zapisana płaszczyzna pomocnicza. Wybierz nową ścianę, aby naprawić zaczepienie.",
|
||||
"The saved author occurrence is missing. Select a valid author placement before rebinding.": "Brak zapisanego wystąpienia autora. Przed ponownym powiązaniem wybierz prawidłowe położenie autora.",
|
||||
"Then": "Wtedy",
|
||||
@@ -373,6 +395,7 @@
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "Ten element podrzędny jest współdzielony. Usunięcie go usuwa go z każdej kopii elementu nadrzędnego.",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "Ten element podrzędny jest współdzielony. Zmiany położenia dotyczą każdej kopii elementu nadrzędnego.",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "Ta ściana nie zapewnia trwałego zaczepienia. Wybierz inną ścianę lub jawnie użyj stałej płaszczyzny.",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "Ten obraz nie jest jeszcze dołączony na GitHubie. Skopiuj go lub zapisz, a potem dołącz na GitHubie.",
|
||||
"To Offset": "Do odsunięcia",
|
||||
"To edges": "Do krawędzi",
|
||||
"Tolerance": "Tolerancja",
|
||||
@@ -398,6 +421,9 @@
|
||||
"Wall": "Ścianka",
|
||||
"Wall Location": "Położenie ścianki",
|
||||
"Wall Thickness": "Grubość ścianki",
|
||||
"What did you do just before the problem? A short list is enough": "Co robiłeś tuż przed wystąpieniem problemu? Wystarczy krótka lista",
|
||||
"What did you expect to see?": "Czego się spodziewałeś?",
|
||||
"What happened?": "Co się stało?",
|
||||
"When": "Gdy",
|
||||
"Width": "Szerokość",
|
||||
"Will fail": "Nie powiedzie się",
|
||||
@@ -408,6 +434,29 @@
|
||||
"Z angle": "Kąt Z",
|
||||
"Z distance": "Odległość Z",
|
||||
"Zebra": "Zebra",
|
||||
"ai.prefs.availability": "Sterowanie asystentem",
|
||||
"ai.prefs.background_commands": "Uruchamiaj polecenia agenta w tle",
|
||||
"ai.prefs.follow_camera": "Obracaj kamerę do szkiców",
|
||||
"ai.prefs.follow_camera_off": "Automatyczne podążanie kamery jest wyłączone.",
|
||||
"ai.prefs.follow_camera_on": "Kamera obraca się przodem do szkiców tworzonych przez agenta.",
|
||||
"ai.prefs.intro": "Agenty, uprawnienia i sposób pokazywania ich pracy.",
|
||||
"ai.prefs.make_default": "Używaj domyślnie",
|
||||
"ai.prefs.no_agents": "Brak agentów. Dodaj agenta lub odśwież, aby wyszukać zainstalowane agenty.",
|
||||
"ai.prefs.no_saved_approvals": "Brak zapisanych zgód.",
|
||||
"ai.prefs.override_all_warning": "Ten agent może zapisywać, nadpisywać, eksportować i zastępować projekt bez pytania.",
|
||||
"ai.prefs.permission_all": "Zezwalaj na wszystko",
|
||||
"ai.prefs.permission_all_summary": "Dostępne narzędzia SolidCraft działają bez pytania.",
|
||||
"ai.prefs.permission_ask": "Pytaj przed zmianami",
|
||||
"ai.prefs.permission_ask_summary": "Zatwierdzaj każdą zmianę projektu i każdą operację na plikach.",
|
||||
"ai.prefs.permission_edits": "Zezwalaj na edycję modelu",
|
||||
"ai.prefs.permission_edits_summary": "Edycja modelu działa bez pytania; operacje na plikach i nieodwracalne nadal wymagają pytania.",
|
||||
"ai.prefs.permission_scope": "Dotyczy tylko narzędzi SolidCraft. Powłoka agenta i edycja plików podlegają jego własnym uprawnieniom.",
|
||||
"ai.prefs.pointer_preview_hidden": "Wskaźnik ukryty",
|
||||
"ai.prefs.pointer_preview_speed": "Wskaźnik agenta · {speed}",
|
||||
"ai.prefs.pointer_speed": "Szybkość ruchu",
|
||||
"ai.prefs.privacy_note": "Rozmowę otrzymuje tylko wybrany przez Ciebie agent lub punkt końcowy. Klucze punktów końcowych są przechowywane w systemowym pęku kluczy.",
|
||||
"ai.prefs.show_pointer": "Pokaż wskaźnik agenta",
|
||||
"ai.prefs.turn_limit_hint": "Maksymalna liczba wywołań narzędzi zmieniających projekt, które asystent może wykonać dla jednej wiadomości.",
|
||||
"angle, height": "kąt, wysokość",
|
||||
"appearance.dielectric_ior": "Współczynnik załamania dielektryka (IOR)",
|
||||
"appearance.metallic": "Metaliczność",
|
||||
@@ -758,6 +807,7 @@
|
||||
"cmd.view_graphics_preset": "Ustawienie graficzne",
|
||||
"cmd.view_list": "Lista widoków nazwanych",
|
||||
"cmd.view_navigate": "Nawiguj widokiem",
|
||||
"cmd.view_normal_to": "Prostopadle do zaznaczenia",
|
||||
"cmd.view_rename": "Zmień nazwę widoku nazwanego",
|
||||
"cmd.view_save": "Nowy widok nazwany",
|
||||
"color.copy": "Kliknij, aby skopiować wartości koloru",
|
||||
@@ -831,7 +881,7 @@
|
||||
"dxf.progress.projection": "Rzutowanie geometrii (3/5)",
|
||||
"dxf.progress.write": "Zapisywanie DXF (5/5)",
|
||||
"dxf.tolerance": "Tolerancja krzywych",
|
||||
"dxf.tolerance_help": "Tylko widoczne bryły. Krzywe są przybliżane odcinkami. Mniejsza tolerancja daje dokładniejsze krzywe, ale zajmuje więcej czasu i pamięci.",
|
||||
"dxf.tolerance_help": "Tylko widoczne bryły i pokazane szkice. Krzywe są przybliżane odcinkami. Mniejsza tolerancja daje dokładniejsze krzywe, ale zajmuje więcej czasu i pamięci.",
|
||||
"file_load.built": "Dotąd zbudowano: {built} z {total} elementów.",
|
||||
"file_load.converting": "Konwertowanie bryły {done} z {total}",
|
||||
"file_load.inserting": "Wstawianie geometrii",
|
||||
@@ -855,20 +905,64 @@
|
||||
"help.licences": "Licencje",
|
||||
"help.mit": "Licencja MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.solid.chamfer": "Ścina zaznaczone krawędzie płaską fazą o zadanej odległości. Służy do łamania ostrych krawędzi lub ułatwienia wprowadzenia kołka czy śruby.",
|
||||
"help.solid.extrude": "Wyciąga profil szkicu w 3D na zadaną odległość, dodając lub usuwając materiał. Służy do zamiany płaskiego obrysu w blok, występ lub kieszeń.",
|
||||
"help.solid.fillet": "Zaokrągla zaznaczone krawędzie gładkim łukiem o zadanym promieniu. Służy do złagodzenia ostrych krawędzi dla wytrzymałości, wygody lub wyglądu.",
|
||||
"help.solid.hole": "Wierci okrągły otwór o zadanej średnicy w wybranym punkcie ściany. Służy do otworów przelotowych pod śruby, kołki i innych prostych okrągłych otworów.",
|
||||
"help.solid.revolve": "Obraca profil szkicu wokół osi, tworząc okrągłą bryłę. Służy do wałków, gałek, misek i wszystkich części okrągłych względem osi.",
|
||||
"help.solid.shell": "Wydrąża bryłę, pozostawiając ścianki o zadanej grubości, i może otworzyć wybrane ściany. Służy do pudełek, pokryw i innych części cienkościennych.",
|
||||
"help.third_party": "Licencje stron trzecich",
|
||||
"home.back": "Wróć do {name}",
|
||||
"home.crashes": "Raporty awarii",
|
||||
"home.design_workspace": "Projektowanie",
|
||||
"home.documentation": "Dokumentacja",
|
||||
"home.export": "Eksportuj",
|
||||
"home.export_hint": "Wybierz format dla bieżącego projektu.",
|
||||
"home.export_json_hint": "Edytowalny projekt i historia poleceń",
|
||||
"home.export_mesh_hint": "Siatka do druku lub udostępniania",
|
||||
"home.export_step_hint": "Precyzyjna geometria bryłowa",
|
||||
"home.import": "Importuj…",
|
||||
"home.import_hint": "STEP, IGES lub siatka do nowego projektu",
|
||||
"home.in_this_browser": "w tej przeglądarce",
|
||||
"home.missing": "brak",
|
||||
"home.month_01": "sty",
|
||||
"home.month_02": "lut",
|
||||
"home.month_03": "mar",
|
||||
"home.month_04": "kwi",
|
||||
"home.month_05": "maj",
|
||||
"home.month_06": "cze",
|
||||
"home.month_07": "lip",
|
||||
"home.month_08": "sie",
|
||||
"home.month_09": "wrz",
|
||||
"home.month_10": "paź",
|
||||
"home.month_11": "lis",
|
||||
"home.month_12": "gru",
|
||||
"home.new_inches": "Nowy projekt w calach",
|
||||
"home.new_inches_hint": "Cale · otwiera w obszarze Projektowanie",
|
||||
"home.new_mm": "Nowy projekt",
|
||||
"home.new_mm_hint": "Milimetry · otwiera w obszarze Projektowanie",
|
||||
"home.open": "Otwórz…",
|
||||
"home.opened_days_ago": "Otwarto {count} dni temu",
|
||||
"home.opened_hours_ago": "Otwarto {count} godz. temu",
|
||||
"home.opened_just_now": "Otwarto przed chwilą",
|
||||
"home.opened_minutes_ago": "Otwarto {count} min temu",
|
||||
"home.open_hint": "Projekt .solidcraft ({shortcut})",
|
||||
"home.open_now": "Otwórz teraz",
|
||||
"home.opened_days_ago": "{count} dni temu",
|
||||
"home.opened_hours_ago": "{count} godz. temu",
|
||||
"home.opened_just_now": "Przed chwilą",
|
||||
"home.opened_minutes_ago": "{count} min temu",
|
||||
"home.opening": "otwieranie…",
|
||||
"home.properties": "Właściwości projektu",
|
||||
"home.recent": "Ostatnie",
|
||||
"home.recent_empty": "Tutaj pojawią się projekty, które otworzysz lub zapiszesz.",
|
||||
"home.recovery_count": "Projekty do odzyskania: {count}",
|
||||
"home.recovery_empty": "Brak projektów do odzyskania.",
|
||||
"home.recovery_hint": "SolidCraft zamknął się przed zapisaniem tych projektów.",
|
||||
"home.report_issue": "Zgłoś problem",
|
||||
"home.samples": "Przykłady",
|
||||
"home.settings": "Ustawienia",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Skróty klawiszowe",
|
||||
"home.start_hint": "Utwórz projekt, otwórz ostatni plik lub obejrzyj przykład.",
|
||||
"home.whats_new": "Co nowego",
|
||||
"home.yesterday": "Wczoraj",
|
||||
"install.button_tip": "Zainstaluj SolidCraft jako aplikację: otwiera się we własnym oknie i działa offline",
|
||||
"install.dock_1": "Wybierz Plik › Dodaj do Docka.",
|
||||
"install.dock_2": "Kliknij Dodaj.",
|
||||
@@ -926,6 +1020,8 @@
|
||||
"motion.to_end": "Na koniec",
|
||||
"motion.to_start": "Na początek",
|
||||
"motion.track_name": "Ścieżka {number}",
|
||||
"nav.free_orbit.help": "Mysz i mysz 3D obracają widok przez oba bieguny i zachowują przechylenie. Przyciąganie do osi z Shift jest wyłączone.",
|
||||
"nav.free_orbit.label": "Swobodne obracanie",
|
||||
"nav.touchpad.help": "Przytrzymaj Shift i poruszaj wskaźnikiem, aby przesuwać; przytrzymaj Alt/Option i poruszaj nim, aby obracać widok. Przycisk myszy nie jest potrzebny. Przewijanie w pionie powiększa.",
|
||||
"nav.touchpad.label": "Touchpad",
|
||||
"nav.touchpad.orbit": "Obracanie widoku (przytrzymaj Alt/Option i poruszaj; bez przycisku myszy)",
|
||||
@@ -948,8 +1044,130 @@
|
||||
"pattern.flip_direction": "Odwróć kierunek",
|
||||
"pick a hole to seat it, or OK places it at the origin": "wybierz otwór, aby go osadzić, lub OK umieszcza go w początku układu",
|
||||
"pick one or two vertices, edges or faces": "wybierz jeden lub dwa wierzchołki, krawędzie lub ściany",
|
||||
"prefs.add_item": "Dodaj element",
|
||||
"prefs.alt_frees_manipulators": "Alt / Option zwalnia również strzałki manipulatora",
|
||||
"prefs.anti_aliasing_note": "Wygładza poszarpane krawędzie.",
|
||||
"prefs.applies_on_restart": "Działa po ponownym uruchomieniu",
|
||||
"prefs.assistant": "Asystent",
|
||||
"prefs.axes": "Osie",
|
||||
"prefs.axis": "Oś",
|
||||
"prefs.bottom": "Dół",
|
||||
"prefs.browser": "Przeglądarka",
|
||||
"prefs.built_in": "Wbudowana",
|
||||
"prefs.button_left": "Przeciąganie lewym",
|
||||
"prefs.button_middle": "Przeciąganie środkowym",
|
||||
"prefs.button_right": "Przeciąganie prawym",
|
||||
"prefs.choose_font": "Wybierz plik czcionki…",
|
||||
"prefs.click": "Kliknięcie",
|
||||
"prefs.contact_shading": "Miękkie cieniowanie kontaktowe",
|
||||
"prefs.contact_shading_note": "Miękkie cieniowanie tam, gdzie części są blisko siebie.",
|
||||
"prefs.context_menu": "Menu kontekstowe",
|
||||
"prefs.context_menu_ring": "Menu kontekstowe · przytrzymaj, aby otworzyć menu promieniste",
|
||||
"prefs.cpu": "CPU (programowo)",
|
||||
"prefs.crash_reports": "Otwórz raporty o awariach…",
|
||||
"prefs.crash_reports_note": "Raporty są przechowywane na tym komputerze, razem z projektem i poleceniami, które odtwarzają problem.",
|
||||
"prefs.ctrl_cmd": "Ctrl / Cmd",
|
||||
"prefs.curved_surfaces": "Powierzchnie zakrzywione",
|
||||
"prefs.curves": "Powierzchnie zakrzywione",
|
||||
"prefs.dead_zone_note": "Zakreskowany pas to strefa martwa: ruch wewnątrz niej jest pomijany.",
|
||||
"prefs.default": "domyślnie",
|
||||
"prefs.design": "Ustawienia domyślne projektu",
|
||||
"prefs.design_note": "Ustawienia, z którymi startują nowe projekty. Otwarte projekty zachowują własne.",
|
||||
"prefs.devices": "Mysz 3D",
|
||||
"prefs.display": "Wyświetlanie",
|
||||
"prefs.edges": "Krawędzie i cieniowanie",
|
||||
"prefs.extend": "Rozszerz",
|
||||
"prefs.extra_navigation": "Ctrl+przeciąganie lewym na pustym miejscu obraca widok; przytrzymaj Spację, aby przesuwać.",
|
||||
"prefs.follows_os": "Zgodnie z systemem",
|
||||
"prefs.font": "Czcionka",
|
||||
"prefs.font_fallback": "Znaki, których brakuje w wybranej czcionce, są brane z czcionki wbudowanej, więc żadna etykieta nie pokaże pustego prostokąta.",
|
||||
"prefs.font_sample": "Zażółć gęślą jaźń · Ø12.50 mm · 45.0° · 0123456789",
|
||||
"prefs.font_unreadable": "Nie można odczytać wybranej czcionki.",
|
||||
"prefs.general": "Ogólne",
|
||||
"prefs.general_note": "Język, zapisywanie i aktualizacje.",
|
||||
"prefs.gesture_orbit": "Obracanie widoku",
|
||||
"prefs.gesture_pan": "Przesuwanie",
|
||||
"prefs.gesture_zoom": "Powiększanie",
|
||||
"prefs.graphics": "Grafika",
|
||||
"prefs.graphics_note": "Wybierz między szybkością a gładkością. Każda opcja pokazuje swój efekt na przykładzie.",
|
||||
"prefs.graphics_presets_note": "Ustawienia wstępne zmieniają razem poniższe opcje.",
|
||||
"prefs.history": "Historia",
|
||||
"prefs.hold_stop_snapping": "Przytrzymaj, aby wyłączyć przyciąganie",
|
||||
"prefs.icons_only": "Tylko ikony",
|
||||
"prefs.imported_file": "Zaimportowany plik",
|
||||
"prefs.input": "Wprowadzanie",
|
||||
"prefs.interface": "Interfejs",
|
||||
"prefs.interface_language": "Język interfejsu",
|
||||
"prefs.interface_note": "Wygląd SolidCraft i rozmieszczenie jego elementów.",
|
||||
"prefs.interval_minutes": "{n} min",
|
||||
"prefs.labels": "Etykiety",
|
||||
"prefs.layout": "Układ",
|
||||
"prefs.layout_note": "Kompaktowy dokuje panele do krawędzi okna. Przezroczystość przeglądarki jest dostępna w układzie Pływający. Stronę asystenta zmienisz na stronie Asystent.",
|
||||
"prefs.left": "Lewo",
|
||||
"prefs.left_click": "Kliknięcie lewym",
|
||||
"prefs.live_input": "Bieżące wejście",
|
||||
"prefs.live_preview": "Podgląd na żywo",
|
||||
"prefs.minutes": "minut",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "Mysz i gładzik",
|
||||
"prefs.mouse_heading": "Mysz",
|
||||
"prefs.mouse_mapping": "Przypisanie przycisków myszy",
|
||||
"prefs.navigation": "Nawigacja",
|
||||
"prefs.navigation_note": "Jak mysz, gładzik i mysz 3D poruszają widokiem.",
|
||||
"prefs.not_on_gpu": "niedostępne na tym GPU",
|
||||
"prefs.on": "Włączone",
|
||||
"prefs.opaque": "Nieprzezroczysta",
|
||||
"prefs.orbit_snap": "Przytrzymaj Shift podczas obracania widoku, aby przyciągnąć do osi.",
|
||||
"prefs.orientation": "Orientacja",
|
||||
"prefs.overall_speed": "Szybkość ogólna",
|
||||
"prefs.preview_choices": "Podgląd wybranych opcji",
|
||||
"prefs.quality_default": "domyślnie",
|
||||
"prefs.quality_fastest": "najszybciej",
|
||||
"prefs.quality_slowest": "najwolniej",
|
||||
"prefs.quality_smoother": "gładziej",
|
||||
"prefs.reports_saved": "Zapisane: {n}",
|
||||
"prefs.right_click": "Kliknięcie prawym",
|
||||
"prefs.saving": "Autozapis i odzyskiwanie",
|
||||
"prefs.scale_note": "Także Ctrl + / Ctrl − w oknie. Przyciski mają 28 px przy 100%.",
|
||||
"prefs.scale_text": "Skala i tekst",
|
||||
"prefs.select": "Zaznacz",
|
||||
"prefs.select_one_item": "Zaznacz jeden element",
|
||||
"prefs.selecting": "Zaznaczanie",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift tylko dodaje; Ctrl / Cmd przełącza",
|
||||
"prefs.shift_add_note": "Włączone: Shift dodaje, Ctrl / Cmd przełącza. Wyłączone (domyślnie): oba przełączają.",
|
||||
"prefs.shortcuts": "Skróty",
|
||||
"prefs.sketch_selection": "Szkic i zaznaczanie",
|
||||
"prefs.sketch_selection_heading": "Szkic i zaznaczanie",
|
||||
"prefs.sketch_selection_note": "Jak działa przyciąganie w szkicach i jak kliknięcia zaznaczają.",
|
||||
"prefs.sketching": "Szkicowanie",
|
||||
"prefs.snap_drawing_note": "Podczas rysowania lub przeciągania punktu szkicu.",
|
||||
"prefs.source": "Źródło",
|
||||
"prefs.speed": "Szybkość",
|
||||
"prefs.stand_up_note": "Gdy plik STEP lub IGES otworzy się z osią Z w górę, proponuj obrót o ćwierć obrotu wokół osi X.",
|
||||
"prefs.status_done": "Gotowe",
|
||||
"prefs.status_error": "Błąd",
|
||||
"prefs.status_selected": "Zaznaczone",
|
||||
"prefs.status_warning": "Ostrzeżenie",
|
||||
"prefs.supersampling_brief": "Rysuje widok w większym rozmiarze i go zmniejsza: bardzo ostro, ale bardziej obciąża.",
|
||||
"prefs.tab_accent_note": "Kolor akcentu podąża za aktywną kartą",
|
||||
"prefs.theme_file": "plik motywu",
|
||||
"prefs.timeline_half_hour": "−30 min",
|
||||
"prefs.timeline_now": "teraz",
|
||||
"prefs.timeline_quarter_hour": "−15",
|
||||
"prefs.toggle_item": "Dodaj element lub usuń go ponownie",
|
||||
"prefs.toolbar": "Pasek narzędzi",
|
||||
"prefs.translucent": "Półprzezroczysta",
|
||||
"prefs.under_browser": "Pod przeglądarką",
|
||||
"prefs.under_cursor": "Pod kursorem",
|
||||
"prefs.units_precision": "Jednostki i dokładność",
|
||||
"prefs.updates": "Aktualizacje",
|
||||
"prefs.view": "Zachowanie widoku",
|
||||
"prefs.viewport": "Widok",
|
||||
"prefs.wheel": "Kółko",
|
||||
"prefs.wheel_trackpad": "Kółko i gładzik",
|
||||
"prefs.workspace": "Środowisko pracy",
|
||||
"prefs.zoom_toward_cursor": "Powiększanie w stronę kursora",
|
||||
"properties.title": "Właściwości: {name}",
|
||||
"recovery.days_ago": "{count} dni temu",
|
||||
"recovery.detail": "{file} · elementy: {features} · autozapis {when}",
|
||||
@@ -1021,7 +1239,7 @@
|
||||
"search.try": "Wpisz nazwę polecenia, element tego projektu lub parametr. Aby uruchomić polecenie z wartościami, wpisz jego identyfikator i obiekt JSON: {example}",
|
||||
"search.valid": "Prawidłowe",
|
||||
"settings.display_quality_note": "Wyższe poziomy rysują zakrzywione ściany i krawędzie gładziej, ale siatka powstaje dłużej. Zmienia się tylko widok, nigdy projekt ani eksport.",
|
||||
"settings.frame_rate_note": "Pokazuje liczbę klatek na sekundę w prawym dolnym rogu widoku. Gdy jest włączone, widok odświeża się bez przerwy.",
|
||||
"settings.frame_rate_note": "Pokazuje liczbę klatek na sekundę w prawym dolnym rogu widoku.",
|
||||
"settings.measure_axis_distances": "Pokaż odległości X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Gdy pomiar jest otwarty, pokazuj składowe wzdłuż osi globalnych obok odległości całkowitej.",
|
||||
"settings.msaa_applies_on_restart": "Wygładzanie krawędzi zadziała po ponownym uruchomieniu SolidCraft",
|
||||
@@ -1066,6 +1284,9 @@
|
||||
"thread.designation": "Oznaczenie",
|
||||
"thread.iso_metric": "Metryczny ISO",
|
||||
"thread.select_size": "Wybierz rozmiar",
|
||||
"timeline.delete_after_marker_one": "Usuń 1 funkcję za znacznikiem historii",
|
||||
"timeline.delete_after_marker_other": "Usuń funkcje za znacznikiem historii: {count}",
|
||||
"timeline.delete_many": "Usuń zaznaczone funkcje: {count}",
|
||||
"timeline.group": "Nowy folder funkcji",
|
||||
"timeline.move_many": "Przenieś elementy osi czasu",
|
||||
"timeline.move_to_group": "Przenieś funkcje do folderu",
|
||||
@@ -1092,6 +1313,7 @@
|
||||
"ui.agent_chat_add": "Załącz pliki",
|
||||
"ui.agent_chat_add_file": "Wybierz plik…",
|
||||
"ui.agent_chat_allow": "Zezwól",
|
||||
"ui.agent_chat_allow_once": "Zezwól raz",
|
||||
"ui.agent_chat_allowed": "Zezwolono",
|
||||
"ui.agent_chat_answered": "Odpowiedź: {option}",
|
||||
"ui.agent_chat_approval": "Zezwolić agentowi na to działanie?",
|
||||
@@ -1143,12 +1365,16 @@
|
||||
"ui.agent_chat_files_left_out": "Do jednej wiadomości można dołączyć najwyżej {max} plików; pominięto: {files}",
|
||||
"ui.agent_chat_files_loading": "Oczekiwanie na odczytanie plików",
|
||||
"ui.agent_chat_files_max": "Najwyżej {max} plików w jednej wiadomości",
|
||||
"ui.agent_chat_flatpak_none_found": "Nie znaleziono agenta programistycznego. Piaskownica Flatpak domyślnie nie widzi agentów zainstalowanych w folderze domowym i nie ma dostępu do sieci. Aby zezwolić na Claude Code i jego adapter ACP zainstalowane przez nvm lub w ~/.local/bin, uruchom to polecenie w terminalu, a potem uruchom ponownie SolidCraft. Daje ono dostęp do wymienionych programów i plików logowania oraz dostęp do sieci:",
|
||||
"ui.agent_chat_import_failed": "{name}: import się nie powiódł: {error}",
|
||||
"ui.agent_chat_intro": "Rozmawiaj z agentem programistycznym, którego już używasz, lub z wybranym punktem końcowym modelu. Pracuje on na otwartym projekcie za pomocą narzędzi SolidCraft: jego zmiany są widoczne na bieżąco, a cofa się je jednym krokiem na wiadomość. To, co może robić bez pytania, ustawisz w Preferencje > AI.",
|
||||
"ui.agent_chat_key_in_env": "klucz ustawiony",
|
||||
"ui.agent_chat_left": "Lewa",
|
||||
"ui.agent_chat_limit": "Agent osiągnął limit {limit} zmian na jedną wiadomość. Wyślij kolejną wiadomość, aby mógł kontynuować.",
|
||||
"ui.agent_chat_minimize": "Zminimalizuj do paska",
|
||||
"ui.agent_chat_mode_all": "Wszystko",
|
||||
"ui.agent_chat_mode_ask": "Pytaj",
|
||||
"ui.agent_chat_mode_edits": "Edycje",
|
||||
"ui.agent_chat_model_tip": "Model używany przez agenta. Twój wybór jest zapamiętywany dla tego agenta.",
|
||||
"ui.agent_chat_new": "Nowy czat",
|
||||
"ui.agent_chat_new_confirm": "Rozpocząć nowy czat? Bieżący zostanie wyczyszczony.",
|
||||
@@ -1161,6 +1387,7 @@
|
||||
"ui.agent_chat_none_found_short": "Nie znaleziono agenta",
|
||||
"ui.agent_chat_not_installed": "Nie zainstalowano",
|
||||
"ui.agent_chat_not_signed_in": "nie zalogowano",
|
||||
"ui.agent_chat_open_settings": "Otwórz preferencje",
|
||||
"ui.agent_chat_own_window": "Osobne okno",
|
||||
"ui.agent_chat_paste_picture": "Wklej obraz",
|
||||
"ui.agent_chat_permission": "Agent prosi o uruchomienie: {title}",
|
||||
@@ -1185,6 +1412,8 @@
|
||||
"ui.agent_chat_send": "Wyślij",
|
||||
"ui.agent_chat_send_now": "Wyślij teraz",
|
||||
"ui.agent_chat_send_now_tip": "Zatrzymaj bieżący krok agenta i wyślij tę wiadomość jako następną (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft komunikuje się z agentem programistycznym zainstalowanym na tym komputerze. Wybierz go w Preferencje › AI.",
|
||||
"ui.agent_chat_setup_title": "Skonfiguruj asystenta",
|
||||
"ui.agent_chat_side": "Strona czatu z agentem",
|
||||
"ui.agent_chat_signed_in": "zalogowano",
|
||||
"ui.agent_chat_state_auth": "Wymagane logowanie",
|
||||
@@ -1201,8 +1430,11 @@
|
||||
"ui.agent_chat_undo_label": "Czat z agentem: {message}",
|
||||
"ui.agent_chat_undone": "(cofnięto)",
|
||||
"ui.agent_chat_view_attached": "Dołączono widok",
|
||||
"ui.agent_chat_waiting": "Czeka na Ciebie",
|
||||
"ui.agent_cursor": "Kursor agenta",
|
||||
"ui.agent_cursor_speed": "Szybkość kursora agenta",
|
||||
"ui.agent_off_thread": "Zachowaj responsywność okna, gdy agenty wykonują polecenia",
|
||||
"ui.agent_off_thread_note": "Wolne polecenia agenta (z panelu AI lub klienta MCP) są liczone obok okna: możesz dalej obracać i oglądać widok oraz zatrzymać polecenie przyciskiem w widoku. Wyłączone: każde działa w wątku okna, a okno na nie czeka.",
|
||||
"ui.ai_add": "Dodaj",
|
||||
"ui.ai_add_agent": "Dodaj agenta…",
|
||||
"ui.ai_add_agent_title": "Dodaj agenta",
|
||||
@@ -1455,6 +1687,7 @@
|
||||
"ui.grid_follows_view_hint": "Widoki boczne pokazują siatkę na pionowej płaszczyźnie zwróconej do nich zamiast na podłożu",
|
||||
"ui.ground_shadow": "Cień na podłożu",
|
||||
"ui.groupSelected": "Grupuj zaznaczone",
|
||||
"ui.hatch": "Kreskowanie",
|
||||
"ui.heading_add_ins": "DODATKI",
|
||||
"ui.heading_assemble": "ZŁOŻENIE",
|
||||
"ui.heading_box": "PROSTOPADŁOŚCIAN",
|
||||
@@ -1528,7 +1761,19 @@
|
||||
"ui.hideOrigin": "Ukryj początek układu",
|
||||
"ui.hidePlanes": "Ukryj płaszczyzny",
|
||||
"ui.hideProfile": "Ukryj profil",
|
||||
"ui.history_back": "Cofnij o jeden krok",
|
||||
"ui.history_below_browser": "Pod przeglądarką",
|
||||
"ui.history_edge_hint": "kliknij dwukrotnie krawędź",
|
||||
"ui.history_first": "Przejdź do początku",
|
||||
"ui.history_forward": "Przejdź o jeden krok do przodu",
|
||||
"ui.history_hide_names": "Ukryj nazwy",
|
||||
"ui.history_last": "Przejdź do końca",
|
||||
"ui.history_marker_tip": "Znacznik historii: przeciągnij, aby cofnąć model; nowe funkcje trafiają tutaj",
|
||||
"ui.history_names": "Nazwy",
|
||||
"ui.history_play": "Odtwórz do końca",
|
||||
"ui.history_show_names": "Pokaż nazwy",
|
||||
"ui.history_title": "Historia",
|
||||
"ui.history_toggle_names": "Pokaż lub ukryj nazwy funkcji",
|
||||
"ui.hole": "Otwór",
|
||||
"ui.hole_tap_type": "Typ gwintu otworu",
|
||||
"ui.hole_type": "Typ otworu",
|
||||
@@ -1545,6 +1790,8 @@
|
||||
"ui.joints": "Złącza",
|
||||
"ui.keyboard_shortcuts": "Skróty klawiszowe",
|
||||
"ui.language": "Język",
|
||||
"ui.layout_compact": "Kompaktowy",
|
||||
"ui.layout_floating": "Pływający",
|
||||
"ui.length_decimals": "Miejsca dziesiętne długości",
|
||||
"ui.light": "Jasny",
|
||||
"ui.line": "Linia",
|
||||
@@ -1682,6 +1929,7 @@
|
||||
"ui.reverse_zoom_direction": "Odwróć kierunek powiększania",
|
||||
"ui.revolve": "Obrót",
|
||||
"ui.ribbon_exit": "Wyjdź",
|
||||
"ui.ribbon_labels": "Pokazuj tekst pod ikonami wstążki",
|
||||
"ui.ribbon_pin_footer": "Przypięte polecenia są widoczne na wstążce. Najedź na wiersz, aby go przypiąć lub odpiąć.",
|
||||
"ui.ribbon_workspace": "Przestrzeń robocza",
|
||||
"ui.right": "Prawy",
|
||||
@@ -1737,6 +1985,7 @@
|
||||
"ui.smooth_wheel_zoom": "Płynne powiększanie kółkiem",
|
||||
"ui.smooth_wheel_zoom_tip": "Wyłącz, aby każdy ruch kółka działał od razu, bez wygładzania",
|
||||
"ui.snap": "Przyciąganie",
|
||||
"ui.space_mouse_axes_reassigned": "Osie są przypisane inaczej w Preferencjach i to przypisanie nadal działa niezależnie od tej kalibracji.",
|
||||
"ui.space_mouse_calibrate": "Kalibruj…",
|
||||
"ui.space_mouse_calibrate_tip": "Przesuwaj nakładkę zgodnie z poleceniami okna, aby SolidCraft nauczył się kierunku i zakresu każdej osi tej myszy 3D. Zapisywane dla tej myszy 3D.",
|
||||
"ui.space_mouse_calibrate_title": "Kalibracja myszy 3D",
|
||||
@@ -1746,12 +1995,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Jedna oś prawie się nie poruszyła, więc nie można jej skalibrować. Zacznij od nowa i za każdym razem wychylaj nakładkę mocniej.",
|
||||
"ui.space_mouse_dead_zone": "Strefa martwa",
|
||||
"ui.space_mouse_dead_zone_tip": "O ile trzeba wychylić nakładkę, zanim widok się poruszy, jako część pełnego wychylenia. Zwiększ, jeśli widok dryfuje przy nieruszanej nakładce.",
|
||||
"ui.space_mouse_driven_by": "Który skalibrowany ruch urządzenia steruje tą osią. Wybranie ruchu używanego już przez inną oś zamienia je miejscami.",
|
||||
"ui.space_mouse_driven_by_label": "sterowana przez",
|
||||
"ui.space_mouse_driver": "Sterownik myszy 3D",
|
||||
"ui.space_mouse_driver_auto": "Automatycznie",
|
||||
"ui.space_mouse_driver_direct": "Bezpośrednio (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Bezpośredni odczyt urządzenia; spacenavd nie działa",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Odczyt przez spacenavd, jedyny dostępny sposób",
|
||||
"ui.space_mouse_forget": "Zapomnij kalibrację",
|
||||
"ui.space_mouse_hint": "Przesuwaj i obracaj widok jednocześnie; w szkicach działa tylko przesuwanie i powiększanie.",
|
||||
"ui.space_mouse_motion_rotation_x": "Obrót X",
|
||||
"ui.space_mouse_motion_rotation_y": "Obrót Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Obrót Z",
|
||||
"ui.space_mouse_motion_translation_x": "Przesunięcie X",
|
||||
"ui.space_mouse_motion_translation_y": "Przesunięcie Y",
|
||||
"ui.space_mouse_motion_translation_z": "Przesunięcie Z",
|
||||
"ui.space_mouse_navigate": "Nawiguj za pomocą SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "Nie znaleziono myszy 3D",
|
||||
"ui.space_mouse_not_calibrated": "Nieskalibrowano",
|
||||
"ui.space_mouse_reading": "Odczyt",
|
||||
"ui.space_mouse_reset_axes": "Resetuj przypisanie osi",
|
||||
"ui.space_mouse_step_lift": "Unieś nakładkę, przytrzymaj, a następnie puść.",
|
||||
"ui.space_mouse_step_press": "Wciśnij nakładkę w dół, przytrzymaj, a następnie puść.",
|
||||
"ui.space_mouse_step_pull": "Pociągnij nakładkę do siebie, przytrzymaj, a następnie puść.",
|
||||
@@ -1765,6 +2028,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Przechyl nakładkę w prawo (prawa krawędź w dół), przytrzymaj, a następnie puść.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Obróć nakładkę zgodnie z ruchem wskazówek zegara, przytrzymaj, a następnie puść.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Obróć nakładkę przeciwnie do ruchu wskazówek zegara, przytrzymaj, a następnie puść.",
|
||||
"ui.space_mouse_view_axis": "Oś widoku",
|
||||
"ui.space_mouse_view_off": "Wyłączona",
|
||||
"ui.space_mouse_view_off_tip": "Profil sterownika myszy 3D wyłącza tę oś, więc jej ruch nie porusza widokiem. Wybranie tutaj ruchu innej osi zamienia je miejscami, a ten ruch przestaje poruszać widokiem.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Obracanie w lewo / w prawo",
|
||||
"ui.space_mouse_view_orbit_up_down": "Obracanie w górę / w dół",
|
||||
"ui.space_mouse_view_pan_sideways": "Przesuwanie w lewo / w prawo",
|
||||
"ui.space_mouse_view_pan_up_down": "Przesuwanie w górę / w dół",
|
||||
"ui.space_mouse_view_roll": "Przechylenie",
|
||||
"ui.space_mouse_view_unmapped": "Oś {n}",
|
||||
"ui.space_mouse_view_zoom": "Powiększanie",
|
||||
"ui.spacing": "Odstęp",
|
||||
"ui.spacing_2": "Odstęp 2",
|
||||
"ui.sphere": "Sfera",
|
||||
@@ -1836,6 +2109,7 @@
|
||||
"ui.workspace_design_tabs": "Model · Powierzchnia · Złożenie · Wstaw · Sprawdź · Zarządzaj · Widok",
|
||||
"ui.workspace_drawing_description": "Rysunki 2D z widokami, wymiarami i tabliczkami rysunkowymi",
|
||||
"ui.workspace_footer": "Każda przestrzeń robocza działa na tym samym projekcie, historii i zaznaczeniu; zmieniają się tylko karty wstążki. Przełącznik jest zablokowany podczas edycji szkicu lub elementu.",
|
||||
"ui.workspace_layout": "Układ obszaru roboczego",
|
||||
"ui.workspace_manufacture_description": "Cięcie na warstwy, ścieżki narzędzia i przygotowanie",
|
||||
"ui.workspace_planned": "Planowane",
|
||||
"ui.workspace_render_description": "Podgląd produktu, ustawienia sceny i renderowane obrazy",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "HISTÓRICO",
|
||||
"Height": "Altura",
|
||||
"Hidden edges": "Arestas ocultas",
|
||||
"History layout": "Layout do histórico",
|
||||
"Holes": "Furos",
|
||||
"Holes (edges on them)": "Furos (arestas neles)",
|
||||
"Home view": "Vista inicial",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "Nenhum relatório de falha.",
|
||||
"No matching appearance presets.": "Nenhuma predefinição de aparência correspondente.",
|
||||
"No matching appearances": "Nenhuma aparência correspondente",
|
||||
"No visible bodies to export.": "Nenhum corpo visível para exportar.",
|
||||
"No visible bodies or sketches to export.": "Nenhum corpo ou esboço visível para exportar.",
|
||||
"None": "Nenhum",
|
||||
"Not available yet": "Ainda não disponível",
|
||||
"Notch": "Entalhe",
|
||||
@@ -856,19 +857,57 @@
|
||||
"help.mit": "Licença MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Licenças de terceiros",
|
||||
"home.back": "Voltar para {name}",
|
||||
"home.crashes": "Relatórios de falhas",
|
||||
"home.design_workspace": "Projeto",
|
||||
"home.documentation": "Documentação",
|
||||
"home.export": "Exportar",
|
||||
"home.export_hint": "Escolha um formato para o projeto atual.",
|
||||
"home.export_json_hint": "Projeto editável e histórico de comandos",
|
||||
"home.export_mesh_hint": "Malha para impressão ou compartilhamento",
|
||||
"home.export_step_hint": "Geometria sólida precisa",
|
||||
"home.import": "Importar…",
|
||||
"home.import_hint": "STEP, IGES ou malha em um novo projeto",
|
||||
"home.in_this_browser": "neste navegador",
|
||||
"home.missing": "ausente",
|
||||
"home.month_01": "jan.",
|
||||
"home.month_02": "fev.",
|
||||
"home.month_03": "mar.",
|
||||
"home.month_04": "abr.",
|
||||
"home.month_05": "mai.",
|
||||
"home.month_06": "jun.",
|
||||
"home.month_07": "jul.",
|
||||
"home.month_08": "ago.",
|
||||
"home.month_09": "set.",
|
||||
"home.month_10": "out.",
|
||||
"home.month_11": "nov.",
|
||||
"home.month_12": "dez.",
|
||||
"home.new_inches": "Novo projeto em polegadas",
|
||||
"home.new_inches_hint": "Polegadas · abre em Projeto",
|
||||
"home.new_mm": "Novo projeto",
|
||||
"home.new_mm_hint": "Milímetros · abre em Projeto",
|
||||
"home.open": "Abrir…",
|
||||
"home.opened_days_ago": "Aberto há {count} dias",
|
||||
"home.opened_hours_ago": "Aberto há {count} h",
|
||||
"home.opened_just_now": "Aberto agora mesmo",
|
||||
"home.opened_minutes_ago": "Aberto há {count} min",
|
||||
"home.open_hint": "Um projeto .solidcraft ({shortcut})",
|
||||
"home.open_now": "Abrir agora",
|
||||
"home.opened_days_ago": "Há {count} dias",
|
||||
"home.opened_hours_ago": "Há {count} h",
|
||||
"home.opened_just_now": "Agora mesmo",
|
||||
"home.opened_minutes_ago": "Há {count} min",
|
||||
"home.opening": "abrindo…",
|
||||
"home.properties": "Propriedades do projeto",
|
||||
"home.recent": "Recentes",
|
||||
"home.recent_empty": "Os projetos que você abrir ou salvar aparecerão aqui.",
|
||||
"home.recovery_count": "Projetos recuperáveis: {count}",
|
||||
"home.recovery_empty": "Nenhum projeto recuperável.",
|
||||
"home.recovery_hint": "O SolidCraft foi fechado antes que estes projetos fossem salvos.",
|
||||
"home.report_issue": "Relatar um problema",
|
||||
"home.samples": "Exemplos",
|
||||
"home.settings": "Configurações",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Atalhos de teclado",
|
||||
"home.start_hint": "Crie um projeto, abra um arquivo recente ou explore um exemplo.",
|
||||
"home.whats_new": "Novidades",
|
||||
"home.yesterday": "Ontem",
|
||||
"install.button_tip": "Instale o SolidCraft como aplicativo: ele abre em sua própria janela e funciona offline",
|
||||
"install.dock_1": "Escolha Arquivo › Adicionar ao Dock.",
|
||||
"install.dock_2": "Clique em Adicionar.",
|
||||
@@ -1021,7 +1060,7 @@
|
||||
"search.try": "Digite o nome de um comando, um recurso deste projeto ou um parâmetro. Para executar um comando com valores, digite seu id e um objeto JSON: {example}",
|
||||
"search.valid": "Válido",
|
||||
"settings.display_quality_note": "Níveis mais finos desenham faces e arestas curvas mais suaves e demoram mais para gerar a malha. Só a janela de visualização muda, nunca o projeto ou as exportações.",
|
||||
"settings.frame_rate_note": "Mostra quadros por segundo no canto inferior direito da vista. Enquanto estiver ativo, a vista é redesenhada continuamente.",
|
||||
"settings.frame_rate_note": "Mostra quadros por segundo no canto inferior direito da vista.",
|
||||
"settings.measure_axis_distances": "Mostrar distâncias X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Mostrar as componentes nos eixos do mundo junto com a distância total enquanto Medir está aberto.",
|
||||
"settings.msaa_applies_on_restart": "O antisserrilhamento vale na próxima vez que o SolidCraft iniciar",
|
||||
@@ -1092,6 +1131,7 @@
|
||||
"ui.agent_chat_add": "Anexar arquivos",
|
||||
"ui.agent_chat_add_file": "Escolher um arquivo…",
|
||||
"ui.agent_chat_allow": "Permitir",
|
||||
"ui.agent_chat_allow_once": "Permitir uma vez",
|
||||
"ui.agent_chat_allowed": "Permitido",
|
||||
"ui.agent_chat_answered": "Resposta: {option}",
|
||||
"ui.agent_chat_approval": "Permitir que o agente faça isto?",
|
||||
@@ -1143,12 +1183,16 @@
|
||||
"ui.agent_chat_files_left_out": "No máximo {max} arquivos acompanham uma mensagem; deixados de fora: {files}",
|
||||
"ui.agent_chat_files_loading": "Aguardando a leitura dos arquivos",
|
||||
"ui.agent_chat_files_max": "No máximo {max} arquivos por mensagem",
|
||||
"ui.agent_chat_flatpak_none_found": "Nenhum agente de programação encontrado. Por padrão, a sandbox do Flatpak não vê agentes instalados na sua pasta pessoal e não tem acesso à rede. Para permitir o Claude Code e o adaptador ACP dele instalados via nvm ou em ~/.local/bin, execute este comando em um terminal e reinicie o SolidCraft. Ele concede acesso aos programas e arquivos de login listados, além de acesso à rede:",
|
||||
"ui.agent_chat_import_failed": "{name}: falha na importação: {error}",
|
||||
"ui.agent_chat_intro": "Converse com um agente de programação que você já usa, ou com um endpoint de modelo que você escolher. Ele trabalha no projeto aberto pelas ferramentas do SolidCraft: as alterações aparecem conforme são feitas e se desfazem em um passo por mensagem. O que ele pode fazer sem perguntar é definido em Preferências > IA.",
|
||||
"ui.agent_chat_key_in_env": "chave definida",
|
||||
"ui.agent_chat_left": "Esquerda",
|
||||
"ui.agent_chat_limit": "O agente atingiu o limite de {limit} alterações por mensagem. Envie outra mensagem para que ele continue.",
|
||||
"ui.agent_chat_minimize": "Minimizar para uma faixa",
|
||||
"ui.agent_chat_mode_all": "Tudo",
|
||||
"ui.agent_chat_mode_ask": "Perguntar",
|
||||
"ui.agent_chat_mode_edits": "Edições",
|
||||
"ui.agent_chat_model_tip": "O modelo que o agente usa. Sua escolha é lembrada para este agente.",
|
||||
"ui.agent_chat_new": "Novo chat",
|
||||
"ui.agent_chat_new_confirm": "Começar um novo chat? O atual será apagado.",
|
||||
@@ -1161,6 +1205,7 @@
|
||||
"ui.agent_chat_none_found_short": "Nenhum agente encontrado",
|
||||
"ui.agent_chat_not_installed": "Não instalado",
|
||||
"ui.agent_chat_not_signed_in": "não conectado",
|
||||
"ui.agent_chat_open_settings": "Abrir preferências",
|
||||
"ui.agent_chat_own_window": "Janela própria",
|
||||
"ui.agent_chat_paste_picture": "Colar uma imagem",
|
||||
"ui.agent_chat_permission": "O agente pede para executar: {title}",
|
||||
@@ -1185,6 +1230,8 @@
|
||||
"ui.agent_chat_send": "Enviar",
|
||||
"ui.agent_chat_send_now": "Enviar agora",
|
||||
"ui.agent_chat_send_now_tip": "Parar o passo atual do agente e enviar esta em seguida (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "O SolidCraft se comunica com um agente de programação instalado neste computador. Escolha um em Preferências › IA.",
|
||||
"ui.agent_chat_setup_title": "Configurar um assistente",
|
||||
"ui.agent_chat_side": "Lado do chat com agente",
|
||||
"ui.agent_chat_signed_in": "conectado",
|
||||
"ui.agent_chat_state_auth": "É preciso entrar",
|
||||
@@ -1201,6 +1248,7 @@
|
||||
"ui.agent_chat_undo_label": "Chat com agente: {message}",
|
||||
"ui.agent_chat_undone": "(desfeito)",
|
||||
"ui.agent_chat_view_attached": "Vista anexada",
|
||||
"ui.agent_chat_waiting": "Aguardando sua resposta",
|
||||
"ui.agent_cursor": "Cursor do agente",
|
||||
"ui.agent_cursor_speed": "Velocidade do cursor do agente",
|
||||
"ui.ai_add": "Adicionar",
|
||||
@@ -1455,6 +1503,7 @@
|
||||
"ui.grid_follows_view_hint": "As vistas laterais mostram a grade no plano vertical voltado para elas, em vez do solo",
|
||||
"ui.ground_shadow": "Sombra no chão",
|
||||
"ui.groupSelected": "Agrupar seleção",
|
||||
"ui.hatch": "Hachura",
|
||||
"ui.heading_add_ins": "COMPLEMENTOS",
|
||||
"ui.heading_assemble": "MONTAR",
|
||||
"ui.heading_box": "CAIXA",
|
||||
@@ -1528,6 +1577,11 @@
|
||||
"ui.hideOrigin": "Ocultar origem",
|
||||
"ui.hidePlanes": "Ocultar planos",
|
||||
"ui.hideProfile": "Ocultar perfil",
|
||||
"ui.history_back": "Voltar uma etapa",
|
||||
"ui.history_below_browser": "Abaixo do navegador",
|
||||
"ui.history_first": "Ir para o início",
|
||||
"ui.history_forward": "Avançar uma etapa",
|
||||
"ui.history_last": "Ir para o fim",
|
||||
"ui.history_title": "Histórico",
|
||||
"ui.hole": "Furo",
|
||||
"ui.hole_tap_type": "Tipo de rosca do furo",
|
||||
@@ -1545,6 +1599,8 @@
|
||||
"ui.joints": "Juntas",
|
||||
"ui.keyboard_shortcuts": "Atalhos de teclado",
|
||||
"ui.language": "Idioma",
|
||||
"ui.layout_compact": "Compacto",
|
||||
"ui.layout_floating": "Flutuante",
|
||||
"ui.length_decimals": "Casas decimais de comprimento",
|
||||
"ui.light": "Claro",
|
||||
"ui.line": "Linha",
|
||||
@@ -1682,6 +1738,7 @@
|
||||
"ui.reverse_zoom_direction": "Inverter direção do zoom",
|
||||
"ui.revolve": "Revolução",
|
||||
"ui.ribbon_exit": "Sair",
|
||||
"ui.ribbon_labels": "Mostrar texto abaixo dos ícones da faixa de opções",
|
||||
"ui.ribbon_pin_footer": "Os comandos fixados aparecem na faixa de opções. Passe o mouse sobre uma linha para fixar ou desafixar.",
|
||||
"ui.ribbon_workspace": "Espaço de trabalho",
|
||||
"ui.right": "Direita",
|
||||
@@ -1737,6 +1794,7 @@
|
||||
"ui.smooth_wheel_zoom": "Zoom suave com a roda",
|
||||
"ui.smooth_wheel_zoom_tip": "Desative para aplicar cada evento da roda na hora, sem rastro de suavização",
|
||||
"ui.snap": "Encaixe",
|
||||
"ui.space_mouse_axes_reassigned": "Os eixos estão reatribuídos nas Preferências, e isso continua valendo sobre esta calibração.",
|
||||
"ui.space_mouse_calibrate": "Calibrar…",
|
||||
"ui.space_mouse_calibrate_tip": "Mova a tampa como a janela pedir, para que o SolidCraft aprenda para onde e até onde vai cada eixo deste mouse 3D. Salvo para este mouse 3D.",
|
||||
"ui.space_mouse_calibrate_title": "Calibrar mouse 3D",
|
||||
@@ -1746,12 +1804,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Um eixo quase não se moveu, então não dá para calibrá-lo. Recomece e mova a tampa mais longe a cada vez.",
|
||||
"ui.space_mouse_dead_zone": "Zona morta",
|
||||
"ui.space_mouse_dead_zone_tip": "Quanto a tampa precisa se mover antes de a vista se mover, como fração do curso completo. Aumente se a vista se mexer com a tampa parada.",
|
||||
"ui.space_mouse_driven_by": "Qual movimento calibrado do dispositivo controla este eixo. Escolher um que outro eixo já usa troca os dois.",
|
||||
"ui.space_mouse_driven_by_label": "controlado por",
|
||||
"ui.space_mouse_driver": "Driver do mouse 3D",
|
||||
"ui.space_mouse_driver_auto": "Automático",
|
||||
"ui.space_mouse_driver_direct": "Direto (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Lendo o dispositivo diretamente; o spacenavd não está em execução",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Lendo pelo spacenavd, a única opção disponível",
|
||||
"ui.space_mouse_forget": "Esquecer calibração",
|
||||
"ui.space_mouse_hint": "Move e gira a vista juntos; esboços usam apenas deslocamento e zoom.",
|
||||
"ui.space_mouse_motion_rotation_x": "Rotação X",
|
||||
"ui.space_mouse_motion_rotation_y": "Rotação Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Rotação Z",
|
||||
"ui.space_mouse_motion_translation_x": "Translação X",
|
||||
"ui.space_mouse_motion_translation_y": "Translação Y",
|
||||
"ui.space_mouse_motion_translation_z": "Translação Z",
|
||||
"ui.space_mouse_navigate": "Navegar com SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "Nenhum mouse 3D encontrado",
|
||||
"ui.space_mouse_not_calibrated": "Não calibrado",
|
||||
"ui.space_mouse_reading": "Leitura",
|
||||
"ui.space_mouse_reset_axes": "Redefinir atribuição de eixos",
|
||||
"ui.space_mouse_step_lift": "Levante a tampa, segure e solte.",
|
||||
"ui.space_mouse_step_press": "Pressione a tampa para baixo, segure e solte.",
|
||||
"ui.space_mouse_step_pull": "Puxe a tampa na sua direção, segure e solte.",
|
||||
@@ -1765,6 +1837,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Incline a tampa para a direita (borda direita para baixo), segure e solte.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Gire a tampa no sentido horário, segure e solte.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Gire a tampa no sentido anti-horário, segure e solte.",
|
||||
"ui.space_mouse_view_axis": "Eixo da vista",
|
||||
"ui.space_mouse_view_off": "Desligado",
|
||||
"ui.space_mouse_view_off_tip": "O perfil do driver do mouse 3D desliga este eixo, então o movimento dele não move a vista. Escolher aqui o movimento de outro eixo troca os dois, e esse movimento deixa de mover a vista.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Orbitar esquerda / direita",
|
||||
"ui.space_mouse_view_orbit_up_down": "Orbitar cima / baixo",
|
||||
"ui.space_mouse_view_pan_sideways": "Deslocar esquerda / direita",
|
||||
"ui.space_mouse_view_pan_up_down": "Deslocar cima / baixo",
|
||||
"ui.space_mouse_view_roll": "Girar a vista",
|
||||
"ui.space_mouse_view_unmapped": "Eixo {n}",
|
||||
"ui.space_mouse_view_zoom": "Zoom",
|
||||
"ui.spacing": "Espaçamento",
|
||||
"ui.spacing_2": "Espaçamento 2",
|
||||
"ui.sphere": "Esfera",
|
||||
@@ -1836,6 +1918,7 @@
|
||||
"ui.workspace_design_tabs": "Modelo · Superfície · Montagem · Inserir · Inspecionar · Gerenciar · Vista",
|
||||
"ui.workspace_drawing_description": "Desenhos 2D com vistas, cotas e legendas",
|
||||
"ui.workspace_footer": "Todo espaço de trabalho usa o mesmo projeto, histórico e seleção; só as guias da faixa de opções mudam. O seletor fica bloqueado enquanto um esboço ou recurso está sendo editado.",
|
||||
"ui.workspace_layout": "Layout do espaço de trabalho",
|
||||
"ui.workspace_manufacture_description": "Fatiamento, trajetórias de ferramenta e configuração",
|
||||
"ui.workspace_planned": "Planejado",
|
||||
"ui.workspace_render_description": "Pré-visualização do produto, configurações de cena e imagens renderizadas",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "ISTORIC",
|
||||
"Height": "Înălțime",
|
||||
"Hidden edges": "Muchii ascunse",
|
||||
"History layout": "Aspectul istoricului",
|
||||
"Holes": "Găuri",
|
||||
"Holes (edges on them)": "Găuri (muchiile lor)",
|
||||
"Home view": "Vizualizare de start",
|
||||
@@ -232,7 +233,6 @@
|
||||
"No crash reports.": "Niciun raport de blocare.",
|
||||
"No matching appearance presets.": "Niciun preset de aspect corespunzător.",
|
||||
"No matching appearances": "Niciun aspect corespunzător",
|
||||
"No visible bodies to export.": "Niciun corp vizibil de exportat.",
|
||||
"None": "Niciunul",
|
||||
"Not available yet": "Indisponibil deocamdată",
|
||||
"Notch": "Crestătură",
|
||||
@@ -856,19 +856,57 @@
|
||||
"help.mit": "Licența MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Licențe terțe",
|
||||
"home.back": "Înapoi la {name}",
|
||||
"home.crashes": "Rapoarte de blocare",
|
||||
"home.design_workspace": "Proiectare",
|
||||
"home.documentation": "Documentație",
|
||||
"home.export": "Exportă",
|
||||
"home.export_hint": "Alege un format pentru proiectul curent.",
|
||||
"home.export_json_hint": "Proiect editabil și istoricul comenzilor",
|
||||
"home.export_mesh_hint": "Plasă pentru imprimare sau partajare",
|
||||
"home.export_step_hint": "Geometrie solidă precisă",
|
||||
"home.import": "Importă…",
|
||||
"home.import_hint": "STEP, IGES sau plasă într-un proiect nou",
|
||||
"home.in_this_browser": "în acest browser",
|
||||
"home.missing": "lipsă",
|
||||
"home.month_01": "ian.",
|
||||
"home.month_02": "feb.",
|
||||
"home.month_03": "mar.",
|
||||
"home.month_04": "apr.",
|
||||
"home.month_05": "mai",
|
||||
"home.month_06": "iun.",
|
||||
"home.month_07": "iul.",
|
||||
"home.month_08": "aug.",
|
||||
"home.month_09": "sept.",
|
||||
"home.month_10": "oct.",
|
||||
"home.month_11": "nov.",
|
||||
"home.month_12": "dec.",
|
||||
"home.new_inches": "Proiect nou în inci",
|
||||
"home.new_inches_hint": "Inci · se deschide în Proiectare",
|
||||
"home.new_mm": "Proiect nou",
|
||||
"home.new_mm_hint": "Milimetri · se deschide în Proiectare",
|
||||
"home.open": "Deschide…",
|
||||
"home.opened_days_ago": "Deschis acum {count} zile",
|
||||
"home.opened_hours_ago": "Deschis acum {count} h",
|
||||
"home.opened_just_now": "Deschis chiar acum",
|
||||
"home.opened_minutes_ago": "Deschis acum {count} min",
|
||||
"home.open_hint": "Un proiect .solidcraft ({shortcut})",
|
||||
"home.open_now": "Deschis acum",
|
||||
"home.opened_days_ago": "Acum {count} zile",
|
||||
"home.opened_hours_ago": "Acum {count} h",
|
||||
"home.opened_just_now": "Chiar acum",
|
||||
"home.opened_minutes_ago": "Acum {count} min",
|
||||
"home.opening": "se deschide…",
|
||||
"home.properties": "Proprietățile proiectului",
|
||||
"home.recent": "Recente",
|
||||
"home.recent_empty": "Proiectele pe care le deschizi sau le salvezi apar aici.",
|
||||
"home.recovery_count": "Proiecte recuperabile: {count}",
|
||||
"home.recovery_empty": "Nu există proiecte recuperabile.",
|
||||
"home.recovery_hint": "SolidCraft s-a închis înainte ca aceste proiecte să fie salvate.",
|
||||
"home.report_issue": "Raportează o problemă",
|
||||
"home.samples": "Exemple",
|
||||
"home.settings": "Setări",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Scurtături de la tastatură",
|
||||
"home.start_hint": "Creează un proiect, deschide un fișier recent sau explorează un exemplu.",
|
||||
"home.whats_new": "Noutăți",
|
||||
"home.yesterday": "Ieri",
|
||||
"install.button_tip": "Instalați SolidCraft ca aplicație: se deschide în propria fereastră și funcționează offline",
|
||||
"install.dock_1": "Alegeți Fișier › Adaugă în Dock.",
|
||||
"install.dock_2": "Faceți clic pe Adaugă.",
|
||||
@@ -1021,7 +1059,7 @@
|
||||
"search.try": "Tastați numele unei comenzi, o operație din acest proiect sau un parametru. Pentru a executa o comandă cu valori, tastați id-ul ei și un obiect JSON: {example}",
|
||||
"search.valid": "Valid",
|
||||
"settings.display_quality_note": "Nivelurile mai fine desenează fețele și muchiile curbe mai neted și durează mai mult la generarea plasei. Se schimbă doar fereastra de vizualizare, niciodată proiectul sau exporturile.",
|
||||
"settings.frame_rate_note": "Afișează cadrele pe secundă în colțul din dreapta jos al vizualizării. Cât timp este activat, vizualizarea se redesenează continuu.",
|
||||
"settings.frame_rate_note": "Afișează cadrele pe secundă în colțul din dreapta jos al vizualizării.",
|
||||
"settings.measure_axis_distances": "Afișează distanțele X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Afișează cotele pe axele globale alături de distanța totală cât timp Măsurare este deschis.",
|
||||
"settings.msaa_applies_on_restart": "Anti-aliasing se aplică la următoarea pornire a SolidCraft",
|
||||
@@ -1092,6 +1130,7 @@
|
||||
"ui.agent_chat_add": "Atașează fișiere",
|
||||
"ui.agent_chat_add_file": "Alegeți un fișier…",
|
||||
"ui.agent_chat_allow": "Permite",
|
||||
"ui.agent_chat_allow_once": "Permite o dată",
|
||||
"ui.agent_chat_allowed": "Permis",
|
||||
"ui.agent_chat_answered": "Răspuns: {option}",
|
||||
"ui.agent_chat_approval": "Permiteți agentului să facă asta?",
|
||||
@@ -1143,12 +1182,16 @@
|
||||
"ui.agent_chat_files_left_out": "Cel mult {max} fișiere merg cu un mesaj; omise: {files}",
|
||||
"ui.agent_chat_files_loading": "Se așteaptă citirea fișierelor",
|
||||
"ui.agent_chat_files_max": "Cel mult {max} fișiere pe un mesaj",
|
||||
"ui.agent_chat_flatpak_none_found": "Nu s-a găsit niciun agent de programare. Implicit, sandboxul Flatpak nu vede agenții instalați în dosarul personal și nu are acces la rețea. Pentru a permite Claude Code și adaptorul său ACP instalate prin nvm sau în ~/.local/bin, rulați această comandă într-un terminal, apoi reporniți SolidCraft. Ea acordă acces la programele și fișierele de autentificare enumerate, precum și acces la rețea:",
|
||||
"ui.agent_chat_import_failed": "{name}: importul a eșuat: {error}",
|
||||
"ui.agent_chat_intro": "Conversați cu un agent de programare pe care îl folosiți deja sau cu un endpoint de model ales de dumneavoastră. Lucrează la proiectul deschis prin instrumentele SolidCraft: modificările lui apar pe măsură ce le face și se anulează ca un singur pas per mesaj. Ce poate face fără să întrebe se stabilește în Preferințe > AI.",
|
||||
"ui.agent_chat_key_in_env": "cheie setată",
|
||||
"ui.agent_chat_left": "Stânga",
|
||||
"ui.agent_chat_limit": "Agentul a atins limita de {limit} modificări pentru un mesaj. Trimiteți alt mesaj pentru a-l lăsa să continue.",
|
||||
"ui.agent_chat_minimize": "Minimizează într-o bandă",
|
||||
"ui.agent_chat_mode_all": "Tot",
|
||||
"ui.agent_chat_mode_ask": "Întreabă",
|
||||
"ui.agent_chat_mode_edits": "Modificări",
|
||||
"ui.agent_chat_model_tip": "Modelul folosit de agent. Alegerea dumneavoastră este reținută pentru acest agent.",
|
||||
"ui.agent_chat_new": "Chat nou",
|
||||
"ui.agent_chat_new_confirm": "Începeți un chat nou? Cel curent este șters.",
|
||||
@@ -1161,6 +1204,7 @@
|
||||
"ui.agent_chat_none_found_short": "Niciun agent găsit",
|
||||
"ui.agent_chat_not_installed": "Neinstalat",
|
||||
"ui.agent_chat_not_signed_in": "neautentificat",
|
||||
"ui.agent_chat_open_settings": "Deschide preferințele",
|
||||
"ui.agent_chat_own_window": "Fereastră proprie",
|
||||
"ui.agent_chat_paste_picture": "Lipește o imagine",
|
||||
"ui.agent_chat_permission": "Agentul cere să ruleze: {title}",
|
||||
@@ -1185,6 +1229,8 @@
|
||||
"ui.agent_chat_send": "Trimite",
|
||||
"ui.agent_chat_send_now": "Trimite acum",
|
||||
"ui.agent_chat_send_now_tip": "Oprește pasul curent al agentului și trimite acest mesaj următorul (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft comunică cu un agent de programare instalat pe acest computer. Alege unul în Preferințe › AI.",
|
||||
"ui.agent_chat_setup_title": "Configurează un asistent",
|
||||
"ui.agent_chat_side": "Partea chatului cu agentul",
|
||||
"ui.agent_chat_signed_in": "autentificat",
|
||||
"ui.agent_chat_state_auth": "Autentificare necesară",
|
||||
@@ -1201,6 +1247,7 @@
|
||||
"ui.agent_chat_undo_label": "Chat cu agentul: {message}",
|
||||
"ui.agent_chat_undone": "(anulat)",
|
||||
"ui.agent_chat_view_attached": "Vizualizare atașată",
|
||||
"ui.agent_chat_waiting": "Așteaptă răspunsul tău",
|
||||
"ui.agent_cursor": "Cursorul agentului",
|
||||
"ui.agent_cursor_speed": "Viteza cursorului agentului",
|
||||
"ui.ai_add": "Adaugă",
|
||||
@@ -1455,6 +1502,7 @@
|
||||
"ui.grid_follows_view_hint": "Vederile laterale afișează grila pe planul vertical orientat spre ele, în loc de sol",
|
||||
"ui.ground_shadow": "Umbra la sol",
|
||||
"ui.groupSelected": "Grupează selecția",
|
||||
"ui.hatch": "Hașură",
|
||||
"ui.heading_add_ins": "EXTENSII",
|
||||
"ui.heading_assemble": "ASAMBLARE",
|
||||
"ui.heading_box": "CUTIE",
|
||||
@@ -1528,6 +1576,11 @@
|
||||
"ui.hideOrigin": "Ascunde originea",
|
||||
"ui.hidePlanes": "Ascunde planele",
|
||||
"ui.hideProfile": "Ascunde profilul",
|
||||
"ui.history_back": "Un pas înapoi",
|
||||
"ui.history_below_browser": "Sub navigator",
|
||||
"ui.history_first": "Mergi la început",
|
||||
"ui.history_forward": "Un pas înainte",
|
||||
"ui.history_last": "Mergi la sfârșit",
|
||||
"ui.history_title": "Istoric",
|
||||
"ui.hole": "Gaură",
|
||||
"ui.hole_tap_type": "Tip de filetare gaură",
|
||||
@@ -1545,6 +1598,8 @@
|
||||
"ui.joints": "Îmbinări",
|
||||
"ui.keyboard_shortcuts": "Scurtături de tastatură",
|
||||
"ui.language": "Limbă",
|
||||
"ui.layout_compact": "Compact",
|
||||
"ui.layout_floating": "Plutitor",
|
||||
"ui.length_decimals": "Zecimale lungime",
|
||||
"ui.light": "Luminos",
|
||||
"ui.line": "Linie",
|
||||
@@ -1682,6 +1737,7 @@
|
||||
"ui.reverse_zoom_direction": "Inversează direcția zoomului",
|
||||
"ui.revolve": "Revoluție",
|
||||
"ui.ribbon_exit": "Ieșire",
|
||||
"ui.ribbon_labels": "Afișează text sub pictogramele panglicii",
|
||||
"ui.ribbon_pin_footer": "Comenzile fixate apar pe bandă. Treceți cursorul peste un rând pentru a-l fixa sau defixa.",
|
||||
"ui.ribbon_workspace": "Spațiu de lucru",
|
||||
"ui.right": "Dreapta",
|
||||
@@ -1836,6 +1892,7 @@
|
||||
"ui.workspace_design_tabs": "Model · Suprafață · Asamblare · Inserare · Inspectare · Gestionare · Vizualizare",
|
||||
"ui.workspace_drawing_description": "Desene 2D cu vederi, cote și indicatoare",
|
||||
"ui.workspace_footer": "Fiecare spațiu de lucru lucrează pe același proiect, istoric și selecție; se schimbă doar filele benzii. Comutatorul este blocat cât timp se editează o schiță sau o operație.",
|
||||
"ui.workspace_layout": "Aspectul spațiului de lucru",
|
||||
"ui.workspace_manufacture_description": "Feliere, trasee de sculă și configurare",
|
||||
"ui.workspace_planned": "Planificat",
|
||||
"ui.workspace_render_description": "Previzualizare produs, setări de scenă și imagini randate",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "ИСТОРИЯ",
|
||||
"Height": "Высота",
|
||||
"Hidden edges": "Скрытые рёбра",
|
||||
"History layout": "Расположение истории",
|
||||
"Holes": "Отверстия",
|
||||
"Holes (edges on them)": "Отверстия (рёбра на них)",
|
||||
"Home view": "Главный вид",
|
||||
@@ -232,7 +233,6 @@
|
||||
"No crash reports.": "Нет отчётов о сбоях.",
|
||||
"No matching appearance presets.": "Нет подходящих наборов внешнего вида.",
|
||||
"No matching appearances": "Нет подходящих внешних видов",
|
||||
"No visible bodies to export.": "Нет видимых тел для экспорта.",
|
||||
"None": "Нет",
|
||||
"Not available yet": "Пока недоступно",
|
||||
"Notch": "Вырез",
|
||||
@@ -856,19 +856,57 @@
|
||||
"help.mit": "Лицензия MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Лицензии сторонних компонентов",
|
||||
"home.back": "Назад к {name}",
|
||||
"home.crashes": "Отчёты о сбоях",
|
||||
"home.design_workspace": "Проектирование",
|
||||
"home.documentation": "Документация",
|
||||
"home.export": "Экспорт",
|
||||
"home.export_hint": "Выберите формат для текущего проекта.",
|
||||
"home.export_json_hint": "Редактируемый проект и история команд",
|
||||
"home.export_mesh_hint": "Сетка для печати или обмена",
|
||||
"home.export_step_hint": "Точная твердотельная геометрия",
|
||||
"home.import": "Импорт…",
|
||||
"home.import_hint": "STEP, IGES или сетка в новый проект",
|
||||
"home.in_this_browser": "в этом браузере",
|
||||
"home.missing": "отсутствует",
|
||||
"home.month_01": "янв.",
|
||||
"home.month_02": "февр.",
|
||||
"home.month_03": "мар.",
|
||||
"home.month_04": "апр.",
|
||||
"home.month_05": "мая",
|
||||
"home.month_06": "июн.",
|
||||
"home.month_07": "июл.",
|
||||
"home.month_08": "авг.",
|
||||
"home.month_09": "сент.",
|
||||
"home.month_10": "окт.",
|
||||
"home.month_11": "нояб.",
|
||||
"home.month_12": "дек.",
|
||||
"home.new_inches": "Новый проект в дюймах",
|
||||
"home.new_inches_hint": "Дюймы · откроется в рабочей области «Проектирование»",
|
||||
"home.new_mm": "Новый проект",
|
||||
"home.new_mm_hint": "Миллиметры · откроется в рабочей области «Проектирование»",
|
||||
"home.open": "Открыть…",
|
||||
"home.opened_days_ago": "Открыт {count} дн. назад",
|
||||
"home.opened_hours_ago": "Открыт {count} ч назад",
|
||||
"home.opened_just_now": "Открыт только что",
|
||||
"home.opened_minutes_ago": "Открыт {count} мин назад",
|
||||
"home.open_hint": "Проект .solidcraft ({shortcut})",
|
||||
"home.open_now": "Открыть сейчас",
|
||||
"home.opened_days_ago": "{count} дн. назад",
|
||||
"home.opened_hours_ago": "{count} ч назад",
|
||||
"home.opened_just_now": "Только что",
|
||||
"home.opened_minutes_ago": "{count} мин назад",
|
||||
"home.opening": "открывается…",
|
||||
"home.properties": "Свойства проекта",
|
||||
"home.recent": "Недавние",
|
||||
"home.recent_empty": "Здесь появятся проекты, которые вы откроете или сохраните.",
|
||||
"home.recovery_count": "Проектов для восстановления: {count}",
|
||||
"home.recovery_empty": "Нет проектов для восстановления.",
|
||||
"home.recovery_hint": "SolidCraft закрылся до сохранения этих проектов.",
|
||||
"home.report_issue": "Сообщить о проблеме",
|
||||
"home.samples": "Примеры",
|
||||
"home.settings": "Настройки",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Сочетания клавиш",
|
||||
"home.start_hint": "Создайте проект, откройте недавний файл или изучите пример.",
|
||||
"home.whats_new": "Что нового",
|
||||
"home.yesterday": "Вчера",
|
||||
"install.button_tip": "Установить SolidCraft как приложение: отдельное окно и работа без сети",
|
||||
"install.dock_1": "Выберите «Файл» › «Добавить в Dock».",
|
||||
"install.dock_2": "Нажмите «Добавить».",
|
||||
@@ -1021,7 +1059,7 @@
|
||||
"search.try": "Введите название команды, операцию этого дизайна или параметр. Чтобы выполнить команду со значениями, введите её id и объект JSON: {example}",
|
||||
"search.valid": "Допустимо",
|
||||
"settings.display_quality_note": "Более высокие уровни рисуют криволинейные грани и рёбра глаже, но сетка строится дольше. Меняется только видовой экран, но не дизайн и не экспорт.",
|
||||
"settings.frame_rate_note": "Показывает кадры в секунду в правом нижнем углу вида. Пока включено, вид перерисовывается непрерывно.",
|
||||
"settings.frame_rate_note": "Показывает кадры в секунду в правом нижнем углу вида.",
|
||||
"settings.measure_axis_distances": "Расстояния X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Показывать размеры вдоль мировых осей вместе с общим расстоянием, пока открыто окно измерения.",
|
||||
"settings.msaa_applies_on_restart": "Сглаживание вступит в силу при следующем запуске SolidCraft",
|
||||
@@ -1092,6 +1130,7 @@
|
||||
"ui.agent_chat_add": "Прикрепить файлы",
|
||||
"ui.agent_chat_add_file": "Выбрать файл…",
|
||||
"ui.agent_chat_allow": "Разрешить",
|
||||
"ui.agent_chat_allow_once": "Разрешить один раз",
|
||||
"ui.agent_chat_allowed": "Разрешено",
|
||||
"ui.agent_chat_answered": "Ответ: {option}",
|
||||
"ui.agent_chat_approval": "Разрешить агенту сделать это?",
|
||||
@@ -1143,12 +1182,16 @@
|
||||
"ui.agent_chat_files_left_out": "К одному сообщению можно приложить не более {max} файлов; не добавлены: {files}",
|
||||
"ui.agent_chat_files_loading": "Ожидание чтения файлов",
|
||||
"ui.agent_chat_files_max": "Не более {max} файлов в одном сообщении",
|
||||
"ui.agent_chat_flatpak_none_found": "Кодирующий агент не найден. По умолчанию песочница Flatpak не видит агентов, установленных в домашней папке, и не имеет доступа к сети. Чтобы разрешить Claude Code и его адаптер ACP, установленные через nvm или в ~/.local/bin, выполните эту команду в терминале и перезапустите SolidCraft. Она даёт доступ к перечисленным программам и файлам входа, а также доступ к сети:",
|
||||
"ui.agent_chat_import_failed": "{name}: не удалось импортировать: {error}",
|
||||
"ui.agent_chat_intro": "Общайтесь с уже используемым кодирующим агентом или выбранной конечной точкой модели. Он работает с открытым дизайном через инструменты SolidCraft: изменения видны по мере выполнения и отменяются одним шагом на сообщение. Что ему разрешено без запроса, задаётся в Настройки > ИИ.",
|
||||
"ui.agent_chat_key_in_env": "ключ задан",
|
||||
"ui.agent_chat_left": "Слева",
|
||||
"ui.agent_chat_limit": "Агент достиг предела в {limit} изменений на одно сообщение. Отправьте ещё одно сообщение, чтобы он продолжил.",
|
||||
"ui.agent_chat_minimize": "Свернуть в полосу",
|
||||
"ui.agent_chat_mode_all": "Всё",
|
||||
"ui.agent_chat_mode_ask": "Спросить",
|
||||
"ui.agent_chat_mode_edits": "Правки",
|
||||
"ui.agent_chat_model_tip": "Модель, которую использует агент. Ваш выбор запоминается для этого агента.",
|
||||
"ui.agent_chat_new": "Новый чат",
|
||||
"ui.agent_chat_new_confirm": "Начать новый чат? Текущий будет очищен.",
|
||||
@@ -1161,6 +1204,7 @@
|
||||
"ui.agent_chat_none_found_short": "Агент не найден",
|
||||
"ui.agent_chat_not_installed": "Не установлен",
|
||||
"ui.agent_chat_not_signed_in": "вход не выполнен",
|
||||
"ui.agent_chat_open_settings": "Открыть настройки",
|
||||
"ui.agent_chat_own_window": "Отдельное окно",
|
||||
"ui.agent_chat_paste_picture": "Вставить изображение",
|
||||
"ui.agent_chat_permission": "Агент просит выполнить: {title}",
|
||||
@@ -1185,6 +1229,8 @@
|
||||
"ui.agent_chat_send": "Отправить",
|
||||
"ui.agent_chat_send_now": "Отправить сейчас",
|
||||
"ui.agent_chat_send_now_tip": "Остановить текущий шаг агента и отправить это следующим (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft взаимодействует с агентом программирования, установленным на этом компьютере. Выберите его в разделе «Настройки › ИИ».",
|
||||
"ui.agent_chat_setup_title": "Настроить ассистента",
|
||||
"ui.agent_chat_side": "Сторона чата с агентом",
|
||||
"ui.agent_chat_signed_in": "вход выполнен",
|
||||
"ui.agent_chat_state_auth": "Требуется вход",
|
||||
@@ -1201,6 +1247,7 @@
|
||||
"ui.agent_chat_undo_label": "Чат с агентом: {message}",
|
||||
"ui.agent_chat_undone": "(отменено)",
|
||||
"ui.agent_chat_view_attached": "Вид прикреплён",
|
||||
"ui.agent_chat_waiting": "Ожидает вашего ответа",
|
||||
"ui.agent_cursor": "Курсор агента",
|
||||
"ui.agent_cursor_speed": "Скорость курсора агента",
|
||||
"ui.ai_add": "Добавить",
|
||||
@@ -1455,6 +1502,7 @@
|
||||
"ui.grid_follows_view_hint": "На боковых видах сетка показывается на вертикальной плоскости, обращённой к вам, а не на земле",
|
||||
"ui.ground_shadow": "Тень на земле",
|
||||
"ui.groupSelected": "Группировать выбранное",
|
||||
"ui.hatch": "Штриховка",
|
||||
"ui.heading_add_ins": "НАДСТРОЙКИ",
|
||||
"ui.heading_assemble": "СБОРКА",
|
||||
"ui.heading_box": "БОКС",
|
||||
@@ -1528,6 +1576,11 @@
|
||||
"ui.hideOrigin": "Скрыть начало координат",
|
||||
"ui.hidePlanes": "Скрыть плоскости",
|
||||
"ui.hideProfile": "Скрыть профиль",
|
||||
"ui.history_back": "На один шаг назад",
|
||||
"ui.history_below_browser": "Под браузером",
|
||||
"ui.history_first": "Перейти в начало",
|
||||
"ui.history_forward": "На один шаг вперёд",
|
||||
"ui.history_last": "Перейти в конец",
|
||||
"ui.history_title": "История",
|
||||
"ui.hole": "Отверстие",
|
||||
"ui.hole_tap_type": "Тип резьбы отверстия",
|
||||
@@ -1545,6 +1598,8 @@
|
||||
"ui.joints": "Сопряжения",
|
||||
"ui.keyboard_shortcuts": "Сочетания клавиш",
|
||||
"ui.language": "Язык",
|
||||
"ui.layout_compact": "Компактная",
|
||||
"ui.layout_floating": "Плавающая",
|
||||
"ui.length_decimals": "Знаков после запятой (длины)",
|
||||
"ui.light": "Светлая",
|
||||
"ui.line": "Линия",
|
||||
@@ -1682,6 +1737,7 @@
|
||||
"ui.reverse_zoom_direction": "Обратить направление масштабирования",
|
||||
"ui.revolve": "Вращение",
|
||||
"ui.ribbon_exit": "Выход",
|
||||
"ui.ribbon_labels": "Показывать текст под значками ленты",
|
||||
"ui.ribbon_pin_footer": "Закреплённые команды отображаются на ленте. Наведите курсор на строку, чтобы закрепить или открепить её.",
|
||||
"ui.ribbon_workspace": "Рабочая область",
|
||||
"ui.right": "Справа",
|
||||
@@ -1737,6 +1793,7 @@
|
||||
"ui.smooth_wheel_zoom": "Плавное масштабирование колесом",
|
||||
"ui.smooth_wheel_zoom_tip": "Отключите, чтобы каждое движение колеса применялось сразу, без сглаживания",
|
||||
"ui.snap": "Привязка",
|
||||
"ui.space_mouse_axes_reassigned": "Оси переназначены в настройках, и это действует и поверх этой калибровки.",
|
||||
"ui.space_mouse_calibrate": "Калибровать…",
|
||||
"ui.space_mouse_calibrate_tip": "Двигайте колпачок так, как просит окно, чтобы SolidCraft узнал, куда и насколько далеко движется каждая ось этой 3D-мыши. Сохраняется для этой 3D-мыши.",
|
||||
"ui.space_mouse_calibrate_title": "Калибровка 3D-мыши",
|
||||
@@ -1746,12 +1803,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Одна ось почти не сдвинулась, поэтому её нельзя откалибровать. Начните заново и каждый раз двигайте колпачок дальше.",
|
||||
"ui.space_mouse_dead_zone": "Мёртвая зона",
|
||||
"ui.space_mouse_dead_zone_tip": "Насколько нужно сдвинуть колпачок, прежде чем сдвинется вид, в доле от полного хода. Увеличьте, если вид смещается, когда колпачок в покое.",
|
||||
"ui.space_mouse_driven_by": "Какое откалиброванное движение устройства управляет этой осью. Если выбрать движение, которое уже использует другая ось, они поменяются местами.",
|
||||
"ui.space_mouse_driven_by_label": "управляется",
|
||||
"ui.space_mouse_driver": "Драйвер 3D-мыши",
|
||||
"ui.space_mouse_driver_auto": "Автоматически",
|
||||
"ui.space_mouse_driver_direct": "Напрямую (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Чтение напрямую с устройства; spacenavd не запущен",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Чтение через spacenavd, других вариантов нет",
|
||||
"ui.space_mouse_forget": "Забыть калибровку",
|
||||
"ui.space_mouse_hint": "Совместное перемещение и вращение вида; в эскизе — только панорама и масштаб.",
|
||||
"ui.space_mouse_motion_rotation_x": "Вращение X",
|
||||
"ui.space_mouse_motion_rotation_y": "Вращение Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Вращение Z",
|
||||
"ui.space_mouse_motion_translation_x": "Смещение X",
|
||||
"ui.space_mouse_motion_translation_y": "Смещение Y",
|
||||
"ui.space_mouse_motion_translation_z": "Смещение Z",
|
||||
"ui.space_mouse_navigate": "Навигация через SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "3D-мышь не найдена",
|
||||
"ui.space_mouse_not_calibrated": "Не откалибрована",
|
||||
"ui.space_mouse_reading": "Показания",
|
||||
"ui.space_mouse_reset_axes": "Сбросить назначение осей",
|
||||
"ui.space_mouse_step_lift": "Поднимите колпачок вверх, удержите и отпустите.",
|
||||
"ui.space_mouse_step_press": "Нажмите на колпачок вниз, удержите и отпустите.",
|
||||
"ui.space_mouse_step_pull": "Потяните колпачок на себя, удержите и отпустите.",
|
||||
@@ -1765,6 +1836,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Наклоните колпачок вправо (правый край вниз), удержите и отпустите.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Поверните колпачок по часовой стрелке, удержите и отпустите.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Поверните колпачок против часовой стрелки, удержите и отпустите.",
|
||||
"ui.space_mouse_view_axis": "Ось вида",
|
||||
"ui.space_mouse_view_off": "Выкл.",
|
||||
"ui.space_mouse_view_off_tip": "Профиль драйвера 3D-мыши отключает эту ось, поэтому её движение не двигает вид. Если выбрать здесь движение другой оси, они поменяются местами, и это движение перестанет двигать вид.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Орбита влево / вправо",
|
||||
"ui.space_mouse_view_orbit_up_down": "Орбита вверх / вниз",
|
||||
"ui.space_mouse_view_pan_sideways": "Сдвиг влево / вправо",
|
||||
"ui.space_mouse_view_pan_up_down": "Сдвиг вверх / вниз",
|
||||
"ui.space_mouse_view_roll": "Крен",
|
||||
"ui.space_mouse_view_unmapped": "Ось {n}",
|
||||
"ui.space_mouse_view_zoom": "Масштаб",
|
||||
"ui.spacing": "Интервал",
|
||||
"ui.spacing_2": "Интервал 2",
|
||||
"ui.sphere": "Сфера",
|
||||
@@ -1836,6 +1917,7 @@
|
||||
"ui.workspace_design_tabs": "Модель · Поверхность · Сборка · Вставка · Проверка · Управление · Вид",
|
||||
"ui.workspace_drawing_description": "2D-чертежи с видами, размерами и основными надписями",
|
||||
"ui.workspace_footer": "Все рабочие среды работают с одним дизайном, историей и выбором; меняются только вкладки ленты. Переключатель заблокирован, пока редактируется эскиз или операция.",
|
||||
"ui.workspace_layout": "Компоновка рабочей области",
|
||||
"ui.workspace_manufacture_description": "Слайсинг, траектории инструмента и наладка",
|
||||
"ui.workspace_planned": "Запланировано",
|
||||
"ui.workspace_render_description": "Предпросмотр изделия, настройки сцены и отрендеренные изображения",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "HISTORIK",
|
||||
"Height": "Höjd",
|
||||
"Hidden edges": "Dolda kanter",
|
||||
"History layout": "Historiklayout",
|
||||
"Holes": "Hål",
|
||||
"Holes (edges on them)": "Hål (kanter på dem)",
|
||||
"Home view": "Hemvy",
|
||||
@@ -232,7 +233,6 @@
|
||||
"No crash reports.": "Inga kraschrapporter.",
|
||||
"No matching appearance presets.": "Inga matchande utseendeförinställningar.",
|
||||
"No matching appearances": "Inga matchande utseenden",
|
||||
"No visible bodies to export.": "Inga synliga kroppar att exportera.",
|
||||
"None": "Ingen",
|
||||
"Not available yet": "Inte tillgänglig ännu",
|
||||
"Notch": "Urtag",
|
||||
@@ -856,19 +856,57 @@
|
||||
"help.mit": "MIT-licens",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Licenser från tredje part",
|
||||
"home.back": "Tillbaka till {name}",
|
||||
"home.crashes": "Kraschrapporter",
|
||||
"home.design_workspace": "Konstruktion",
|
||||
"home.documentation": "Dokumentation",
|
||||
"home.export": "Exportera",
|
||||
"home.export_hint": "Välj ett format för den aktuella konstruktionen.",
|
||||
"home.export_json_hint": "Redigerbar konstruktion och kommandohistorik",
|
||||
"home.export_mesh_hint": "Mesh för utskrift eller delning",
|
||||
"home.export_step_hint": "Exakt solidgeometri",
|
||||
"home.import": "Importera…",
|
||||
"home.import_hint": "STEP, IGES eller mesh till en ny konstruktion",
|
||||
"home.in_this_browser": "i den här webbläsaren",
|
||||
"home.missing": "saknas",
|
||||
"home.month_01": "jan.",
|
||||
"home.month_02": "feb.",
|
||||
"home.month_03": "mars",
|
||||
"home.month_04": "apr.",
|
||||
"home.month_05": "maj",
|
||||
"home.month_06": "juni",
|
||||
"home.month_07": "juli",
|
||||
"home.month_08": "aug.",
|
||||
"home.month_09": "sep.",
|
||||
"home.month_10": "okt.",
|
||||
"home.month_11": "nov.",
|
||||
"home.month_12": "dec.",
|
||||
"home.new_inches": "Ny konstruktion i tum",
|
||||
"home.new_inches_hint": "Tum · öppnas i Konstruktion",
|
||||
"home.new_mm": "Ny konstruktion",
|
||||
"home.new_mm_hint": "Millimeter · öppnas i Konstruktion",
|
||||
"home.open": "Öppna…",
|
||||
"home.opened_days_ago": "Öppnades för {count} dagar sedan",
|
||||
"home.opened_hours_ago": "Öppnades för {count} h sedan",
|
||||
"home.opened_just_now": "Öppnades nyss",
|
||||
"home.opened_minutes_ago": "Öppnades för {count} min sedan",
|
||||
"home.open_hint": "En .solidcraft-konstruktion ({shortcut})",
|
||||
"home.open_now": "Öppen nu",
|
||||
"home.opened_days_ago": "För {count} dagar sedan",
|
||||
"home.opened_hours_ago": "För {count} h sedan",
|
||||
"home.opened_just_now": "Nyss",
|
||||
"home.opened_minutes_ago": "För {count} min sedan",
|
||||
"home.opening": "öppnar…",
|
||||
"home.properties": "Konstruktionsegenskaper",
|
||||
"home.recent": "Senaste",
|
||||
"home.recent_empty": "Konstruktioner som du öppnar eller sparar visas här.",
|
||||
"home.recovery_count": "Återställningsbara konstruktioner: {count}",
|
||||
"home.recovery_empty": "Inga återställningsbara konstruktioner.",
|
||||
"home.recovery_hint": "SolidCraft stängdes innan dessa konstruktioner sparades.",
|
||||
"home.report_issue": "Rapportera ett problem",
|
||||
"home.samples": "Exempel",
|
||||
"home.settings": "Inställningar",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Kortkommandon",
|
||||
"home.start_hint": "Skapa en konstruktion, öppna en nyligen använd fil eller utforska ett exempel.",
|
||||
"home.whats_new": "Nyheter",
|
||||
"home.yesterday": "I går",
|
||||
"install.button_tip": "Installera SolidCraft som en app: den öppnas i ett eget fönster och fungerar offline",
|
||||
"install.dock_1": "Välj Arkiv › Lägg till i Dock.",
|
||||
"install.dock_2": "Klicka på Lägg till.",
|
||||
@@ -1021,7 +1059,7 @@
|
||||
"search.try": "Skriv ett kommandonamn, en funktion i denna konstruktion eller en parameter. För att köra ett kommando med värden, skriv dess id och ett JSON-objekt: {example}",
|
||||
"search.valid": "Giltig",
|
||||
"settings.display_quality_note": "Finare nivåer ritar krökta ytor och kanter jämnare och tar längre tid att mesha. Endast vyporten ändras, aldrig konstruktionen eller exporter.",
|
||||
"settings.frame_rate_note": "Visar bildrutor per sekund i vyns nedre högra hörn. Medan det är på ritas vyn om kontinuerligt.",
|
||||
"settings.frame_rate_note": "Visar bildrutor per sekund i vyns nedre högra hörn.",
|
||||
"settings.measure_axis_distances": "Visa X/Y/Z-avstånd",
|
||||
"settings.measure_axis_distances_help": "Visa världsaxelns komponentmått bredvid det totala avståndet medan Mät är öppet.",
|
||||
"settings.msaa_applies_on_restart": "Kantutjämning tillämpas nästa gång SolidCraft startar",
|
||||
@@ -1092,6 +1130,7 @@
|
||||
"ui.agent_chat_add": "Bifoga filer",
|
||||
"ui.agent_chat_add_file": "Välj en fil…",
|
||||
"ui.agent_chat_allow": "Tillåt",
|
||||
"ui.agent_chat_allow_once": "Tillåt en gång",
|
||||
"ui.agent_chat_allowed": "Tillåten",
|
||||
"ui.agent_chat_answered": "Svar: {option}",
|
||||
"ui.agent_chat_approval": "Tillåta agenten att göra detta?",
|
||||
@@ -1143,12 +1182,16 @@
|
||||
"ui.agent_chat_files_left_out": "Högst {max} filer följer med ett meddelande; utelämnade: {files}",
|
||||
"ui.agent_chat_files_loading": "Väntar på att filerna ska läsas",
|
||||
"ui.agent_chat_files_max": "Högst {max} filer i ett meddelande",
|
||||
"ui.agent_chat_flatpak_none_found": "Ingen kodningsagent hittades. Flatpak-sandlådan ser som standard inte agenter som är installerade i din hemmapp och har ingen nätverksåtkomst. För att tillåta Claude Code och dess ACP-adapter installerade via nvm eller i ~/.local/bin kör du det här kommandot i en terminal och startar sedan om SolidCraft. Det ger åtkomst till de angivna programmen och inloggningsfilerna samt nätverksåtkomst:",
|
||||
"ui.agent_chat_import_failed": "{name}: importen misslyckades: {error}",
|
||||
"ui.agent_chat_intro": "Chatta med en kodningsagent du redan använder, eller en modellslutpunkt du väljer. Den arbetar med den öppna konstruktionen via SolidCrafts verktyg: dess ändringar syns medan den gör dem och ångras som ett steg per meddelande. Vad den får göra utan att fråga ställs in under Inställningar > AI.",
|
||||
"ui.agent_chat_key_in_env": "nyckel angiven",
|
||||
"ui.agent_chat_left": "Vänster",
|
||||
"ui.agent_chat_limit": "Agenten nådde gränsen på {limit} ändringar för ett meddelande. Skicka ett nytt meddelande så att den kan fortsätta.",
|
||||
"ui.agent_chat_minimize": "Minimera till ett fält",
|
||||
"ui.agent_chat_mode_all": "Allt",
|
||||
"ui.agent_chat_mode_ask": "Fråga",
|
||||
"ui.agent_chat_mode_edits": "Ändringar",
|
||||
"ui.agent_chat_model_tip": "Modellen som agenten använder. Ditt val kommer ihåg för den här agenten.",
|
||||
"ui.agent_chat_new": "Ny chatt",
|
||||
"ui.agent_chat_new_confirm": "Starta en ny chatt? Den nuvarande rensas.",
|
||||
@@ -1161,6 +1204,7 @@
|
||||
"ui.agent_chat_none_found_short": "Ingen agent hittades",
|
||||
"ui.agent_chat_not_installed": "Inte installerad",
|
||||
"ui.agent_chat_not_signed_in": "inte inloggad",
|
||||
"ui.agent_chat_open_settings": "Öppna inställningar",
|
||||
"ui.agent_chat_own_window": "Eget fönster",
|
||||
"ui.agent_chat_paste_picture": "Klistra in en bild",
|
||||
"ui.agent_chat_permission": "Agenten ber om att få köra: {title}",
|
||||
@@ -1185,6 +1229,8 @@
|
||||
"ui.agent_chat_send": "Skicka",
|
||||
"ui.agent_chat_send_now": "Skicka nu",
|
||||
"ui.agent_chat_send_now_tip": "Stoppa agentens nuvarande steg och skicka detta härnäst (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft kommunicerar med en kodningsagent som är installerad på den här datorn. Välj en under Inställningar › AI.",
|
||||
"ui.agent_chat_setup_title": "Konfigurera en assistent",
|
||||
"ui.agent_chat_side": "Agentchattens sida",
|
||||
"ui.agent_chat_signed_in": "inloggad",
|
||||
"ui.agent_chat_state_auth": "Inloggning krävs",
|
||||
@@ -1201,6 +1247,7 @@
|
||||
"ui.agent_chat_undo_label": "Agentchatt: {message}",
|
||||
"ui.agent_chat_undone": "(ångrad)",
|
||||
"ui.agent_chat_view_attached": "Vy bifogad",
|
||||
"ui.agent_chat_waiting": "Väntar på dig",
|
||||
"ui.agent_cursor": "Agentmarkör",
|
||||
"ui.agent_cursor_speed": "Agentmarkörens hastighet",
|
||||
"ui.ai_add": "Lägg till",
|
||||
@@ -1455,6 +1502,7 @@
|
||||
"ui.grid_follows_view_hint": "Sidovyer visar rutnätet på det upprätta planet som vetter mot dem istället för marken",
|
||||
"ui.ground_shadow": "Markskugga",
|
||||
"ui.groupSelected": "Gruppera markerade",
|
||||
"ui.hatch": "Skraffering",
|
||||
"ui.heading_add_ins": "TILLÄGG",
|
||||
"ui.heading_assemble": "MONTERA",
|
||||
"ui.heading_box": "LÅDA",
|
||||
@@ -1528,6 +1576,11 @@
|
||||
"ui.hideOrigin": "Dölj origo",
|
||||
"ui.hidePlanes": "Dölj plan",
|
||||
"ui.hideProfile": "Dölj profil",
|
||||
"ui.history_back": "Gå ett steg bakåt",
|
||||
"ui.history_below_browser": "Under webbläsaren",
|
||||
"ui.history_first": "Gå till början",
|
||||
"ui.history_forward": "Gå ett steg framåt",
|
||||
"ui.history_last": "Gå till slutet",
|
||||
"ui.history_title": "Historik",
|
||||
"ui.hole": "Hål",
|
||||
"ui.hole_tap_type": "Typ av gängning för hål",
|
||||
@@ -1545,6 +1598,8 @@
|
||||
"ui.joints": "Leder",
|
||||
"ui.keyboard_shortcuts": "Kortkommandon",
|
||||
"ui.language": "Språk",
|
||||
"ui.layout_compact": "Kompakt",
|
||||
"ui.layout_floating": "Flytande",
|
||||
"ui.length_decimals": "Längddecimaler",
|
||||
"ui.light": "Ljust",
|
||||
"ui.line": "Linje",
|
||||
@@ -1682,6 +1737,7 @@
|
||||
"ui.reverse_zoom_direction": "Vänd zoomriktning",
|
||||
"ui.revolve": "Rotation",
|
||||
"ui.ribbon_exit": "Avsluta",
|
||||
"ui.ribbon_labels": "Visa text under menyfliksikoner",
|
||||
"ui.ribbon_pin_footer": "Fästa kommandon visas i menyfliken. Håll muspekaren över en rad för att fästa eller lossa den.",
|
||||
"ui.ribbon_workspace": "Arbetsyta",
|
||||
"ui.right": "Höger",
|
||||
@@ -1836,6 +1892,7 @@
|
||||
"ui.workspace_design_tabs": "Modell · Yta · Montera · Infoga · Granska · Hantera · Vy",
|
||||
"ui.workspace_drawing_description": "2D-ritningar med vyer, mått och titelrutor",
|
||||
"ui.workspace_footer": "Varje arbetsyta arbetar med samma konstruktion, historik och markering; endast menyflikarna ändras. Växlaren är låst medan en skiss eller funktion redigeras.",
|
||||
"ui.workspace_layout": "Arbetsytans layout",
|
||||
"ui.workspace_manufacture_description": "Slicing, verktygsbanor och uppsättning",
|
||||
"ui.workspace_planned": "Planerad",
|
||||
"ui.workspace_render_description": "Produktförhandsvisning, sceninställningar och renderade bilder",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "GEÇMİŞ",
|
||||
"Height": "Yükseklik",
|
||||
"Hidden edges": "Gizli kenarlar",
|
||||
"History layout": "Geçmiş düzeni",
|
||||
"Holes": "Delikler",
|
||||
"Holes (edges on them)": "Delikler (kenarları)",
|
||||
"Home view": "Başlangıç görünümü",
|
||||
@@ -232,7 +233,6 @@
|
||||
"No crash reports.": "Çökme raporu yok.",
|
||||
"No matching appearance presets.": "Eşleşen görünüm ön ayarı yok.",
|
||||
"No matching appearances": "Eşleşen görünüm yok",
|
||||
"No visible bodies to export.": "Dışa aktarılacak görünür gövde yok.",
|
||||
"None": "Hiçbiri",
|
||||
"Not available yet": "Henüz kullanılamıyor",
|
||||
"Notch": "Çentik",
|
||||
@@ -856,19 +856,57 @@
|
||||
"help.mit": "MIT lisansı",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Üçüncü taraf lisansları",
|
||||
"home.back": "{name} tasarımına dön",
|
||||
"home.crashes": "Çökme raporları",
|
||||
"home.design_workspace": "Tasarım",
|
||||
"home.documentation": "Belgeler",
|
||||
"home.export": "Dışa aktar",
|
||||
"home.export_hint": "Geçerli tasarım için bir biçim seçin.",
|
||||
"home.export_json_hint": "Düzenlenebilir tasarım ve komut geçmişi",
|
||||
"home.export_mesh_hint": "Yazdırma veya paylaşma için ağ",
|
||||
"home.export_step_hint": "Hassas katı geometrisi",
|
||||
"home.import": "İçe aktar…",
|
||||
"home.import_hint": "STEP, IGES veya ağı yeni bir tasarıma aktar",
|
||||
"home.in_this_browser": "bu tarayıcıda",
|
||||
"home.missing": "eksik",
|
||||
"home.month_01": "Oca",
|
||||
"home.month_02": "Şub",
|
||||
"home.month_03": "Mar",
|
||||
"home.month_04": "Nis",
|
||||
"home.month_05": "May",
|
||||
"home.month_06": "Haz",
|
||||
"home.month_07": "Tem",
|
||||
"home.month_08": "Ağu",
|
||||
"home.month_09": "Eyl",
|
||||
"home.month_10": "Eki",
|
||||
"home.month_11": "Kas",
|
||||
"home.month_12": "Ara",
|
||||
"home.new_inches": "Yeni tasarım, inç",
|
||||
"home.new_inches_hint": "İnç · Tasarım alanında açılır",
|
||||
"home.new_mm": "Yeni tasarım",
|
||||
"home.new_mm_hint": "Milimetre · Tasarım alanında açılır",
|
||||
"home.open": "Aç…",
|
||||
"home.opened_days_ago": "{count} gün önce açıldı",
|
||||
"home.opened_hours_ago": "{count} sa. önce açıldı",
|
||||
"home.opened_just_now": "Az önce açıldı",
|
||||
"home.opened_minutes_ago": "{count} dk. önce açıldı",
|
||||
"home.open_hint": "Bir .solidcraft tasarımı ({shortcut})",
|
||||
"home.open_now": "Şimdi aç",
|
||||
"home.opened_days_ago": "{count} gün önce",
|
||||
"home.opened_hours_ago": "{count} sa. önce",
|
||||
"home.opened_just_now": "Az önce",
|
||||
"home.opened_minutes_ago": "{count} dk. önce",
|
||||
"home.opening": "açılıyor…",
|
||||
"home.properties": "Tasarım özellikleri",
|
||||
"home.recent": "Son kullanılanlar",
|
||||
"home.recent_empty": "Açtığınız veya kaydettiğiniz tasarımlar burada görünür.",
|
||||
"home.recovery_count": "Kurtarılabilir tasarımlar: {count}",
|
||||
"home.recovery_empty": "Kurtarılabilir tasarım yok.",
|
||||
"home.recovery_hint": "Bu tasarımlar kaydedilmeden SolidCraft kapandı.",
|
||||
"home.report_issue": "Sorun bildir",
|
||||
"home.samples": "Örnekler",
|
||||
"home.settings": "Ayarlar",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Klavye kısayolları",
|
||||
"home.start_hint": "Bir tasarım oluşturun, son kullanılan bir dosyayı açın veya bir örneği inceleyin.",
|
||||
"home.whats_new": "Yenilikler",
|
||||
"home.yesterday": "Dün",
|
||||
"install.button_tip": "SolidCraft'ı uygulama olarak yükleyin: kendi penceresinde açılır ve çevrimdışı da çalışır",
|
||||
"install.dock_1": "Dosya › Dock'a Ekle'yi seçin.",
|
||||
"install.dock_2": "“Ekle” düğmesine tıklayın.",
|
||||
@@ -1021,7 +1059,7 @@
|
||||
"search.try": "Bir komut adı, bu tasarımdaki bir özellik veya bir parametre yazın. Bir komutu değerlerle çalıştırmak için kimliğini ve bir JSON nesnesi yazın: {example}",
|
||||
"search.valid": "Geçerli",
|
||||
"settings.display_quality_note": "Daha ince seviyeler eğri yüzeyleri ve kenarları daha pürüzsüz gösterir, ancak ağ oluşturma daha uzun sürer. Yalnızca görünüm değişir; tasarım ve dışa aktarımlar asla değişmez.",
|
||||
"settings.frame_rate_note": "Görünümün sağ alt köşesinde saniyedeki kare sayısını gösterir. Açıkken görünüm sürekli yeniden çizilir.",
|
||||
"settings.frame_rate_note": "Görünümün sağ alt köşesinde saniyedeki kare sayısını gösterir.",
|
||||
"settings.measure_axis_distances": "X/Y/Z mesafelerini göster",
|
||||
"settings.measure_axis_distances_help": "Ölç açıkken toplam mesafenin yanında dünya ekseni bileşen ölçülerini gösterir.",
|
||||
"settings.msaa_applies_on_restart": "Kenar yumuşatma, SolidCraft bir sonraki başlatıldığında uygulanır",
|
||||
@@ -1092,6 +1130,7 @@
|
||||
"ui.agent_chat_add": "Dosya ekle",
|
||||
"ui.agent_chat_add_file": "Dosya seç…",
|
||||
"ui.agent_chat_allow": "İzin ver",
|
||||
"ui.agent_chat_allow_once": "Bir kez izin ver",
|
||||
"ui.agent_chat_allowed": "İzin verildi",
|
||||
"ui.agent_chat_answered": "Yanıt: {option}",
|
||||
"ui.agent_chat_approval": "Ajanın bunu yapmasına izin verilsin mi?",
|
||||
@@ -1143,12 +1182,16 @@
|
||||
"ui.agent_chat_files_left_out": "Bir iletiyle en fazla {max} dosya gider; dışarıda kalanlar: {files}",
|
||||
"ui.agent_chat_files_loading": "Dosyaların okunması bekleniyor",
|
||||
"ui.agent_chat_files_max": "Bir iletide en fazla {max} dosya olabilir",
|
||||
"ui.agent_chat_flatpak_none_found": "Kodlama ajanı bulunamadı. Flatpak korumalı alanı varsayılan olarak ana klasörünüze yüklenen ajanları göremez ve ağ erişimi yoktur. nvm ile veya ~/.local/bin içine yüklenen Claude Code'a ve ACP bağdaştırıcısına izin vermek için bu komutu bir terminalde çalıştırın, ardından SolidCraft'ı yeniden başlatın. Komut, listelenen programlara ve oturum açma dosyalarına erişimin yanı sıra ağ erişimi de verir:",
|
||||
"ui.agent_chat_import_failed": "{name}: içe aktarma başarısız oldu: {error}",
|
||||
"ui.agent_chat_intro": "Zaten kullandığınız bir kodlama ajanıyla veya seçtiğiniz bir model uç noktasıyla sohbet edin. Ajan, SolidCraft'ın araçlarıyla açık tasarım üzerinde çalışır: Değişiklikleri hemen görünür ve mesaj başına tek adımda geri alınabilir. Sormadan neleri yapabileceğini Ayarlar > AI altında belirlersiniz.",
|
||||
"ui.agent_chat_key_in_env": "anahtar ayarlı",
|
||||
"ui.agent_chat_left": "Sol",
|
||||
"ui.agent_chat_limit": "Ajan, bir mesaj için {limit} değişiklik sınırına ulaştı. Devam etmesi için başka bir mesaj gönderin.",
|
||||
"ui.agent_chat_minimize": "Bir çubuğa küçült",
|
||||
"ui.agent_chat_mode_all": "Tümü",
|
||||
"ui.agent_chat_mode_ask": "Sor",
|
||||
"ui.agent_chat_mode_edits": "Düzenle",
|
||||
"ui.agent_chat_model_tip": "Ajanın kullandığı model. Seçiminiz bu ajan için hatırlanır.",
|
||||
"ui.agent_chat_new": "Yeni sohbet",
|
||||
"ui.agent_chat_new_confirm": "Yeni bir sohbet başlatılsın mı? Geçerli sohbet temizlenir.",
|
||||
@@ -1161,6 +1204,7 @@
|
||||
"ui.agent_chat_none_found_short": "Ajan bulunamadı",
|
||||
"ui.agent_chat_not_installed": "Yüklü değil",
|
||||
"ui.agent_chat_not_signed_in": "oturum açık değil",
|
||||
"ui.agent_chat_open_settings": "Ayarları aç",
|
||||
"ui.agent_chat_own_window": "Ayrı pencere",
|
||||
"ui.agent_chat_paste_picture": "Görsel yapıştır",
|
||||
"ui.agent_chat_permission": "Ajan şunu çalıştırmak istiyor: {title}",
|
||||
@@ -1185,6 +1229,8 @@
|
||||
"ui.agent_chat_send": "Gönder",
|
||||
"ui.agent_chat_send_now": "Şimdi gönder",
|
||||
"ui.agent_chat_send_now_tip": "Ajanın geçerli adımını durdurur ve bunu sonraki olarak gönderir (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft, bu bilgisayarda yüklü bir kodlama aracısıyla iletişim kurar. Ayarlar › AI bölümünden birini seçin.",
|
||||
"ui.agent_chat_setup_title": "Asistan ayarla",
|
||||
"ui.agent_chat_side": "Ajan sohbeti konumu",
|
||||
"ui.agent_chat_signed_in": "oturum açık",
|
||||
"ui.agent_chat_state_auth": "Oturum açılması gerekiyor",
|
||||
@@ -1201,6 +1247,7 @@
|
||||
"ui.agent_chat_undo_label": "Ajan sohbeti: {message}",
|
||||
"ui.agent_chat_undone": "(geri alındı)",
|
||||
"ui.agent_chat_view_attached": "Görünüm eklendi",
|
||||
"ui.agent_chat_waiting": "Yanıtınız bekleniyor",
|
||||
"ui.agent_cursor": "Ajan imleci",
|
||||
"ui.agent_cursor_speed": "Ajan imleci hızı",
|
||||
"ui.ai_add": "Ekle",
|
||||
@@ -1455,6 +1502,7 @@
|
||||
"ui.grid_follows_view_hint": "Yan görünümlerde ızgara, zemin yerine onlara bakan dik düzlemde gösterilir",
|
||||
"ui.ground_shadow": "Zemin gölgesi",
|
||||
"ui.groupSelected": "Seçimi grupla",
|
||||
"ui.hatch": "Tarama",
|
||||
"ui.heading_add_ins": "EKLENTİLER",
|
||||
"ui.heading_assemble": "MONTAJ",
|
||||
"ui.heading_box": "KUTU",
|
||||
@@ -1528,6 +1576,11 @@
|
||||
"ui.hideOrigin": "Orijini gizle",
|
||||
"ui.hidePlanes": "Düzlemleri gizle",
|
||||
"ui.hideProfile": "Profili gizle",
|
||||
"ui.history_back": "Bir adım geri git",
|
||||
"ui.history_below_browser": "Tarayıcının altında",
|
||||
"ui.history_first": "Başlangıca git",
|
||||
"ui.history_forward": "Bir adım ileri git",
|
||||
"ui.history_last": "Sona git",
|
||||
"ui.history_title": "Geçmiş",
|
||||
"ui.hole": "Delik",
|
||||
"ui.hole_tap_type": "Diş türü",
|
||||
@@ -1545,6 +1598,8 @@
|
||||
"ui.joints": "Bağlantılar",
|
||||
"ui.keyboard_shortcuts": "Klavye kısayolları",
|
||||
"ui.language": "Dil",
|
||||
"ui.layout_compact": "Kompakt",
|
||||
"ui.layout_floating": "Kayan",
|
||||
"ui.length_decimals": "Uzunluk ondalık basamakları",
|
||||
"ui.light": "Açık",
|
||||
"ui.line": "Çizgi",
|
||||
@@ -1682,6 +1737,7 @@
|
||||
"ui.reverse_zoom_direction": "Yakınlaştırma yönünü tersine çevir",
|
||||
"ui.revolve": "Döndür",
|
||||
"ui.ribbon_exit": "Çıkış",
|
||||
"ui.ribbon_labels": "Şerit simgelerinin altında metin göster",
|
||||
"ui.ribbon_pin_footer": "Sabitlenen komutlar şeritte görünür. Sabitlemek veya kaldırmak için bir satırın üzerine gelin.",
|
||||
"ui.ribbon_workspace": "Çalışma alanı",
|
||||
"ui.right": "Sağ",
|
||||
@@ -1737,6 +1793,7 @@
|
||||
"ui.smooth_wheel_zoom": "Yumuşak tekerlek yakınlaştırması",
|
||||
"ui.smooth_wheel_zoom_tip": "Her tekerlek hareketini yumuşatma olmadan hemen uygulamak için kapatın",
|
||||
"ui.snap": "Yakala",
|
||||
"ui.space_mouse_axes_reassigned": "Eksenler Tercihler'de yeniden atanmış; bu, bu kalibrasyonun üstüne de uygulanır.",
|
||||
"ui.space_mouse_calibrate": "Kalibre et…",
|
||||
"ui.space_mouse_calibrate_tip": "Pencerenin istediği gibi başlığı hareket ettirin; SolidCraft bu 3B farenin her ekseninin hangi yöne ve ne kadar gittiğini öğrensin. Bu 3B fare için kaydedilir.",
|
||||
"ui.space_mouse_calibrate_title": "3B fareyi kalibre et",
|
||||
@@ -1746,12 +1803,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Bir eksen neredeyse hiç hareket etmedi, bu yüzden kalibre edilemiyor. Baştan başlayın ve başlığı her seferinde daha fazla hareket ettirin.",
|
||||
"ui.space_mouse_dead_zone": "Ölü bölge",
|
||||
"ui.space_mouse_dead_zone_tip": "Görünüm hareket etmeden önce başlığın ne kadar hareket etmesi gerektiği, tam hareket aralığının oranı olarak. Başlık dururken görünüm kayıyorsa artırın.",
|
||||
"ui.space_mouse_driven_by": "Bu ekseni cihazın hangi kalibre edilmiş hareketinin yönettiği. Başka bir eksenin zaten kullandığını seçerseniz ikisi yer değiştirir.",
|
||||
"ui.space_mouse_driven_by_label": "kumanda eden",
|
||||
"ui.space_mouse_driver": "3B fare sürücüsü",
|
||||
"ui.space_mouse_driver_auto": "Otomatik",
|
||||
"ui.space_mouse_driver_direct": "Doğrudan (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Aygıt doğrudan okunuyor; spacenavd çalışmıyor",
|
||||
"ui.space_mouse_driver_only_spacenavd": "spacenavd üzerinden okunuyor, tek seçenek bu",
|
||||
"ui.space_mouse_forget": "Kalibrasyonu unut",
|
||||
"ui.space_mouse_hint": "Görünümü aynı anda kaydırın ve döndürün; eskizlerde yalnızca kaydırma ve yakınlaştırma kullanılır.",
|
||||
"ui.space_mouse_motion_rotation_x": "Dönme X",
|
||||
"ui.space_mouse_motion_rotation_y": "Dönme Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Dönme Z",
|
||||
"ui.space_mouse_motion_translation_x": "Öteleme X",
|
||||
"ui.space_mouse_motion_translation_y": "Öteleme Y",
|
||||
"ui.space_mouse_motion_translation_z": "Öteleme Z",
|
||||
"ui.space_mouse_navigate": "SpaceNavigator / SpaceMouse ile gezin",
|
||||
"ui.space_mouse_none": "3B fare bulunamadı",
|
||||
"ui.space_mouse_not_calibrated": "Kalibre edilmedi",
|
||||
"ui.space_mouse_reading": "Okunan değer",
|
||||
"ui.space_mouse_reset_axes": "Eksen atamasını sıfırla",
|
||||
"ui.space_mouse_step_lift": "Başlığı yukarı kaldırın, tutun, sonra bırakın.",
|
||||
"ui.space_mouse_step_press": "Başlığı aşağı bastırın, tutun, sonra bırakın.",
|
||||
"ui.space_mouse_step_pull": "Başlığı kendinize doğru çekin, tutun, sonra bırakın.",
|
||||
@@ -1765,6 +1836,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Başlığı sağa eğin (sağ kenar aşağı), tutun, sonra bırakın.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Başlığı saat yönünde çevirin, tutun, sonra bırakın.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Başlığı saat yönünün tersine çevirin, tutun, sonra bırakın.",
|
||||
"ui.space_mouse_view_axis": "Görünüm ekseni",
|
||||
"ui.space_mouse_view_off": "Kapalı",
|
||||
"ui.space_mouse_view_off_tip": "3D fare sürücüsünün profili bu ekseni kapatıyor, bu yüzden hareketi görünümü oynatmaz. Burada başka bir eksenin hareketini seçerseniz ikisi yer değiştirir ve o hareket görünümü oynatmayı bırakır.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Sola / sağa yörünge",
|
||||
"ui.space_mouse_view_orbit_up_down": "Yukarı / aşağı yörünge",
|
||||
"ui.space_mouse_view_pan_sideways": "Sola / sağa kaydır",
|
||||
"ui.space_mouse_view_pan_up_down": "Yukarı / aşağı kaydır",
|
||||
"ui.space_mouse_view_roll": "Yuvarlanma",
|
||||
"ui.space_mouse_view_unmapped": "Eksen {n}",
|
||||
"ui.space_mouse_view_zoom": "Yakınlaştır",
|
||||
"ui.spacing": "Aralık",
|
||||
"ui.spacing_2": "Aralık 2",
|
||||
"ui.sphere": "Küre",
|
||||
@@ -1836,6 +1917,7 @@
|
||||
"ui.workspace_design_tabs": "Modelle · Yüzey · Montajla · Ekle · İncele · Yönet · Görünüm",
|
||||
"ui.workspace_drawing_description": "Görünümler, ölçüler ve başlık bloklarıyla 2B teknik resimler",
|
||||
"ui.workspace_footer": "Her çalışma alanı aynı tasarım, geçmiş ve seçim üzerinde çalışır; yalnızca şerit sekmeleri değişir. Bir eskiz veya özellik düzenlenirken geçiş kilitlidir.",
|
||||
"ui.workspace_layout": "Çalışma alanı düzeni",
|
||||
"ui.workspace_manufacture_description": "Dilimleme, takım yolları ve kurulum",
|
||||
"ui.workspace_planned": "Planlanan",
|
||||
"ui.workspace_render_description": "Ürün önizlemesi, sahne ayarları ve render görüntüleri",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "ІСТОРІЯ",
|
||||
"Height": "Висота",
|
||||
"Hidden edges": "Приховані ребра",
|
||||
"History layout": "Розташування історії",
|
||||
"Holes": "Отвори",
|
||||
"Holes (edges on them)": "Отвори (ребра на них)",
|
||||
"Home view": "Головний вид",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "Немає звітів про збої.",
|
||||
"No matching appearance presets.": "Немає відповідних наборів вигляду.",
|
||||
"No matching appearances": "Немає відповідних виглядів",
|
||||
"No visible bodies to export.": "Немає видимих тіл для експорту.",
|
||||
"No visible bodies or sketches to export.": "Немає видимих тіл або ескізів для експорту.",
|
||||
"None": "Немає",
|
||||
"Not available yet": "Ще недоступно",
|
||||
"Notch": "Виріз",
|
||||
@@ -831,7 +832,7 @@
|
||||
"dxf.progress.projection": "Проєктування геометрії (3/5)",
|
||||
"dxf.progress.write": "Запис DXF (5/5)",
|
||||
"dxf.tolerance": "Допуск кривої",
|
||||
"dxf.tolerance_help": "Лише видимі тіла. Криві подаються відрізками. Менший допуск дає точніші криві, але потребує більше часу й пам'яті.",
|
||||
"dxf.tolerance_help": "Лише видимі тіла та показані ескізи. Криві подаються відрізками. Менший допуск дає точніші криві, але потребує більше часу й пам'яті.",
|
||||
"file_load.built": "Побудовано: {built} із {total} елементів.",
|
||||
"file_load.converting": "Перетворення тіла {done} із {total}",
|
||||
"file_load.inserting": "Вставлення геометрії",
|
||||
@@ -856,19 +857,57 @@
|
||||
"help.mit": "Ліцензія MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Ліцензії сторонніх компонентів",
|
||||
"home.back": "Назад до {name}",
|
||||
"home.crashes": "Звіти про збої",
|
||||
"home.design_workspace": "Проєктування",
|
||||
"home.documentation": "Документація",
|
||||
"home.export": "Експортувати",
|
||||
"home.export_hint": "Виберіть формат для поточного проєкту.",
|
||||
"home.export_json_hint": "Редагований проєкт та історія команд",
|
||||
"home.export_mesh_hint": "Сітка для друку або поширення",
|
||||
"home.export_step_hint": "Точна твердотільна геометрія",
|
||||
"home.import": "Імпортувати…",
|
||||
"home.import_hint": "STEP, IGES або сітку в новий проєкт",
|
||||
"home.in_this_browser": "у цьому браузері",
|
||||
"home.missing": "відсутній",
|
||||
"home.month_01": "січ.",
|
||||
"home.month_02": "лют.",
|
||||
"home.month_03": "бер.",
|
||||
"home.month_04": "квіт.",
|
||||
"home.month_05": "трав.",
|
||||
"home.month_06": "черв.",
|
||||
"home.month_07": "лип.",
|
||||
"home.month_08": "серп.",
|
||||
"home.month_09": "вер.",
|
||||
"home.month_10": "жовт.",
|
||||
"home.month_11": "лист.",
|
||||
"home.month_12": "груд.",
|
||||
"home.new_inches": "Новий проєкт у дюймах",
|
||||
"home.new_inches_hint": "Дюйми · відкриється в робочому просторі «Проєктування»",
|
||||
"home.new_mm": "Новий проєкт",
|
||||
"home.new_mm_hint": "Міліметри · відкриється в робочому просторі «Проєктування»",
|
||||
"home.open": "Відкрити…",
|
||||
"home.opened_days_ago": "Відкрито {count} дн. тому",
|
||||
"home.opened_hours_ago": "Відкрито {count} год тому",
|
||||
"home.opened_just_now": "Щойно відкрито",
|
||||
"home.opened_minutes_ago": "Відкрито {count} хв тому",
|
||||
"home.open_hint": "Проєкт .solidcraft ({shortcut})",
|
||||
"home.open_now": "Відкрити зараз",
|
||||
"home.opened_days_ago": "{count} дн. тому",
|
||||
"home.opened_hours_ago": "{count} год тому",
|
||||
"home.opened_just_now": "Щойно",
|
||||
"home.opened_minutes_ago": "{count} хв тому",
|
||||
"home.opening": "відкриття…",
|
||||
"home.properties": "Властивості проєкту",
|
||||
"home.recent": "Недавні",
|
||||
"home.recent_empty": "Тут з’являться проєкти, які ви відкриєте або збережете.",
|
||||
"home.recovery_count": "Проєктів для відновлення: {count}",
|
||||
"home.recovery_empty": "Немає проєктів для відновлення.",
|
||||
"home.recovery_hint": "SolidCraft закрився до збереження цих проєктів.",
|
||||
"home.report_issue": "Повідомити про проблему",
|
||||
"home.samples": "Зразки",
|
||||
"home.settings": "Налаштування",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Сполучення клавіш",
|
||||
"home.start_hint": "Створіть проєкт, відкрийте нещодавній файл або перегляньте приклад.",
|
||||
"home.whats_new": "Що нового",
|
||||
"home.yesterday": "Учора",
|
||||
"install.button_tip": "Встановити SolidCraft як застосунок: він відкривається в окремому вікні й працює без мережі",
|
||||
"install.dock_1": "Виберіть «Файл» › «Додати в Dock».",
|
||||
"install.dock_2": "Натисніть «Додати».",
|
||||
@@ -1021,7 +1060,7 @@
|
||||
"search.try": "Введіть назву команди, елемент цього проєкту або параметр. Щоб виконати команду зі значеннями, введіть її id та об'єкт JSON: {example}",
|
||||
"search.valid": "Дійсне",
|
||||
"settings.display_quality_note": "Дрібніші рівні малюють криві грані й ребра плавнішими, але тріангуляція триває довше. Змінюється лише вікно перегляду, ніколи не проєкт чи експорт.",
|
||||
"settings.frame_rate_note": "Показує кадри за секунду в правому нижньому куті виду. Поки це ввімкнено, вид перемальовується безперервно.",
|
||||
"settings.frame_rate_note": "Показує кадри за секунду в правому нижньому куті виду.",
|
||||
"settings.measure_axis_distances": "Відстані X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Показувати розміри вздовж світових осей разом із загальною відстанню, поки відкрите вікно вимірювання.",
|
||||
"settings.msaa_applies_on_restart": "Згладжування застосується під час наступного запуску SolidCraft",
|
||||
@@ -1092,6 +1131,7 @@
|
||||
"ui.agent_chat_add": "Прикріпити файли",
|
||||
"ui.agent_chat_add_file": "Вибрати файл…",
|
||||
"ui.agent_chat_allow": "Дозволити",
|
||||
"ui.agent_chat_allow_once": "Дозволити один раз",
|
||||
"ui.agent_chat_allowed": "Дозволено",
|
||||
"ui.agent_chat_answered": "Відповідь: {option}",
|
||||
"ui.agent_chat_approval": "Дозволити агенту це зробити?",
|
||||
@@ -1143,12 +1183,16 @@
|
||||
"ui.agent_chat_files_left_out": "З одним повідомленням надсилається щонайбільше {max} файлів; пропущено: {files}",
|
||||
"ui.agent_chat_files_loading": "Очікування читання файлів",
|
||||
"ui.agent_chat_files_max": "Щонайбільше {max} файлів на одне повідомлення",
|
||||
"ui.agent_chat_flatpak_none_found": "Агента для програмування не знайдено. Пісочниця Flatpak типово не бачить агентів, установлених у домашній теці, і не має доступу до мережі. Щоб дозволити Claude Code і його адаптер ACP, установлені через nvm або в ~/.local/bin, виконайте цю команду в терміналі, а потім перезапустіть SolidCraft. Вона надає доступ до перелічених програм і файлів входу, а також доступ до мережі:",
|
||||
"ui.agent_chat_import_failed": "{name}: не вдалося імпортувати: {error}",
|
||||
"ui.agent_chat_intro": "Спілкуйтеся з агентом для програмування, яким уже користуєтеся, або з обраною вами модельною кінцевою точкою. Він працює з відкритим проєктом через інструменти SolidCraft: його зміни з'являються в міру виконання й скасовуються одним кроком на повідомлення. Що він може робити без запиту, задано в Налаштування > ШІ.",
|
||||
"ui.agent_chat_key_in_env": "ключ задано",
|
||||
"ui.agent_chat_left": "Ліворуч",
|
||||
"ui.agent_chat_limit": "Агент досяг межі {limit} змін на одне повідомлення. Надішліть інше повідомлення, щоб дозволити йому продовжити.",
|
||||
"ui.agent_chat_minimize": "Згорнути до смужки",
|
||||
"ui.agent_chat_mode_all": "Усе",
|
||||
"ui.agent_chat_mode_ask": "Запит",
|
||||
"ui.agent_chat_mode_edits": "Зміни",
|
||||
"ui.agent_chat_model_tip": "Модель, яку використовує агент. Ваш вибір запам'ятовується для цього агента.",
|
||||
"ui.agent_chat_new": "Новий чат",
|
||||
"ui.agent_chat_new_confirm": "Почати новий чат? Поточний буде очищено.",
|
||||
@@ -1161,6 +1205,7 @@
|
||||
"ui.agent_chat_none_found_short": "Агента не знайдено",
|
||||
"ui.agent_chat_not_installed": "Не встановлено",
|
||||
"ui.agent_chat_not_signed_in": "не виконано вхід",
|
||||
"ui.agent_chat_open_settings": "Відкрити налаштування",
|
||||
"ui.agent_chat_own_window": "Власне вікно",
|
||||
"ui.agent_chat_paste_picture": "Вставити зображення",
|
||||
"ui.agent_chat_permission": "Агент просить виконати: {title}",
|
||||
@@ -1185,6 +1230,8 @@
|
||||
"ui.agent_chat_send": "Надіслати",
|
||||
"ui.agent_chat_send_now": "Надіслати зараз",
|
||||
"ui.agent_chat_send_now_tip": "Зупинити поточний крок агента й надіслати це наступним (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft взаємодіє з агентом програмування, установленим на цьому комп’ютері. Виберіть його в розділі «Налаштування › ШІ».",
|
||||
"ui.agent_chat_setup_title": "Налаштувати асистента",
|
||||
"ui.agent_chat_side": "Сторона чату з агентом",
|
||||
"ui.agent_chat_signed_in": "виконано вхід",
|
||||
"ui.agent_chat_state_auth": "Потрібен вхід",
|
||||
@@ -1201,6 +1248,7 @@
|
||||
"ui.agent_chat_undo_label": "Чат з агентом: {message}",
|
||||
"ui.agent_chat_undone": "(скасовано)",
|
||||
"ui.agent_chat_view_attached": "Вид прикріплено",
|
||||
"ui.agent_chat_waiting": "Очікує на вашу відповідь",
|
||||
"ui.agent_cursor": "Курсор агента",
|
||||
"ui.agent_cursor_speed": "Швидкість курсора агента",
|
||||
"ui.ai_add": "Додати",
|
||||
@@ -1455,6 +1503,7 @@
|
||||
"ui.grid_follows_view_hint": "Бічні види показують сітку на вертикальній площині, повернутій до них, а не на землі",
|
||||
"ui.ground_shadow": "Тінь на землі",
|
||||
"ui.groupSelected": "Згрупувати виділене",
|
||||
"ui.hatch": "Штрихування",
|
||||
"ui.heading_add_ins": "НАДБУДОВИ",
|
||||
"ui.heading_assemble": "СКЛАДАННЯ",
|
||||
"ui.heading_box": "КУБ",
|
||||
@@ -1528,6 +1577,11 @@
|
||||
"ui.hideOrigin": "Приховати початок координат",
|
||||
"ui.hidePlanes": "Приховати площини",
|
||||
"ui.hideProfile": "Приховати профіль",
|
||||
"ui.history_back": "На один крок назад",
|
||||
"ui.history_below_browser": "Під браузером",
|
||||
"ui.history_first": "Перейти на початок",
|
||||
"ui.history_forward": "На один крок уперед",
|
||||
"ui.history_last": "Перейти в кінець",
|
||||
"ui.history_title": "Історія",
|
||||
"ui.hole": "Отвір",
|
||||
"ui.hole_tap_type": "Тип різьби отвору",
|
||||
@@ -1545,6 +1599,8 @@
|
||||
"ui.joints": "З'єднання",
|
||||
"ui.keyboard_shortcuts": "Комбінації клавіш",
|
||||
"ui.language": "Мова",
|
||||
"ui.layout_compact": "Компактне",
|
||||
"ui.layout_floating": "Плаваюче",
|
||||
"ui.length_decimals": "Знаки після коми для довжин",
|
||||
"ui.light": "Світла",
|
||||
"ui.line": "Пряма",
|
||||
@@ -1682,6 +1738,7 @@
|
||||
"ui.reverse_zoom_direction": "Змінити напрямок масштабування",
|
||||
"ui.revolve": "Обертання",
|
||||
"ui.ribbon_exit": "Вихід",
|
||||
"ui.ribbon_labels": "Показувати текст під піктограмами стрічки",
|
||||
"ui.ribbon_pin_footer": "Закріплені команди відображаються на стрічці. Наведіть курсор на рядок, щоб закріпити або відкріпити його.",
|
||||
"ui.ribbon_workspace": "Робоча область",
|
||||
"ui.right": "Справа",
|
||||
@@ -1737,6 +1794,7 @@
|
||||
"ui.smooth_wheel_zoom": "Плавне масштабування колесом",
|
||||
"ui.smooth_wheel_zoom_tip": "Вимкніть, щоб застосовувати кожну подію колеса негайно, без плавного завершення",
|
||||
"ui.snap": "Прив'язка",
|
||||
"ui.space_mouse_axes_reassigned": "Осі перепризначено в налаштуваннях, і це діє й поверх цього калібрування.",
|
||||
"ui.space_mouse_calibrate": "Калібрувати…",
|
||||
"ui.space_mouse_calibrate_tip": "Рухайте ковпачок так, як просить вікно, щоб SolidCraft дізнався, куди й наскільки далеко рухається кожна вісь цієї 3D-миші. Зберігається для цієї 3D-миші.",
|
||||
"ui.space_mouse_calibrate_title": "Калібрування 3D-миші",
|
||||
@@ -1746,12 +1804,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "Одна вісь майже не зрушила, тому її не можна відкалібрувати. Почніть спочатку й щоразу рухайте ковпачок далі.",
|
||||
"ui.space_mouse_dead_zone": "Мертва зона",
|
||||
"ui.space_mouse_dead_zone_tip": "Наскільки треба зсунути ковпачок, перш ніж зрушить вигляд, у частці від повного ходу. Збільште, якщо вигляд зміщується, коли ковпачок у спокої.",
|
||||
"ui.space_mouse_driven_by": "Який відкалібрований рух пристрою керує цією віссю. Якщо вибрати рух, який уже використовує інша вісь, вони поміняються місцями.",
|
||||
"ui.space_mouse_driven_by_label": "керується",
|
||||
"ui.space_mouse_driver": "Драйвер 3D-миші",
|
||||
"ui.space_mouse_driver_auto": "Автоматично",
|
||||
"ui.space_mouse_driver_direct": "Напряму (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "Читання напряму з пристрою; spacenavd не запущено",
|
||||
"ui.space_mouse_driver_only_spacenavd": "Читання через spacenavd, інших варіантів немає",
|
||||
"ui.space_mouse_forget": "Забути калібрування",
|
||||
"ui.space_mouse_hint": "Переміщуйте й обертайте вид разом; в ескізах доступні лише панорамування та масштаб.",
|
||||
"ui.space_mouse_motion_rotation_x": "Обертання X",
|
||||
"ui.space_mouse_motion_rotation_y": "Обертання Y",
|
||||
"ui.space_mouse_motion_rotation_z": "Обертання Z",
|
||||
"ui.space_mouse_motion_translation_x": "Зміщення X",
|
||||
"ui.space_mouse_motion_translation_y": "Зміщення Y",
|
||||
"ui.space_mouse_motion_translation_z": "Зміщення Z",
|
||||
"ui.space_mouse_navigate": "Навігація за допомогою SpaceNavigator / SpaceMouse",
|
||||
"ui.space_mouse_none": "3D-мишу не знайдено",
|
||||
"ui.space_mouse_not_calibrated": "Не відкалібровано",
|
||||
"ui.space_mouse_reading": "Показники",
|
||||
"ui.space_mouse_reset_axes": "Скинути призначення осей",
|
||||
"ui.space_mouse_step_lift": "Підніміть ковпачок угору, утримайте й відпустіть.",
|
||||
"ui.space_mouse_step_press": "Натисніть ковпачок униз, утримайте й відпустіть.",
|
||||
"ui.space_mouse_step_pull": "Потягніть ковпачок до себе, утримайте й відпустіть.",
|
||||
@@ -1765,6 +1837,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "Нахиліть ковпачок праворуч (правий край униз), утримайте й відпустіть.",
|
||||
"ui.space_mouse_step_twist_clockwise": "Поверніть ковпачок за годинниковою стрілкою, утримайте й відпустіть.",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "Поверніть ковпачок проти годинникової стрілки, утримайте й відпустіть.",
|
||||
"ui.space_mouse_view_axis": "Вісь вигляду",
|
||||
"ui.space_mouse_view_off": "Вимк.",
|
||||
"ui.space_mouse_view_off_tip": "Профіль драйвера 3D-миші вимикає цю вісь, тож її рух не рухає вигляд. Якщо вибрати тут рух іншої осі, вони поміняються місцями, і цей рух перестане рухати вигляд.",
|
||||
"ui.space_mouse_view_orbit_sideways": "Орбіта ліворуч / праворуч",
|
||||
"ui.space_mouse_view_orbit_up_down": "Орбіта вгору / вниз",
|
||||
"ui.space_mouse_view_pan_sideways": "Зсув ліворуч / праворуч",
|
||||
"ui.space_mouse_view_pan_up_down": "Зсув угору / вниз",
|
||||
"ui.space_mouse_view_roll": "Крен",
|
||||
"ui.space_mouse_view_unmapped": "Вісь {n}",
|
||||
"ui.space_mouse_view_zoom": "Масштаб",
|
||||
"ui.spacing": "Крок",
|
||||
"ui.spacing_2": "Крок 2",
|
||||
"ui.sphere": "Куля",
|
||||
@@ -1836,6 +1918,7 @@
|
||||
"ui.workspace_design_tabs": "Модель · Поверхня · Збірка · Вставка · Перевірка · Керування · Вигляд",
|
||||
"ui.workspace_drawing_description": "2D-креслення з видами, розмірами та штампами",
|
||||
"ui.workspace_footer": "Кожне робоче середовище працює з тим самим проєктом, історією та вибором; змінюються лише вкладки стрічки. Перемикач заблоковано, поки редагується ескіз або елемент.",
|
||||
"ui.workspace_layout": "Компонування робочої області",
|
||||
"ui.workspace_manufacture_description": "Нарізання, траєкторії та налаштування",
|
||||
"ui.workspace_planned": "Заплановано",
|
||||
"ui.workspace_render_description": "Перегляд виробу, налаштування сцени та відтворені зображення",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "LỊCH SỬ",
|
||||
"Height": "Chiều cao",
|
||||
"Hidden edges": "Nét khuất",
|
||||
"History layout": "Bố cục lịch sử",
|
||||
"Holes": "Lỗ",
|
||||
"Holes (edges on them)": "Lỗ (các cạnh trên lỗ)",
|
||||
"Home view": "Góc nhìn chuẩn (Home)",
|
||||
@@ -232,7 +233,7 @@
|
||||
"No crash reports.": "Không có báo cáo sự cố.",
|
||||
"No matching appearance presets.": "Không có cài đặt sẵn vật liệu bề mặt phù hợp.",
|
||||
"No matching appearances": "Không có màu sắc/vật liệu phù hợp",
|
||||
"No visible bodies to export.": "Không có thân khối hiển thị nào để xuất.",
|
||||
"No visible bodies or sketches to export.": "Không có thân khối hoặc phác thảo hiển thị nào để xuất.",
|
||||
"None": "Không có",
|
||||
"Not available yet": "Chưa khả dụng",
|
||||
"Notch": "Rãnh khía chữ V",
|
||||
@@ -831,7 +832,7 @@
|
||||
"dxf.progress.projection": "Đang chiếu hình học (3/5)",
|
||||
"dxf.progress.write": "Đang ghi tệp DXF (5/5)",
|
||||
"dxf.tolerance": "Dung sai đường cong",
|
||||
"dxf.tolerance_help": "Chỉ áp dụng cho các thân khối hiển thị. Đường cong sử dụng các đoạn thẳng. Dung sai nhỏ hơn cho đường cong mịn hơn nhưng tốn nhiều thời gian và bộ nhớ hơn.",
|
||||
"dxf.tolerance_help": "Chỉ áp dụng cho các thân khối và phác thảo hiển thị. Đường cong sử dụng các đoạn thẳng. Dung sai nhỏ hơn cho đường cong mịn hơn nhưng tốn nhiều thời gian và bộ nhớ hơn.",
|
||||
"file_load.built": "Đã dựng được: {built} trên {total} tính năng.",
|
||||
"file_load.converting": "Đang chuyển đổi khối đặc {done} trên {total}",
|
||||
"file_load.inserting": "Đang chèn hình học",
|
||||
@@ -856,19 +857,57 @@
|
||||
"help.mit": "Giấy phép MIT",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "Giấy phép của bên thứ ba",
|
||||
"home.back": "Quay lại {name}",
|
||||
"home.crashes": "Báo cáo sự cố",
|
||||
"home.design_workspace": "Thiết kế",
|
||||
"home.documentation": "Tài liệu hướng dẫn",
|
||||
"home.export": "Xuất",
|
||||
"home.export_hint": "Chọn định dạng cho thiết kế hiện tại.",
|
||||
"home.export_json_hint": "Thiết kế có thể chỉnh sửa và lịch sử lệnh",
|
||||
"home.export_mesh_hint": "Lưới để in hoặc chia sẻ",
|
||||
"home.export_step_hint": "Hình học khối chính xác",
|
||||
"home.import": "Nhập…",
|
||||
"home.import_hint": "Nhập STEP, IGES hoặc lưới vào thiết kế mới",
|
||||
"home.in_this_browser": "trong trình duyệt này",
|
||||
"home.missing": "thiếu",
|
||||
"home.month_01": "thg 1",
|
||||
"home.month_02": "thg 2",
|
||||
"home.month_03": "thg 3",
|
||||
"home.month_04": "thg 4",
|
||||
"home.month_05": "thg 5",
|
||||
"home.month_06": "thg 6",
|
||||
"home.month_07": "thg 7",
|
||||
"home.month_08": "thg 8",
|
||||
"home.month_09": "thg 9",
|
||||
"home.month_10": "thg 10",
|
||||
"home.month_11": "thg 11",
|
||||
"home.month_12": "thg 12",
|
||||
"home.new_inches": "Thiết kế mới theo inch",
|
||||
"home.new_inches_hint": "Inch · mở trong Thiết kế",
|
||||
"home.new_mm": "Thiết kế mới",
|
||||
"home.new_mm_hint": "Milimét · mở trong Thiết kế",
|
||||
"home.open": "Mở…",
|
||||
"home.opened_days_ago": "Đã mở {count} ngày trước",
|
||||
"home.opened_hours_ago": "Đã mở {count} giờ trước",
|
||||
"home.opened_just_now": "Vừa mới mở",
|
||||
"home.opened_minutes_ago": "Đã mở {count} phút trước",
|
||||
"home.open_hint": "Một thiết kế .solidcraft ({shortcut})",
|
||||
"home.open_now": "Mở ngay",
|
||||
"home.opened_days_ago": "{count} ngày trước",
|
||||
"home.opened_hours_ago": "{count} giờ trước",
|
||||
"home.opened_just_now": "Vừa xong",
|
||||
"home.opened_minutes_ago": "{count} phút trước",
|
||||
"home.opening": "đang mở…",
|
||||
"home.properties": "Thuộc tính thiết kế",
|
||||
"home.recent": "Gần đây",
|
||||
"home.recent_empty": "Các thiết kế bạn mở hoặc lưu sẽ xuất hiện ở đây.",
|
||||
"home.recovery_count": "Thiết kế có thể khôi phục: {count}",
|
||||
"home.recovery_empty": "Không có thiết kế nào có thể khôi phục.",
|
||||
"home.recovery_hint": "SolidCraft đã đóng trước khi các thiết kế này được lưu.",
|
||||
"home.report_issue": "Báo cáo sự cố",
|
||||
"home.samples": "Mẫu thiết kế",
|
||||
"home.settings": "Cài đặt",
|
||||
"home.short_date": "{day} {month}",
|
||||
"home.shortcuts": "Phím tắt",
|
||||
"home.start_hint": "Tạo thiết kế, mở tệp gần đây hoặc khám phá mẫu.",
|
||||
"home.whats_new": "Có gì mới",
|
||||
"home.yesterday": "Hôm qua",
|
||||
"install.button_tip": "Cài đặt SolidCraft dưới dạng ứng dụng: mở trong cửa sổ riêng và hoạt động ngoại tuyến",
|
||||
"install.dock_1": "Chọn Tệp › Thêm vào Dock.",
|
||||
"install.dock_2": "Nhấp vào Thêm.",
|
||||
@@ -1021,7 +1060,7 @@
|
||||
"search.try": "Nhập tên lệnh, một tính năng trong thiết kế này hoặc một tham số. Để chạy lệnh kèm giá trị, hãy nhập mã lệnh và một đối tượng JSON: {example}",
|
||||
"search.valid": "Hợp lệ",
|
||||
"settings.display_quality_note": "Mức độ chi tiết cao hơn giúp hiển thị các mặt cong và cạnh mượt mà hơn nhưng tốn nhiều thời gian tạo lưới hơn. Thiết lập này chỉ thay đổi vùng nhìn, không ảnh hưởng đến thiết kế hay dữ liệu xuất tệp.",
|
||||
"settings.frame_rate_note": "Hiển thị số khung hình trên giây (FPS) ở góc dưới bên phải khung nhìn. Khi bật, khung nhìn sẽ vẽ lại liên tục.",
|
||||
"settings.frame_rate_note": "Hiển thị số khung hình trên giây (FPS) ở góc dưới bên phải khung nhìn.",
|
||||
"settings.measure_axis_distances": "Hiển thị khoảng cách theo trục X/Y/Z",
|
||||
"settings.measure_axis_distances_help": "Hiển thị kích thước thành phần theo các trục tọa độ cùng với khoảng cách tổng thể khi mở công cụ Đo lường.",
|
||||
"settings.msaa_applies_on_restart": "Khử răng cưa sẽ áp dụng vào lần khởi động tiếp theo của SolidCraft",
|
||||
@@ -1092,6 +1131,7 @@
|
||||
"ui.agent_chat_add": "Đính kèm tệp",
|
||||
"ui.agent_chat_add_file": "Chọn một tệp…",
|
||||
"ui.agent_chat_allow": "Cho phép",
|
||||
"ui.agent_chat_allow_once": "Cho phép một lần",
|
||||
"ui.agent_chat_allowed": "Đã cho phép",
|
||||
"ui.agent_chat_answered": "Câu trả lời: {option}",
|
||||
"ui.agent_chat_approval": "Cho phép AI thực hiện thao tác này?",
|
||||
@@ -1143,12 +1183,16 @@
|
||||
"ui.agent_chat_files_left_out": "Tối đa {max} tệp đính kèm trong một tin nhắn; đã bỏ qua: {files}",
|
||||
"ui.agent_chat_files_loading": "Đang chờ đọc các tệp đính kèm",
|
||||
"ui.agent_chat_files_max": "Tối đa {max} tệp trong một tin nhắn",
|
||||
"ui.agent_chat_flatpak_none_found": "Không tìm thấy tác tử lập trình nào. Theo mặc định, hộp cát Flatpak không thấy các tác tử được cài trong thư mục nhà của bạn và không có quyền truy cập mạng. Để cho phép Claude Code và bộ điều hợp ACP của nó được cài qua nvm hoặc trong ~/.local/bin, hãy chạy lệnh này trong terminal, rồi khởi động lại SolidCraft. Lệnh cấp quyền truy cập các chương trình và tệp đăng nhập được liệt kê, cùng quyền truy cập mạng:",
|
||||
"ui.agent_chat_import_failed": "{name}: nhập tệp thất bại: {error}",
|
||||
"ui.agent_chat_intro": "Trò chuyện với tác tử lập trình (AI agent) bạn đang dùng hoặc một điểm cuối mô hình bạn chọn. AI thao tác trên thiết kế đang mở thông qua các công cụ của SolidCraft: các thay đổi hiển thị ngay khi thực hiện và có thể hoàn tác theo từng bước cho mỗi tin nhắn. Các thao tác AI được phép thực hiện mà không cần hỏi được đặt trong Tùy chọn cài đặt > AI.",
|
||||
"ui.agent_chat_key_in_env": "đã đặt khóa",
|
||||
"ui.agent_chat_left": "Trái",
|
||||
"ui.agent_chat_limit": "AI Agent đã đạt giới hạn {limit} thay đổi cho một tin nhắn. Hãy gửi tin nhắn tiếp theo để tiếp tục.",
|
||||
"ui.agent_chat_minimize": "Thu nhỏ thành thanh công cụ",
|
||||
"ui.agent_chat_mode_all": "Tất cả",
|
||||
"ui.agent_chat_mode_ask": "Hỏi",
|
||||
"ui.agent_chat_mode_edits": "Chỉnh sửa",
|
||||
"ui.agent_chat_model_tip": "Mô hình AI đang sử dụng. Lựa chọn của bạn sẽ được ghi nhớ cho Agent này.",
|
||||
"ui.agent_chat_new": "Cuộc trò chuyện mới",
|
||||
"ui.agent_chat_new_confirm": "Bắt đầu cuộc trò chuyện mới? Cuộc trò chuyện hiện tại sẽ bị xóa.",
|
||||
@@ -1161,6 +1205,7 @@
|
||||
"ui.agent_chat_none_found_short": "Không tìm thấy tác tử nào",
|
||||
"ui.agent_chat_not_installed": "Chưa cài đặt",
|
||||
"ui.agent_chat_not_signed_in": "chưa đăng nhập",
|
||||
"ui.agent_chat_open_settings": "Mở tùy chọn cài đặt",
|
||||
"ui.agent_chat_own_window": "Cửa sổ riêng",
|
||||
"ui.agent_chat_paste_picture": "Dán hình ảnh",
|
||||
"ui.agent_chat_permission": "AI Agent yêu cầu thực thi: {title}",
|
||||
@@ -1185,6 +1230,8 @@
|
||||
"ui.agent_chat_send": "Gửi",
|
||||
"ui.agent_chat_send_now": "Gửi ngay",
|
||||
"ui.agent_chat_send_now_tip": "Dừng bước hiện tại của tác tử và gửi tin nhắn này ngay (Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft giao tiếp với một tác nhân lập trình được cài đặt trên máy tính này. Chọn một tác nhân trong Tùy chọn cài đặt › AI.",
|
||||
"ui.agent_chat_setup_title": "Thiết lập trợ lý",
|
||||
"ui.agent_chat_side": "Vị trí bảng trò chuyện AI",
|
||||
"ui.agent_chat_signed_in": "đã đăng nhập",
|
||||
"ui.agent_chat_state_auth": "Cần đăng nhập",
|
||||
@@ -1201,6 +1248,7 @@
|
||||
"ui.agent_chat_undo_label": "Trò chuyện AI: {message}",
|
||||
"ui.agent_chat_undone": "(hoàn tácne)",
|
||||
"ui.agent_chat_view_attached": "Đã đính kèm góc nhìn",
|
||||
"ui.agent_chat_waiting": "Đang chờ bạn",
|
||||
"ui.agent_cursor": "Con trỏ AI",
|
||||
"ui.agent_cursor_speed": "Tốc độ con trỏ AI",
|
||||
"ui.ai_add": "Thêm",
|
||||
@@ -1455,6 +1503,7 @@
|
||||
"ui.grid_follows_view_hint": "Các góc nhìn cạnh hiển thị lưới trên mặt phẳng thẳng đứng hướng về phía camera thay vì trên mặt sàn",
|
||||
"ui.ground_shadow": "Bóng đổ mặt sàn",
|
||||
"ui.groupSelected": "Gộp nhóm vùng chọn",
|
||||
"ui.hatch": "Gạch mặt cắt",
|
||||
"ui.heading_add_ins": "TIỆN ÍCH MỞ RỘNG",
|
||||
"ui.heading_assemble": "LẮP RÁP",
|
||||
"ui.heading_box": "KHỐI HỘP",
|
||||
@@ -1528,6 +1577,11 @@
|
||||
"ui.hideOrigin": "Ẩn Gốc tọa độ",
|
||||
"ui.hidePlanes": "Ẩn các mặt phẳng",
|
||||
"ui.hideProfile": "Ẩn biên dạng",
|
||||
"ui.history_back": "Lùi một bước",
|
||||
"ui.history_below_browser": "Bên dưới trình duyệt",
|
||||
"ui.history_first": "Về đầu",
|
||||
"ui.history_forward": "Tiến một bước",
|
||||
"ui.history_last": "Đến cuối",
|
||||
"ui.history_title": "Lịch sử",
|
||||
"ui.hole": "Tạo lỗ",
|
||||
"ui.hole_tap_type": "Kiểu ta-rô ren lỗ",
|
||||
@@ -1545,6 +1599,8 @@
|
||||
"ui.joints": "Các khớp nối",
|
||||
"ui.keyboard_shortcuts": "Phím tắt bàn phím",
|
||||
"ui.language": "Ngôn ngữ (Language)",
|
||||
"ui.layout_compact": "Gọn",
|
||||
"ui.layout_floating": "Nổi",
|
||||
"ui.length_decimals": "Số chữ số thập phân cho chiều dài",
|
||||
"ui.light": "Sáng",
|
||||
"ui.line": "Đoạn thẳng",
|
||||
@@ -1682,6 +1738,7 @@
|
||||
"ui.reverse_zoom_direction": "Đảo chiều thu phóng",
|
||||
"ui.revolve": "Xoay tròn tạo khối",
|
||||
"ui.ribbon_exit": "Thoát",
|
||||
"ui.ribbon_labels": "Hiển thị văn bản bên dưới biểu tượng dải băng",
|
||||
"ui.ribbon_pin_footer": "Các lệnh đã ghim hiển thị trên ruy-băng. Rê chuột lên một hàng để ghim hoặc bỏ ghim.",
|
||||
"ui.ribbon_workspace": "Không gian làm việc",
|
||||
"ui.right": "Phải (Hình chiếu cạnh)",
|
||||
@@ -1836,6 +1893,7 @@
|
||||
"ui.workspace_design_tabs": "Mô hình · Bề mặt · Lắp ráp · Chèn · Kiểm tra · Quản lý · Xem",
|
||||
"ui.workspace_drawing_description": "Bản vẽ 2D với các hình chiếu, kích thước và khung tên",
|
||||
"ui.workspace_footer": "Mọi không gian làm việc đều dùng chung một thiết kế, lịch sử và vùng chọn; chỉ các thẻ ruy-băng thay đổi. Bộ chuyển đổi bị khóa khi đang chỉnh sửa phác thảo hoặc tính năng.",
|
||||
"ui.workspace_layout": "Bố cục không gian làm việc",
|
||||
"ui.workspace_manufacture_description": "Cắt lớp, đường chạy dao và thiết lập",
|
||||
"ui.workspace_planned": "Dự kiến",
|
||||
"ui.workspace_render_description": "Xem trước sản phẩm, cài đặt cảnh và hình ảnh kết xuất",
|
||||
|
||||
@@ -167,6 +167,7 @@
|
||||
"HISTORY": "歷程記錄",
|
||||
"Height": "高度",
|
||||
"Hidden edges": "隱藏線",
|
||||
"History layout": "歷程配置",
|
||||
"Holes": "孔",
|
||||
"Holes (edges on them)": "孔(孔上的邊)",
|
||||
"Home view": "主檢視",
|
||||
@@ -232,7 +233,6 @@
|
||||
"No crash reports.": "沒有當機報告。",
|
||||
"No matching appearance presets.": "沒有符合的外觀預設。",
|
||||
"No matching appearances": "沒有符合的外觀",
|
||||
"No visible bodies to export.": "沒有可匯出的可見實體。",
|
||||
"None": "無",
|
||||
"Not available yet": "暫不可用",
|
||||
"Notch": "缺口",
|
||||
@@ -856,19 +856,57 @@
|
||||
"help.mit": "MIT 授權",
|
||||
"help.notice": "NOTICE",
|
||||
"help.third_party": "第三方授權",
|
||||
"home.back": "返回 {name}",
|
||||
"home.crashes": "當機報告",
|
||||
"home.design_workspace": "設計",
|
||||
"home.documentation": "文件",
|
||||
"home.export": "匯出",
|
||||
"home.export_hint": "選擇目前設計的格式。",
|
||||
"home.export_json_hint": "可編輯的設計與命令歷程",
|
||||
"home.export_mesh_hint": "用於列印或分享的網格",
|
||||
"home.export_step_hint": "精確的實體幾何",
|
||||
"home.import": "匯入…",
|
||||
"home.import_hint": "將 STEP、IGES 或網格匯入新設計",
|
||||
"home.in_this_browser": "在此瀏覽器中",
|
||||
"home.missing": "找不到檔案",
|
||||
"home.month_01": "1月",
|
||||
"home.month_02": "2月",
|
||||
"home.month_03": "3月",
|
||||
"home.month_04": "4月",
|
||||
"home.month_05": "5月",
|
||||
"home.month_06": "6月",
|
||||
"home.month_07": "7月",
|
||||
"home.month_08": "8月",
|
||||
"home.month_09": "9月",
|
||||
"home.month_10": "10月",
|
||||
"home.month_11": "11月",
|
||||
"home.month_12": "12月",
|
||||
"home.new_inches": "新增設計(英吋)",
|
||||
"home.new_inches_hint": "英吋 · 在設計工作區中開啟",
|
||||
"home.new_mm": "新增設計",
|
||||
"home.new_mm_hint": "公釐 · 在設計工作區中開啟",
|
||||
"home.open": "開啟…",
|
||||
"home.opened_days_ago": "{count} 天前開啟",
|
||||
"home.opened_hours_ago": "{count} 小時前開啟",
|
||||
"home.opened_just_now": "剛剛開啟",
|
||||
"home.opened_minutes_ago": "{count} 分鐘前開啟",
|
||||
"home.open_hint": ".solidcraft 設計檔案 ({shortcut})",
|
||||
"home.open_now": "目前開啟中",
|
||||
"home.opened_days_ago": "{count} 天前",
|
||||
"home.opened_hours_ago": "{count} 小時前",
|
||||
"home.opened_just_now": "剛剛",
|
||||
"home.opened_minutes_ago": "{count} 分鐘前",
|
||||
"home.opening": "正在開啟…",
|
||||
"home.properties": "設計屬性",
|
||||
"home.recent": "最近使用",
|
||||
"home.recent_empty": "您開啟或儲存的設計會顯示於此。",
|
||||
"home.recovery_count": "可復原的設計:{count} 個",
|
||||
"home.recovery_empty": "沒有可復原的設計。",
|
||||
"home.recovery_hint": "SolidCraft 在這些設計儲存前已關閉。",
|
||||
"home.report_issue": "回報問題",
|
||||
"home.samples": "範例",
|
||||
"home.settings": "設定",
|
||||
"home.short_date": "{month}{day}日",
|
||||
"home.shortcuts": "鍵盤快速鍵",
|
||||
"home.start_hint": "建立設計、開啟最近使用的檔案,或瀏覽範例。",
|
||||
"home.whats_new": "新功能",
|
||||
"home.yesterday": "昨天",
|
||||
"install.button_tip": "將 SolidCraft 安裝為應用程式:在獨立視窗中開啟,離線也能使用",
|
||||
"install.dock_1": "選擇「檔案」›「加入 Dock」。",
|
||||
"install.dock_2": "按一下「加入」。",
|
||||
@@ -1021,7 +1059,7 @@
|
||||
"search.try": "輸入命令名稱、此設計中的特徵或參數。要帶值執行命令,請輸入其ID和JSON物件:{example}",
|
||||
"search.valid": "有效",
|
||||
"settings.display_quality_note": "等級越精細,曲面和邊顯示越平滑,但網格化耗時更長。只影響檢視區,不影響設計或匯出。",
|
||||
"settings.frame_rate_note": "在檢視右下角顯示每秒影格數。開啟時檢視會持續重繪。",
|
||||
"settings.frame_rate_note": "在檢視右下角顯示每秒影格數。",
|
||||
"settings.measure_axis_distances": "顯示 X/Y/Z 距離",
|
||||
"settings.measure_axis_distances_help": "開啟測量時,在總距離之外顯示沿世界座標軸方向的分量尺寸。",
|
||||
"settings.msaa_applies_on_restart": "抗鋸齒將在下次啟動 SolidCraft 時生效",
|
||||
@@ -1092,6 +1130,7 @@
|
||||
"ui.agent_chat_add": "附加檔案",
|
||||
"ui.agent_chat_add_file": "選擇檔案…",
|
||||
"ui.agent_chat_allow": "允許",
|
||||
"ui.agent_chat_allow_once": "僅允許一次",
|
||||
"ui.agent_chat_allowed": "已允許",
|
||||
"ui.agent_chat_answered": "回答:{option}",
|
||||
"ui.agent_chat_approval": "允許代理執行此操作嗎?",
|
||||
@@ -1143,12 +1182,16 @@
|
||||
"ui.agent_chat_files_left_out": "一條訊息最多傳送 {max} 個檔案;未傳送:{files}",
|
||||
"ui.agent_chat_files_loading": "正在等待檔案讀取完成",
|
||||
"ui.agent_chat_files_max": "一條訊息最多附加 {max} 個檔案",
|
||||
"ui.agent_chat_flatpak_none_found": "未找到程式設計代理。預設情況下,Flatpak 沙箱無法存取主資料夾中安裝的代理,也無法存取網路。若要允許透過 nvm 或在 ~/.local/bin 中安裝的 Claude Code 及其 ACP 轉接器,請在終端機執行以下命令,然後重新啟動 SolidCraft。此命令會授予對所列程式和登入檔案的存取權限,以及網路存取權限:",
|
||||
"ui.agent_chat_import_failed": "{name}:匯入失敗:{error}",
|
||||
"ui.agent_chat_intro": "與您已在使用的程式設計代理或您選擇的模型端點聊天。它透過 SolidCraft 的工具處理開啟的設計:變更即時顯示,每條訊息的變更可一步復原。無需詢問即可執行的範圍在「偏好設定 > AI」中設定。",
|
||||
"ui.agent_chat_key_in_env": "已設定金鑰",
|
||||
"ui.agent_chat_left": "左側",
|
||||
"ui.agent_chat_limit": "代理已達到每條訊息 {limit} 項變更的上限。再傳送一條訊息可讓它繼續。",
|
||||
"ui.agent_chat_minimize": "最小化為細條",
|
||||
"ui.agent_chat_mode_all": "全部",
|
||||
"ui.agent_chat_mode_ask": "詢問",
|
||||
"ui.agent_chat_mode_edits": "編輯",
|
||||
"ui.agent_chat_model_tip": "代理使用的模型。您的選擇會為此代理記住。",
|
||||
"ui.agent_chat_new": "新對話",
|
||||
"ui.agent_chat_new_confirm": "開始新對話?目前對話將被清除。",
|
||||
@@ -1161,6 +1204,7 @@
|
||||
"ui.agent_chat_none_found_short": "未找到代理",
|
||||
"ui.agent_chat_not_installed": "未安裝",
|
||||
"ui.agent_chat_not_signed_in": "未登入",
|
||||
"ui.agent_chat_open_settings": "開啟偏好設定",
|
||||
"ui.agent_chat_own_window": "獨立視窗",
|
||||
"ui.agent_chat_paste_picture": "貼上圖片",
|
||||
"ui.agent_chat_permission": "代理請求執行:{title}",
|
||||
@@ -1185,6 +1229,8 @@
|
||||
"ui.agent_chat_send": "傳送",
|
||||
"ui.agent_chat_send_now": "立即傳送",
|
||||
"ui.agent_chat_send_now_tip": "停止代理目前的步驟,並接著傳送這條訊息(Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft 會與安裝在這部電腦上的程式設計代理程式通訊。請在「偏好設定 › AI」中選擇一個。",
|
||||
"ui.agent_chat_setup_title": "設定助理",
|
||||
"ui.agent_chat_side": "代理聊天位置",
|
||||
"ui.agent_chat_signed_in": "已登入",
|
||||
"ui.agent_chat_state_auth": "需要登入",
|
||||
@@ -1201,6 +1247,7 @@
|
||||
"ui.agent_chat_undo_label": "代理聊天:{message}",
|
||||
"ui.agent_chat_undone": "(已復原)",
|
||||
"ui.agent_chat_view_attached": "已附加檢視",
|
||||
"ui.agent_chat_waiting": "等待您的回應",
|
||||
"ui.agent_cursor": "代理游標",
|
||||
"ui.agent_cursor_speed": "代理游標速度",
|
||||
"ui.ai_add": "新增",
|
||||
@@ -1455,6 +1502,7 @@
|
||||
"ui.grid_follows_view_hint": "在側檢視中,將網格顯示在朝向該檢視的豎直平面上,而不是地面上",
|
||||
"ui.ground_shadow": "地面陰影",
|
||||
"ui.groupSelected": "群組所選",
|
||||
"ui.hatch": "剖面線",
|
||||
"ui.heading_add_ins": "增益集",
|
||||
"ui.heading_assemble": "組裝",
|
||||
"ui.heading_box": "長方體",
|
||||
@@ -1528,6 +1576,11 @@
|
||||
"ui.hideOrigin": "隱藏原點",
|
||||
"ui.hidePlanes": "隱藏平面",
|
||||
"ui.hideProfile": "隱藏輪廓",
|
||||
"ui.history_back": "後退一步",
|
||||
"ui.history_below_browser": "瀏覽器下方",
|
||||
"ui.history_first": "移至開頭",
|
||||
"ui.history_forward": "前進一步",
|
||||
"ui.history_last": "移至結尾",
|
||||
"ui.history_title": "歷程記錄",
|
||||
"ui.hole": "孔",
|
||||
"ui.hole_tap_type": "攻牙類型",
|
||||
@@ -1545,6 +1598,8 @@
|
||||
"ui.joints": "接頭",
|
||||
"ui.keyboard_shortcuts": "鍵盤快捷鍵",
|
||||
"ui.language": "語言",
|
||||
"ui.layout_compact": "精簡",
|
||||
"ui.layout_floating": "浮動",
|
||||
"ui.length_decimals": "長度小數位數",
|
||||
"ui.light": "淺色",
|
||||
"ui.line": "直線",
|
||||
@@ -1682,6 +1737,7 @@
|
||||
"ui.reverse_zoom_direction": "反轉縮放方向",
|
||||
"ui.revolve": "旋轉",
|
||||
"ui.ribbon_exit": "結束",
|
||||
"ui.ribbon_labels": "顯示功能區圖示下的文字",
|
||||
"ui.ribbon_pin_footer": "固定的命令會顯示在功能區中。將指標停留在某列上即可固定或取消固定。",
|
||||
"ui.ribbon_workspace": "工作區",
|
||||
"ui.right": "右視",
|
||||
@@ -1836,6 +1892,7 @@
|
||||
"ui.workspace_design_tabs": "模型 · 曲面 · 組裝 · 插入 · 檢查 · 管理 · 檢視",
|
||||
"ui.workspace_drawing_description": "含檢視、尺寸和標題欄的 2D 工程圖",
|
||||
"ui.workspace_footer": "所有工作區使用同一設計、歷程記錄和選擇,僅功能區索引標籤會變化。編輯草圖或特徵時,切換器將被鎖定。",
|
||||
"ui.workspace_layout": "工作區配置",
|
||||
"ui.workspace_manufacture_description": "切片、刀具路徑和設定",
|
||||
"ui.workspace_planned": "規劃中",
|
||||
"ui.workspace_render_description": "產品預覽、場景設定和彩現影像",
|
||||
|
||||
@@ -14,11 +14,15 @@
|
||||
"Active": "活动",
|
||||
"Active rule": "活动规则",
|
||||
"Add": "添加",
|
||||
"Add Column": "添加列",
|
||||
"Add Key": "添加按键",
|
||||
"Add Mid Radius": "添加中间半径",
|
||||
"Add Row": "添加行",
|
||||
"Add a tool": "添加工具",
|
||||
"Add condition": "添加条件",
|
||||
"Add or edit rule": "添加或编辑规则",
|
||||
"Add to New Folder": "添加到新文件夹",
|
||||
"Advanced": "高级",
|
||||
"Against": "对照",
|
||||
"Alignment": "对齐",
|
||||
"All Sketch Points": "所有草图点",
|
||||
@@ -28,9 +32,11 @@
|
||||
"Also deletes": "同时删除",
|
||||
"Angle 2": "角度 2",
|
||||
"Animate": "动画",
|
||||
"App/system information and command settings are included. Review private details before sharing.": "报告包含应用和系统信息以及命令设置。共享前请检查私人信息。",
|
||||
"Appearance name": "外观名称",
|
||||
"Applied Radius": "应用半径",
|
||||
"Apply To": "应用于",
|
||||
"Apply library appearance": "应用库外观",
|
||||
"Apply to selection": "应用到选择",
|
||||
"Apply your appearance first. Exports assigned appearances and materials created in this design.": "请先应用外观。导出已指定的外观和在此设计中创建的材质。",
|
||||
"Arc length": "弧长",
|
||||
@@ -41,13 +47,18 @@
|
||||
"BLEND SURFACE": "混合曲面",
|
||||
"BOUNDARY SURFACE": "边界曲面",
|
||||
"BROWSER": "浏览器",
|
||||
"Bend Edges": "折弯边",
|
||||
"Bend Line Position": "弯折线位置",
|
||||
"Bend Position": "折弯位置",
|
||||
"Bend Radius": "折弯半径",
|
||||
"Bend Table": "折弯表",
|
||||
"Bends": "折弯",
|
||||
"Bodies": "实体",
|
||||
"Bodies (optional)": "实体(可选)",
|
||||
"Body": "实体",
|
||||
"Body (last if none)": "实体(未指定时为最后一个)",
|
||||
"Body to split": "要分割的实体",
|
||||
"Body, or faces to take out": "实体,或要移除的面",
|
||||
"Boundary": "边界",
|
||||
"Bounding box": "边界框",
|
||||
"CHECK": "检查",
|
||||
@@ -59,7 +70,9 @@
|
||||
"CSV or JSON: updates existing parameters, adds new ones": "CSV 或 JSON:更新现有参数、添加新参数",
|
||||
"Capture All Positions": "捕获所有位置",
|
||||
"Capture Pos.": "捕获位置",
|
||||
"Catch Depth": "卡扣深度",
|
||||
"Catch Direction": "卡扣方向",
|
||||
"Catch Length": "卡扣长度",
|
||||
"Cells": "区域",
|
||||
"Center X": "中心 X",
|
||||
"Center Y": "中心 Y",
|
||||
@@ -68,22 +81,30 @@
|
||||
"Chamfer Type": "倒角类型",
|
||||
"Check collisions": "检查碰撞",
|
||||
"Checked": "已检查",
|
||||
"Choose Variable radius or Spline in Type.": "请在“类型”中选择 Variable radius 或样条曲线。",
|
||||
"Choose a new plane. Sketch geometry and dimensions stay unchanged in its two-dimensional coordinates.": "选择一个新平面。草图几何和尺寸在其二维坐标中保持不变。",
|
||||
"Choose…": "选择…",
|
||||
"Circular": "圆周",
|
||||
"Circumference": "周长",
|
||||
"Close draft": "关闭草稿",
|
||||
"Collapse": "折叠",
|
||||
"Collisions": "碰撞",
|
||||
"Colour": "颜色",
|
||||
"Command": "命令",
|
||||
"Comment": "注释",
|
||||
"Component 1": "组件 1",
|
||||
"Component 2": "组件 2",
|
||||
"Component1": "组件1",
|
||||
"Components": "组件",
|
||||
"Config Table": "配置表",
|
||||
"Configuration": "配置",
|
||||
"Configuration rules": "配置规则",
|
||||
"Contact": "接触",
|
||||
"Contact Sets": "接触集",
|
||||
"Contact sets": "接触集",
|
||||
"Continue on GitHub": "在GitHub中继续",
|
||||
"Continuity": "连续性",
|
||||
"Control Radius": "控制半径",
|
||||
"Copy Error Message": "复制错误消息",
|
||||
"Copy Warning Message": "复制警告消息",
|
||||
"Copy all licences": "复制所有许可证",
|
||||
@@ -93,8 +114,11 @@
|
||||
"Corner Relief": "拐角释放",
|
||||
"Corner Relief Shape": "拐角释放形状",
|
||||
"Counterbore depth": "沉孔深度",
|
||||
"Counterbore Ø": "柱形沉孔 Ø",
|
||||
"Countersink angle": "沉头角度",
|
||||
"Countersink Ø": "锥形沉孔 Ø",
|
||||
"Create Issue — review draft": "创建 Issue——审阅草稿",
|
||||
"Create Issue…": "创建 Issue…",
|
||||
"Cross curves": "交叉曲线",
|
||||
"Cube": "立方体",
|
||||
"Current orthographic view (1:1 mm)": "当前正交视图(1:1毫米)",
|
||||
@@ -102,18 +126,28 @@
|
||||
"Curv. Comb": "曲率梳",
|
||||
"Curvature (G2)": "曲率 (G2)",
|
||||
"Curvature change (G3)": "曲率变化 (G3)",
|
||||
"Custom": "自定义",
|
||||
"Customize Toolbar": "自定义工具栏",
|
||||
"Customize…": "自定义…",
|
||||
"Cylindrical face": "圆柱面",
|
||||
"Delete": "删除",
|
||||
"Delete Selected Features…": "删除所选特征…",
|
||||
"Delete Selected Folders": "删除所选文件夹",
|
||||
"Delete all": "全部删除",
|
||||
"Delete rule": "删除规则",
|
||||
"Delete the row": "删除此行",
|
||||
"Delete the set": "删除此集合",
|
||||
"Density": "密度",
|
||||
"Dependents": "依赖项",
|
||||
"Describe the problem you saw": "请描述您遇到的问题",
|
||||
"Describe what happened before continuing.": "继续之前,请描述发生了什么。",
|
||||
"Designs you open or save appear here.": "你打开或保存的设计会显示在此处。",
|
||||
"Determined by To Object. Choose Angle to edit the angular extent.": "由“到对象”确定。选择“角度”可编辑角度范围。",
|
||||
"Diameter": "直径",
|
||||
"Direction": "方向",
|
||||
"Discard": "放弃",
|
||||
"Distance": "距离",
|
||||
"Distance 1": "距离 1",
|
||||
"Do not export hidden edges": "不导出隐藏线",
|
||||
"Don't ask again": "不再询问",
|
||||
"Double-click to rename": "双击重命名",
|
||||
@@ -125,48 +159,65 @@
|
||||
"Edit Profile Sketch": "编辑轮廓草图",
|
||||
"Enable rule": "启用规则",
|
||||
"Enabled": "已启用",
|
||||
"End Radius": "结束半径",
|
||||
"End bulge": "终止鼓度",
|
||||
"End continuity": "终止连续性",
|
||||
"Expand": "展开",
|
||||
"Expected result (optional)": "预期结果(可选)",
|
||||
"Explode": "爆炸",
|
||||
"Explode Text": "分解文字",
|
||||
"Export Animation…": "导出动画…",
|
||||
"Export Bend Table…": "导出折弯表…",
|
||||
"Export CSV…": "导出 CSV…",
|
||||
"Export Current View as DXF": "将当前视图导出为DXF",
|
||||
"Export Current View as DXF…": "将当前视图导出为DXF…",
|
||||
"Export DXF": "导出DXF",
|
||||
"Export DXF…": "导出DXF…",
|
||||
"Export JSON…": "导出 JSON…",
|
||||
"Export design library...": "导出设计库...",
|
||||
"Export hidden edges as dashed lines": "以虚线导出隐藏线",
|
||||
"Exported by SolidWorks, which usually saves Y up": "由 SolidWorks 导出,通常以 Y 轴向上保存",
|
||||
"Expression": "表达式",
|
||||
"Extend to meet": "延伸至相交",
|
||||
"Extents": "范围",
|
||||
"FILES": "文件",
|
||||
"FLAT": "展开",
|
||||
"Face": "面",
|
||||
"Face Appearance": "面外观",
|
||||
"Face attachment lost": "面附着丢失",
|
||||
"Faces": "面",
|
||||
"Faces / edges / vertices": "面 / 边 / 顶点",
|
||||
"Faces to split": "要分割的面",
|
||||
"Fastener": "紧固件",
|
||||
"Favorites": "收藏",
|
||||
"Favourite": "收藏",
|
||||
"Feature": "特征",
|
||||
"Files from many CAD programs have Y up, so they open lying on their back here (Z up).": "许多 CAD 程序的文件以 Y 为上轴,因此在此处打开时会平躺(Z 朝上)。",
|
||||
"Filter": "筛选",
|
||||
"Filter…": "筛选…",
|
||||
"Find in Browser": "在浏览器中查找",
|
||||
"Finish": "完成",
|
||||
"First plane": "第一个平面",
|
||||
"Fit and G2 corners require Constant radius.": "拟合和 G2 拐角需要 Constant radius。",
|
||||
"Fixed Face": "固定面",
|
||||
"Flat Pattern": "展开图",
|
||||
"Flat size": "平板尺寸",
|
||||
"Follow camera (Look At sketches)": "跟随相机(注视草图)",
|
||||
"Follow the camera (Look At sketches)": "跟随相机(注视草图)",
|
||||
"Font": "字体",
|
||||
"From": "起点",
|
||||
"From Bodies": "从实体创建",
|
||||
"From edges": "起始边",
|
||||
"Full Length": "全长",
|
||||
"G2 corners require a constant radius and Exact fit. G2 corner construction is not supported yet.": "G2 拐角需要恒定半径和 Exact fit。尚不支持构建 G2 拐角。",
|
||||
"Gap": "间隙",
|
||||
"Grid": "网格",
|
||||
"HISTORY": "历史",
|
||||
"Height": "高度",
|
||||
"Hidden edges": "隐藏线",
|
||||
"History layout": "历史布局",
|
||||
"History names": "历史名称",
|
||||
"Hole (optional)": "孔(可选)",
|
||||
"Holes": "孔",
|
||||
"Holes (edges on them)": "孔(孔上的边)",
|
||||
"Home view": "主视图",
|
||||
@@ -177,14 +228,20 @@
|
||||
"In place (surfaces)": "原位(曲面)",
|
||||
"In plane": "在平面内",
|
||||
"Inside": "内侧",
|
||||
"Instant": "即时",
|
||||
"Interface font": "界面字体",
|
||||
"Interferes": "发生干涉",
|
||||
"Invert": "反转",
|
||||
"Isocurve": "等参线",
|
||||
"Issue title": "Issue 标题",
|
||||
"Items": "项目",
|
||||
"JOINTS": "关节",
|
||||
"Joint Origin1": "接头原点1",
|
||||
"Keep (points on it)": "保留(其上的点)",
|
||||
"Keep Tools": "保留工具",
|
||||
"Keep of the other surface": "另一曲面保留的部分",
|
||||
"Key a joint's value at this step": "在此步骤为接头值设置关键帧",
|
||||
"Keys": "关键帧",
|
||||
"LIBRARY": "库",
|
||||
"LINKS": "链接",
|
||||
"Later": "稍后",
|
||||
@@ -195,9 +252,14 @@
|
||||
"Letter Spacing": "字间距",
|
||||
"Library": "零件库",
|
||||
"Library file": "库文件",
|
||||
"Limits": "限制",
|
||||
"Line Spacing": "行间距",
|
||||
"Line Type": "线型",
|
||||
"Listing the installed fonts…": "正在列出已安装字体…",
|
||||
"Load library": "加载库",
|
||||
"Local library": "本地库",
|
||||
"Loop": "循环",
|
||||
"M5 or M5x0.5": "M5 或 M5x0.5",
|
||||
"MANAGE": "管理",
|
||||
"MATERIALS": "材料",
|
||||
"MODEL": "模型",
|
||||
@@ -208,14 +270,20 @@
|
||||
"Matched restrictions check the final values.": "满足条件的限制规则检查最终值。",
|
||||
"Material": "材质",
|
||||
"Max": "最大",
|
||||
"Maximum": "最大",
|
||||
"Mesh body": "网格实体",
|
||||
"Mid Radius": "中间半径",
|
||||
"Middle double-click": "中键双击",
|
||||
"Min": "最小",
|
||||
"Minimum": "最小",
|
||||
"Mirror Plane": "镜像平面",
|
||||
"Mitre": "斜接",
|
||||
"Model Parameters": "模型参数",
|
||||
"Modeled": "已建模",
|
||||
"More toolbar panels": "更多工具栏面板",
|
||||
"Motion": "运动",
|
||||
"Mouse gestures": "鼠标手势",
|
||||
"Mouse gestures only work with the SolidWorks mouse mode (the wheel orbits, Ctrl + wheel pans).": "鼠标手势仅在 SolidWorks 鼠标模式下有效(滚轮旋转,Ctrl + 滚轮平移)。",
|
||||
"Move / Copy": "移动 / 复制",
|
||||
"Move Type": "移动类型",
|
||||
"Move down": "下移",
|
||||
@@ -232,16 +300,23 @@
|
||||
"No crash reports.": "没有崩溃报告。",
|
||||
"No matching appearance presets.": "没有匹配的外观预设。",
|
||||
"No matching appearances": "没有匹配的外观",
|
||||
"No visible bodies to export.": "没有可导出的可见实体。",
|
||||
"No visible bodies or sketches to export.": "没有可导出的可见实体或草图。",
|
||||
"Nominal diameter": "公称直径",
|
||||
"None": "无",
|
||||
"Not available yet": "暂不可用",
|
||||
"Notch": "缺口",
|
||||
"OUTPUT": "输出",
|
||||
"Of": "的值",
|
||||
"On your computer": "在此计算机上",
|
||||
"Opacity": "不透明度",
|
||||
"Open GitHub draft": "打开 GitHub 草稿",
|
||||
"Open library...": "打开库...",
|
||||
"Open local libraries in the desktop app. You can export this design's library here.": "请在桌面应用中打开本地库。您可以在此导出当前设计的库。",
|
||||
"Open-source parametric 3D CAD in Rust. Licensed MIT OR Apache-2.0.": "使用 Rust 编写的开源参数化 3D CAD。基于 MIT OR Apache-2.0 许可。",
|
||||
"Opens your browser and copies the report text for you to paste into GitHub.": "打开浏览器,并复制报告文本以便粘贴到GitHub。",
|
||||
"Opens your browser. Review and submit your report on GitHub.": "打开浏览器。请在GitHub中检查并提交报告。",
|
||||
"Operator": "运算符",
|
||||
"Orbit (right drag)": "旋转(右键拖动)",
|
||||
"Other side": "另一侧",
|
||||
"Other surface (mutual trim)": "另一曲面(相互修剪)",
|
||||
"Outside": "外侧",
|
||||
@@ -256,8 +331,11 @@
|
||||
"Pick the tool bodies": "选择工具实体",
|
||||
"Picked": "所选",
|
||||
"Picked point": "选取的点",
|
||||
"Pitch": "螺距",
|
||||
"Pivot": "枢轴",
|
||||
"Place at the origin instead": "改为放置在原点",
|
||||
"Plastic Rules": "塑料规则",
|
||||
"Play the joint's motion in the view": "在视图中播放接头运动",
|
||||
"Playback": "播放",
|
||||
"Plot": "图表",
|
||||
"Position": "位置",
|
||||
@@ -265,14 +343,18 @@
|
||||
"Position (G0)": "位置 (G0)",
|
||||
"Position along the edge, 0 at the start end, 1 at the other": "沿边的位置,起点端为 0,另一端为 1",
|
||||
"Preferences › Design turns the offer back on": "可在 首选项 › 设计 中重新开启此提示",
|
||||
"Preview": "预览",
|
||||
"Preview Row": "预览行",
|
||||
"Preview leaves the current design unchanged.": "预览不会更改当前设计。",
|
||||
"Profile / Edges": "轮廓 / 边",
|
||||
"Profiles or curves": "轮廓或曲线",
|
||||
"Profiles/Curves": "轮廓/曲线",
|
||||
"Quantity": "物理量",
|
||||
"RECENT": "最近使用",
|
||||
"REFERENCE": "参考",
|
||||
"RULED SURFACE": "直纹曲面",
|
||||
"RULES": "规则",
|
||||
"Radius": "半径",
|
||||
"Radius Fit": "半径拟合",
|
||||
"Ratio": "比率",
|
||||
"Reattach selected face": "重新附着所选面",
|
||||
@@ -281,6 +363,8 @@
|
||||
"Rectangular": "矩形",
|
||||
"Reference face": "参考面",
|
||||
"Remove Tools": "移除工具",
|
||||
"Remove condition": "删除条件",
|
||||
"Remove from Folder": "从文件夹中移除",
|
||||
"Remove from list": "从列表移除",
|
||||
"Remove override": "移除覆盖",
|
||||
"Remove private design details or paths before sharing.": "共享前请移除私密设计细节或路径。",
|
||||
@@ -288,12 +372,18 @@
|
||||
"Remove the column": "移除此列",
|
||||
"Remove the track": "移除轨迹",
|
||||
"Remove this point": "移除此点",
|
||||
"Rename Feature": "重命名特征",
|
||||
"Rename Folder": "重命名文件夹",
|
||||
"Replace existing library file": "替换现有库文件",
|
||||
"Report a bug — review a screenshot and open a GitHub draft": "报告缺陷 — 复核截图并开启 GitHub 草稿",
|
||||
"Report text copied. Paste it into GitHub and submit your report there.": "报告文本已复制。请在GitHub中粘贴并提交。",
|
||||
"Reports are public. A GitHub account is required.": "报告将公开发布。您需要GitHub账户。",
|
||||
"Reset Toolbar": "重置工具栏",
|
||||
"Resize Part": "调整零件大小",
|
||||
"Restore View": "恢复视图",
|
||||
"Restore outer boundary": "恢复外边界",
|
||||
"Restore the inherited component or physical material appearance": "还原继承的组件或物理材质外观",
|
||||
"Restore this studio's tools": "恢复此工作室的工具",
|
||||
"Result": "结果",
|
||||
"Retake screenshot": "重新截图",
|
||||
"Reverse": "反向",
|
||||
@@ -303,7 +393,14 @@
|
||||
"Revert Pos.": "还原位置",
|
||||
"Revert Position": "恢复位置",
|
||||
"Review the report and screenshot before opening GitHub.": "打开 GitHub 前请审阅报告和截图。",
|
||||
"Review your report on GitHub and click Submit new issue to publish it.": "请在GitHub中检查报告,然后点击Submit new issue发布。",
|
||||
"Rib Length": "筋板长度",
|
||||
"Rib Offset": "筋板偏移",
|
||||
"Rib Thickness": "筋板厚度",
|
||||
"Ribs": "筋板",
|
||||
"Rim Edge": "轮缘边",
|
||||
"Ring of tools on the right button": "右键工具环",
|
||||
"Roll Back Here": "回滚到此处",
|
||||
"Roll History Marker Here": "将历史标记滚动到此处",
|
||||
"Round": "圆角",
|
||||
"Rule": "规则",
|
||||
@@ -313,20 +410,27 @@
|
||||
"SURFACE QUALITY": "曲面质量",
|
||||
"Save Rule": "保存规则",
|
||||
"Save View": "保存视图",
|
||||
"Save screenshot…": "保存屏幕截图…",
|
||||
"Save the study as an animated GIF, seen as the viewport shows it": "按视口中的显示将研究保存为动画 GIF",
|
||||
"Saved preview. Geometry is being checked before editing.": "已保存预览。编辑前正在检查几何。",
|
||||
"Scale factor": "比例因子",
|
||||
"Scene": "场景",
|
||||
"Screenshot (optional)": "屏幕截图(可选)",
|
||||
"Search": "搜索",
|
||||
"Search commands": "搜索命令",
|
||||
"Search this library": "搜索此库",
|
||||
"Second plane": "第二个平面",
|
||||
"Section": "剖面",
|
||||
"Sections (one sketch each)": "截面(每个一个草图)",
|
||||
"Select Other": "选择其他",
|
||||
"Select Other: hold the left button still on the model (or right-click › Select Other…) to list everything under the cursor; click again on the same spot to select the next thing there. Double-click the middle button to go Home (Preferences › Navigation).": "“选择其他”:在模型上按住左键(或右键单击 › 选择其他…)列出光标下的所有对象;在同一位置再次单击可选择该处的下一个对象。双击中键转到主视图(首选项 › 导航)。",
|
||||
"Select bodies (a face picks its body)": "选择实体(单击面即选择其所属实体)",
|
||||
"Select bodies or faces instead": "改为选择实体或面",
|
||||
"Select edges": "选择边",
|
||||
"Selection filter": "选择筛选",
|
||||
"Semantic faces share their appearance across instances.": "语义面在各实例间共享外观。",
|
||||
"Send your report on GitHub": "在 GitHub 上发送报告",
|
||||
"Shaded": "着色",
|
||||
"Shape": "形状",
|
||||
"Sheet Rules": "钣金规则",
|
||||
"Show Agent Cursor": "显示代理光标",
|
||||
@@ -344,6 +448,7 @@
|
||||
"SolidCraft closed before these designs were saved. Their last autosave can be opened.": "SolidCraft 在这些设计保存前已关闭。可以打开它们的上次自动保存。",
|
||||
"Specialise": "专用操作",
|
||||
"Speed": "速度",
|
||||
"Splitting tool": "分割工具",
|
||||
"Stand it up": "将其立起",
|
||||
"Stand it up: a quarter turn about X, as one Move feature you can undo.": "将其立起:绕 X 轴旋转四分之一周,作为一个可撤销的移动特征。",
|
||||
"Stand this part up?": "立起此零件?",
|
||||
@@ -351,17 +456,27 @@
|
||||
"Start continuity": "起始连续性",
|
||||
"Step": "步骤",
|
||||
"Steps": "步数",
|
||||
"Steps to reproduce (optional)": "重现步骤(可选)",
|
||||
"Stitch the kept pieces": "缝合保留的部分",
|
||||
"Stitch to both bodies": "缝合到两个实体",
|
||||
"Studio": "工作室",
|
||||
"Study": "研究",
|
||||
"Style": "样式",
|
||||
"Summary": "摘要",
|
||||
"Suppress": "抑制",
|
||||
"Suppressed": "已抑制",
|
||||
"Surface": "曲面",
|
||||
"Surface, or faces to turn over": "曲面,或要翻转的面",
|
||||
"Swap Ends": "交换端点",
|
||||
"TRIM": "修剪",
|
||||
"Tangent (G1)": "相切 (G1)",
|
||||
"Tangent Chain": "相切链",
|
||||
"Tangent chain": "相切链",
|
||||
"Tap drill diameter": "攻丝底孔直径",
|
||||
"Target": "目标",
|
||||
"Target Body": "目标实体",
|
||||
"Tear": "撕裂",
|
||||
"Technical details": "技术详情",
|
||||
"The dashed sketch is a saved plane guide. Select a new face to repair the attachment.": "虚线草图是已保存的平面引导。选择一个新面以修复附着。",
|
||||
"The saved author occurrence is missing. Select a valid author placement before rebinding.": "保存的作者实例缺失。重新绑定前请选择有效的作者放置。",
|
||||
"Then": "操作",
|
||||
@@ -373,24 +488,32 @@
|
||||
"This child is shared. Deleting it removes it from every copy of its parent.": "此子项是共享的。删除它会从其父项的每个副本中移除。",
|
||||
"This child is shared. Position changes apply to every copy of its parent.": "此子项是共享的。位置更改会应用到其父项的每个副本。",
|
||||
"This face cannot provide a durable attachment. Choose another face or explicitly use a fixed plane.": "此面无法提供持久附着。请选择其他面或显式使用固定平面。",
|
||||
"This image is not attached to GitHub yet. Copy or save it, then attach it on GitHub.": "此图片尚未附加到GitHub。请复制或保存图片,然后在GitHub中附加。",
|
||||
"To": "终点",
|
||||
"To Offset": "偏移",
|
||||
"To edges": "终止边",
|
||||
"Tolerance": "公差",
|
||||
"Too close": "过近",
|
||||
"Tool Bodies": "工具实体",
|
||||
"Tools": "工具",
|
||||
"Tools, clockwise from the top": "工具,从顶部顺时针排列",
|
||||
"Trimming tool (plane, face or curves)": "修剪工具(平面、面或曲线)",
|
||||
"Turn off section analysis before exporting the view.": "请关闭截面分析后再导出视图。",
|
||||
"Type": "类型",
|
||||
"UNTRIM": "取消修剪",
|
||||
"Unit": "单位",
|
||||
"Unsuppress": "取消抑制",
|
||||
"Updating the preview": "正在更新预览",
|
||||
"Use active author placement": "使用活动作者放置",
|
||||
"Use fixed plane": "使用固定平面",
|
||||
"Use saved fixed plane": "使用已保存的固定平面",
|
||||
"Use selected face as fixed plane": "使用所选面作为固定平面",
|
||||
"Use the SolidWorks mouse mode": "使用 SolidWorks 鼠标模式",
|
||||
"User Parameters": "用户参数",
|
||||
"VIEW": "视图",
|
||||
"VIEWS": "视图",
|
||||
"Value": "值",
|
||||
"Variable Radius": "可变半径",
|
||||
"Velocity": "速度",
|
||||
"Vertices": "顶点",
|
||||
"View navigator": "视图导航器",
|
||||
@@ -398,16 +521,50 @@
|
||||
"Wall": "壁厚",
|
||||
"Wall Location": "壁位置",
|
||||
"Wall Thickness": "壁厚度",
|
||||
"What did you do just before the problem? A short list is enough": "问题发生前您进行了哪些操作?简要列出即可",
|
||||
"What did you expect to see?": "您期望看到什么结果?",
|
||||
"What happened?": "发生了什么?",
|
||||
"When": "条件",
|
||||
"Width": "宽度",
|
||||
"Will fail": "将失败",
|
||||
"With gestures on, the right button no longer orbits the view: hold it and move to open the ring, then touch a tool's zone. A plain right-click still opens the menu.": "开启鼠标手势后,右键不再旋转视图:按住右键并移动以打开工具环,然后触碰某个工具的区域。普通右键单击仍会打开菜单。",
|
||||
"X": "X",
|
||||
"X Angle": "X 角度",
|
||||
"X angle": "X 角度",
|
||||
"X distance": "X 距离",
|
||||
"Y": "Y",
|
||||
"Y Angle": "Y 角度",
|
||||
"Y angle": "Y 角度",
|
||||
"Y distance": "Y 距离",
|
||||
"Z": "Z",
|
||||
"Z Angle": "Z 角度",
|
||||
"Z Distance": "Z 距离",
|
||||
"Z angle": "Z 角度",
|
||||
"Z distance": "Z 距离",
|
||||
"Zebra": "斑马纹",
|
||||
"ai.prefs.availability": "助手控制",
|
||||
"ai.prefs.background_commands": "在后台执行代理命令",
|
||||
"ai.prefs.follow_camera": "将相机转向草图",
|
||||
"ai.prefs.follow_camera_off": "相机自动跟随已关闭。",
|
||||
"ai.prefs.follow_camera_on": "相机将转向代理创建的草图。",
|
||||
"ai.prefs.intro": "设置代理、权限及其工作方式。",
|
||||
"ai.prefs.make_default": "设为默认",
|
||||
"ai.prefs.no_agents": "尚无代理。添加代理或刷新以查找已安装的代理。",
|
||||
"ai.prefs.no_saved_approvals": "没有已保存的批准。",
|
||||
"ai.prefs.override_all_warning": "此代理可在不询问的情况下保存、覆盖、导出或替换设计。",
|
||||
"ai.prefs.permission_all": "全部允许",
|
||||
"ai.prefs.permission_all_summary": "可用的 SolidCraft 工具无需询问即可运行。",
|
||||
"ai.prefs.permission_ask": "更改前询问",
|
||||
"ai.prefs.permission_ask_summary": "每次设计更改和文件操作均需批准。",
|
||||
"ai.prefs.permission_edits": "允许模型编辑",
|
||||
"ai.prefs.permission_edits_summary": "模型编辑自动执行;文件及破坏性操作仍需询问。",
|
||||
"ai.prefs.permission_scope": "仅适用于 SolidCraft 工具。代理的终端和文件编辑使用其自身权限。",
|
||||
"ai.prefs.pointer_preview_hidden": "指针已隐藏",
|
||||
"ai.prefs.pointer_preview_speed": "代理指针 · {speed}",
|
||||
"ai.prefs.pointer_speed": "移动速度",
|
||||
"ai.prefs.privacy_note": "对话仅发送给所选代理或端点。端点密钥保存在系统钥匙串中。",
|
||||
"ai.prefs.show_pointer": "显示代理指针",
|
||||
"ai.prefs.turn_limit_hint": "助手针对一条消息可调用的设计更改工具次数上限。",
|
||||
"angle, height": "角度、高度",
|
||||
"appearance.dielectric_ior": "电介质折射率",
|
||||
"appearance.metallic": "金属度",
|
||||
@@ -453,8 +610,10 @@
|
||||
"cmd.component_activate": "激活组件",
|
||||
"cmd.component_break_link": "断开链接",
|
||||
"cmd.component_capture_position": "捕获位置",
|
||||
"cmd.component_copies": "查找相同副本",
|
||||
"cmd.component_create": "新建组件",
|
||||
"cmd.component_delete": "删除组件",
|
||||
"cmd.component_extract": "提取到文件",
|
||||
"cmd.component_from_bodies": "由实体创建组件",
|
||||
"cmd.component_insert_design": "插入设计",
|
||||
"cmd.component_links": "列出链接",
|
||||
@@ -467,6 +626,7 @@
|
||||
"cmd.component_properties": "组件物理属性",
|
||||
"cmd.component_relink": "重新链接源文件",
|
||||
"cmd.component_rename": "重命名组件",
|
||||
"cmd.component_replace_with_link": "替换为链接",
|
||||
"cmd.component_revert_position": "恢复位置",
|
||||
"cmd.component_unlock": "解锁内容",
|
||||
"cmd.component_update_links": "更新链接",
|
||||
@@ -584,6 +744,7 @@
|
||||
"cmd.motion_plot": "运动研究图表",
|
||||
"cmd.motion_study": "运动研究",
|
||||
"cmd.motion_trace": "运动轨迹",
|
||||
"cmd.motion_trace_edit": "编辑运动轨迹",
|
||||
"cmd.motion_trace_keep": "保留运动轨迹",
|
||||
"cmd.occurrence_copy": "粘贴(实例)",
|
||||
"cmd.occurrence_ground": "固定",
|
||||
@@ -758,6 +919,7 @@
|
||||
"cmd.view_graphics_preset": "图形预设",
|
||||
"cmd.view_list": "列出命名视图",
|
||||
"cmd.view_navigate": "导航视图",
|
||||
"cmd.view_normal_to": "垂直于所选面",
|
||||
"cmd.view_rename": "重命名命名视图",
|
||||
"cmd.view_save": "新建命名视图",
|
||||
"color.copy": "单击复制颜色值",
|
||||
@@ -831,7 +993,7 @@
|
||||
"dxf.progress.projection": "正在投影几何体 (3/5)",
|
||||
"dxf.progress.write": "正在写入 DXF (5/5)",
|
||||
"dxf.tolerance": "曲线公差",
|
||||
"dxf.tolerance_help": "仅导出可见实体。曲线使用直线段近似。公差越小,曲线越精细,但需要更多时间和内存。",
|
||||
"dxf.tolerance_help": "仅导出可见实体和显示的草图。曲线使用直线段近似。公差越小,曲线越精细,但需要更多时间和内存。",
|
||||
"file_load.built": "已构建:{built}/{total} 个特征。",
|
||||
"file_load.converting": "正在转换实体 {done}/{total}",
|
||||
"file_load.inserting": "正在插入几何体",
|
||||
@@ -862,19 +1024,57 @@
|
||||
"help.solid.revolve": "将草图轮廓绕一条轴旋转,生成圆形的实体。用于轴、旋钮、碗等围绕中心线呈圆形的零件。",
|
||||
"help.solid.shell": "将实体掏空,留下指定厚度的壁,还可以打开所选的面。用于盒子、盖子等薄壁零件。",
|
||||
"help.third_party": "第三方许可证",
|
||||
"home.back": "返回 {name}",
|
||||
"home.crashes": "崩溃报告",
|
||||
"home.design_workspace": "设计",
|
||||
"home.documentation": "文档",
|
||||
"home.export": "导出",
|
||||
"home.export_hint": "为当前设计选择一种格式。",
|
||||
"home.export_json_hint": "可编辑的设计和命令历史记录",
|
||||
"home.export_mesh_hint": "用于打印或共享的网格",
|
||||
"home.export_step_hint": "精确的实体几何",
|
||||
"home.import": "导入…",
|
||||
"home.import_hint": "将 STEP、IGES 或网格导入新设计",
|
||||
"home.in_this_browser": "在此浏览器中",
|
||||
"home.missing": "文件不存在",
|
||||
"home.month_01": "1月",
|
||||
"home.month_02": "2月",
|
||||
"home.month_03": "3月",
|
||||
"home.month_04": "4月",
|
||||
"home.month_05": "5月",
|
||||
"home.month_06": "6月",
|
||||
"home.month_07": "7月",
|
||||
"home.month_08": "8月",
|
||||
"home.month_09": "9月",
|
||||
"home.month_10": "10月",
|
||||
"home.month_11": "11月",
|
||||
"home.month_12": "12月",
|
||||
"home.new_inches": "新建设计(英寸)",
|
||||
"home.new_inches_hint": "英寸 · 在设计工作区中打开",
|
||||
"home.new_mm": "新建设计",
|
||||
"home.new_mm_hint": "毫米 · 在设计工作区中打开",
|
||||
"home.open": "打开…",
|
||||
"home.opened_days_ago": "{count} 天前打开",
|
||||
"home.opened_hours_ago": "{count} 小时前打开",
|
||||
"home.opened_just_now": "刚刚打开",
|
||||
"home.opened_minutes_ago": "{count} 分钟前打开",
|
||||
"home.open_hint": ".solidcraft 设计文件 ({shortcut})",
|
||||
"home.open_now": "立即打开",
|
||||
"home.opened_days_ago": "{count} 天前",
|
||||
"home.opened_hours_ago": "{count} 小时前",
|
||||
"home.opened_just_now": "刚刚",
|
||||
"home.opened_minutes_ago": "{count} 分钟前",
|
||||
"home.opening": "正在打开…",
|
||||
"home.properties": "设计属性",
|
||||
"home.recent": "最近使用",
|
||||
"home.recent_empty": "您打开或保存的设计将显示在这里。",
|
||||
"home.recovery_count": "可恢复的设计: {count} 个",
|
||||
"home.recovery_empty": "没有可恢复的设计。",
|
||||
"home.recovery_hint": "SolidCraft 在这些设计保存前已关闭。",
|
||||
"home.report_issue": "报告问题",
|
||||
"home.samples": "示例",
|
||||
"home.settings": "设置",
|
||||
"home.short_date": "{month}{day}日",
|
||||
"home.shortcuts": "键盘快捷键",
|
||||
"home.start_hint": "创建设计、打开最近的文件或浏览示例。",
|
||||
"home.whats_new": "新功能",
|
||||
"home.yesterday": "昨天",
|
||||
"install.button_tip": "将 SolidCraft 安装为应用:在独立窗口中打开,离线也能使用",
|
||||
"install.dock_1": "选择“文件”›“添加到程序坞”。",
|
||||
"install.dock_2": "点按“添加”。",
|
||||
@@ -932,6 +1132,15 @@
|
||||
"motion.to_end": "到结尾",
|
||||
"motion.to_start": "到开头",
|
||||
"motion.track_name": "轨道 {number}",
|
||||
"nav.alias.help": "Shift+Alt+左键拖动旋转,Shift+Alt+中键拖动平移,Shift+Alt+右键拖动缩放;中键拖动也可平移,右键拖动旋转",
|
||||
"nav.blender.help": "中键拖动旋转,Shift+中键拖动平移,Ctrl+中键拖动缩放;右键拖动不会移动相机",
|
||||
"nav.free_orbit.help": "鼠标和3D鼠标可保持滚转并越过两个极点旋转。Shift轴吸附将被禁用。",
|
||||
"nav.free_orbit.label": "自由旋转",
|
||||
"nav.fusion.help": "中键拖动平移,Shift+中键拖动旋转,右键拖动旋转",
|
||||
"nav.inventor.help": "中键拖动平移,Shift+中键拖动旋转,Ctrl+中键拖动缩放,右键拖动旋转",
|
||||
"nav.openscad.help": "在空白处左键拖动旋转,Shift+左键拖动框选,拖动草图几何可编辑;右键或中键拖动平移,Shift+右键或 Shift+中键拖动缩放",
|
||||
"nav.solidworks.help": "中键拖动旋转,Ctrl+中键拖动平移,Shift+中键拖动缩放,右键拖动旋转",
|
||||
"nav.tinkercad.help": "右键拖动旋转,中键或 Shift+右键拖动平移",
|
||||
"nav.touchpad.help": "按住 Shift 并移动指针可平移;按住 Alt/Option 并移动可旋转。无需按鼠标按钮。垂直滚动可缩放。",
|
||||
"nav.touchpad.label": "触控板",
|
||||
"nav.touchpad.orbit": "旋转(按住 Alt/Option 并移动,无需鼠标按钮)",
|
||||
@@ -954,8 +1163,130 @@
|
||||
"pattern.flip_direction": "反转方向",
|
||||
"pick a hole to seat it, or OK places it at the origin": "选择一个孔放置,或单击确定放置在原点",
|
||||
"pick one or two vertices, edges or faces": "选择一个或两个顶点、边或面",
|
||||
"prefs.add_item": "添加项目",
|
||||
"prefs.alt_frees_manipulators": "Alt / Option 也可自由拖动操纵器箭头",
|
||||
"prefs.anti_aliasing_note": "平滑锯齿边缘。",
|
||||
"prefs.applies_on_restart": "重启后生效",
|
||||
"prefs.assistant": "助手",
|
||||
"prefs.axes": "坐标轴",
|
||||
"prefs.axis": "轴",
|
||||
"prefs.bottom": "底部",
|
||||
"prefs.browser": "浏览器",
|
||||
"prefs.built_in": "内置",
|
||||
"prefs.button_left": "左键拖动",
|
||||
"prefs.button_middle": "中键拖动",
|
||||
"prefs.button_right": "右键拖动",
|
||||
"prefs.choose_font": "选择字体文件…",
|
||||
"prefs.click": "单击",
|
||||
"prefs.contact_shading": "柔和接触阴影",
|
||||
"prefs.contact_shading_note": "在零件相近处添加柔和阴影。",
|
||||
"prefs.context_menu": "上下文菜单",
|
||||
"prefs.context_menu_ring": "上下文菜单 · 按住显示环形菜单",
|
||||
"prefs.cpu": "CPU(软件)",
|
||||
"prefs.crash_reports": "打开崩溃报告…",
|
||||
"prefs.crash_reports_note": "报告与重现问题的设计和命令一起保存在此计算机上。",
|
||||
"prefs.ctrl_cmd": "Ctrl / Cmd",
|
||||
"prefs.curved_surfaces": "曲面",
|
||||
"prefs.curves": "曲面",
|
||||
"prefs.dead_zone_note": "斜线区域为死区:此范围内的移动将被忽略。",
|
||||
"prefs.default": "默认",
|
||||
"prefs.design": "设计默认值",
|
||||
"prefs.design_note": "新建设计的初始设置。已打开的设计保留各自的设置。",
|
||||
"prefs.devices": "3D 鼠标",
|
||||
"prefs.display": "显示",
|
||||
"prefs.edges": "边缘与着色",
|
||||
"prefs.extend": "扩展",
|
||||
"prefs.extra_navigation": "在空白处按住Ctrl并用鼠标左键拖动可旋转;按住空格键可平移。",
|
||||
"prefs.follows_os": "跟随操作系统",
|
||||
"prefs.font": "字体",
|
||||
"prefs.font_fallback": "所选字体缺少的字符会使用内置字体,避免标签显示为空方框。",
|
||||
"prefs.font_sample": "字体示例 · Ø12.50 mm · 45.0° · 0123456789",
|
||||
"prefs.font_unreadable": "无法读取所选字体。",
|
||||
"prefs.general": "常规",
|
||||
"prefs.general_note": "语言、保存和更新。",
|
||||
"prefs.gesture_orbit": "环绕",
|
||||
"prefs.gesture_pan": "平移",
|
||||
"prefs.gesture_zoom": "缩放",
|
||||
"prefs.graphics": "图形",
|
||||
"prefs.graphics_note": "在速度与平滑度之间取舍。每个选项均以示例展示效果。",
|
||||
"prefs.graphics_presets_note": "预设会同时设置以下选项。",
|
||||
"prefs.history": "历史",
|
||||
"prefs.hold_stop_snapping": "按住以停用吸附",
|
||||
"prefs.icons_only": "仅图标",
|
||||
"prefs.imported_file": "已导入文件",
|
||||
"prefs.input": "输入",
|
||||
"prefs.interface": "界面",
|
||||
"prefs.interface_language": "界面语言",
|
||||
"prefs.interface_note": "SolidCraft 的外观和面板布局。",
|
||||
"prefs.interval_minutes": "{n} 分钟",
|
||||
"prefs.labels": "标签",
|
||||
"prefs.layout": "布局",
|
||||
"prefs.layout_note": "紧凑模式将面板停靠在窗口边缘。浏览器半透明仅适用于浮动模式。助手面板的位置在助手页面中设置。",
|
||||
"prefs.left": "左侧",
|
||||
"prefs.left_click": "左键单击",
|
||||
"prefs.live_input": "实时输入",
|
||||
"prefs.live_preview": "实时预览",
|
||||
"prefs.minutes": "分钟",
|
||||
"prefs.minutes_suffix": " min",
|
||||
"prefs.mouse": "鼠标与触控板",
|
||||
"prefs.mouse_heading": "鼠标",
|
||||
"prefs.mouse_mapping": "鼠标映射",
|
||||
"prefs.navigation": "导航",
|
||||
"prefs.navigation_note": "鼠标、触控板和3D鼠标如何移动视图。",
|
||||
"prefs.not_on_gpu": "此 GPU 不支持",
|
||||
"prefs.on": "开启",
|
||||
"prefs.opaque": "不透明",
|
||||
"prefs.orbit_snap": "旋转时按住Shift可捕捉到坐标轴。",
|
||||
"prefs.orientation": "方向",
|
||||
"prefs.overall_speed": "整体速度",
|
||||
"prefs.preview_choices": "所选设置预览",
|
||||
"prefs.quality_default": "默认",
|
||||
"prefs.quality_fastest": "最快",
|
||||
"prefs.quality_slowest": "最慢",
|
||||
"prefs.quality_smoother": "更平滑",
|
||||
"prefs.reports_saved": "已保存 {n} 份",
|
||||
"prefs.right_click": "右键单击",
|
||||
"prefs.saving": "自动保存和恢复",
|
||||
"prefs.scale_note": "也可在窗口中使用 Ctrl + / Ctrl −。100% 时按钮高度为 28 像素。",
|
||||
"prefs.scale_text": "缩放与文字",
|
||||
"prefs.select": "选择",
|
||||
"prefs.select_one_item": "选择一个项目",
|
||||
"prefs.selecting": "选择",
|
||||
"prefs.shift": "Shift",
|
||||
"prefs.shift_add_ctrl_toggle": "Shift 仅添加;Ctrl / Cmd 切换选择",
|
||||
"prefs.shift_add_note": "开启:Shift 添加,Ctrl / Cmd 切换选择。关闭(默认):两者均切换选择。",
|
||||
"prefs.shortcuts": "快捷键",
|
||||
"prefs.sketch_selection": "草图与选择",
|
||||
"prefs.sketch_selection_heading": "草图和选择",
|
||||
"prefs.sketch_selection_note": "草图如何捕捉,以及单击如何选择。",
|
||||
"prefs.sketching": "草图",
|
||||
"prefs.snap_drawing_note": "在绘制或拖动草图点时使用。",
|
||||
"prefs.source": "来源",
|
||||
"prefs.speed": "速度",
|
||||
"prefs.stand_up_note": "以 Z 轴向上打开 STEP 或 IGES 文件后,询问是否绕 X 轴旋转 90°。",
|
||||
"prefs.status_done": "完成",
|
||||
"prefs.status_error": "错误",
|
||||
"prefs.status_selected": "已选择",
|
||||
"prefs.status_warning": "警告",
|
||||
"prefs.supersampling_brief": "以更高分辨率绘制后滤波缩小:更清晰,但负载更高。",
|
||||
"prefs.tab_accent_note": "强调色跟随当前选项卡",
|
||||
"prefs.theme_file": "主题文件",
|
||||
"prefs.timeline_half_hour": "−30 分钟",
|
||||
"prefs.timeline_now": "现在",
|
||||
"prefs.timeline_quarter_hour": "−15",
|
||||
"prefs.toggle_item": "添加项目,或取消选择",
|
||||
"prefs.toolbar": "工具栏",
|
||||
"prefs.translucent": "半透明",
|
||||
"prefs.under_browser": "浏览器下方",
|
||||
"prefs.under_cursor": "光标下方",
|
||||
"prefs.units_precision": "单位与精度",
|
||||
"prefs.updates": "更新",
|
||||
"prefs.view": "视图行为",
|
||||
"prefs.viewport": "视口",
|
||||
"prefs.wheel": "滚轮",
|
||||
"prefs.wheel_trackpad": "滚轮与触控板",
|
||||
"prefs.workspace": "工作区",
|
||||
"prefs.zoom_toward_cursor": "朝光标缩放",
|
||||
"properties.title": "属性:{name}",
|
||||
"recovery.days_ago": "{count} 天前",
|
||||
"recovery.detail": "{file} · {features} 个特征 · 自动保存于 {when}",
|
||||
@@ -1026,8 +1357,8 @@
|
||||
"search.suggest": "您是否想找 {label}?",
|
||||
"search.try": "输入命令名称、此设计中的特征或参数。要带值运行命令,请输入其ID和JSON对象:{example}",
|
||||
"search.valid": "有效",
|
||||
"settings.display_quality_note": "级别越精细,曲面和边显示越平滑,但网格生成耗时更长。只影响视口,不影响设计或导出。",
|
||||
"settings.frame_rate_note": "在视图右下角显示每秒帧数。开启时视图会持续重绘。",
|
||||
"settings.display_quality_note": "仅影响显示,不影响设计和导出。",
|
||||
"settings.frame_rate_note": "在视图右下角显示每秒帧数。",
|
||||
"settings.measure_axis_distances": "显示 X/Y/Z 距离",
|
||||
"settings.measure_axis_distances_help": "测量对话框打开时,在总距离之外显示沿世界坐标轴方向的尺寸线和距离。",
|
||||
"settings.msaa_applies_on_restart": "抗锯齿将在下次启动 SolidCraft 时生效",
|
||||
@@ -1036,6 +1367,7 @@
|
||||
"settings.reset_intro": "这些设置在此计算机上无法正常工作,会导致 SolidCraft 无法启动,因此已更改:",
|
||||
"settings.reset_title": "设置已更改",
|
||||
"settings.supersampling_note": "以更高分辨率绘制视图再缩小:在低于 4K 的屏幕上边、线和网格更平滑。会消耗 GPU 时间:1.5× 时约 2.25 倍像素,2× 时 4 倍。",
|
||||
"sheet.no_body": "没有钣金实体:请使用法兰 > Base 创建,或使用转换为钣金将板材转换为钣金(选择其较大的平面)。",
|
||||
"shortcut.json_error": "参数必须采用 JSON 格式:{error}",
|
||||
"shortcut.no_command": "没有命令 `{id}`;JSON 前的文本必须是命令 ID",
|
||||
"shortcut.pin": "固定到 S 框顶部",
|
||||
@@ -1072,6 +1404,9 @@
|
||||
"thread.designation": "螺纹标记",
|
||||
"thread.iso_metric": "ISO 公制",
|
||||
"thread.select_size": "选择尺寸",
|
||||
"timeline.delete_after_marker_one": "删除历史标记之后的 1 个特征",
|
||||
"timeline.delete_after_marker_other": "删除历史标记之后的 {count} 个特征",
|
||||
"timeline.delete_many": "删除所选的 {count} 个特征",
|
||||
"timeline.group": "新建特征文件夹",
|
||||
"timeline.move_many": "移动时间线项目",
|
||||
"timeline.move_to_group": "将特征移至文件夹",
|
||||
@@ -1098,6 +1433,7 @@
|
||||
"ui.agent_chat_add": "附加文件",
|
||||
"ui.agent_chat_add_file": "选择文件…",
|
||||
"ui.agent_chat_allow": "允许",
|
||||
"ui.agent_chat_allow_once": "仅允许一次",
|
||||
"ui.agent_chat_allowed": "已允许",
|
||||
"ui.agent_chat_answered": "回答:{option}",
|
||||
"ui.agent_chat_approval": "允许智能体执行此操作吗?",
|
||||
@@ -1149,12 +1485,16 @@
|
||||
"ui.agent_chat_files_left_out": "一条消息最多发送 {max} 个文件;未发送:{files}",
|
||||
"ui.agent_chat_files_loading": "正在等待文件读取完成",
|
||||
"ui.agent_chat_files_max": "一条消息最多附加 {max} 个文件",
|
||||
"ui.agent_chat_flatpak_none_found": "未找到编程代理。默认情况下,Flatpak 沙箱无法访问主目录中安装的代理,也无法访问网络。要允许使用通过 nvm 或 ~/.local/bin 安装的 Claude Code 及其 ACP 适配器,请在终端运行以下命令,然后重新启动 SolidCraft。此命令授予对所列程序和登录文件的访问权限以及网络访问权限:",
|
||||
"ui.agent_chat_import_failed": "{name}:导入失败:{error}",
|
||||
"ui.agent_chat_intro": "与你已在使用的编程智能体或你选择的模型端点聊天。它通过 SolidCraft 的工具处理打开的设计:更改即时显示,每条消息的更改可一步撤销。无需询问即可执行的范围在“首选项 > AI”中设置。",
|
||||
"ui.agent_chat_key_in_env": "已设置密钥",
|
||||
"ui.agent_chat_left": "左侧",
|
||||
"ui.agent_chat_limit": "智能体已达到每条消息 {limit} 项更改的上限。再发送一条消息可让它继续。",
|
||||
"ui.agent_chat_minimize": "最小化为细条",
|
||||
"ui.agent_chat_mode_all": "全部",
|
||||
"ui.agent_chat_mode_ask": "询问",
|
||||
"ui.agent_chat_mode_edits": "编辑",
|
||||
"ui.agent_chat_model_tip": "智能体使用的模型。你的选择会为此智能体记住。",
|
||||
"ui.agent_chat_new": "新对话",
|
||||
"ui.agent_chat_new_confirm": "开始新对话?当前对话将被清除。",
|
||||
@@ -1167,6 +1507,7 @@
|
||||
"ui.agent_chat_none_found_short": "未找到智能体",
|
||||
"ui.agent_chat_not_installed": "未安装",
|
||||
"ui.agent_chat_not_signed_in": "未登录",
|
||||
"ui.agent_chat_open_settings": "打开首选项",
|
||||
"ui.agent_chat_own_window": "独立窗口",
|
||||
"ui.agent_chat_paste_picture": "粘贴图片",
|
||||
"ui.agent_chat_permission": "智能体请求运行:{title}",
|
||||
@@ -1191,6 +1532,8 @@
|
||||
"ui.agent_chat_send": "发送",
|
||||
"ui.agent_chat_send_now": "立即发送",
|
||||
"ui.agent_chat_send_now_tip": "停止智能体当前的步骤,并接着发送这条消息(Ctrl+Enter)",
|
||||
"ui.agent_chat_setup_body": "SolidCraft 会与安装在此计算机上的编程代理通信。请在“首选项 › AI”中选择一个。",
|
||||
"ui.agent_chat_setup_title": "设置助手",
|
||||
"ui.agent_chat_side": "智能体聊天位置",
|
||||
"ui.agent_chat_signed_in": "已登录",
|
||||
"ui.agent_chat_state_auth": "需要登录",
|
||||
@@ -1207,13 +1550,18 @@
|
||||
"ui.agent_chat_undo_label": "智能体聊天:{message}",
|
||||
"ui.agent_chat_undone": "(已撤销)",
|
||||
"ui.agent_chat_view_attached": "已附加视图",
|
||||
"ui.agent_chat_waiting": "等待您的回复",
|
||||
"ui.agent_cursor": "代理光标",
|
||||
"ui.agent_cursor_speed": "代理光标速度",
|
||||
"ui.agent_off_thread": "代理运行命令时保持窗口响应",
|
||||
"ui.agent_off_thread_note": "代理(来自 AI 面板或 MCP 客户端)的耗时命令在窗口之外计算:运行时仍可旋转和查看视图,并可在视图中的提示上停止它。关闭:每条命令在窗口线程上运行,窗口会等待其完成。",
|
||||
"ui.ai_add": "添加",
|
||||
"ui.ai_add_agent": "添加智能体…",
|
||||
"ui.ai_add_agent_title": "添加智能体",
|
||||
"ui.ai_add_anthropic": "Anthropic 兼容 API",
|
||||
"ui.ai_add_api": "OpenAI 兼容 API",
|
||||
"ui.ai_add_custom": "自定义命令",
|
||||
"ui.ai_add_endpoint": "API 端点",
|
||||
"ui.ai_add_installed": "已安装的智能体",
|
||||
"ui.ai_add_installed_note": "为已安装的智能体添加一个自己的条目,例如使用其他参数。已安装的智能体会自动列出。",
|
||||
"ui.ai_added": "已添加",
|
||||
@@ -1242,6 +1590,7 @@
|
||||
"ui.ai_key_needs_https": "密钥只会通过 HTTPS 发送,或发送到本机。",
|
||||
"ui.ai_key_note": "保存在系统钥匙串中,绝不保存在 SolidCraft 的设置里。本地服务器可留空。",
|
||||
"ui.ai_keychain_error": "系统钥匙串拒绝:{error}",
|
||||
"ui.ai_kind": "类型",
|
||||
"ui.ai_mode_all": "全部允许",
|
||||
"ui.ai_mode_all_note": "不再询问。崩溃报告仍不可访问,文件夹限制仍然有效。",
|
||||
"ui.ai_mode_all_warning": "智能体可以不经询问保存、覆盖、导出和替换你的设计。只在你信任的智能体和已保存的设计上使用。",
|
||||
@@ -1263,6 +1612,7 @@
|
||||
"ui.ai_panel": "面板",
|
||||
"ui.ai_permissions": "权限",
|
||||
"ui.ai_preset": "预设",
|
||||
"ui.ai_protocol": "协议",
|
||||
"ui.ai_remove": "移除",
|
||||
"ui.ai_request_limit": "每条消息 24 次请求后已停止;再发送一条消息即可继续",
|
||||
"ui.ai_reset": "重置",
|
||||
@@ -1273,6 +1623,8 @@
|
||||
"ui.ai_test": "测试",
|
||||
"ui.ai_test_acp_ok": "已响应:{agent}",
|
||||
"ui.ai_test_acp_tip": "短暂启动智能体并请求一个会话,然后结束它",
|
||||
"ui.ai_test_answered": "已连接:{model} 已响应",
|
||||
"ui.ai_test_anthropic_tip": "向端点发送一条简短消息",
|
||||
"ui.ai_test_api_tip": "向端点查询其模型列表",
|
||||
"ui.ai_test_no_model": "已连接:{count} 个模型,但没有 {model}",
|
||||
"ui.ai_test_ok": "已连接:{count} 个模型",
|
||||
@@ -1430,6 +1782,9 @@
|
||||
"ui.export_keymap_tip": "将按键、S 框收藏和工具栏导出为文件",
|
||||
"ui.extend": "延伸",
|
||||
"ui.extent_type": "延伸类型",
|
||||
"ui.extract_component": "提取到文件…",
|
||||
"ui.extract_design_changed": "选择文件时设计已更改。请重新开始提取到文件。",
|
||||
"ui.extract_done": "该组件现在是独立的设计,并已在此处链接。",
|
||||
"ui.extrude": "拉伸",
|
||||
"ui.factor": "系数",
|
||||
"ui.feature_history": "特征历史",
|
||||
@@ -1461,6 +1816,7 @@
|
||||
"ui.grid_follows_view_hint": "在侧视图中,将网格显示在朝向该视图的竖直平面上,而不是地面上",
|
||||
"ui.ground_shadow": "地面阴影",
|
||||
"ui.groupSelected": "将所选编组",
|
||||
"ui.hatch": "剖面线",
|
||||
"ui.heading_add_ins": "加载项",
|
||||
"ui.heading_assemble": "装配",
|
||||
"ui.heading_box": "长方体",
|
||||
@@ -1534,7 +1890,19 @@
|
||||
"ui.hideOrigin": "隐藏原点",
|
||||
"ui.hidePlanes": "隐藏平面",
|
||||
"ui.hideProfile": "隐藏轮廓",
|
||||
"ui.history_back": "后退一步",
|
||||
"ui.history_below_browser": "浏览器下方",
|
||||
"ui.history_edge_hint": "双击边缘",
|
||||
"ui.history_first": "转到开头",
|
||||
"ui.history_forward": "前进一步",
|
||||
"ui.history_hide_names": "隐藏名称",
|
||||
"ui.history_last": "转到末尾",
|
||||
"ui.history_marker_tip": "历史标记:拖动以回退模型;新特征将在此处添加",
|
||||
"ui.history_names": "名称",
|
||||
"ui.history_play": "播放至末尾",
|
||||
"ui.history_show_names": "显示名称",
|
||||
"ui.history_title": "历史",
|
||||
"ui.history_toggle_names": "显示或隐藏特征名称",
|
||||
"ui.hole": "孔",
|
||||
"ui.hole_tap_type": "孔攻丝类型",
|
||||
"ui.hole_type": "孔类型",
|
||||
@@ -1551,9 +1919,15 @@
|
||||
"ui.joints": "关节",
|
||||
"ui.keyboard_shortcuts": "键盘快捷键",
|
||||
"ui.language": "语言",
|
||||
"ui.layout_compact": "紧凑",
|
||||
"ui.layout_floating": "浮动",
|
||||
"ui.length_decimals": "长度小数位",
|
||||
"ui.light": "浅色",
|
||||
"ui.line": "直线",
|
||||
"ui.link_copies": "链接相同副本",
|
||||
"ui.link_copies_keep": "保留",
|
||||
"ui.link_copies_link": "链接",
|
||||
"ui.link_copies_text": "这些组件生成的实体与 {name} 相同。要将它们改为其链接的放置吗?",
|
||||
"ui.lock": "锁定",
|
||||
"ui.loft": "放样",
|
||||
"ui.look_at": "朝向",
|
||||
@@ -1677,6 +2051,7 @@
|
||||
"ui.render": "渲染",
|
||||
"ui.renderer": "渲染器",
|
||||
"ui.repeat": "重复",
|
||||
"ui.replace_with_link_done": "这些副本现在是链接设计的放置。",
|
||||
"ui.report_a_bug": "报告缺陷",
|
||||
"ui.reset": "重置",
|
||||
"ui.reset_all": "全部重置",
|
||||
@@ -1688,6 +2063,7 @@
|
||||
"ui.reverse_zoom_direction": "反转缩放方向",
|
||||
"ui.revolve": "旋转",
|
||||
"ui.ribbon_exit": "退出",
|
||||
"ui.ribbon_labels": "显示功能区图标下的文字",
|
||||
"ui.ribbon_pin_footer": "固定的命令显示在功能区中。将指针悬停在行上可固定或取消固定。",
|
||||
"ui.ribbon_workspace": "工作区",
|
||||
"ui.right": "右视",
|
||||
@@ -1743,6 +2119,7 @@
|
||||
"ui.smooth_wheel_zoom": "平滑滚轮缩放",
|
||||
"ui.smooth_wheel_zoom_tip": "关闭后每个滚轮事件立即生效,不做平滑延迟",
|
||||
"ui.snap": "捕捉",
|
||||
"ui.space_mouse_axes_reassigned": "轴已在偏好设置中重新分配,在此次校准之上仍然生效。",
|
||||
"ui.space_mouse_calibrate": "校准…",
|
||||
"ui.space_mouse_calibrate_tip": "按窗口提示移动摇杆帽,SolidCraft 会记住这个 3D 鼠标每个轴的方向和行程。校准结果按此 3D 鼠标保存。",
|
||||
"ui.space_mouse_calibrate_title": "校准 3D 鼠标",
|
||||
@@ -1752,12 +2129,26 @@
|
||||
"ui.space_mouse_calibration_no_response": "有一个轴几乎没有移动,因此无法校准。请重新开始,并且每次把摇杆帽移得更远。",
|
||||
"ui.space_mouse_dead_zone": "死区",
|
||||
"ui.space_mouse_dead_zone_tip": "视图开始移动前摇杆帽需要移动的距离,以其全行程的比例表示。如果摇杆帽静止时视图仍在漂移,请调大。",
|
||||
"ui.space_mouse_driven_by": "由设备的哪个校准动作控制此轴。选择另一个轴已在使用的动作时,两者会互换。",
|
||||
"ui.space_mouse_driven_by_label": "控制来源",
|
||||
"ui.space_mouse_driver": "3D 鼠标驱动",
|
||||
"ui.space_mouse_driver_auto": "自动",
|
||||
"ui.space_mouse_driver_direct": "直接 (hidraw)",
|
||||
"ui.space_mouse_driver_only_direct": "直接读取设备(spacenavd 未运行)",
|
||||
"ui.space_mouse_driver_only_spacenavd": "通过 spacenavd 读取(没有其他方式)",
|
||||
"ui.space_mouse_forget": "清除校准",
|
||||
"ui.space_mouse_hint": "同时移动和旋转视图;草图中仅支持平移和缩放。",
|
||||
"ui.space_mouse_motion_rotation_x": "旋转 X",
|
||||
"ui.space_mouse_motion_rotation_y": "旋转 Y",
|
||||
"ui.space_mouse_motion_rotation_z": "旋转 Z",
|
||||
"ui.space_mouse_motion_translation_x": "平移 X",
|
||||
"ui.space_mouse_motion_translation_y": "平移 Y",
|
||||
"ui.space_mouse_motion_translation_z": "平移 Z",
|
||||
"ui.space_mouse_navigate": "使用 SpaceNavigator / SpaceMouse 导航",
|
||||
"ui.space_mouse_none": "未找到 3D 鼠标",
|
||||
"ui.space_mouse_not_calibrated": "未校准",
|
||||
"ui.space_mouse_reading": "读数",
|
||||
"ui.space_mouse_reset_axes": "重置轴分配",
|
||||
"ui.space_mouse_step_lift": "向上提起摇杆帽,保持住,然后松开。",
|
||||
"ui.space_mouse_step_press": "向下按压摇杆帽,保持住,然后松开。",
|
||||
"ui.space_mouse_step_pull": "把摇杆帽拉向自己,保持住,然后松开。",
|
||||
@@ -1771,6 +2162,16 @@
|
||||
"ui.space_mouse_step_tilt_right": "向右倾斜摇杆帽(右缘向下),保持住,然后松开。",
|
||||
"ui.space_mouse_step_twist_clockwise": "顺时针扭转摇杆帽,保持住,然后松开。",
|
||||
"ui.space_mouse_step_twist_counterclockwise": "逆时针扭转摇杆帽,保持住,然后松开。",
|
||||
"ui.space_mouse_view_axis": "视图轴",
|
||||
"ui.space_mouse_view_off": "关闭",
|
||||
"ui.space_mouse_view_off_tip": "3D 鼠标驱动程序的配置文件关闭了此轴,因此它的动作不会移动视图。在此选择另一个轴的动作会将两者互换,该动作将不再移动视图。",
|
||||
"ui.space_mouse_view_orbit_sideways": "左右环绕",
|
||||
"ui.space_mouse_view_orbit_up_down": "上下环绕",
|
||||
"ui.space_mouse_view_pan_sideways": "左右平移",
|
||||
"ui.space_mouse_view_pan_up_down": "上下平移",
|
||||
"ui.space_mouse_view_roll": "滚转",
|
||||
"ui.space_mouse_view_unmapped": "轴 {n}",
|
||||
"ui.space_mouse_view_zoom": "缩放",
|
||||
"ui.spacing": "间距",
|
||||
"ui.spacing_2": "间距 2",
|
||||
"ui.sphere": "球体",
|
||||
@@ -1804,7 +2205,7 @@
|
||||
"ui.tie_ends": "约束",
|
||||
"ui.tie_ends_tip": "约束全部未约束端点",
|
||||
"ui.timeline_bottom": "底部时间轴",
|
||||
"ui.timeline_left_note": "左侧布局下,回退条显示在零件和场景浏览器的上方。",
|
||||
"ui.timeline_left_note": "垂直历史位于浏览器左侧。可在历史条上切换特征名称的显示。",
|
||||
"ui.timeline_left_sidebar": "左侧边栏",
|
||||
"ui.tip_angle": "尖端角度",
|
||||
"ui.to_object": "到对象",
|
||||
@@ -1842,6 +2243,7 @@
|
||||
"ui.workspace_design_tabs": "模型 · 曲面 · 装配 · 插入 · 检查 · 管理 · 视图",
|
||||
"ui.workspace_drawing_description": "包含视图、尺寸和标题栏的二维图纸",
|
||||
"ui.workspace_footer": "所有工作区使用同一设计、历史记录和选择,仅功能区选项卡发生变化。编辑草图或特征时,切换器将被锁定。",
|
||||
"ui.workspace_layout": "工作区布局",
|
||||
"ui.workspace_manufacture_description": "切片、刀具路径和设置",
|
||||
"ui.workspace_planned": "计划中",
|
||||
"ui.workspace_render_description": "产品预览、场景设置和渲染图像",
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
//! Built-in physical materials: densities in g/cm³ and sRGB colours.
|
||||
|
||||
/// The default material's name: what a body without a usable material of its own is made of.
|
||||
/// Assigning it clears a body's assignment.
|
||||
pub const DEFAULT_MATERIAL: &str = "Default";
|
||||
/// Density of the default material (g/cm³).
|
||||
pub const DEFAULT_DENSITY: f64 = 1.29;
|
||||
|
||||
/// Physical materials: name and density (g/cm³).
|
||||
pub const MATERIALS: [(&str, f64); 14] = [
|
||||
("Default", DEFAULT_DENSITY),
|
||||
(DEFAULT_MATERIAL, DEFAULT_DENSITY),
|
||||
("Steel", 7.85),
|
||||
("Stainless Steel", 8.0),
|
||||
("Aluminum", 2.70),
|
||||
|
||||
@@ -16,6 +16,8 @@ struct U {
|
||||
ana_c: array<vec4<f32>, 8>,
|
||||
ana_f: vec4<f32>, // x = 1: stripe the negative draft and blocked faces
|
||||
depth: vec4<f32>, // x = 1: reversed depth (1 near, 0 far); y, z: the faces' push (`FACE_BIAS`)
|
||||
tint: vec4<f32>, // xyz added to a whole hovered body's colour before lighting
|
||||
sel: vec4<f32>, // xyz a whole selected body's colour before lighting
|
||||
};
|
||||
|
||||
fn reversed() -> bool {
|
||||
@@ -64,7 +66,138 @@ fn vs_tri(@location(0) p: vec3<f32>, @location(1) n: vec3<f32>, @location(2) c:
|
||||
return o;
|
||||
}
|
||||
|
||||
/// Opaque model surfaces: cut by the section plane, the inside shows as a flat cap colour.
|
||||
/// Shared triangles (in their part's own frame) drawn at one placement: the rows of its rigid
|
||||
/// move (`r0`..`r2`, a point's coordinates are their dot products with (p, 1)) and its colour.
|
||||
/// The vertex colour (location 2) is not read.
|
||||
@vertex
|
||||
fn vs_tri_inst(
|
||||
@location(0) p: vec3<f32>,
|
||||
@location(1) n: vec3<f32>,
|
||||
@location(3) r0: vec4<f32>,
|
||||
@location(4) r1: vec4<f32>,
|
||||
@location(5) r2: vec4<f32>,
|
||||
@location(6) c: vec4<f32>,
|
||||
) -> TOut {
|
||||
let q = vec4<f32>(p, 1.0);
|
||||
let wp = vec3<f32>(dot(r0, q), dot(r1, q), dot(r2, q));
|
||||
var o: TOut;
|
||||
o.pos = u.vp * vec4<f32>(wp, 1.0);
|
||||
o.n = vec3<f32>(dot(r0.xyz, n), dot(r1.xyz, n), dot(r2.xyz, n));
|
||||
o.c = c;
|
||||
o.wp = wp;
|
||||
return o;
|
||||
}
|
||||
|
||||
/// A flat-shaded placement (`vs_tri_inst_flat`): its vertices are shared between triangles, so
|
||||
/// the face's normal is the triangle's own plane, worked out per fragment. The fragment gets its
|
||||
/// position from the eye (`rp`): small near what is looked at, so the plane comes out exact at
|
||||
/// any zoom however far from the origin the part stands, and few values per vertex (a tiled GPU
|
||||
/// stores every vertex's outputs: more of them cost more than the triangles' shared vertices
|
||||
/// save).
|
||||
struct FOut {
|
||||
@builtin(position) pos: vec4<f32>,
|
||||
@location(0) rp: vec3<f32>,
|
||||
@location(1) c: vec4<f32>,
|
||||
};
|
||||
|
||||
@vertex
|
||||
fn vs_tri_inst_flat(
|
||||
@location(0) p: vec3<f32>,
|
||||
@location(3) r0: vec4<f32>,
|
||||
@location(4) r1: vec4<f32>,
|
||||
@location(5) r2: vec4<f32>,
|
||||
@location(6) c: vec4<f32>,
|
||||
) -> FOut {
|
||||
let q = vec4<f32>(p, 1.0);
|
||||
let wp = vec3<f32>(dot(r0, q), dot(r1, q), dot(r2, q));
|
||||
var o: FOut;
|
||||
o.pos = u.vp * vec4<f32>(wp, 1.0);
|
||||
o.rp = wp - u.eye.xyz;
|
||||
o.c = c;
|
||||
return o;
|
||||
}
|
||||
|
||||
/// The fragment of a flat-shaded placement as the other triangles' fragments are: its normal
|
||||
/// the outward normal of its triangle (toward the eye on a front face, away on a back face, as
|
||||
/// the triangles are wound outward).
|
||||
fn flat_fragment(i: FOut, front: bool) -> TOut {
|
||||
var n = cross(dpdx(i.rp), dpdy(i.rp));
|
||||
let toward = select(u.back.xyz, -i.rp, u.eye.w > 0.5);
|
||||
n = n * inverseSqrt(max(dot(n, n), 1e-30));
|
||||
if ((dot(n, toward) < 0.0) == front) { n = -n; }
|
||||
var o: TOut;
|
||||
o.pos = i.pos;
|
||||
o.n = n;
|
||||
o.c = i.c;
|
||||
o.wp = i.rp + u.eye.xyz;
|
||||
return o;
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_solid_flat(i: FOut, @builtin(front_facing) front: bool) -> @location(0) vec4<f32> {
|
||||
let t = flat_fragment(i, front);
|
||||
let c = solid(t, front);
|
||||
return c;
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_solid_cut_flat(i: FOut, @builtin(front_facing) front: bool) -> CutOut {
|
||||
let t = flat_fragment(i, front);
|
||||
var o: CutOut;
|
||||
o.depth = pushed(cap_depth(t.wp, t.pos.z));
|
||||
o.c = solid(t, front);
|
||||
return o;
|
||||
}
|
||||
|
||||
/// Weighted blended order-independent transparency (`view/oit.rs`): a see-through fragment's
|
||||
/// colour, premultiplied and weighted by its alpha and nearness, into the accumulation target,
|
||||
/// and its alpha into the revealage target (which keeps what is behind it by 1 - alpha).
|
||||
struct Oit {
|
||||
@location(0) accum: vec4<f32>,
|
||||
@location(1) reveal: vec4<f32>,
|
||||
};
|
||||
|
||||
fn oit(c: vec4<f32>, z: f32) -> Oit {
|
||||
let a = clamp(c.a, 0.0, 1.0);
|
||||
// Depth 0 near and 1 far, whichever way the buffer runs.
|
||||
let d = select(z, 1.0 - z, reversed());
|
||||
let w = clamp(a * max(1e-2, 3e3 * pow(1.0 - d, 3.0)), 1e-2, 3e3);
|
||||
var o: Oit;
|
||||
o.accum = vec4<f32>(c.rgb * a, a) * w;
|
||||
o.reveal = vec4<f32>(a);
|
||||
return o;
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_oit(i: TOut) -> Oit {
|
||||
if (clipped(i.wp)) { discard; }
|
||||
return oit(shade(i), i.pos.z);
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_oit_flat(i: FOut, @builtin(front_facing) front: bool) -> Oit {
|
||||
let t = flat_fragment(i, front);
|
||||
let o = oit(shade(t), t.pos.z);
|
||||
if (clipped(t.wp)) { discard; }
|
||||
return o;
|
||||
}
|
||||
|
||||
/// A see-through flat-shaded placement (faded or glass), shaded like `fs_tri`.
|
||||
@fragment
|
||||
fn fs_tri_flat(i: FOut, @builtin(front_facing) front: bool) -> @location(0) vec4<f32> {
|
||||
let t = flat_fragment(i, front);
|
||||
let c = shade(t);
|
||||
if (clipped(t.wp)) { discard; }
|
||||
return c;
|
||||
}
|
||||
|
||||
@fragment
|
||||
fn fs_ao_depth_flat(i: FOut, @builtin(front_facing) front: bool) -> AoDepth {
|
||||
let t = flat_fragment(i, front);
|
||||
return opaque_depth(t, front);
|
||||
}
|
||||
|
||||
/// Opaque model surfaces: cut by the section plane/// Opaque model surfaces: cut by the section plane, the inside shows as a flat cap colour.
|
||||
@fragment
|
||||
fn fs_solid(i: TOut, @builtin(front_facing) front: bool) -> @location(0) vec4<f32> {
|
||||
let c = solid(i, front);
|
||||
@@ -122,7 +255,9 @@ fn solid(i: TOut, front: bool) -> vec4<f32> {
|
||||
if (clipped(i.wp)) { discard; }
|
||||
if (!front && length(u.clip.xyz) > 0.5) {
|
||||
// The cut face in its body's colour ("from component" colouring), tinted toward the
|
||||
// cap colour so it reads as a cut, hatched at 45 degrees on screen.
|
||||
// cap colour so it reads as a cut, hatched at 45 degrees on screen; with the hatch off
|
||||
// (`u.cap.a` 0), plain in the body's own colour.
|
||||
if (u.cap.a < 0.5) { return out_color(vec4<f32>(i.c.rgb, 1.0)); }
|
||||
let base = mix(i.c.rgb, u.cap.rgb, 0.35);
|
||||
let h = fract((i.pos.x + i.pos.y) / 9.0);
|
||||
return out_color(vec4<f32>(select(base, base * 0.6, h < 0.22), 1.0));
|
||||
@@ -150,6 +285,11 @@ struct AoDepth {
|
||||
|
||||
@fragment
|
||||
fn fs_ao_depth(i: TOut, @builtin(front_facing) front: bool) -> AoDepth {
|
||||
return opaque_depth(i, front);
|
||||
}
|
||||
|
||||
/// The AO prepass's depth of an opaque surface's fragment.
|
||||
fn opaque_depth(i: TOut, front: bool) -> AoDepth {
|
||||
if (clipped(i.wp) || length(i.n) < 0.5) { discard; }
|
||||
var depth = i.pos.z;
|
||||
if (!front && length(u.clip.xyz) > 0.5) { depth = cap_depth(i.wp, i.pos.z); }
|
||||
@@ -286,6 +426,20 @@ fn fs_tri(i: TOut) -> @location(0) vec4<f32> {
|
||||
return shade(i);
|
||||
}
|
||||
|
||||
/// A whole hovered body, lit over the model from its own plan triangles in a lifted colour.
|
||||
@fragment
|
||||
fn fs_hl_hover(i: TOut) -> @location(0) vec4<f32> {
|
||||
if (clipped(i.wp)) { discard; }
|
||||
return lit_color(i, 1.0, vec4<f32>(i.c.rgb + u.tint.rgb, i.c.a));
|
||||
}
|
||||
|
||||
/// A whole selected body, lit over the model from its own plan triangles in the selection colour.
|
||||
@fragment
|
||||
fn fs_hl_selected(i: TOut) -> @location(0) vec4<f32> {
|
||||
if (clipped(i.wp)) { discard; }
|
||||
return lit_color(i, 1.0, vec4<f32>(u.sel.rgb, i.c.a));
|
||||
}
|
||||
|
||||
/// Reference planes: shaded like `fs_tri`, but never cut by the section plane.
|
||||
@fragment
|
||||
fn fs_tri_all(i: TOut) -> @location(0) vec4<f32> {
|
||||
@@ -297,9 +451,15 @@ fn shade(i: TOut) -> vec4<f32> {
|
||||
}
|
||||
|
||||
fn lit(i: TOut, visibility: f32) -> vec4<f32> {
|
||||
return lit_color(i, visibility, i.c);
|
||||
}
|
||||
|
||||
/// [`lit`] in a colour of its own: a whole highlighted body is lit in its colour lifted by the
|
||||
/// hover amount, or in the selection colour, from the model's own plan triangles.
|
||||
fn lit_color(i: TOut, visibility: f32, base: vec4<f32>) -> vec4<f32> {
|
||||
// A zero normal marks flat colour (selection fills, translucent planes).
|
||||
if (length(i.n) < 0.5) {
|
||||
return out_color(i.c);
|
||||
return out_color(base);
|
||||
}
|
||||
let v = normalize(u.back.xyz);
|
||||
var n = normalize(i.n);
|
||||
@@ -310,7 +470,7 @@ fn lit(i: TOut, visibility: f32) -> vec4<f32> {
|
||||
let h = normalize(key + v);
|
||||
let spec = pow(max(dot(n, h), 0.0), 40.0) * 0.25;
|
||||
let k = 0.42 + 0.38 * diff + 0.25 * fill - (0.42 + 0.25 * fill) * (1.0 - visibility);
|
||||
return out_color(vec4<f32>(min(i.c.rgb * k + vec3<f32>(spec), vec3<f32>(1.0)), i.c.a));
|
||||
return out_color(vec4<f32>(min(base.rgb * k + vec3<f32>(spec), vec3<f32>(1.0)), base.a));
|
||||
}
|
||||
|
||||
// Lines, decals and ghosts are drawn at their own depth: opaque faces are pushed back by their
|
||||
|
||||
@@ -8,6 +8,35 @@ const fn icon_primary(rgb: [u8; 3]) -> Color32 {
|
||||
impl Tokens {
|
||||
pub const fn light() -> Tokens {
|
||||
Tokens {
|
||||
file_dim: Color32::from_rgb(58, 70, 86),
|
||||
file_recovery_well: Color32::from_rgb(247, 226, 184),
|
||||
file_action_height: 32.0,
|
||||
file_back_height: 40.0,
|
||||
file_recovery_icon: 32.0,
|
||||
file_grid_gap: 14.0,
|
||||
file_background: Color32::from_rgb(247, 249, 251),
|
||||
file_surface: Color32::WHITE,
|
||||
file_border: Color32::from_rgb(224, 229, 236),
|
||||
file_image_tint: Color32::WHITE,
|
||||
file_rail: Color32::from_rgb(35, 110, 173),
|
||||
file_rail_ink: Color32::WHITE,
|
||||
file_rail_hover: Color32::from_rgb(43, 118, 180),
|
||||
file_primary: Color32::from_rgb(227, 240, 251),
|
||||
file_primary_ink: Color32::from_rgb(26, 80, 127),
|
||||
file_primary_border: Color32::from_rgb(50, 139, 211),
|
||||
file_recovery: Color32::from_rgb(255, 246, 229),
|
||||
file_recovery_ink: Color32::from_rgb(122, 74, 5),
|
||||
file_recovery_border: Color32::from_rgb(240, 210, 154),
|
||||
file_nav_width: 248.0,
|
||||
file_nav_height: 38.0,
|
||||
file_tile_height: 84.0,
|
||||
file_tile_icon: 44.0,
|
||||
file_recent_height: 52.0,
|
||||
file_sample_image_height: 84.0,
|
||||
file_content_inset_x: 40.0,
|
||||
file_content_inset_y: 32.0,
|
||||
file_section_gap: 28.0,
|
||||
font_start_title: 28.0,
|
||||
space_2: 2.0,
|
||||
space_3: 3.0,
|
||||
space_4: 4.0,
|
||||
@@ -107,7 +136,6 @@ impl Tokens {
|
||||
error: Color32::from_rgb(214, 54, 54),
|
||||
warning: Color32::from_rgb(222, 150, 30),
|
||||
icon: Color32::from_rgb(70, 78, 92),
|
||||
icon_fill: Color32::from_rgb(178, 196, 222),
|
||||
timeline: Color32::from_rgb(232, 235, 240),
|
||||
hover: Color32::from_rgb(226, 234, 246),
|
||||
sel_face: Color32::from_rgb(76, 127, 203),
|
||||
@@ -157,8 +185,6 @@ impl Tokens {
|
||||
dialog_bg: Color32::from_rgb(250, 251, 252),
|
||||
dialog_border: Color32::from_rgb(213, 219, 227),
|
||||
chip: Color32::from_rgb(38, 120, 218),
|
||||
heading_bg: Color32::from_rgb(218, 223, 231),
|
||||
subheading_bg: Color32::from_rgb(234, 237, 242),
|
||||
profile_fill: Color32::from_rgba_unmultiplied_const(255, 196, 120, 70),
|
||||
glyph_bg: Color32::WHITE,
|
||||
glyph_edge: Color32::from_rgb(190, 110, 100),
|
||||
@@ -203,31 +229,8 @@ impl Tokens {
|
||||
Color32::from_rgb(204, 0, 140),
|
||||
],
|
||||
analysis: AnalysisColors::DEFAULT,
|
||||
icons: IconColors {
|
||||
sheet: Color32::from_rgb(170, 200, 240),
|
||||
sheet_2: Color32::from_rgb(150, 185, 235),
|
||||
sheet_light: Color32::from_rgb(214, 229, 248),
|
||||
sheet_line: Color32::from_rgb(127, 166, 218),
|
||||
highlight: Color32::WHITE,
|
||||
glint: Color32::from_rgba_premultiplied(160, 160, 160, 160),
|
||||
folder: Color32::from_rgb(236, 200, 110),
|
||||
plane: Color32::from_rgb(244, 214, 150),
|
||||
fold: Color32::from_rgb(130, 140, 160),
|
||||
stripe: Color32::from_gray(30),
|
||||
sky: Color32::from_rgb(190, 205, 230),
|
||||
floor: Color32::from_rgb(60, 62, 70),
|
||||
paint: [Color32::from_rgb(220, 70, 60), Color32::from_rgb(70, 150, 230), Color32::from_rgb(240, 200, 60)],
|
||||
axes: [Color32::from_rgb(210, 60, 60), Color32::from_rgb(60, 160, 60), Color32::from_rgb(60, 100, 220)],
|
||||
access: [Color32::from_rgb(70, 180, 90), Color32::from_rgb(220, 70, 60)],
|
||||
draft: [Color32::from_rgb(70, 180, 90), Color32::from_rgb(235, 200, 50)],
|
||||
curvature: [Color32::from_rgb(60, 110, 230), Color32::from_rgb(70, 190, 90), Color32::from_rgb(225, 60, 45)],
|
||||
interference: Color32::from_rgb(225, 70, 60),
|
||||
warning: Color32::from_rgb(250, 200, 60),
|
||||
agent: Color32::from_rgb(168, 85, 247),
|
||||
marker_halo: Color32::from_black_alpha(150),
|
||||
},
|
||||
app_bar_icon: [Color32::from_rgb(225, 230, 238), Color32::from_rgb(120, 140, 170), Color32::from_rgb(120, 190, 255)],
|
||||
logo: [Color32::from_rgb(96, 158, 236), Color32::from_rgb(58, 136, 238), Color32::from_rgb(55, 108, 197), Color32::WHITE],
|
||||
icons: IconColors { highlight: Color32::WHITE, agent: Color32::from_rgb(168, 85, 247), marker_halo: Color32::from_black_alpha(150) },
|
||||
logo: [Color32::from_rgb(96, 158, 236), Color32::from_rgb(58, 136, 238), Color32::from_rgb(55, 108, 197)],
|
||||
}
|
||||
}
|
||||
pub const fn dark() -> Tokens {
|
||||
@@ -262,6 +265,19 @@ impl Tokens {
|
||||
t.sketch_mode_tint = 0.12;
|
||||
t.sketch_footer_icon_size = 15.0;
|
||||
t.font_section_tracking = 0.04;
|
||||
t.file_dim = Color32::from_rgb(180, 187, 200);
|
||||
t.file_recovery_well = Color32::from_rgb(92, 68, 32);
|
||||
t.file_background = Color32::from_rgb(31, 35, 43);
|
||||
t.file_surface = Color32::from_rgb(39, 43, 52);
|
||||
t.file_border = Color32::from_rgb(63, 69, 82);
|
||||
t.file_rail = Color32::from_rgb(30, 80, 128);
|
||||
t.file_rail_hover = Color32::from_rgb(46, 99, 149);
|
||||
t.file_primary = Color32::from_rgb(27, 48, 72);
|
||||
t.file_primary_ink = Color32::from_rgb(156, 199, 245);
|
||||
t.file_primary_border = Color32::from_rgb(58, 136, 238);
|
||||
t.file_recovery = Color32::from_rgb(67, 51, 28);
|
||||
t.file_recovery_ink = Color32::from_rgb(245, 204, 137);
|
||||
t.file_recovery_border = Color32::from_rgb(115, 88, 43);
|
||||
t.app_bar = Color32::from_rgb(28, 31, 38);
|
||||
t.toolbar = Color32::from_rgb(39, 43, 52);
|
||||
t.panel = Color32::from_rgb(39, 43, 52);
|
||||
@@ -294,19 +310,18 @@ impl Tokens {
|
||||
t.render_ink = Color32::from_rgb(224, 116, 174);
|
||||
t.render_soft = Color32::from_rgb(64, 35, 54);
|
||||
t.tab_on_fill_dark = Color32::BLACK;
|
||||
t.dialog_body = Color32::from_rgb(59, 68, 83);
|
||||
t.dialog_body = Color32::from_rgb(39, 43, 52);
|
||||
t.dialog_footer = Color32::from_rgb(47, 52, 62);
|
||||
t.dialog_rule = Color32::from_rgb(53, 59, 71);
|
||||
t.control_fill = Color32::from_rgb(39, 43, 52);
|
||||
t.control_fill = Color32::from_rgb(28, 31, 38);
|
||||
t.control_border = Color32::from_rgb(74, 82, 98);
|
||||
t.dialog_label = Color32::from_rgb(180, 187, 200);
|
||||
t.dialog_label = t.text;
|
||||
t.selected_ink = Color32::from_rgb(156, 199, 245);
|
||||
t.selected_bg = Color32::from_rgb(42, 70, 110);
|
||||
t.construction_geom = icon_primary(crate::icon_svg::CONSTRUCTION_PRIMARY[1]);
|
||||
t.error = Color32::from_rgb(240, 100, 96);
|
||||
t.warning = Color32::from_rgb(236, 170, 70);
|
||||
t.icon = Color32::from_rgb(208, 214, 226);
|
||||
t.icon_fill = Color32::from_rgb(86, 112, 150);
|
||||
t.timeline = Color32::from_rgb(33, 37, 45);
|
||||
t.hover = Color32::from_rgb(54, 61, 74);
|
||||
t.hover_edge_halo = Color32::from_rgb(203, 203, 203);
|
||||
@@ -325,11 +340,9 @@ impl Tokens {
|
||||
t.dimension_driven = Color32::from_rgb(142, 150, 164);
|
||||
t.sketch_point_free = Color32::from_rgb(92, 150, 255);
|
||||
t.profile_fill = Color32::from_rgba_unmultiplied_const(120, 150, 200, 40);
|
||||
t.dialog_bg = Color32::from_rgb(59, 68, 83);
|
||||
t.dialog_border = Color32::from_rgb(72, 83, 99);
|
||||
t.dialog_bg = Color32::from_rgb(39, 43, 52);
|
||||
t.dialog_border = Color32::from_rgb(63, 69, 82);
|
||||
t.chip = Color32::from_rgb(59, 101, 168);
|
||||
t.heading_bg = Color32::from_rgb(38, 44, 55);
|
||||
t.subheading_bg = Color32::from_rgb(48, 55, 68);
|
||||
t.glyph_bg = Color32::from_rgb(44, 50, 60);
|
||||
t.glyph_edge = Color32::from_rgb(200, 130, 120);
|
||||
t.glyph_text = icon_primary(crate::icon_svg::CONSTRAINT_PRIMARY[1]);
|
||||
@@ -344,7 +357,7 @@ impl Tokens {
|
||||
t.bend_up = Color32::from_rgb(110, 200, 120);
|
||||
t.bend_down = Color32::from_rgb(240, 150, 80);
|
||||
t.form_ink = t.text;
|
||||
t.form_dim = t.text_dim;
|
||||
t.form_dim = Color32::from_rgb(180, 187, 200);
|
||||
t.form_primary = t.accent;
|
||||
t.form_error = t.error;
|
||||
t.form_error_fill = t.timeline_item_error;
|
||||
@@ -373,15 +386,8 @@ impl Tokens {
|
||||
if !dark {
|
||||
t.form_success = Color32::from_rgb(39, 88, 78);
|
||||
}
|
||||
// The icons that show the same meanings follow; on the dark toolbar the blue is a little
|
||||
// stronger, to stay clear of the icon fill.
|
||||
let good = if dark { Color32::from_rgb(35, 115, 245) } else { Color32::from_rgb(51, 115, 230) };
|
||||
t.icons.axes[0] = t.triad[0];
|
||||
t.icons.axes[1] = t.triad[1];
|
||||
t.icons.access = [good, Color32::from_rgb(217, 102, 13)];
|
||||
t.construction_geom = icon_primary(crate::icon_svg::CONSTRUCTION_RED_GREEN[dark as usize]);
|
||||
t.glyph_text = icon_primary(crate::icon_svg::CONSTRAINT_RED_GREEN[dark as usize]);
|
||||
t.icons.draft = [good, Color32::from_rgb(242, 230, 153)];
|
||||
t.surface_accent = if dark { Color32::from_rgb(200, 135, 55) } else { Color32::from_rgb(164, 80, 0) };
|
||||
t.mesh_accent = if dark { Color32::from_rgb(190, 175, 70) } else { Color32::from_rgb(130, 103, 0) };
|
||||
t.form_accent = if dark { Color32::from_rgb(165, 135, 220) } else { Color32::from_rgb(115, 73, 205) };
|
||||
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#ffbc48",
|
||||
"accent_soft": "#3c290d",
|
||||
"agent_busy": "#ffad38",
|
||||
"agent_ok": "#d4902f",
|
||||
"app_bar": "#090602",
|
||||
"app_bar_hover": "#ffad3818",
|
||||
"app_bar_hover_button": "#ffad3820",
|
||||
"app_bar_hover_strong": "#ffad3830",
|
||||
"app_bar_hover_subtle": "#ffad3810",
|
||||
"app_bar_icon": [
|
||||
"#efa335",
|
||||
"#9b6922",
|
||||
"#ffad38"
|
||||
],
|
||||
"app_bar_separator": "#533812",
|
||||
"app_bar_tab_active": "#1d1406",
|
||||
"app_bar_text": "#f3ca87",
|
||||
"axis_x": "#f3a535",
|
||||
"axis_y": "#ffad38",
|
||||
"axis_z": "#9b6922",
|
||||
"bend_down": "#ba7e29",
|
||||
"bend_up": "#d4902f",
|
||||
"body": "#382309",
|
||||
"body_edge": "#ffbc48",
|
||||
"body_selected": "#543615",
|
||||
"border": "#533812",
|
||||
"box_crossing": "#d4902f",
|
||||
"box_window": "#ffad38",
|
||||
"chip": "#4a3210",
|
||||
"construction_geom": "#ad7626",
|
||||
"construction_plane": "#c6872c18",
|
||||
"continuity": [
|
||||
"#c5862b",
|
||||
"#c6872c",
|
||||
"#d38f2e",
|
||||
"#b07827"
|
||||
],
|
||||
"control_border": "#533812",
|
||||
"control_fill": "#1d1406",
|
||||
"cube_border": "#533812",
|
||||
"cube_face": "#36250c",
|
||||
"cube_hover": "#563a13",
|
||||
"cube_text": "#efa335",
|
||||
"dialog_bg": "#100b04",
|
||||
"dialog_body": "#1d1406",
|
||||
"dialog_border": "#533812",
|
||||
"dialog_footer": "#100b04",
|
||||
"dialog_label": "#f3ca87",
|
||||
"dialog_rule": "#3b280d",
|
||||
"dimension": "#ffe2a5",
|
||||
"dimension_driven": "#9b6922",
|
||||
"error": "#fff0ca",
|
||||
"field": "#100b04",
|
||||
"form_accent": "#d6922f",
|
||||
"form_dim": "#9b6922",
|
||||
"form_error": "#fff0ca",
|
||||
"form_error_fill": "#46300f",
|
||||
"form_fill": "#7e561c",
|
||||
"form_ink": "#f3ca87",
|
||||
"form_primary": "#ffad38",
|
||||
"form_soft": "#291c09",
|
||||
"form_success": "#d4902f",
|
||||
"form_success_fill": "#3b280d",
|
||||
"form_tab_ink": "#f0a335",
|
||||
"gizmo": [
|
||||
"#f3a535",
|
||||
"#ffad38",
|
||||
"#9b6922"
|
||||
],
|
||||
"glyph_bg": "#201607",
|
||||
"glyph_edge": "#bd812a",
|
||||
"glyph_text": "#fff0ca",
|
||||
"grid": "#21170b",
|
||||
"grid_major": "#362511",
|
||||
"heading_bg": "#080602",
|
||||
"hover": "#3c290d",
|
||||
"hover_edge": "#ffbc48",
|
||||
"hover_edge_halo": "#170d03",
|
||||
"hover_profile": "#ffbc4826",
|
||||
"hover_profile_edge": "#ffbc48",
|
||||
"icon": "#f3ca87",
|
||||
"icon_fill": "#b87d28",
|
||||
"icons.access": [
|
||||
"#c5862b",
|
||||
"#ac7526"
|
||||
],
|
||||
"icons.agent": "#cb8a2d",
|
||||
"icons.axes": [
|
||||
"#f3a535",
|
||||
"#ffad38",
|
||||
"#9b6922"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#c0832a",
|
||||
"#c5862b",
|
||||
"#ac7526"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#cb8a2d",
|
||||
"#d38f2e"
|
||||
],
|
||||
"icons.floor": "#76501a",
|
||||
"icons.fold": "#9f6c23",
|
||||
"icons.folder": "#d38f2e",
|
||||
"icons.glint": "#f4a63699",
|
||||
"icons.highlight": "#f6a736",
|
||||
"icons.interference": "#fff0ca",
|
||||
"icons.marker_halo": "#171005cc",
|
||||
"icons.paint": [
|
||||
"#cc8b2d",
|
||||
"#c6872c",
|
||||
"#eea234"
|
||||
],
|
||||
"icons.plane": "#d38f2e",
|
||||
"icons.sheet": "#c3852b",
|
||||
"icons.sheet_2": "#a26e24",
|
||||
"icons.sheet_light": "#eca034",
|
||||
"icons.sheet_line": "#f4a636",
|
||||
"icons.sky": "#654516",
|
||||
"icons.stripe": "#171005",
|
||||
"icons.warning": "#ffd274",
|
||||
"interference": "#fff0ca",
|
||||
"logo": [
|
||||
"#ffad38",
|
||||
"#eda134",
|
||||
"#855a1d"
|
||||
],
|
||||
"manipulator": "#ffad38",
|
||||
"mesh_accent": "#d6922f",
|
||||
"mesh_fill": "#7e561c",
|
||||
"mesh_ink": "#f0a335",
|
||||
"mesh_soft": "#291c09",
|
||||
"on_accent": "#170d03",
|
||||
"origin_plane": "#c6872c20",
|
||||
"origin_plane_edge": "#c6872c80",
|
||||
"origin_plane_hover": "#ffad3840",
|
||||
"origin_point": "#c48b32",
|
||||
"overlay": "#100b04",
|
||||
"panel": "#100b04",
|
||||
"panel_header": "#1d1406",
|
||||
"preview_add": "#8e5c20",
|
||||
"preview_cut": "#ffbc4855",
|
||||
"preview_new": "#9f6c28",
|
||||
"preview_sketch": "#d4902f",
|
||||
"profile_fill": "#be812f20",
|
||||
"render_accent": "#d6922f",
|
||||
"render_fill": "#7e561c",
|
||||
"render_ink": "#f0a335",
|
||||
"render_soft": "#291c09",
|
||||
"rubber_band": "#ffad38",
|
||||
"section_cap": "#ba7e29",
|
||||
"sel_edge": "#ffbc48",
|
||||
"sel_edge_rim": "#9d6a24",
|
||||
"sel_face": "#66431b",
|
||||
"sel_profile": "#5e3d14",
|
||||
"sel_profile_edge": "#ffbc48",
|
||||
"sel_vertex": "#ffbc48",
|
||||
"selected_bg": "#3c290d",
|
||||
"selected_ink": "#ffe8b3",
|
||||
"sheet_fill": "#7e561c",
|
||||
"sheet_ink": "#f0a335",
|
||||
"sheet_soft": "#291c09",
|
||||
"sketch": "#ffbc48",
|
||||
"sketch_accent": "#d6922f",
|
||||
"sketch_centerline": "#ba7e29",
|
||||
"sketch_construction": "#ad7626",
|
||||
"sketch_fixed": "#c68b2f",
|
||||
"sketch_ink": "#f0a335",
|
||||
"sketch_locked": "#d4902f",
|
||||
"sketch_lost": "#fff0ca",
|
||||
"sketch_point": "#ffbc48",
|
||||
"sketch_point_free": "#ffbc48",
|
||||
"sketch_projected": "#cb8a2d",
|
||||
"sketch_soft": "#291c09",
|
||||
"subheading_bg": "#0c0803",
|
||||
"surface_accent": "#d6922f",
|
||||
"surface_fill": "#7e561c",
|
||||
"surface_ink": "#f0a335",
|
||||
"surface_soft": "#291c09",
|
||||
"tab_on_fill_dark": "#170d03",
|
||||
"text": "#f3ca87",
|
||||
"text_dim": "#9b6922",
|
||||
"timeline": "#090602",
|
||||
"timeline_item": "#1d1406",
|
||||
"timeline_item_error": "#46300f",
|
||||
"timeline_marker": "#9b6922",
|
||||
"toolbar": "#100b04",
|
||||
"triad": [
|
||||
"#f3a535",
|
||||
"#ffad38",
|
||||
"#9b6922"
|
||||
],
|
||||
"viewport_bottom": "#090603",
|
||||
"viewport_top": "#090603",
|
||||
"warning": "#ffd274"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Amber Phosphor"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#66ddff",
|
||||
"accent_soft": "#153c60",
|
||||
"agent_busy": "#66ddff",
|
||||
"agent_ok": "#6ee0bb",
|
||||
"app_bar": "#07192f",
|
||||
"app_bar_hover": "#c6ecff18",
|
||||
"app_bar_hover_button": "#c6ecff20",
|
||||
"app_bar_hover_strong": "#c6ecff30",
|
||||
"app_bar_hover_subtle": "#c6ecff10",
|
||||
"app_bar_icon": [
|
||||
"#e3f0fa",
|
||||
"#94b2cb",
|
||||
"#66ddff"
|
||||
],
|
||||
"app_bar_separator": "#315777",
|
||||
"app_bar_tab_active": "#112d4b",
|
||||
"app_bar_text": "#e3f0fa",
|
||||
"axis_x": "#ec9e99",
|
||||
"axis_y": "#9ddab7",
|
||||
"axis_z": "#91c8ff",
|
||||
"bend_down": "#e7b374",
|
||||
"bend_up": "#6ee0bb",
|
||||
"body": "#8baccb",
|
||||
"body_edge": "#eef8ff",
|
||||
"body_selected": "#58bbdf",
|
||||
"border": "#315777",
|
||||
"box_crossing": "#6ee0bb",
|
||||
"box_window": "#66ddff",
|
||||
"chip": "#1f5278",
|
||||
"construction_geom": "#78b8dc",
|
||||
"construction_plane": "#b7dcf01c",
|
||||
"continuity": [
|
||||
"#6ee0bb",
|
||||
"#66ddff",
|
||||
"#f0d18c",
|
||||
"#b6a9e4"
|
||||
],
|
||||
"control_border": "#315777",
|
||||
"control_fill": "#112d4b",
|
||||
"cube_border": "#315777",
|
||||
"cube_face": "#163b60",
|
||||
"cube_hover": "#285f89",
|
||||
"cube_text": "#e3f0fa",
|
||||
"dialog_bg": "#0c223c",
|
||||
"dialog_body": "#112d4b",
|
||||
"dialog_border": "#315777",
|
||||
"dialog_footer": "#0c223c",
|
||||
"dialog_label": "#e3f0fa",
|
||||
"dialog_rule": "#254764",
|
||||
"dimension": "#e3f0fa",
|
||||
"dimension_driven": "#94b2cb",
|
||||
"error": "#ff968d",
|
||||
"field": "#071d35",
|
||||
"form_accent": "#78c6e8",
|
||||
"form_dim": "#94b2cb",
|
||||
"form_error": "#ff968d",
|
||||
"form_error_fill": "#422d40",
|
||||
"form_fill": "#4386ac",
|
||||
"form_ink": "#c3e6f6",
|
||||
"form_primary": "#66ddff",
|
||||
"form_soft": "#132f4c",
|
||||
"form_success": "#6ee0bb",
|
||||
"form_success_fill": "#153e47",
|
||||
"form_tab_ink": "#c3e6f6",
|
||||
"gizmo": [
|
||||
"#ec9e99",
|
||||
"#9ddab7",
|
||||
"#91c8ff"
|
||||
],
|
||||
"glyph_bg": "#0a233e",
|
||||
"glyph_edge": "#e6b3a6",
|
||||
"glyph_text": "#e6b3a6",
|
||||
"grid": "#214975",
|
||||
"grid_major": "#315d89",
|
||||
"heading_bg": "#06111e",
|
||||
"hover": "#153c60",
|
||||
"hover_edge": "#eef8ff",
|
||||
"hover_edge_halo": "#092c50",
|
||||
"hover_profile": "#66ddff26",
|
||||
"hover_profile_edge": "#66ddff",
|
||||
"icon": "#e3f0fa",
|
||||
"icon_fill": "#a4c1dc",
|
||||
"icons.access": [
|
||||
"#6ee0bb",
|
||||
"#ff968d"
|
||||
],
|
||||
"icons.agent": "#9cd6ef",
|
||||
"icons.axes": [
|
||||
"#ec9e99",
|
||||
"#9ddab7",
|
||||
"#91c8ff"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#91c8ff",
|
||||
"#6ee0bb",
|
||||
"#ff968d"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#9ddab7",
|
||||
"#f0d18c"
|
||||
],
|
||||
"icons.floor": "#557c9e",
|
||||
"icons.fold": "#7fa5c5",
|
||||
"icons.folder": "#b9d8ec",
|
||||
"icons.glint": "#eaf6ff99",
|
||||
"icons.highlight": "#eef8ff",
|
||||
"icons.interference": "#ff968d",
|
||||
"icons.marker_halo": "#07192fcc",
|
||||
"icons.paint": [
|
||||
"#a5d4ec",
|
||||
"#66ddff",
|
||||
"#e3f0fa"
|
||||
],
|
||||
"icons.plane": "#bad8ec",
|
||||
"icons.sheet": "#a4c9e5",
|
||||
"icons.sheet_2": "#7ea9cb",
|
||||
"icons.sheet_light": "#deeffb",
|
||||
"icons.sheet_line": "#eaf6ff",
|
||||
"icons.sky": "#416b92",
|
||||
"icons.stripe": "#07192f",
|
||||
"icons.warning": "#f0d18c",
|
||||
"interference": "#ff968d",
|
||||
"logo": [
|
||||
"#d8f4ff",
|
||||
"#8edcf5",
|
||||
"#4386ac"
|
||||
],
|
||||
"manipulator": "#66ddff",
|
||||
"mesh_accent": "#78c6e8",
|
||||
"mesh_fill": "#4386ac",
|
||||
"mesh_ink": "#c3e6f6",
|
||||
"mesh_soft": "#132f4c",
|
||||
"on_accent": "#07192f",
|
||||
"origin_plane": "#b7dcf024",
|
||||
"origin_plane_edge": "#a3cce480",
|
||||
"origin_plane_hover": "#66ddff45",
|
||||
"origin_point": "#aad0ed",
|
||||
"overlay": "#0c223c",
|
||||
"panel": "#0c223c",
|
||||
"panel_header": "#112d4b",
|
||||
"preview_add": "#a9def2",
|
||||
"preview_cut": "#ff968d55",
|
||||
"preview_new": "#d2e8f7",
|
||||
"preview_sketch": "#6ee0bb",
|
||||
"profile_fill": "#c9eaff12",
|
||||
"render_accent": "#78c6e8",
|
||||
"render_fill": "#4386ac",
|
||||
"render_ink": "#c3e6f6",
|
||||
"render_soft": "#132f4c",
|
||||
"rubber_band": "#66ddff",
|
||||
"section_cap": "#e7b374",
|
||||
"sel_edge": "#66ddff",
|
||||
"sel_edge_rim": "#c5f3ff",
|
||||
"sel_face": "#58bbdf",
|
||||
"sel_profile": "#1c799e",
|
||||
"sel_profile_edge": "#66ddff",
|
||||
"sel_vertex": "#66ddff",
|
||||
"selected_bg": "#153c60",
|
||||
"selected_ink": "#b6f2ff",
|
||||
"sheet_fill": "#4386ac",
|
||||
"sheet_ink": "#c3e6f6",
|
||||
"sheet_soft": "#132f4c",
|
||||
"sketch": "#eaf6ff",
|
||||
"sketch_accent": "#78c6e8",
|
||||
"sketch_centerline": "#e7b374",
|
||||
"sketch_construction": "#78b8dc",
|
||||
"sketch_fixed": "#e3f0fa",
|
||||
"sketch_ink": "#c3e6f6",
|
||||
"sketch_locked": "#6ee0bb",
|
||||
"sketch_lost": "#ff968d",
|
||||
"sketch_point": "#e3f0fa",
|
||||
"sketch_point_free": "#66ddff",
|
||||
"sketch_projected": "#9cd6ef",
|
||||
"sketch_soft": "#132f4c",
|
||||
"subheading_bg": "#091a2d",
|
||||
"surface_accent": "#78c6e8",
|
||||
"surface_fill": "#4386ac",
|
||||
"surface_ink": "#c3e6f6",
|
||||
"surface_soft": "#132f4c",
|
||||
"tab_on_fill_dark": "#07192f",
|
||||
"text": "#e3f0fa",
|
||||
"text_dim": "#94b2cb",
|
||||
"timeline": "#07192f",
|
||||
"timeline_item": "#112d4b",
|
||||
"timeline_item_error": "#422d40",
|
||||
"timeline_marker": "#94b2cb",
|
||||
"toolbar": "#0c223c",
|
||||
"triad": [
|
||||
"#ec9e99",
|
||||
"#9ddab7",
|
||||
"#91c8ff"
|
||||
],
|
||||
"viewport_bottom": "#143b67",
|
||||
"viewport_top": "#143b67",
|
||||
"warning": "#f0d18c"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Blueprint"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#cba6f7",
|
||||
"accent_soft": "#302b46",
|
||||
"agent_busy": "#cba6f7",
|
||||
"agent_ok": "#a6e3a1",
|
||||
"app_bar": "#181825",
|
||||
"app_bar_hover": "#cdd6f418",
|
||||
"app_bar_hover_button": "#cdd6f422",
|
||||
"app_bar_hover_strong": "#cdd6f430",
|
||||
"app_bar_hover_subtle": "#cdd6f410",
|
||||
"app_bar_icon": [
|
||||
"#cdd6f4",
|
||||
"#a6adc8",
|
||||
"#cba6f7"
|
||||
],
|
||||
"app_bar_separator": "#45475a",
|
||||
"app_bar_tab_active": "#313244",
|
||||
"app_bar_text": "#cdd6f4",
|
||||
"axis_x": "#f38ba8",
|
||||
"axis_y": "#a6e3a1",
|
||||
"axis_z": "#477dc8",
|
||||
"bend_down": "#f9e2af",
|
||||
"bend_up": "#a6e3a1",
|
||||
"body": "#586382",
|
||||
"body_edge": "#477dc8",
|
||||
"body_selected": "#365280",
|
||||
"border": "#45475a",
|
||||
"box_crossing": "#a6e3a1",
|
||||
"box_window": "#cba6f7",
|
||||
"chip": "#cba6f7",
|
||||
"construction_geom": "#f9e2af",
|
||||
"construction_plane": "#f9e2af22",
|
||||
"continuity": [
|
||||
"#a6e3a1",
|
||||
"#477dc8",
|
||||
"#f9e2af",
|
||||
"#cba6f7"
|
||||
],
|
||||
"control_border": "#45475a",
|
||||
"control_fill": "#313244",
|
||||
"cube_border": "#45475a",
|
||||
"cube_face": "#313244",
|
||||
"cube_hover": "#302b46",
|
||||
"cube_text": "#cdd6f4",
|
||||
"dialog_bg": "#1e1e2e",
|
||||
"dialog_body": "#1e1e2e",
|
||||
"dialog_border": "#45475a",
|
||||
"dialog_footer": "#1e1e2e",
|
||||
"dialog_label": "#cdd6f4",
|
||||
"dialog_rule": "#45475a",
|
||||
"dimension": "#cdd6f4",
|
||||
"dimension_driven": "#a6adc8",
|
||||
"error": "#f38ba8",
|
||||
"field": "#181825",
|
||||
"form_accent": "#cba6f7",
|
||||
"form_dim": "#a6adc8",
|
||||
"form_error": "#f38ba8",
|
||||
"form_error_fill": "#493446",
|
||||
"form_fill": "#477dc8",
|
||||
"form_ink": "#cdd6f4",
|
||||
"form_primary": "#cba6f7",
|
||||
"form_soft": "#302b46",
|
||||
"form_success": "#a6e3a1",
|
||||
"form_success_fill": "#353f42",
|
||||
"form_tab_ink": "#cdd6f4",
|
||||
"gizmo": [
|
||||
"#f38ba8",
|
||||
"#a6e3a1",
|
||||
"#477dc8"
|
||||
],
|
||||
"glyph_bg": "#313244",
|
||||
"glyph_edge": "#f38ba8",
|
||||
"glyph_text": "#f38ba8",
|
||||
"grid": "#242531",
|
||||
"grid_major": "#363846",
|
||||
"heading_bg": "#0f0f17",
|
||||
"hover": "#302b46",
|
||||
"hover_edge": "#477dc8",
|
||||
"hover_edge_halo": "#11111b",
|
||||
"hover_profile": "#cba6f728",
|
||||
"hover_profile_edge": "#477dc8",
|
||||
"icon": "#cdd6f4",
|
||||
"icon_fill": "#a6adc8",
|
||||
"icons.access": [
|
||||
"#a6e3a1",
|
||||
"#f38ba8"
|
||||
],
|
||||
"icons.agent": "#cba6f7",
|
||||
"icons.axes": [
|
||||
"#f38ba8",
|
||||
"#a6e3a1",
|
||||
"#477dc8"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#477dc8",
|
||||
"#a6e3a1",
|
||||
"#f38ba8"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#a6e3a1",
|
||||
"#f9e2af"
|
||||
],
|
||||
"icons.floor": "#a6adc8",
|
||||
"icons.fold": "#a6adc8",
|
||||
"icons.folder": "#f9e2af",
|
||||
"icons.glint": "#cdd6f480",
|
||||
"icons.highlight": "#cdd6f4",
|
||||
"icons.interference": "#f38ba8",
|
||||
"icons.marker_halo": "#181825cc",
|
||||
"icons.paint": [
|
||||
"#f38ba8",
|
||||
"#477dc8",
|
||||
"#f9e2af"
|
||||
],
|
||||
"icons.plane": "#f9e2af",
|
||||
"icons.sheet": "#586382",
|
||||
"icons.sheet_2": "#586382",
|
||||
"icons.sheet_light": "#cdd6f4",
|
||||
"icons.sheet_line": "#477dc8",
|
||||
"icons.sky": "#586382",
|
||||
"icons.stripe": "#a6adc8",
|
||||
"icons.warning": "#f9e2af",
|
||||
"interference": "#f38ba8",
|
||||
"logo": [
|
||||
"#cba6f7",
|
||||
"#477dc8",
|
||||
"#586382"
|
||||
],
|
||||
"manipulator": "#cba6f7",
|
||||
"mesh_accent": "#cba6f7",
|
||||
"mesh_fill": "#477dc8",
|
||||
"mesh_ink": "#cdd6f4",
|
||||
"mesh_soft": "#302b46",
|
||||
"on_accent": "#06121b",
|
||||
"origin_plane": "#f9e2af28",
|
||||
"origin_plane_edge": "#f9e2af88",
|
||||
"origin_plane_hover": "#cba6f740",
|
||||
"origin_point": "#a6adc8",
|
||||
"overlay": "#1e1e2e",
|
||||
"panel": "#1e1e2e",
|
||||
"panel_header": "#313244",
|
||||
"preview_add": "#477dc8",
|
||||
"preview_cut": "#f38ba866",
|
||||
"preview_new": "#f9e2af",
|
||||
"preview_sketch": "#a6e3a1",
|
||||
"profile_fill": "#477dc822",
|
||||
"render_accent": "#cba6f7",
|
||||
"render_fill": "#477dc8",
|
||||
"render_ink": "#cdd6f4",
|
||||
"render_soft": "#302b46",
|
||||
"rubber_band": "#cba6f7",
|
||||
"section_cap": "#f9e2af",
|
||||
"sel_edge": "#477dc8",
|
||||
"sel_edge_rim": "#477dc8",
|
||||
"sel_face": "#365280",
|
||||
"sel_profile": "#365280",
|
||||
"sel_profile_edge": "#477dc8",
|
||||
"sel_vertex": "#477dc8",
|
||||
"selected_bg": "#365280",
|
||||
"selected_ink": "#cdd6f4",
|
||||
"sheet_fill": "#477dc8",
|
||||
"sheet_ink": "#cdd6f4",
|
||||
"sheet_soft": "#302b46",
|
||||
"sketch": "#477dc8",
|
||||
"sketch_accent": "#cba6f7",
|
||||
"sketch_centerline": "#f9e2af",
|
||||
"sketch_construction": "#f9e2af",
|
||||
"sketch_fixed": "#cdd6f4",
|
||||
"sketch_ink": "#cdd6f4",
|
||||
"sketch_locked": "#a6e3a1",
|
||||
"sketch_lost": "#f38ba8",
|
||||
"sketch_point": "#cdd6f4",
|
||||
"sketch_point_free": "#477dc8",
|
||||
"sketch_projected": "#cba6f7",
|
||||
"sketch_soft": "#302b46",
|
||||
"subheading_bg": "#161622",
|
||||
"surface_accent": "#cba6f7",
|
||||
"surface_fill": "#477dc8",
|
||||
"surface_ink": "#cdd6f4",
|
||||
"surface_soft": "#302b46",
|
||||
"tab_on_fill_dark": "#181825",
|
||||
"text": "#cdd6f4",
|
||||
"text_dim": "#a6adc8",
|
||||
"timeline": "#313244",
|
||||
"timeline_item": "#313244",
|
||||
"timeline_item_error": "#51384b",
|
||||
"timeline_marker": "#a6adc8",
|
||||
"toolbar": "#1e1e2e",
|
||||
"triad": [
|
||||
"#f38ba8",
|
||||
"#a6e3a1",
|
||||
"#477dc8"
|
||||
],
|
||||
"viewport_bottom": "#11111b",
|
||||
"viewport_top": "#11111b",
|
||||
"warning": "#f9e2af"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Catppuccin Mocha"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "light",
|
||||
"colors": {
|
||||
"accent": "#007aff",
|
||||
"accent_soft": "#dcecff",
|
||||
"agent_busy": "#329ade",
|
||||
"agent_ok": "#299b45",
|
||||
"app_bar": "#dcdcdc",
|
||||
"app_bar_hover": "#0000000a",
|
||||
"app_bar_hover_button": "#ffffff80",
|
||||
"app_bar_hover_strong": "#00000018",
|
||||
"app_bar_hover_subtle": "#ffffff40",
|
||||
"app_bar_icon": [
|
||||
"#48484a",
|
||||
"#8e8e93",
|
||||
"#007aff"
|
||||
],
|
||||
"app_bar_separator": "#b4b4b8",
|
||||
"app_bar_tab_active": "#f4f4f4",
|
||||
"app_bar_text": "#242426",
|
||||
"axis_x": "#ff0000",
|
||||
"axis_y": "#00ff00",
|
||||
"axis_z": "#0202f8",
|
||||
"bend_down": "#bd843f",
|
||||
"bend_up": "#36934d",
|
||||
"body": "#b6bbc3",
|
||||
"body_edge": "#393d44",
|
||||
"body_selected": "#79afea",
|
||||
"border": "#c6c6c8",
|
||||
"box_crossing": "#39a75b",
|
||||
"box_window": "#007aff",
|
||||
"chip": "#007aff",
|
||||
"construction_geom": "#9a712b",
|
||||
"construction_plane": "#efd3a146",
|
||||
"continuity": [
|
||||
"#009e73",
|
||||
"#0072b2",
|
||||
"#f0c800",
|
||||
"#cc008c"
|
||||
],
|
||||
"control_border": "#b0b0b4",
|
||||
"control_fill": "#ececec",
|
||||
"cube_border": "#9a9aa0",
|
||||
"cube_face": "#f2f2f4",
|
||||
"cube_hover": "#cce5ff",
|
||||
"cube_text": "#262628",
|
||||
"dialog_bg": "#ececec",
|
||||
"dialog_body": "#f3f3f3",
|
||||
"dialog_border": "#c6c6c8",
|
||||
"dialog_footer": "#ececec",
|
||||
"dialog_label": "#262628",
|
||||
"dialog_rule": "#c6c6c8",
|
||||
"dimension": "#262628",
|
||||
"dimension_driven": "#6e6e73",
|
||||
"error": "#d53137",
|
||||
"field": "#ffffff",
|
||||
"form_accent": "#8055be",
|
||||
"form_dim": "#6e6e73",
|
||||
"form_error": "#c02b31",
|
||||
"form_error_fill": "#fcebea",
|
||||
"form_fill": "#946bc9",
|
||||
"form_ink": "#262628",
|
||||
"form_primary": "#0071e3",
|
||||
"form_soft": "#eee8f7",
|
||||
"form_success": "#237b38",
|
||||
"form_success_fill": "#e6f3e8",
|
||||
"form_tab_ink": "#7445af",
|
||||
"gizmo": [
|
||||
"#ed514b",
|
||||
"#36ad59",
|
||||
"#2184e9"
|
||||
],
|
||||
"glyph_bg": "#ffffff",
|
||||
"glyph_edge": "#ce8d85",
|
||||
"glyph_text": "#c34136",
|
||||
"grid": "#d0d2d6",
|
||||
"grid_major": "#b5b8be",
|
||||
"heading_bg": "#e2e2e2",
|
||||
"hover": "#dcecff",
|
||||
"hover_edge": "#222226",
|
||||
"hover_edge_halo": "#ffffff",
|
||||
"hover_profile": "#007aff26",
|
||||
"hover_profile_edge": "#007aff",
|
||||
"icon": "#505054",
|
||||
"icon_fill": "#b5c8e1",
|
||||
"icons.access": [
|
||||
"#34a853",
|
||||
"#e94e44"
|
||||
],
|
||||
"icons.agent": "#a467d6",
|
||||
"icons.axes": [
|
||||
"#e95049",
|
||||
"#35a754",
|
||||
"#297fdb"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#297fdb",
|
||||
"#35ad59",
|
||||
"#e95049"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#35ad59",
|
||||
"#e4bb31"
|
||||
],
|
||||
"icons.floor": "#606068",
|
||||
"icons.fold": "#9a9aa2",
|
||||
"icons.folder": "#70bce8",
|
||||
"icons.glint": "#ffffffb3",
|
||||
"icons.highlight": "#ffffff",
|
||||
"icons.interference": "#ed514b",
|
||||
"icons.marker_halo": "#00000080",
|
||||
"icons.paint": [
|
||||
"#ed514b",
|
||||
"#3599e4",
|
||||
"#edc53d"
|
||||
],
|
||||
"icons.plane": "#ebd3a2",
|
||||
"icons.sheet": "#bbd7ef",
|
||||
"icons.sheet_2": "#a5c8e7",
|
||||
"icons.sheet_light": "#e5eff8",
|
||||
"icons.sheet_line": "#84aace",
|
||||
"icons.sky": "#d1e2f0",
|
||||
"icons.stripe": "#38383c",
|
||||
"icons.warning": "#f5c437",
|
||||
"interference": "#ed443b",
|
||||
"logo": [
|
||||
"#85b9ef",
|
||||
"#4096e9",
|
||||
"#2b71be"
|
||||
],
|
||||
"manipulator": "#007aff",
|
||||
"mesh_accent": "#927300",
|
||||
"mesh_fill": "#d0ac35",
|
||||
"mesh_ink": "#856700",
|
||||
"mesh_soft": "#fbf5df",
|
||||
"on_accent": "#ffffff",
|
||||
"origin_plane": "#f0c58a55",
|
||||
"origin_plane_edge": "#bf915ac8",
|
||||
"origin_plane_hover": "#8eaee680",
|
||||
"origin_point": "#d8dadd",
|
||||
"overlay": "#f6f6f6f5",
|
||||
"panel": "#ececec",
|
||||
"panel_header": "#e2e2e2",
|
||||
"preview_add": "#78aae1",
|
||||
"preview_cut": "#eb634d66",
|
||||
"preview_new": "#e9d875",
|
||||
"preview_sketch": "#3ab86b",
|
||||
"profile_fill": "#f3c88a3d",
|
||||
"render_accent": "#af4083",
|
||||
"render_fill": "#bd5b92",
|
||||
"render_ink": "#9f3676",
|
||||
"render_soft": "#f6e8f0",
|
||||
"rubber_band": "#007aff",
|
||||
"section_cap": "#c79769",
|
||||
"sel_edge": "#007aff",
|
||||
"sel_edge_rim": "#a6d2ff",
|
||||
"sel_face": "#669bd6",
|
||||
"sel_profile": "#215da3",
|
||||
"sel_profile_edge": "#007aff",
|
||||
"sel_vertex": "#316cae",
|
||||
"selected_bg": "#dcecff",
|
||||
"selected_ink": "#004b9b",
|
||||
"sheet_fill": "#3884a5",
|
||||
"sheet_ink": "#226b89",
|
||||
"sheet_soft": "#e6f1f6",
|
||||
"sketch": "#1264bf",
|
||||
"sketch_accent": "#288049",
|
||||
"sketch_centerline": "#b77c47",
|
||||
"sketch_construction": "#cb8b37",
|
||||
"sketch_fixed": "#262628",
|
||||
"sketch_ink": "#23723f",
|
||||
"sketch_locked": "#318348",
|
||||
"sketch_lost": "#c94f68",
|
||||
"sketch_point": "#262628",
|
||||
"sketch_point_free": "#1264bf",
|
||||
"sketch_projected": "#9258b7",
|
||||
"sketch_soft": "#eaf4ed",
|
||||
"subheading_bg": "#e8e8e8",
|
||||
"surface_accent": "#996a28",
|
||||
"surface_fill": "#b5833e",
|
||||
"surface_ink": "#8b5c1d",
|
||||
"surface_soft": "#f8efdf",
|
||||
"tab_on_fill_dark": "#242426",
|
||||
"text": "#262628",
|
||||
"text_dim": "#6e6e73",
|
||||
"timeline": "#e2e2e2",
|
||||
"timeline_item": "#ffffff",
|
||||
"timeline_item_error": "#f8dedb",
|
||||
"timeline_marker": "#63636b",
|
||||
"toolbar": "#ececec",
|
||||
"triad": [
|
||||
"#e95049",
|
||||
"#35a754",
|
||||
"#297fdb"
|
||||
],
|
||||
"viewport_bottom": "#d9dce2",
|
||||
"viewport_top": "#f5f5f7",
|
||||
"warning": "#ad7400"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Cupertino"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#4aa3d8",
|
||||
"accent_soft": "#293c49",
|
||||
"agent_busy": "#4aa3d8",
|
||||
"agent_ok": "#83c69b",
|
||||
"app_bar": "#1c1e21",
|
||||
"app_bar_hover": "#e0e2e518",
|
||||
"app_bar_hover_button": "#e0e2e522",
|
||||
"app_bar_hover_strong": "#e0e2e530",
|
||||
"app_bar_hover_subtle": "#e0e2e510",
|
||||
"app_bar_icon": [
|
||||
"#e0e2e5",
|
||||
"#a0a6b0",
|
||||
"#4aa3d8"
|
||||
],
|
||||
"app_bar_separator": "#484d55",
|
||||
"app_bar_tab_active": "#303338",
|
||||
"app_bar_text": "#e0e2e5",
|
||||
"axis_x": "#ed7777",
|
||||
"axis_y": "#83c69b",
|
||||
"axis_z": "#2878a9",
|
||||
"bend_down": "#dbb879",
|
||||
"bend_up": "#83c69b",
|
||||
"body": "#68717d",
|
||||
"body_edge": "#2878a9",
|
||||
"body_selected": "#245674",
|
||||
"border": "#484d55",
|
||||
"box_crossing": "#83c69b",
|
||||
"box_window": "#4aa3d8",
|
||||
"chip": "#4aa3d8",
|
||||
"construction_geom": "#dbb879",
|
||||
"construction_plane": "#dbb87922",
|
||||
"continuity": [
|
||||
"#83c69b",
|
||||
"#2878a9",
|
||||
"#dbb879",
|
||||
"#ad9cce"
|
||||
],
|
||||
"control_border": "#484d55",
|
||||
"control_fill": "#303338",
|
||||
"cube_border": "#484d55",
|
||||
"cube_face": "#303338",
|
||||
"cube_hover": "#293c49",
|
||||
"cube_text": "#e0e2e5",
|
||||
"dialog_bg": "#25272b",
|
||||
"dialog_body": "#25272b",
|
||||
"dialog_border": "#484d55",
|
||||
"dialog_footer": "#25272b",
|
||||
"dialog_label": "#e0e2e5",
|
||||
"dialog_rule": "#484d55",
|
||||
"dimension": "#e0e2e5",
|
||||
"dimension_driven": "#a0a6b0",
|
||||
"error": "#ed7777",
|
||||
"field": "#1c1e21",
|
||||
"form_accent": "#4aa3d8",
|
||||
"form_dim": "#a0a6b0",
|
||||
"form_error": "#ed7777",
|
||||
"form_error_fill": "#4d373a",
|
||||
"form_fill": "#2878a9",
|
||||
"form_ink": "#e0e2e5",
|
||||
"form_primary": "#4aa3d8",
|
||||
"form_soft": "#293c49",
|
||||
"form_success": "#83c69b",
|
||||
"form_success_fill": "#35423e",
|
||||
"form_tab_ink": "#e0e2e5",
|
||||
"gizmo": [
|
||||
"#ed7777",
|
||||
"#83c69b",
|
||||
"#2878a9"
|
||||
],
|
||||
"glyph_bg": "#303338",
|
||||
"glyph_edge": "#ed7777",
|
||||
"glyph_text": "#ed7777",
|
||||
"grid": "#292b30",
|
||||
"grid_major": "#393c42",
|
||||
"heading_bg": "#121416",
|
||||
"hover": "#293c49",
|
||||
"hover_edge": "#2878a9",
|
||||
"hover_edge_halo": "#17191d",
|
||||
"hover_profile": "#4aa3d828",
|
||||
"hover_profile_edge": "#2878a9",
|
||||
"icon": "#e0e2e5",
|
||||
"icon_fill": "#a0a6b0",
|
||||
"icons.access": [
|
||||
"#83c69b",
|
||||
"#ed7777"
|
||||
],
|
||||
"icons.agent": "#ad9cce",
|
||||
"icons.axes": [
|
||||
"#ed7777",
|
||||
"#83c69b",
|
||||
"#2878a9"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#2878a9",
|
||||
"#83c69b",
|
||||
"#ed7777"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#83c69b",
|
||||
"#dbb879"
|
||||
],
|
||||
"icons.floor": "#a0a6b0",
|
||||
"icons.fold": "#a0a6b0",
|
||||
"icons.folder": "#dbb879",
|
||||
"icons.glint": "#e0e2e580",
|
||||
"icons.highlight": "#e0e2e5",
|
||||
"icons.interference": "#ed7777",
|
||||
"icons.marker_halo": "#1c1e21cc",
|
||||
"icons.paint": [
|
||||
"#ed7777",
|
||||
"#2878a9",
|
||||
"#dbb879"
|
||||
],
|
||||
"icons.plane": "#dbb879",
|
||||
"icons.sheet": "#68717d",
|
||||
"icons.sheet_2": "#68717d",
|
||||
"icons.sheet_light": "#e0e2e5",
|
||||
"icons.sheet_line": "#2878a9",
|
||||
"icons.sky": "#68717d",
|
||||
"icons.stripe": "#a0a6b0",
|
||||
"icons.warning": "#dbb879",
|
||||
"interference": "#ed7777",
|
||||
"logo": [
|
||||
"#4aa3d8",
|
||||
"#2878a9",
|
||||
"#68717d"
|
||||
],
|
||||
"manipulator": "#4aa3d8",
|
||||
"mesh_accent": "#4aa3d8",
|
||||
"mesh_fill": "#2878a9",
|
||||
"mesh_ink": "#e0e2e5",
|
||||
"mesh_soft": "#293c49",
|
||||
"on_accent": "#06121b",
|
||||
"origin_plane": "#dbb87928",
|
||||
"origin_plane_edge": "#dbb87988",
|
||||
"origin_plane_hover": "#4aa3d840",
|
||||
"origin_point": "#a0a6b0",
|
||||
"overlay": "#25272b",
|
||||
"panel": "#25272b",
|
||||
"panel_header": "#303338",
|
||||
"preview_add": "#2878a9",
|
||||
"preview_cut": "#ed777766",
|
||||
"preview_new": "#dbb879",
|
||||
"preview_sketch": "#83c69b",
|
||||
"profile_fill": "#2878a922",
|
||||
"render_accent": "#4aa3d8",
|
||||
"render_fill": "#2878a9",
|
||||
"render_ink": "#e0e2e5",
|
||||
"render_soft": "#293c49",
|
||||
"rubber_band": "#4aa3d8",
|
||||
"section_cap": "#dbb879",
|
||||
"sel_edge": "#2878a9",
|
||||
"sel_edge_rim": "#2878a9",
|
||||
"sel_face": "#245674",
|
||||
"sel_profile": "#245674",
|
||||
"sel_profile_edge": "#2878a9",
|
||||
"sel_vertex": "#2878a9",
|
||||
"selected_bg": "#245674",
|
||||
"selected_ink": "#e0e2e5",
|
||||
"sheet_fill": "#2878a9",
|
||||
"sheet_ink": "#e0e2e5",
|
||||
"sheet_soft": "#293c49",
|
||||
"sketch": "#2878a9",
|
||||
"sketch_accent": "#4aa3d8",
|
||||
"sketch_centerline": "#dbb879",
|
||||
"sketch_construction": "#dbb879",
|
||||
"sketch_fixed": "#e0e2e5",
|
||||
"sketch_ink": "#e0e2e5",
|
||||
"sketch_locked": "#83c69b",
|
||||
"sketch_lost": "#ed7777",
|
||||
"sketch_point": "#e0e2e5",
|
||||
"sketch_point_free": "#2878a9",
|
||||
"sketch_projected": "#ad9cce",
|
||||
"sketch_soft": "#293c49",
|
||||
"subheading_bg": "#1c1d20",
|
||||
"surface_accent": "#4aa3d8",
|
||||
"surface_fill": "#2878a9",
|
||||
"surface_ink": "#e0e2e5",
|
||||
"surface_soft": "#293c49",
|
||||
"tab_on_fill_dark": "#1c1e21",
|
||||
"text": "#e0e2e5",
|
||||
"text_dim": "#a0a6b0",
|
||||
"timeline": "#303338",
|
||||
"timeline_item": "#303338",
|
||||
"timeline_item_error": "#553a3d",
|
||||
"timeline_marker": "#a0a6b0",
|
||||
"toolbar": "#25272b",
|
||||
"triad": [
|
||||
"#ed7777",
|
||||
"#83c69b",
|
||||
"#2878a9"
|
||||
],
|
||||
"viewport_bottom": "#17191d",
|
||||
"viewport_top": "#17191d",
|
||||
"warning": "#dbb879"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Graphite"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#4dff79",
|
||||
"accent_soft": "#123c20",
|
||||
"agent_busy": "#4dff79",
|
||||
"agent_ok": "#39d45c",
|
||||
"app_bar": "#020904",
|
||||
"app_bar_hover": "#79ff9b18",
|
||||
"app_bar_hover_button": "#79ff9b20",
|
||||
"app_bar_hover_strong": "#79ff9b30",
|
||||
"app_bar_hover_subtle": "#79ff9b10",
|
||||
"app_bar_icon": [
|
||||
"#8def9f",
|
||||
"#5b9b6a",
|
||||
"#4dff79"
|
||||
],
|
||||
"app_bar_separator": "#285333",
|
||||
"app_bar_tab_active": "#0b1d10",
|
||||
"app_bar_text": "#8def9f",
|
||||
"axis_x": "#c1f3ba",
|
||||
"axis_y": "#4dff79",
|
||||
"axis_z": "#599b70",
|
||||
"bend_down": "#32ba50",
|
||||
"bend_up": "#39d45c",
|
||||
"body": "#0b3818",
|
||||
"body_edge": "#4dff79",
|
||||
"body_selected": "#18542b",
|
||||
"border": "#285333",
|
||||
"box_crossing": "#39d45c",
|
||||
"box_window": "#4dff79",
|
||||
"chip": "#144a20",
|
||||
"construction_geom": "#2fad4a",
|
||||
"construction_plane": "#72c68b18",
|
||||
"continuity": [
|
||||
"#35c555",
|
||||
"#36c655",
|
||||
"#39d35b",
|
||||
"#30b04c"
|
||||
],
|
||||
"control_border": "#285333",
|
||||
"control_fill": "#0b1d10",
|
||||
"cube_border": "#285333",
|
||||
"cube_face": "#0f3617",
|
||||
"cube_hover": "#175625",
|
||||
"cube_text": "#40ee66",
|
||||
"dialog_bg": "#061009",
|
||||
"dialog_body": "#0b1d10",
|
||||
"dialog_border": "#285333",
|
||||
"dialog_footer": "#061009",
|
||||
"dialog_label": "#8def9f",
|
||||
"dialog_rule": "#173b22",
|
||||
"dimension": "#8def9f",
|
||||
"dimension_driven": "#5b9b6a",
|
||||
"error": "#d8ffdf",
|
||||
"field": "#061009",
|
||||
"form_accent": "#59d67b",
|
||||
"form_dim": "#5b9b6a",
|
||||
"form_error": "#d8ffdf",
|
||||
"form_error_fill": "#21462a",
|
||||
"form_fill": "#287e43",
|
||||
"form_ink": "#9bf0b1",
|
||||
"form_primary": "#4dff79",
|
||||
"form_soft": "#0e2918",
|
||||
"form_success": "#39d45c",
|
||||
"form_success_fill": "#133b20",
|
||||
"form_tab_ink": "#9bf0b1",
|
||||
"gizmo": [
|
||||
"#c1f3ba",
|
||||
"#4dff79",
|
||||
"#599b70"
|
||||
],
|
||||
"glyph_bg": "#09200e",
|
||||
"glyph_edge": "#33bd51",
|
||||
"glyph_text": "#d8ffdf",
|
||||
"grid": "#091b0f",
|
||||
"grid_major": "#122d1a",
|
||||
"heading_bg": "#030804",
|
||||
"hover": "#123c20",
|
||||
"hover_edge": "#4dff79",
|
||||
"hover_edge_halo": "#021007",
|
||||
"hover_profile": "#4dff7926",
|
||||
"hover_profile_edge": "#4dff79",
|
||||
"icon": "#8def9f",
|
||||
"icon_fill": "#57b875",
|
||||
"icons.access": [
|
||||
"#35c555",
|
||||
"#2eac4a"
|
||||
],
|
||||
"icons.agent": "#37cb57",
|
||||
"icons.axes": [
|
||||
"#c1f3ba",
|
||||
"#4dff79",
|
||||
"#599b70"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#34c053",
|
||||
"#35c555",
|
||||
"#2eac4a"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#37cb57",
|
||||
"#39d35b"
|
||||
],
|
||||
"icons.floor": "#207633",
|
||||
"icons.fold": "#2b9f44",
|
||||
"icons.folder": "#39d35b",
|
||||
"icons.glint": "#42f46999",
|
||||
"icons.highlight": "#43f66a",
|
||||
"icons.interference": "#d8ffdf",
|
||||
"icons.marker_halo": "#06170acc",
|
||||
"icons.paint": [
|
||||
"#37cc58",
|
||||
"#36c655",
|
||||
"#40ee66"
|
||||
],
|
||||
"icons.plane": "#39d35b",
|
||||
"icons.sheet": "#35c354",
|
||||
"icons.sheet_2": "#2ca246",
|
||||
"icons.sheet_light": "#40ec66",
|
||||
"icons.sheet_line": "#42f469",
|
||||
"icons.sky": "#1b652b",
|
||||
"icons.stripe": "#06170a",
|
||||
"icons.warning": "#d1ffad",
|
||||
"interference": "#d8ffdf",
|
||||
"logo": [
|
||||
"#b3ffc4",
|
||||
"#79ed95",
|
||||
"#34854b"
|
||||
],
|
||||
"manipulator": "#4dff79",
|
||||
"mesh_accent": "#59d67b",
|
||||
"mesh_fill": "#287e43",
|
||||
"mesh_ink": "#9bf0b1",
|
||||
"mesh_soft": "#0e2918",
|
||||
"on_accent": "#031207",
|
||||
"origin_plane": "#72c68b20",
|
||||
"origin_plane_edge": "#72c68b80",
|
||||
"origin_plane_hover": "#4dff7940",
|
||||
"origin_point": "#37ca57",
|
||||
"overlay": "#061009",
|
||||
"panel": "#061009",
|
||||
"panel_header": "#0b1d10",
|
||||
"preview_add": "#278e43",
|
||||
"preview_cut": "#4dff7955",
|
||||
"preview_new": "#319f4b",
|
||||
"preview_sketch": "#39d45c",
|
||||
"profile_fill": "#2fbe5320",
|
||||
"render_accent": "#59d67b",
|
||||
"render_fill": "#287e43",
|
||||
"render_ink": "#9bf0b1",
|
||||
"render_soft": "#0e2918",
|
||||
"rubber_band": "#4dff79",
|
||||
"section_cap": "#32ba50",
|
||||
"sel_edge": "#4dff79",
|
||||
"sel_edge_rim": "#249d48",
|
||||
"sel_face": "#216638",
|
||||
"sel_profile": "#1a5e2c",
|
||||
"sel_profile_edge": "#4dff79",
|
||||
"sel_vertex": "#4dff79",
|
||||
"selected_bg": "#123c20",
|
||||
"selected_ink": "#b3ffc4",
|
||||
"sheet_fill": "#287e43",
|
||||
"sheet_ink": "#9bf0b1",
|
||||
"sheet_soft": "#0e2918",
|
||||
"sketch": "#4dff79",
|
||||
"sketch_accent": "#59d67b",
|
||||
"sketch_centerline": "#32ba50",
|
||||
"sketch_construction": "#2fad4a",
|
||||
"sketch_fixed": "#8def9f",
|
||||
"sketch_ink": "#9bf0b1",
|
||||
"sketch_locked": "#39d45c",
|
||||
"sketch_lost": "#d8ffdf",
|
||||
"sketch_point": "#8def9f",
|
||||
"sketch_point_free": "#4dff79",
|
||||
"sketch_projected": "#37cb57",
|
||||
"sketch_soft": "#0e2918",
|
||||
"subheading_bg": "#040c07",
|
||||
"surface_accent": "#59d67b",
|
||||
"surface_fill": "#287e43",
|
||||
"surface_ink": "#9bf0b1",
|
||||
"surface_soft": "#0e2918",
|
||||
"tab_on_fill_dark": "#031207",
|
||||
"text": "#8def9f",
|
||||
"text_dim": "#5b9b6a",
|
||||
"timeline": "#020904",
|
||||
"timeline_item": "#0b1d10",
|
||||
"timeline_item_error": "#21462a",
|
||||
"timeline_marker": "#5b9b6a",
|
||||
"toolbar": "#061009",
|
||||
"triad": [
|
||||
"#c1f3ba",
|
||||
"#4dff79",
|
||||
"#599b70"
|
||||
],
|
||||
"viewport_bottom": "#010703",
|
||||
"viewport_top": "#010703",
|
||||
"warning": "#d1ffad"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Green Phosphor"
|
||||
}
|
||||
@@ -16,7 +16,6 @@
|
||||
"error": "#fb4934",
|
||||
"warning": "#fabd2f",
|
||||
"icon": "#d5c4a1",
|
||||
"icon_fill": "#458588",
|
||||
"timeline": "#141617",
|
||||
"hover": "#46403e",
|
||||
"sel_face": "#458588",
|
||||
@@ -62,8 +61,6 @@
|
||||
"dialog_bg": "#3c3836",
|
||||
"dialog_border": "#504945",
|
||||
"chip": "#458588",
|
||||
"heading_bg": "#1d2021",
|
||||
"subheading_bg": "#2c2c2c",
|
||||
"section_cap": "#d65d0e",
|
||||
"profile_fill": "#83a59828",
|
||||
"glyph_bg": "#2c2c2c",
|
||||
@@ -96,24 +93,6 @@
|
||||
"#b8bb26",
|
||||
"#83a598"
|
||||
],
|
||||
"app_bar_icon": [
|
||||
"#ebdbb2",
|
||||
"#928374",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.folder": "#d79921",
|
||||
"icons.axes": [
|
||||
"#fb4934",
|
||||
"#b8bb26",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.agent": "#d3869b",
|
||||
"icons.warning": "#fabd2f",
|
||||
"icons.interference": "#fb4934",
|
||||
"icons.paint": [
|
||||
"#fb4934",
|
||||
"#83a598",
|
||||
"#fabd2f"
|
||||
]
|
||||
"icons.agent": "#d3869b"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
"error": "#fb4934",
|
||||
"warning": "#fabd2f",
|
||||
"icon": "#d5c4a1",
|
||||
"icon_fill": "#458588",
|
||||
"timeline": "#1d2021",
|
||||
"hover": "#46403e",
|
||||
"sel_face": "#458588",
|
||||
@@ -62,8 +61,6 @@
|
||||
"dialog_bg": "#3c3836",
|
||||
"dialog_border": "#504945",
|
||||
"chip": "#458588",
|
||||
"heading_bg": "#32302f",
|
||||
"subheading_bg": "#373432",
|
||||
"section_cap": "#d65d0e",
|
||||
"profile_fill": "#83a59828",
|
||||
"glyph_bg": "#373432",
|
||||
@@ -96,24 +93,6 @@
|
||||
"#b8bb26",
|
||||
"#83a598"
|
||||
],
|
||||
"app_bar_icon": [
|
||||
"#ebdbb2",
|
||||
"#928374",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.folder": "#d79921",
|
||||
"icons.axes": [
|
||||
"#fb4934",
|
||||
"#b8bb26",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.agent": "#d3869b",
|
||||
"icons.warning": "#fabd2f",
|
||||
"icons.interference": "#fb4934",
|
||||
"icons.paint": [
|
||||
"#fb4934",
|
||||
"#83a598",
|
||||
"#fabd2f"
|
||||
]
|
||||
"icons.agent": "#d3869b"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
"error": "#fb4934",
|
||||
"warning": "#fabd2f",
|
||||
"icon": "#d5c4a1",
|
||||
"icon_fill": "#458588",
|
||||
"timeline": "#1d2021",
|
||||
"hover": "#46403e",
|
||||
"sel_face": "#458588",
|
||||
@@ -62,8 +61,6 @@
|
||||
"dialog_bg": "#3c3836",
|
||||
"dialog_border": "#504945",
|
||||
"chip": "#458588",
|
||||
"heading_bg": "#282828",
|
||||
"subheading_bg": "#32302f",
|
||||
"section_cap": "#d65d0e",
|
||||
"profile_fill": "#83a59828",
|
||||
"glyph_bg": "#32302f",
|
||||
@@ -96,24 +93,6 @@
|
||||
"#b8bb26",
|
||||
"#83a598"
|
||||
],
|
||||
"app_bar_icon": [
|
||||
"#ebdbb2",
|
||||
"#928374",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.folder": "#d79921",
|
||||
"icons.axes": [
|
||||
"#fb4934",
|
||||
"#b8bb26",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.agent": "#d3869b",
|
||||
"icons.warning": "#fabd2f",
|
||||
"icons.interference": "#fb4934",
|
||||
"icons.paint": [
|
||||
"#fb4934",
|
||||
"#83a598",
|
||||
"#fabd2f"
|
||||
]
|
||||
"icons.agent": "#d3869b"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
"error": "#9d0006",
|
||||
"warning": "#b57614",
|
||||
"icon": "#504945",
|
||||
"icon_fill": "#bdae93",
|
||||
"timeline": "#ebdbb2",
|
||||
"hover": "#f1e5c1",
|
||||
"sel_face": "#458588",
|
||||
@@ -62,8 +61,6 @@
|
||||
"dialog_bg": "#f9f5d7",
|
||||
"dialog_border": "#d5c4a1",
|
||||
"chip": "#458588",
|
||||
"heading_bg": "#d5c4a1",
|
||||
"subheading_bg": "#ebdbb2",
|
||||
"section_cap": "#d65d0e",
|
||||
"profile_fill": "#fabd2f46",
|
||||
"glyph_bg": "#fcfaeb",
|
||||
@@ -96,24 +93,6 @@
|
||||
"#98971a",
|
||||
"#458588"
|
||||
],
|
||||
"app_bar_icon": [
|
||||
"#fbf1c7",
|
||||
"#a89984",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.folder": "#d79921",
|
||||
"icons.axes": [
|
||||
"#cc241d",
|
||||
"#98971a",
|
||||
"#458588"
|
||||
],
|
||||
"icons.agent": "#8f3f71",
|
||||
"icons.warning": "#d79921",
|
||||
"icons.interference": "#cc241d",
|
||||
"icons.paint": [
|
||||
"#cc241d",
|
||||
"#458588",
|
||||
"#d79921"
|
||||
]
|
||||
"icons.agent": "#8f3f71"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
"error": "#9d0006",
|
||||
"warning": "#b57614",
|
||||
"icon": "#504945",
|
||||
"icon_fill": "#bdae93",
|
||||
"timeline": "#ebdbb2",
|
||||
"hover": "#eedfb6",
|
||||
"sel_face": "#458588",
|
||||
@@ -62,8 +61,6 @@
|
||||
"dialog_bg": "#f2e5bc",
|
||||
"dialog_border": "#d5c4a1",
|
||||
"chip": "#458588",
|
||||
"heading_bg": "#d5c4a1",
|
||||
"subheading_bg": "#ebdbb2",
|
||||
"section_cap": "#d65d0e",
|
||||
"profile_fill": "#fabd2f46",
|
||||
"glyph_bg": "#f8f2de",
|
||||
@@ -96,24 +93,6 @@
|
||||
"#98971a",
|
||||
"#458588"
|
||||
],
|
||||
"app_bar_icon": [
|
||||
"#fbf1c7",
|
||||
"#a89984",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.folder": "#d79921",
|
||||
"icons.axes": [
|
||||
"#cc241d",
|
||||
"#98971a",
|
||||
"#458588"
|
||||
],
|
||||
"icons.agent": "#8f3f71",
|
||||
"icons.warning": "#d79921",
|
||||
"icons.interference": "#cc241d",
|
||||
"icons.paint": [
|
||||
"#cc241d",
|
||||
"#458588",
|
||||
"#d79921"
|
||||
]
|
||||
"icons.agent": "#8f3f71"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
"error": "#9d0006",
|
||||
"warning": "#b57614",
|
||||
"icon": "#504945",
|
||||
"icon_fill": "#bdae93",
|
||||
"timeline": "#ebdbb2",
|
||||
"hover": "#f1e4ba",
|
||||
"sel_face": "#458588",
|
||||
@@ -62,8 +61,6 @@
|
||||
"dialog_bg": "#fbf1c7",
|
||||
"dialog_border": "#d5c4a1",
|
||||
"chip": "#458588",
|
||||
"heading_bg": "#d5c4a1",
|
||||
"subheading_bg": "#ebdbb2",
|
||||
"section_cap": "#d65d0e",
|
||||
"profile_fill": "#fabd2f46",
|
||||
"glyph_bg": "#fdf8e3",
|
||||
@@ -96,24 +93,6 @@
|
||||
"#98971a",
|
||||
"#458588"
|
||||
],
|
||||
"app_bar_icon": [
|
||||
"#fbf1c7",
|
||||
"#a89984",
|
||||
"#83a598"
|
||||
],
|
||||
"icons.folder": "#d79921",
|
||||
"icons.axes": [
|
||||
"#cc241d",
|
||||
"#98971a",
|
||||
"#458588"
|
||||
],
|
||||
"icons.agent": "#8f3f71",
|
||||
"icons.warning": "#d79921",
|
||||
"icons.interference": "#cc241d",
|
||||
"icons.paint": [
|
||||
"#cc241d",
|
||||
"#458588",
|
||||
"#d79921"
|
||||
]
|
||||
"icons.agent": "#8f3f71"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#00bfff",
|
||||
"accent_soft": "#002c45",
|
||||
"agent_busy": "#00bfff",
|
||||
"agent_ok": "#40e080",
|
||||
"app_bar": "#000000",
|
||||
"app_bar_hover": "#ffffff18",
|
||||
"app_bar_hover_button": "#ffffff22",
|
||||
"app_bar_hover_strong": "#ffffff30",
|
||||
"app_bar_hover_subtle": "#ffffff10",
|
||||
"app_bar_icon": [
|
||||
"#ffffff",
|
||||
"#cccccc",
|
||||
"#00bfff"
|
||||
],
|
||||
"app_bar_separator": "#a0a0a0",
|
||||
"app_bar_tab_active": "#151515",
|
||||
"app_bar_text": "#ffffff",
|
||||
"axis_x": "#ff6666",
|
||||
"axis_y": "#40e080",
|
||||
"axis_z": "#0070d0",
|
||||
"bend_down": "#ffcc00",
|
||||
"bend_up": "#40e080",
|
||||
"body": "#555555",
|
||||
"body_edge": "#0070d0",
|
||||
"body_selected": "#004c80",
|
||||
"border": "#a0a0a0",
|
||||
"box_crossing": "#40e080",
|
||||
"box_window": "#00bfff",
|
||||
"chip": "#00bfff",
|
||||
"construction_geom": "#ffcc00",
|
||||
"construction_plane": "#ffcc0022",
|
||||
"continuity": [
|
||||
"#40e080",
|
||||
"#0070d0",
|
||||
"#ffcc00",
|
||||
"#c080ff"
|
||||
],
|
||||
"control_border": "#a0a0a0",
|
||||
"control_fill": "#151515",
|
||||
"cube_border": "#a0a0a0",
|
||||
"cube_face": "#151515",
|
||||
"cube_hover": "#002c45",
|
||||
"cube_text": "#ffffff",
|
||||
"dialog_bg": "#0c0c0c",
|
||||
"dialog_body": "#000000",
|
||||
"dialog_border": "#a0a0a0",
|
||||
"dialog_footer": "#000000",
|
||||
"dialog_label": "#ffffff",
|
||||
"dialog_rule": "#a0a0a0",
|
||||
"dimension": "#ffffff",
|
||||
"dimension_driven": "#cccccc",
|
||||
"error": "#ff6666",
|
||||
"field": "#000000",
|
||||
"form_accent": "#00bfff",
|
||||
"form_dim": "#cccccc",
|
||||
"form_error": "#ff6666",
|
||||
"form_error_fill": "#331414",
|
||||
"form_fill": "#0070d0",
|
||||
"form_ink": "#ffffff",
|
||||
"form_primary": "#00bfff",
|
||||
"form_soft": "#002c45",
|
||||
"form_success": "#40e080",
|
||||
"form_success_fill": "#0b2616",
|
||||
"form_tab_ink": "#ffffff",
|
||||
"gizmo": [
|
||||
"#ff6666",
|
||||
"#40e080",
|
||||
"#0070d0"
|
||||
],
|
||||
"glyph_bg": "#151515",
|
||||
"glyph_edge": "#ff6666",
|
||||
"glyph_text": "#ff6666",
|
||||
"grid": "#10202b",
|
||||
"grid_major": "#234054",
|
||||
"heading_bg": "#000000",
|
||||
"hover": "#002c45",
|
||||
"hover_edge": "#ffcc00",
|
||||
"hover_edge_halo": "#000000",
|
||||
"hover_profile": "#00bfff28",
|
||||
"hover_profile_edge": "#0070d0",
|
||||
"icon": "#ffffff",
|
||||
"icon_fill": "#cccccc",
|
||||
"icons.access": [
|
||||
"#40e080",
|
||||
"#ff6666"
|
||||
],
|
||||
"icons.agent": "#c080ff",
|
||||
"icons.axes": [
|
||||
"#ff6666",
|
||||
"#40e080",
|
||||
"#0070d0"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#0070d0",
|
||||
"#40e080",
|
||||
"#ff6666"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#40e080",
|
||||
"#ffcc00"
|
||||
],
|
||||
"icons.floor": "#cccccc",
|
||||
"icons.fold": "#cccccc",
|
||||
"icons.folder": "#ffcc00",
|
||||
"icons.glint": "#ffffff80",
|
||||
"icons.highlight": "#ffffff",
|
||||
"icons.interference": "#ff6666",
|
||||
"icons.marker_halo": "#000000cc",
|
||||
"icons.paint": [
|
||||
"#ff6666",
|
||||
"#0070d0",
|
||||
"#ffcc00"
|
||||
],
|
||||
"icons.plane": "#ffcc00",
|
||||
"icons.sheet": "#555555",
|
||||
"icons.sheet_2": "#555555",
|
||||
"icons.sheet_light": "#ffffff",
|
||||
"icons.sheet_line": "#0070d0",
|
||||
"icons.sky": "#555555",
|
||||
"icons.stripe": "#cccccc",
|
||||
"icons.warning": "#ffcc00",
|
||||
"interference": "#ff6666",
|
||||
"logo": [
|
||||
"#00bfff",
|
||||
"#0070d0",
|
||||
"#555555"
|
||||
],
|
||||
"manipulator": "#00bfff",
|
||||
"mesh_accent": "#00bfff",
|
||||
"mesh_fill": "#0070d0",
|
||||
"mesh_ink": "#ffffff",
|
||||
"mesh_soft": "#002c45",
|
||||
"on_accent": "#06121b",
|
||||
"origin_plane": "#ffcc0028",
|
||||
"origin_plane_edge": "#ffcc0088",
|
||||
"origin_plane_hover": "#00bfff40",
|
||||
"origin_point": "#cccccc",
|
||||
"overlay": "#000000",
|
||||
"panel": "#000000",
|
||||
"panel_header": "#151515",
|
||||
"preview_add": "#0070d0",
|
||||
"preview_cut": "#ff666666",
|
||||
"preview_new": "#ffcc00",
|
||||
"preview_sketch": "#40e080",
|
||||
"profile_fill": "#0070d022",
|
||||
"render_accent": "#00bfff",
|
||||
"render_fill": "#0070d0",
|
||||
"render_ink": "#ffffff",
|
||||
"render_soft": "#002c45",
|
||||
"rubber_band": "#00bfff",
|
||||
"section_cap": "#ffcc00",
|
||||
"sel_edge": "#00bfff",
|
||||
"sel_edge_rim": "#0070d0",
|
||||
"sel_face": "#004c80",
|
||||
"sel_profile": "#004c80",
|
||||
"sel_profile_edge": "#0070d0",
|
||||
"sel_vertex": "#0070d0",
|
||||
"selected_bg": "#004c80",
|
||||
"selected_ink": "#ffffff",
|
||||
"sheet_fill": "#0070d0",
|
||||
"sheet_ink": "#ffffff",
|
||||
"sheet_soft": "#002c45",
|
||||
"sketch": "#0070d0",
|
||||
"sketch_accent": "#00bfff",
|
||||
"sketch_centerline": "#ffcc00",
|
||||
"sketch_construction": "#ffcc00",
|
||||
"sketch_fixed": "#ffffff",
|
||||
"sketch_ink": "#ffffff",
|
||||
"sketch_locked": "#40e080",
|
||||
"sketch_lost": "#ff6666",
|
||||
"sketch_point": "#ffffff",
|
||||
"sketch_point_free": "#0070d0",
|
||||
"sketch_projected": "#c080ff",
|
||||
"sketch_soft": "#002c45",
|
||||
"subheading_bg": "#060606",
|
||||
"surface_accent": "#00bfff",
|
||||
"surface_fill": "#0070d0",
|
||||
"surface_ink": "#ffffff",
|
||||
"surface_soft": "#002c45",
|
||||
"tab_on_fill_dark": "#000000",
|
||||
"text": "#ffffff",
|
||||
"text_dim": "#cccccc",
|
||||
"timeline": "#151515",
|
||||
"timeline_item": "#151515",
|
||||
"timeline_item_error": "#3d1818",
|
||||
"timeline_marker": "#cccccc",
|
||||
"toolbar": "#000000",
|
||||
"triad": [
|
||||
"#ff6666",
|
||||
"#40e080",
|
||||
"#0070d0"
|
||||
],
|
||||
"viewport_bottom": "#000000",
|
||||
"viewport_top": "#000000",
|
||||
"warning": "#ffcc00"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "High Contrast"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#88c0d0",
|
||||
"accent_soft": "#35495b",
|
||||
"agent_busy": "#88c0d0",
|
||||
"agent_ok": "#a3be8c",
|
||||
"app_bar": "#242933",
|
||||
"app_bar_hover": "#eceff418",
|
||||
"app_bar_hover_button": "#eceff422",
|
||||
"app_bar_hover_strong": "#eceff430",
|
||||
"app_bar_hover_subtle": "#eceff410",
|
||||
"app_bar_icon": [
|
||||
"#eceff4",
|
||||
"#a4b0c2",
|
||||
"#88c0d0"
|
||||
],
|
||||
"app_bar_separator": "#4c566a",
|
||||
"app_bar_tab_active": "#3b4252",
|
||||
"app_bar_text": "#eceff4",
|
||||
"axis_x": "#bf616a",
|
||||
"axis_y": "#a3be8c",
|
||||
"axis_z": "#5e81ac",
|
||||
"bend_down": "#ebcb8b",
|
||||
"bend_up": "#a3be8c",
|
||||
"body": "#657991",
|
||||
"body_edge": "#5e81ac",
|
||||
"body_selected": "#34607a",
|
||||
"border": "#4c566a",
|
||||
"box_crossing": "#a3be8c",
|
||||
"box_window": "#88c0d0",
|
||||
"chip": "#88c0d0",
|
||||
"construction_geom": "#ebcb8b",
|
||||
"construction_plane": "#ebcb8b22",
|
||||
"continuity": [
|
||||
"#a3be8c",
|
||||
"#5e81ac",
|
||||
"#ebcb8b",
|
||||
"#b48ead"
|
||||
],
|
||||
"control_border": "#4c566a",
|
||||
"control_fill": "#3b4252",
|
||||
"cube_border": "#4c566a",
|
||||
"cube_face": "#3b4252",
|
||||
"cube_hover": "#35495b",
|
||||
"cube_text": "#eceff4",
|
||||
"dialog_bg": "#2e3440",
|
||||
"dialog_body": "#2e3440",
|
||||
"dialog_border": "#4c566a",
|
||||
"dialog_footer": "#2e3440",
|
||||
"dialog_label": "#eceff4",
|
||||
"dialog_rule": "#4c566a",
|
||||
"dimension": "#eceff4",
|
||||
"dimension_driven": "#a4b0c2",
|
||||
"error": "#bf616a",
|
||||
"field": "#242933",
|
||||
"form_accent": "#88c0d0",
|
||||
"form_dim": "#a4b0c2",
|
||||
"form_error": "#bf616a",
|
||||
"form_error_fill": "#4b3d48",
|
||||
"form_fill": "#5e81ac",
|
||||
"form_ink": "#eceff4",
|
||||
"form_primary": "#88c0d0",
|
||||
"form_soft": "#35495b",
|
||||
"form_success": "#a3be8c",
|
||||
"form_success_fill": "#424b4d",
|
||||
"form_tab_ink": "#eceff4",
|
||||
"gizmo": [
|
||||
"#bf616a",
|
||||
"#a3be8c",
|
||||
"#5e81ac"
|
||||
],
|
||||
"glyph_bg": "#3b4252",
|
||||
"glyph_edge": "#bf616a",
|
||||
"glyph_text": "#bf616a",
|
||||
"grid": "#354051",
|
||||
"grid_major": "#444f60",
|
||||
"heading_bg": "#171a20",
|
||||
"hover": "#35495b",
|
||||
"hover_edge": "#5e81ac",
|
||||
"hover_edge_halo": "#242f40",
|
||||
"hover_profile": "#88c0d028",
|
||||
"hover_profile_edge": "#5e81ac",
|
||||
"icon": "#eceff4",
|
||||
"icon_fill": "#a4b0c2",
|
||||
"icons.access": [
|
||||
"#a3be8c",
|
||||
"#bf616a"
|
||||
],
|
||||
"icons.agent": "#b48ead",
|
||||
"icons.axes": [
|
||||
"#bf616a",
|
||||
"#a3be8c",
|
||||
"#5e81ac"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#5e81ac",
|
||||
"#a3be8c",
|
||||
"#bf616a"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#a3be8c",
|
||||
"#ebcb8b"
|
||||
],
|
||||
"icons.floor": "#a4b0c2",
|
||||
"icons.fold": "#a4b0c2",
|
||||
"icons.folder": "#ebcb8b",
|
||||
"icons.glint": "#eceff480",
|
||||
"icons.highlight": "#eceff4",
|
||||
"icons.interference": "#bf616a",
|
||||
"icons.marker_halo": "#242933cc",
|
||||
"icons.paint": [
|
||||
"#bf616a",
|
||||
"#5e81ac",
|
||||
"#ebcb8b"
|
||||
],
|
||||
"icons.plane": "#ebcb8b",
|
||||
"icons.sheet": "#657991",
|
||||
"icons.sheet_2": "#657991",
|
||||
"icons.sheet_light": "#eceff4",
|
||||
"icons.sheet_line": "#5e81ac",
|
||||
"icons.sky": "#657991",
|
||||
"icons.stripe": "#a4b0c2",
|
||||
"icons.warning": "#ebcb8b",
|
||||
"interference": "#bf616a",
|
||||
"logo": [
|
||||
"#88c0d0",
|
||||
"#5e81ac",
|
||||
"#657991"
|
||||
],
|
||||
"manipulator": "#88c0d0",
|
||||
"mesh_accent": "#88c0d0",
|
||||
"mesh_fill": "#5e81ac",
|
||||
"mesh_ink": "#eceff4",
|
||||
"mesh_soft": "#35495b",
|
||||
"on_accent": "#06121b",
|
||||
"origin_plane": "#ebcb8b28",
|
||||
"origin_plane_edge": "#ebcb8b88",
|
||||
"origin_plane_hover": "#88c0d040",
|
||||
"origin_point": "#a4b0c2",
|
||||
"overlay": "#2e3440",
|
||||
"panel": "#2e3440",
|
||||
"panel_header": "#3b4252",
|
||||
"preview_add": "#5e81ac",
|
||||
"preview_cut": "#bf616a66",
|
||||
"preview_new": "#ebcb8b",
|
||||
"preview_sketch": "#a3be8c",
|
||||
"profile_fill": "#5e81ac22",
|
||||
"render_accent": "#88c0d0",
|
||||
"render_fill": "#5e81ac",
|
||||
"render_ink": "#eceff4",
|
||||
"render_soft": "#35495b",
|
||||
"rubber_band": "#88c0d0",
|
||||
"section_cap": "#ebcb8b",
|
||||
"sel_edge": "#5e81ac",
|
||||
"sel_edge_rim": "#5e81ac",
|
||||
"sel_face": "#34607a",
|
||||
"sel_profile": "#34607a",
|
||||
"sel_profile_edge": "#5e81ac",
|
||||
"sel_vertex": "#5e81ac",
|
||||
"selected_bg": "#34607a",
|
||||
"selected_ink": "#eceff4",
|
||||
"sheet_fill": "#5e81ac",
|
||||
"sheet_ink": "#eceff4",
|
||||
"sheet_soft": "#35495b",
|
||||
"sketch": "#5e81ac",
|
||||
"sketch_accent": "#88c0d0",
|
||||
"sketch_centerline": "#ebcb8b",
|
||||
"sketch_construction": "#ebcb8b",
|
||||
"sketch_fixed": "#eceff4",
|
||||
"sketch_ink": "#eceff4",
|
||||
"sketch_locked": "#a3be8c",
|
||||
"sketch_lost": "#bf616a",
|
||||
"sketch_point": "#eceff4",
|
||||
"sketch_point_free": "#5e81ac",
|
||||
"sketch_projected": "#b48ead",
|
||||
"sketch_soft": "#35495b",
|
||||
"subheading_bg": "#222730",
|
||||
"surface_accent": "#88c0d0",
|
||||
"surface_fill": "#5e81ac",
|
||||
"surface_ink": "#eceff4",
|
||||
"surface_soft": "#35495b",
|
||||
"tab_on_fill_dark": "#242933",
|
||||
"text": "#eceff4",
|
||||
"text_dim": "#a4b0c2",
|
||||
"timeline": "#3b4252",
|
||||
"timeline_item": "#3b4252",
|
||||
"timeline_item_error": "#513f4a",
|
||||
"timeline_marker": "#a4b0c2",
|
||||
"toolbar": "#2e3440",
|
||||
"triad": [
|
||||
"#bf616a",
|
||||
"#a3be8c",
|
||||
"#5e81ac"
|
||||
],
|
||||
"viewport_bottom": "#242f40",
|
||||
"viewport_top": "#242f40",
|
||||
"warning": "#ebcb8b"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Nord"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#bd93f9",
|
||||
"accent_soft": "#393149",
|
||||
"agent_busy": "#bd93f9",
|
||||
"agent_ok": "#50fa7b",
|
||||
"app_bar": "#21222c",
|
||||
"app_bar_hover": "#f8f8f218",
|
||||
"app_bar_hover_button": "#f8f8f222",
|
||||
"app_bar_hover_strong": "#f8f8f230",
|
||||
"app_bar_hover_subtle": "#f8f8f210",
|
||||
"app_bar_icon": [
|
||||
"#f8f8f2",
|
||||
"#a1a4c4",
|
||||
"#bd93f9"
|
||||
],
|
||||
"app_bar_separator": "#50546d",
|
||||
"app_bar_tab_active": "#343746",
|
||||
"app_bar_text": "#f8f8f2",
|
||||
"axis_x": "#ff5555",
|
||||
"axis_y": "#50fa7b",
|
||||
"axis_z": "#8456b8",
|
||||
"bend_down": "#f1fa8c",
|
||||
"bend_up": "#50fa7b",
|
||||
"body": "#656581",
|
||||
"body_edge": "#8456b8",
|
||||
"body_selected": "#563c79",
|
||||
"border": "#50546d",
|
||||
"box_crossing": "#50fa7b",
|
||||
"box_window": "#bd93f9",
|
||||
"chip": "#bd93f9",
|
||||
"construction_geom": "#f1fa8c",
|
||||
"construction_plane": "#f1fa8c22",
|
||||
"continuity": [
|
||||
"#50fa7b",
|
||||
"#8456b8",
|
||||
"#f1fa8c",
|
||||
"#bd93f9"
|
||||
],
|
||||
"control_border": "#50546d",
|
||||
"control_fill": "#343746",
|
||||
"cube_border": "#50546d",
|
||||
"cube_face": "#343746",
|
||||
"cube_hover": "#393149",
|
||||
"cube_text": "#f8f8f2",
|
||||
"dialog_bg": "#282a36",
|
||||
"dialog_body": "#282a36",
|
||||
"dialog_border": "#50546d",
|
||||
"dialog_footer": "#282a36",
|
||||
"dialog_label": "#f8f8f2",
|
||||
"dialog_rule": "#50546d",
|
||||
"dimension": "#f8f8f2",
|
||||
"dimension_driven": "#a1a4c4",
|
||||
"error": "#ff5555",
|
||||
"field": "#21222c",
|
||||
"form_accent": "#bd93f9",
|
||||
"form_dim": "#a1a4c4",
|
||||
"form_error": "#ff5555",
|
||||
"form_error_fill": "#53333c",
|
||||
"form_fill": "#8456b8",
|
||||
"form_ink": "#f8f8f2",
|
||||
"form_primary": "#bd93f9",
|
||||
"form_soft": "#393149",
|
||||
"form_success": "#50fa7b",
|
||||
"form_success_fill": "#2f4d42",
|
||||
"form_tab_ink": "#f8f8f2",
|
||||
"gizmo": [
|
||||
"#ff5555",
|
||||
"#50fa7b",
|
||||
"#8456b8"
|
||||
],
|
||||
"glyph_bg": "#343746",
|
||||
"glyph_edge": "#ff5555",
|
||||
"glyph_text": "#ff5555",
|
||||
"grid": "#2e2f3d",
|
||||
"grid_major": "#3e4050",
|
||||
"heading_bg": "#14151b",
|
||||
"hover": "#393149",
|
||||
"hover_edge": "#8456b8",
|
||||
"hover_edge_halo": "#1d1e29",
|
||||
"hover_profile": "#bd93f928",
|
||||
"hover_profile_edge": "#8456b8",
|
||||
"icon": "#f8f8f2",
|
||||
"icon_fill": "#a1a4c4",
|
||||
"icons.access": [
|
||||
"#50fa7b",
|
||||
"#ff5555"
|
||||
],
|
||||
"icons.agent": "#bd93f9",
|
||||
"icons.axes": [
|
||||
"#ff5555",
|
||||
"#50fa7b",
|
||||
"#8456b8"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#8456b8",
|
||||
"#50fa7b",
|
||||
"#ff5555"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#50fa7b",
|
||||
"#f1fa8c"
|
||||
],
|
||||
"icons.floor": "#a1a4c4",
|
||||
"icons.fold": "#a1a4c4",
|
||||
"icons.folder": "#f1fa8c",
|
||||
"icons.glint": "#f8f8f280",
|
||||
"icons.highlight": "#f8f8f2",
|
||||
"icons.interference": "#ff5555",
|
||||
"icons.marker_halo": "#21222ccc",
|
||||
"icons.paint": [
|
||||
"#ff5555",
|
||||
"#8456b8",
|
||||
"#f1fa8c"
|
||||
],
|
||||
"icons.plane": "#f1fa8c",
|
||||
"icons.sheet": "#656581",
|
||||
"icons.sheet_2": "#656581",
|
||||
"icons.sheet_light": "#f8f8f2",
|
||||
"icons.sheet_line": "#8456b8",
|
||||
"icons.sky": "#656581",
|
||||
"icons.stripe": "#a1a4c4",
|
||||
"icons.warning": "#f1fa8c",
|
||||
"interference": "#ff5555",
|
||||
"logo": [
|
||||
"#bd93f9",
|
||||
"#8456b8",
|
||||
"#656581"
|
||||
],
|
||||
"manipulator": "#bd93f9",
|
||||
"mesh_accent": "#bd93f9",
|
||||
"mesh_fill": "#8456b8",
|
||||
"mesh_ink": "#f8f8f2",
|
||||
"mesh_soft": "#393149",
|
||||
"on_accent": "#06121b",
|
||||
"origin_plane": "#f1fa8c28",
|
||||
"origin_plane_edge": "#f1fa8c88",
|
||||
"origin_plane_hover": "#bd93f940",
|
||||
"origin_point": "#a1a4c4",
|
||||
"overlay": "#282a36",
|
||||
"panel": "#282a36",
|
||||
"panel_header": "#343746",
|
||||
"preview_add": "#8456b8",
|
||||
"preview_cut": "#ff555566",
|
||||
"preview_new": "#f1fa8c",
|
||||
"preview_sketch": "#50fa7b",
|
||||
"profile_fill": "#8456b822",
|
||||
"render_accent": "#bd93f9",
|
||||
"render_fill": "#8456b8",
|
||||
"render_ink": "#f8f8f2",
|
||||
"render_soft": "#393149",
|
||||
"rubber_band": "#bd93f9",
|
||||
"section_cap": "#f1fa8c",
|
||||
"sel_edge": "#8456b8",
|
||||
"sel_edge_rim": "#8456b8",
|
||||
"sel_face": "#563c79",
|
||||
"sel_profile": "#563c79",
|
||||
"sel_profile_edge": "#8456b8",
|
||||
"sel_vertex": "#8456b8",
|
||||
"selected_bg": "#563c79",
|
||||
"selected_ink": "#f8f8f2",
|
||||
"sheet_fill": "#8456b8",
|
||||
"sheet_ink": "#f8f8f2",
|
||||
"sheet_soft": "#393149",
|
||||
"sketch": "#8456b8",
|
||||
"sketch_accent": "#bd93f9",
|
||||
"sketch_centerline": "#f1fa8c",
|
||||
"sketch_construction": "#f1fa8c",
|
||||
"sketch_fixed": "#f8f8f2",
|
||||
"sketch_ink": "#f8f8f2",
|
||||
"sketch_locked": "#50fa7b",
|
||||
"sketch_lost": "#ff5555",
|
||||
"sketch_point": "#f8f8f2",
|
||||
"sketch_point_free": "#8456b8",
|
||||
"sketch_projected": "#bd93f9",
|
||||
"sketch_soft": "#393149",
|
||||
"subheading_bg": "#1e2028",
|
||||
"surface_accent": "#bd93f9",
|
||||
"surface_fill": "#8456b8",
|
||||
"surface_ink": "#f8f8f2",
|
||||
"surface_soft": "#393149",
|
||||
"tab_on_fill_dark": "#21222c",
|
||||
"text": "#f8f8f2",
|
||||
"text_dim": "#a1a4c4",
|
||||
"timeline": "#343746",
|
||||
"timeline_item": "#343746",
|
||||
"timeline_item_error": "#5c343d",
|
||||
"timeline_marker": "#a1a4c4",
|
||||
"toolbar": "#282a36",
|
||||
"triad": [
|
||||
"#ff5555",
|
||||
"#50fa7b",
|
||||
"#8456b8"
|
||||
],
|
||||
"viewport_bottom": "#1d1e29",
|
||||
"viewport_top": "#1d1e29",
|
||||
"warning": "#f1fa8c"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Nosferatu"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "dark",
|
||||
"colors": {
|
||||
"accent": "#61afef",
|
||||
"accent_soft": "#344b65",
|
||||
"agent_busy": "#6cb4f0",
|
||||
"agent_ok": "#4cc27a",
|
||||
"app_bar": "#21252b",
|
||||
"app_bar_hover": "#adb6bf1c",
|
||||
"app_bar_hover_button": "#ffffff1e",
|
||||
"app_bar_hover_strong": "#ffffff28",
|
||||
"app_bar_hover_subtle": "#ffffff12",
|
||||
"app_bar_icon": [
|
||||
"#abb2bf",
|
||||
"#5c6370",
|
||||
"#61afef"
|
||||
],
|
||||
"app_bar_separator": "#8891a0",
|
||||
"app_bar_tab_active": "#353b47",
|
||||
"app_bar_text": "#abb2bf",
|
||||
"axis_x": "#e06c75",
|
||||
"axis_y": "#98c379",
|
||||
"axis_z": "#61afef",
|
||||
"bend_down": "#d19a66",
|
||||
"bend_up": "#98c379",
|
||||
"body": "#abb2bf",
|
||||
"body_edge": "#181a1f",
|
||||
"body_selected": "#61afef",
|
||||
"border": "#3e4451",
|
||||
"box_crossing": "#98c379",
|
||||
"box_window": "#61afef",
|
||||
"chip": "#344b65",
|
||||
"construction_geom": "#d19a66",
|
||||
"construction_plane": "#d0996646",
|
||||
"continuity": [
|
||||
"#98c379",
|
||||
"#61afef",
|
||||
"#e5c07b",
|
||||
"#c678dd"
|
||||
],
|
||||
"control_border": "#4a5262",
|
||||
"control_fill": "#272b34",
|
||||
"cube_border": "#5c6370",
|
||||
"cube_face": "#abb2bf",
|
||||
"cube_hover": "#61afef",
|
||||
"cube_text": "#21252b",
|
||||
"dialog_bg": "#282c34",
|
||||
"dialog_body": "#3b4453",
|
||||
"dialog_border": "#4b5263",
|
||||
"dialog_footer": "#2f343e",
|
||||
"dialog_label": "#b4bbc8",
|
||||
"dialog_rule": "#353b47",
|
||||
"dimension": "#abb2bf",
|
||||
"dimension_driven": "#7f848e",
|
||||
"error": "#e06c75",
|
||||
"field": "#1e2227",
|
||||
"form_accent": "#7b63a6",
|
||||
"form_dim": "#949ba8",
|
||||
"form_error": "#f06460",
|
||||
"form_error_fill": "#6e3236",
|
||||
"form_fill": "#8a6fcc",
|
||||
"form_ink": "#dee2e8",
|
||||
"form_primary": "#3a88ee",
|
||||
"form_soft": "#372f4f",
|
||||
"form_success": "#8fdb9a",
|
||||
"form_success_fill": "#2c4a33",
|
||||
"form_tab_ink": "#b39bee",
|
||||
"gizmo": [
|
||||
"#e06c75",
|
||||
"#98c379",
|
||||
"#61afef"
|
||||
],
|
||||
"glyph_bg": "#282c34",
|
||||
"glyph_edge": "#e06c75",
|
||||
"glyph_text": "#e06c75",
|
||||
"grid": "#323842",
|
||||
"grid_major": "#3e4451",
|
||||
"heading_bg": "#14161a",
|
||||
"hover": "#3e4451",
|
||||
"hover_edge": "#181a1f",
|
||||
"hover_edge_halo": "#abb2bf",
|
||||
"hover_profile": "#60afef30",
|
||||
"hover_profile_edge": "#61afef",
|
||||
"icon": "#abb2bf",
|
||||
"icon_fill": "#5c6370",
|
||||
"icons.access": [
|
||||
"#98c379",
|
||||
"#e06c75"
|
||||
],
|
||||
"icons.agent": "#c678dd",
|
||||
"icons.axes": [
|
||||
"#e06c75",
|
||||
"#98c379",
|
||||
"#61afef"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#61afef",
|
||||
"#98c379",
|
||||
"#e06c75"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#98c379",
|
||||
"#e5c07b"
|
||||
],
|
||||
"icons.floor": "#3e4451",
|
||||
"icons.fold": "#7f848e",
|
||||
"icons.folder": "#e5c07b",
|
||||
"icons.glint": "#ffffffa0",
|
||||
"icons.highlight": "#ffffff",
|
||||
"icons.interference": "#e06c75",
|
||||
"icons.marker_halo": "#181a1f96",
|
||||
"icons.paint": [
|
||||
"#e06c75",
|
||||
"#61afef",
|
||||
"#e5c07b"
|
||||
],
|
||||
"icons.plane": "#e5c07b",
|
||||
"icons.sheet": "#61afef",
|
||||
"icons.sheet_2": "#56b6c2",
|
||||
"icons.sheet_light": "#abb2bf",
|
||||
"icons.sheet_line": "#61afef",
|
||||
"icons.sky": "#abb2bf",
|
||||
"icons.stripe": "#21252b",
|
||||
"icons.warning": "#e5c07b",
|
||||
"interference": "#e06c75",
|
||||
"logo": [
|
||||
"#61afef",
|
||||
"#56b6c2",
|
||||
"#c678dd"
|
||||
],
|
||||
"manipulator": "#61afef",
|
||||
"mesh_accent": "#857100",
|
||||
"mesh_fill": "#c6a800",
|
||||
"mesh_ink": "#d4b726",
|
||||
"mesh_soft": "#41391a",
|
||||
"on_accent": "#ffffff",
|
||||
"origin_plane": "#d19b675e",
|
||||
"origin_plane_edge": "#d19a66c8",
|
||||
"origin_plane_hover": "#c579dd96",
|
||||
"origin_point": "#abb2bf",
|
||||
"overlay": "#21252bf0",
|
||||
"panel": "#21252b",
|
||||
"panel_header": "#282c34",
|
||||
"preview_add": "#61afef",
|
||||
"preview_cut": "#e16d746e",
|
||||
"preview_new": "#e5c07b",
|
||||
"preview_sketch": "#98c379",
|
||||
"profile_fill": "#60acec28",
|
||||
"render_accent": "#e074ae",
|
||||
"render_fill": "#c8588f",
|
||||
"render_ink": "#e074ae",
|
||||
"render_soft": "#402336",
|
||||
"rubber_band": "#61afef",
|
||||
"section_cap": "#d19a66",
|
||||
"sel_edge": "#61afef",
|
||||
"sel_edge_rim": "#a6d4fa",
|
||||
"sel_face": "#4d78a6",
|
||||
"sel_profile": "#2c4b6b",
|
||||
"sel_profile_edge": "#61afef",
|
||||
"sel_vertex": "#61afef",
|
||||
"selected_bg": "#2a466e",
|
||||
"selected_ink": "#9cc7f5",
|
||||
"sheet_fill": "#2a7fa8",
|
||||
"sheet_ink": "#4fb3d9",
|
||||
"sheet_soft": "#1f3a47",
|
||||
"sketch": "#61afef",
|
||||
"sketch_accent": "#56b6c2",
|
||||
"sketch_centerline": "#d19a66",
|
||||
"sketch_construction": "#d19a66",
|
||||
"sketch_fixed": "#abb2bf",
|
||||
"sketch_ink": "#46be78",
|
||||
"sketch_locked": "#98c379",
|
||||
"sketch_lost": "#e06c75",
|
||||
"sketch_point": "#abb2bf",
|
||||
"sketch_point_free": "#61afef",
|
||||
"sketch_projected": "#c678dd",
|
||||
"sketch_soft": "#1f3b2b",
|
||||
"subheading_bg": "#1e2127",
|
||||
"surface_accent": "#95682d",
|
||||
"surface_fill": "#b26a14",
|
||||
"surface_ink": "#e0914a",
|
||||
"surface_soft": "#45331e",
|
||||
"tab_on_fill_dark": "#000000",
|
||||
"text": "#abb2bf",
|
||||
"text_dim": "#7f848e",
|
||||
"timeline": "#1e2227",
|
||||
"timeline_item": "#323842",
|
||||
"timeline_item_error": "#5c343d",
|
||||
"timeline_marker": "#abb2bf",
|
||||
"toolbar": "#21252b",
|
||||
"triad": [
|
||||
"#e06c75",
|
||||
"#98c379",
|
||||
"#61afef"
|
||||
],
|
||||
"viewport_bottom": "#282c34",
|
||||
"viewport_top": "#282c34",
|
||||
"warning": "#e5c07b"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "One Dark"
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"base": "light",
|
||||
"colors": {
|
||||
"accent": "#555599",
|
||||
"accent_soft": "#ccccff",
|
||||
"agent_busy": "#8888bb",
|
||||
"agent_ok": "#558855",
|
||||
"app_bar": "#c5c5c5",
|
||||
"app_bar_hover": "#ffffff40",
|
||||
"app_bar_hover_button": "#ffffff66",
|
||||
"app_bar_hover_strong": "#ffffff80",
|
||||
"app_bar_hover_subtle": "#ffffff26",
|
||||
"app_bar_icon": [
|
||||
"#333333",
|
||||
"#777777",
|
||||
"#666699"
|
||||
],
|
||||
"app_bar_separator": "#aaaaaa",
|
||||
"app_bar_tab_active": "#e6e6e6",
|
||||
"app_bar_text": "#222222",
|
||||
"axis_x": "#ff0000",
|
||||
"axis_y": "#00ff00",
|
||||
"axis_z": "#0202f8",
|
||||
"bend_down": "#c85a14",
|
||||
"bend_up": "#1e8c32",
|
||||
"body": "#adadb6",
|
||||
"body_edge": "#292933",
|
||||
"body_selected": "#9999cc",
|
||||
"border": "#888888",
|
||||
"box_crossing": "#28a050",
|
||||
"box_window": "#555599",
|
||||
"chip": "#555599",
|
||||
"construction_geom": "#9c5600",
|
||||
"construction_plane": "#ccccdd33",
|
||||
"continuity": [
|
||||
"#009e73",
|
||||
"#0072b2",
|
||||
"#f0c800",
|
||||
"#cc008c"
|
||||
],
|
||||
"control_border": "#888888",
|
||||
"control_fill": "#dddddd",
|
||||
"cube_border": "#888888",
|
||||
"cube_face": "#eeeeee",
|
||||
"cube_hover": "#ccccff",
|
||||
"cube_text": "#222222",
|
||||
"dialog_bg": "#dddddd",
|
||||
"dialog_body": "#eeeeee",
|
||||
"dialog_border": "#888888",
|
||||
"dialog_footer": "#dddddd",
|
||||
"dialog_label": "#222222",
|
||||
"dialog_rule": "#aaaaaa",
|
||||
"dimension": "#222222",
|
||||
"dimension_driven": "#666666",
|
||||
"error": "#bb3333",
|
||||
"field": "#ffffff",
|
||||
"form_accent": "#666699",
|
||||
"form_dim": "#666666",
|
||||
"form_error": "#aa2222",
|
||||
"form_error_fill": "#f2dddd",
|
||||
"form_fill": "#8888bb",
|
||||
"form_ink": "#444477",
|
||||
"form_primary": "#555599",
|
||||
"form_soft": "#e6e6f2",
|
||||
"form_success": "#336633",
|
||||
"form_success_fill": "#e2ecdf",
|
||||
"form_tab_ink": "#555599",
|
||||
"gizmo": [
|
||||
"#e1463c",
|
||||
"#50be50",
|
||||
"#4682f0"
|
||||
],
|
||||
"glyph_bg": "#ffffff",
|
||||
"glyph_edge": "#be6e64",
|
||||
"glyph_text": "#ca473d",
|
||||
"grid": "#e2e2e2",
|
||||
"grid_major": "#c8c8c8",
|
||||
"heading_bg": "#cccccc",
|
||||
"hover": "#ccccff",
|
||||
"hover_edge": "#000000",
|
||||
"hover_edge_halo": "#ffffff",
|
||||
"hover_profile": "#9999cc33",
|
||||
"hover_profile_edge": "#666699",
|
||||
"icon": "#222222",
|
||||
"icon_fill": "#666699",
|
||||
"icons.access": [
|
||||
"#46b45a",
|
||||
"#dc463c"
|
||||
],
|
||||
"icons.agent": "#8888bb",
|
||||
"icons.axes": [
|
||||
"#d23c3c",
|
||||
"#3ca03c",
|
||||
"#3c64dc"
|
||||
],
|
||||
"icons.curvature": [
|
||||
"#3c6ee6",
|
||||
"#46be5a",
|
||||
"#e13c2d"
|
||||
],
|
||||
"icons.draft": [
|
||||
"#46b45a",
|
||||
"#ebc832"
|
||||
],
|
||||
"icons.floor": "#666666",
|
||||
"icons.fold": "#999999",
|
||||
"icons.folder": "#aaaaee",
|
||||
"icons.glint": "#ffffffa0",
|
||||
"icons.highlight": "#ffffff",
|
||||
"icons.interference": "#e1463c",
|
||||
"icons.marker_halo": "#00000096",
|
||||
"icons.paint": [
|
||||
"#dc463c",
|
||||
"#4696e6",
|
||||
"#f0c83c"
|
||||
],
|
||||
"icons.plane": "#f4d696",
|
||||
"icons.sheet": "#ccccdd",
|
||||
"icons.sheet_2": "#aaaabb",
|
||||
"icons.sheet_light": "#eeeeff",
|
||||
"icons.sheet_line": "#777799",
|
||||
"icons.sky": "#ccccdd",
|
||||
"icons.stripe": "#1e1e1e",
|
||||
"icons.warning": "#fac83c",
|
||||
"interference": "#eb2d28",
|
||||
"logo": [
|
||||
"#ccccff",
|
||||
"#9999cc",
|
||||
"#666699"
|
||||
],
|
||||
"manipulator": "#555599",
|
||||
"mesh_accent": "#666699",
|
||||
"mesh_fill": "#8888bb",
|
||||
"mesh_ink": "#444477",
|
||||
"mesh_soft": "#e6e6f2",
|
||||
"on_accent": "#ffffff",
|
||||
"origin_plane": "#ccccdd44",
|
||||
"origin_plane_edge": "#888899aa",
|
||||
"origin_plane_hover": "#9999cc66",
|
||||
"origin_point": "#aaaaaa",
|
||||
"overlay": "#dddddd",
|
||||
"panel": "#dddddd",
|
||||
"panel_header": "#cccccc",
|
||||
"preview_add": "#9999cc",
|
||||
"preview_cut": "#e8532c6e",
|
||||
"preview_new": "#f0e169",
|
||||
"preview_sketch": "#20be60",
|
||||
"profile_fill": "#ccccff33",
|
||||
"render_accent": "#666699",
|
||||
"render_fill": "#8888bb",
|
||||
"render_ink": "#444477",
|
||||
"render_soft": "#e6e6f2",
|
||||
"rubber_band": "#555599",
|
||||
"section_cap": "#d68048",
|
||||
"sel_edge": "#555599",
|
||||
"sel_edge_rim": "#ccccff",
|
||||
"sel_face": "#9999cc",
|
||||
"sel_profile": "#444477",
|
||||
"sel_profile_edge": "#555599",
|
||||
"sel_vertex": "#555599",
|
||||
"selected_bg": "#ccccff",
|
||||
"selected_ink": "#333366",
|
||||
"sheet_fill": "#8888bb",
|
||||
"sheet_ink": "#444477",
|
||||
"sheet_soft": "#e6e6f2",
|
||||
"sketch": "#444488",
|
||||
"sketch_accent": "#666699",
|
||||
"sketch_centerline": "#c86e3c",
|
||||
"sketch_construction": "#e68228",
|
||||
"sketch_fixed": "#222222",
|
||||
"sketch_ink": "#444477",
|
||||
"sketch_locked": "#447744",
|
||||
"sketch_lost": "#c83c5a",
|
||||
"sketch_point": "#222222",
|
||||
"sketch_point_free": "#444488",
|
||||
"sketch_projected": "#963cbe",
|
||||
"sketch_soft": "#e6e6f2",
|
||||
"subheading_bg": "#d7d7d7",
|
||||
"surface_accent": "#666699",
|
||||
"surface_fill": "#8888bb",
|
||||
"surface_ink": "#444477",
|
||||
"surface_soft": "#e6e6f2",
|
||||
"tab_on_fill_dark": "#222222",
|
||||
"text": "#222222",
|
||||
"text_dim": "#666666",
|
||||
"timeline": "#cccccc",
|
||||
"timeline_item": "#eeeeee",
|
||||
"timeline_item_error": "#f2dddd",
|
||||
"timeline_marker": "#666666",
|
||||
"toolbar": "#dddddd",
|
||||
"triad": [
|
||||
"#dc3c3c",
|
||||
"#3caa3c",
|
||||
"#3c64e6"
|
||||
],
|
||||
"viewport_bottom": "#ffffff",
|
||||
"viewport_top": "#ffffff",
|
||||
"warning": "#997722"
|
||||
},
|
||||
"format": "solidcraft-theme/1",
|
||||
"name": "Platinum 9"
|
||||
}
|
||||