Compare commits

...

166 Commits

Author SHA1 Message Date
Ian Chua
64d04a75f3 feat: additional events 2026-08-24 11:36:37 +08:00
Ian Chua
bf22ef2a82 Merge branch 'main' into feat/plugin-lifecycle-evts 2026-08-20 12:21:50 +08:00
Ian Bassi
f5f3d2221d AI Translation update (#15300) 2026-08-19 14:47:34 -03:00
Kris Austin
8047141981 test: fix the flaky multiline lightning smoothing assertion (#15294) 2026-08-19 11:28:58 -03:00
Ian Chua
dfd3444ae7 feat: initial draft of lifecycle events API for plugins 2026-08-19 19:20:31 +08:00
SoftFever
872c660cb3 feat: Plugin pages (#14992)
# Description

This PR introduces native tabs as plugins.

The pages are webViews, and function similar to the existing plugin html
dialogs.
One per-requesite of this is to refactor the existing tab/notebook
architecture to be string based rather than index based.
The current implementation is still in early development stages and are
more meant for showcasing the vision rather than a final product.

The plugins used in the screenshots below:

[orca_pages_showcase_plugin_any.py](https://github.com/user-attachments/files/30459615/orca_pages_showcase_plugin_any.py)

[orca_pages_plugin_example_any.py](https://github.com/user-attachments/files/30459616/orca_pages_plugin_example_any.py)


# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
<img width="3384" height="1431" alt="image"
src="https://github.com/user-attachments/assets/68cd7a00-25fc-4e0e-91d7-c9b287f32b81"
/>
<img width="3384" height="1431" alt="image"
src="https://github.com/user-attachments/assets/81474441-e00a-4dea-b961-89dcdc462d55"
/>
<img width="3384" height="1431" alt="image"
src="https://github.com/user-attachments/assets/9504c5d7-25f7-47ed-9c77-b2cdc5507a87"
/>

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-08-19 14:31:57 +08:00
SoftFever
35db2cd89b Merge branch 'main' into feat/plugin-pages 2026-08-19 14:08:59 +08:00
SoftFever
1e87d56482 Micro-refactor 2026-08-19 14:08:19 +08:00
Ian Chua
1c90ba78a5 fix: recursive include between HMS.hpp and GUI_App.hpp (#15285)
# Description

Break the recursive include dependency by moving GUI_App.hpp from
HMS.hpp into HMS.cpp. Add the required standard headers and use explicit
std/nlohmann types to remove reliance on transitive includes.

This prevents recursive header inclusion while preserving HMS
functionality.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-08-19 13:01:19 +08:00
Ian Chua
bb1e68aa94 Merge branch 'main' into fix/recursive_include 2026-08-19 13:01:02 +08:00
Ian Chua
02f148123d Add clang-cl (LLVM) build support on Windows (#14375)
# Description

This PR enables building OrcaSlicer on Windows with the **clang-cl
(LLVM)**
toolchain and the **Ninja** generator, in addition to the existing MSVC
path.
Clang is already supported on Linux with this codebase, so this extends
that
support to Windows.

The changes fall into three categories. All are either no-ops on the
existing
MSVC/Visual Studio path or Windows/clang-cl-specific, so the standard
build is
not affected.

### 1. C++ conformance fixes
clang-cl is stricter than MSVC and rejects several constructs that
cl.exe
silently accepted. Each of these is non-conforming code that MSVC
tolerated:

* **Explicit template instantiation in `BoundingBox.cpp`** — clang-cl
does not
instantiate `BoundingBoxBase<Point, Points>::construct` through the same
  transitive path MSVC uses; added the explicit instantiation.
* **Eigen cast materialization in `AABBTreeLines.hpp`** — `.cast<T>()`
returns a
lazy `CwiseUnaryOp`, not a concrete `Matrix`; materialized it before
passing to
  `distance_to_squared`, which expects a concrete type.
* **`LabelItemType` underlying type in `PresetComboBoxes.hpp`** — gave
the enum
the same `std::size_t` underlying type as `Marker` to resolve a
narrowing
  conversion in a switch.
* **`T2A_` cast in `BaseException.cpp`** — explicit `static_cast<const
char*>` on
  the ATL conversion helper result.
* **Wide string literals in `GUI_App.cpp`** — used `L""` literals where
  concatenated with a `std::wstring` (`url_prefix`).

### 2. Build system / dependencies
* **Exclude clang-cl from MSVC-only CMake guards** — `if(MSVC)` is true
for
  clang-cl, so blocks applying cl.exe-only flags now exclude Clang.
* **Disable TBB LTCG** — oneTBB enables MSVC IPO/LTCG by default,
emitting
proprietary `/GL` bitcode objects that `lld-link` cannot consume.
Disabling IPO
produces native COFF, linkable by both `link.exe` and `lld-link`. TBB is
threading infrastructure, so the runtime impact of disabling LTCG is
negligible.
* **wxWidgets target path** — clang-cl uses the MSVC frontend variant on
Windows
but reports compiler id `Clang`, so wxWidgets looked under
`clang_x64_lib`
  instead of the `vc_x64_lib` layout the deps are built with.

### 3. Ninja generator support
* **Runtime DLL copy** — the DLL copy step was nested under
`CMAKE_CONFIGURATION_TYPES` (multi-config only), so single-config Ninja
skipped
copying OCCT/GMP/MPFR/WebView2/freetype DLLs next to the executable. Now
runs
  for both generator styles, guarded by `if(WIN32)`.
* **`build_release_vs.bat` Ninja target** — `ALL_BUILD` is a Visual
Studio
  target; Ninja uses `all`. The script failed with
  `ninja: error: unknown target 'ALL_BUILD'` when invoked with `-x`.

## Tests

Built from a clean checkout on Windows with:
* clang-cl 22 (LLVM toolchain bundled with Visual Studio 18)
* Ninja Multi-Config generator
* lld-link as the linker

The full build (deps + slicer) compiles, `OrcaSlicer.dll` links with
`lld-link`,
and `orca-slicer.exe` runs. Verified end-to-end by loading a model,
slicing it,
and generating valid G-code (screenshot below).

The existing MSVC / Visual Studio build path is unaffected — all changes
are
guarded by compiler/generator/platform checks or are conformance fixes
that
compile identically under MSVC.

# Screenshots
<img width="1919" height="1079" alt="image"
src="https://github.com/user-attachments/assets/02082437-db36-4696-a91a-d9acf57d4a52"
/>
2026-08-19 13:00:46 +08:00
SoftFever
7c55b07736 Merge branch 'main' into feat/plugin-pages 2026-08-19 11:15:20 +08:00
Ian Chua
156e096a9b Merge branch 'main' into fix/recursive_include 2026-08-19 03:37:06 +08:00
peachismomo
050ebbb1f4 Merge branch 'main' into fix/clang-cl-windows-support 2026-08-19 03:14:10 +08:00
peachismomo
e840187edc fix: clang-cl arm64 wxWidgets path and plater desctructor before merging main 2026-08-19 03:12:56 +08:00
SoftFever
5be1f8f209 fix crash on Mac 2026-08-19 01:37:23 +08:00
SoftFever
02736fee16 Restore the web Device tab URL load on tab selection
Selecting the web Device tab loaded the printer's web UI from the selected discovered machine
when the preset carried no host. That arm was lost merging main into this branch — two of the
three Plater.cpp hunks from #15134 survived, this one did not — leaving the tab blank, since
PrinterWebView starts on an empty URL and nothing else navigates it.
2026-08-19 00:27:48 +08:00
SoftFever
ffee402494 Give the printer-agents web Device tab its own page id
In printer-agents mode the legacy web page was appended under Notebook::PAGE_MONITOR, which
resolves to the same "monitor" id as the native Device tab. FindPageByName returns the first
match, so PluginPages::relayout() — which saves the selection by name and restores it after
rebuilding the tab strip — moved the user off the web tab onto the native one. The tab also
disagreed with its own label, being created as "Device (legacy)" and renamed to "Device (Web)"
on the next show_device() call.
2026-08-19 00:27:48 +08:00
Ian Bassi
4fd7fdb3fa Move smooth factor wiki link (#15287) 2026-08-18 12:25:59 -03:00
Ian Bassi
322dc9b6a6 Smooth more patterns (#15205) 2026-08-18 12:19:27 -03:00
SoftFever
6c0f5eee55 Clarify icon rescaling condition in Button::Rescale method 2026-08-18 22:17:59 +08:00
GlauTech
6a52ea1818 Update OrcaSlicer_tr.po (#15119)
* Update OrcaSlicer_tr.po

* Update OrcaSlicer_tr.po

Fixed inaccurate AI-generated text and updated missing translations.

* REmoive # AI Translated

---------

Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-08-18 10:51:40 -03:00
peachismomo
b6e4f52c05 fix: recursive include between HMS.hpp and GUI_App.hpp 2026-08-18 19:00:53 +08:00
SoftFever
ba22a87a0b Add /bot merge for delegated vendor profile maintainers (#15279)
* Add /bot merge for delegated vendor profile maintainers

Vendor profile PRs no longer need a maintainer with repository write access: an
account listed in the FOLDER_MERGERS variable can squash-merge a PR confined to
the folders it owns by commenting /bot merge on it. Anything reaching outside
that grant, targeting a branch other than main or release/*, or missing a green
Check profiles run is declined with a comment naming the offending files.
Grants live in the merge-delegation environment, so only an admin can change who
may merge, and MERGE_BOT_DRY_RUN stops all merging without a code change.

Check profiles now also runs on release/* pull requests; nothing else changes
for existing contributors.

* Add profile version bump to the code review checklist

Without the bump in resources/profiles/<Vendor>.json, a preset change never
reaches existing installs over the air.
2026-08-18 00:42:03 +08:00
jimmy-brightz
542cd18d19 Fix prime tower rotation angle setting not working (#15227) 2026-08-17 14:34:41 +08:00
SoftFever
57092d5abd Reorder network initialization calls 2026-08-17 13:31:30 +08:00
Robert J Audas
f529692ac0 Fix slowdown for caged external overhangs (#14735)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-08-16 23:40:50 -03:00
Alexandre Folle de Menezes
728cf63c3d Verify and improve AI pt_BR translations (#15261) 2026-08-15 12:54:00 -03:00
Ian Chua
7580d8ef8c Merge branch 'main' into feat/plugin-pages 2026-08-14 12:20:34 +08:00
Manzari
d5dbd96dd6 Skip filament_colour_type in G-code config block to fix Anycubic Kobra 3 parse crash (#13507)
Co-authored-by: manzari <mail@manzari.dev>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
2026-08-13 21:52:52 -03:00
TheLegendTubaGuy
0225cadff0 Fix PLA/PETG warning wiki link (#15172) 2026-08-13 18:57:08 -03:00
TheLegendTubaGuy
c5aedd1cea Enable Snapmaker U1 bed type selector (#15174) 2026-08-13 18:25:52 -03:00
Robert J Audas
78eef79ffe Fix flushing-volume warning for single-filament plates (#14704)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
2026-08-13 17:50:55 -03:00
Kiss Lorand
56d2c527cb Fix crashes from object-level small perimeter speed overrides (#15232) 2026-08-13 17:28:31 -03:00
Kiss Lorand
fd23b74b99 Fix single-value object overrides on multi-nozzle printers (#15221) 2026-08-13 17:09:10 -03:00
Ian Chua
50dfcff031 fix: plugin pages removing calibration tab 2026-08-13 14:54:46 +08:00
Kiss Lorand
d322b1a156 Fix assembly parts omitted by height range modifiers (#15225) 2026-08-12 15:42:21 -03:00
Kiss Lorand
ee6613a4b8 Fix stale flush matrix after enabling SEMM (#15223) 2026-08-12 15:18:00 -03:00
Ian Chua
e9d421050e refactor: access codes and device tab (#15134) 2026-08-12 18:50:49 +08:00
Ian Chua
5e6895ddd2 Merge branch 'main' into feat/plugin-pages 2026-08-12 14:14:00 +08:00
Terasit Juntarasombut
6dbdb1d07e l10n: Fix contextual and technical translation errors in Thai (th) (#15213)
* l10n: Fix contextual and technical translation errors in Thai (th)

* l10n(th): standardize technical terms and sync localization glossary (#15213)

* l10n(th): remove localization_glossary.tsv from PR (#15213)
2026-08-11 16:56:59 -03:00
Kiss Lorand
117ed0060d Fix Celsius symbol rendering in Preview (#15202) 2026-08-11 16:25:09 -03:00
Ian Bassi
c5d2944ee0 Euskera update (#15215)
Based in https://github.com/OrcaSlicer/OrcaSlicer/pull/14970#issuecomment-5145928650
2026-08-11 09:54:37 -03:00
Ian Chua
5005ecc88b Merge branch 'main' into feat/plugin-pages 2026-08-11 17:51:18 +08:00
Ian Chua
7be7f07551 feat: UI for dropdown to select which plugin to show past max visible pages 2026-08-11 17:50:49 +08:00
Ian Chua
54fe28ab08 feat: add max visible pages to app config under Preferences -> General -> Plugins 2026-08-11 17:50:20 +08:00
Anson Liu
b422636740 Move Generic vendor above Bambu vendor in AMS material setting. (#11306)
* Move Generic vendor above Bambu vendor in AMS material setting.

* Remove hardcoded sorted_names. Alphabetically sort Bambu with all vendors

* Fix sorting with case insensitive comparison

* Use arithmetic to get rank distance because priorities are stored in a vector. This lets us remove the <interator> include.
2026-08-11 14:51:25 +08:00
Anson Liu
c806a09c7c Show current filaments at top of AMS filament dropdown (#11293)
* Move currently active filaments added to the Prepare sidebar to the top of the AMS Material Selection combo box.

It is likely the user wants to set the material to the currently active filament.

* Reduce logging verbosity.

* Refactor current active preset filament finding to find nested preset inheritance.

* Initialize pointer to null before usage.

* Remove old commit code

* Remove new line

---------

Co-authored-by: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com>
Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-08-10 11:04:17 +08:00
yw4z
1a8f39c5f7 Fix emboss gizmo font preview of style not rendering properly (#14612) 2026-08-09 13:24:04 +08:00
TheLegendTubaGuy
9421e7fa9b Fix detached copies of system presets (#15173)
* Fix detached copies of system presets

* Clarify detached preset compatibility

* Show unique preset state in save dialog

* Update SavePresetDialog.cpp

---------

Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-08-09 02:08:54 +03:00
Mitchell Mashburn
af9fd10d7a re:3D profile updates. (#15169)
* re:3D profile updates.

- Replace vendor-specific "re3D Greengate rPETG" filament with a generic "re3D rPETG" (base + @0.8/@1.75 nozzle variants), matching the naming convention used for rPLA/rPETG elsewhere in the re:3D vendor
  pack.
- Add fdm_filament_pp as a proper filament-type parent and switch re3D rPP to inherit from it instead of overriding filament_type on top of fdm_filament_pet.
- Added filament_type to the specific printer JSON file and removed from the base printer JSON file [fixes Issue#14693]
- Updates to speeds and accelerations for re:3D profiles, moved from common to machine processes [closed: PR#14259]
- Updates to fdm profile filename format so that it lists the filename and extruder number in the sliced .gcode file

* Fix setting IDs

* Add rename from for changed material names.
2026-08-08 01:07:03 +08:00
Kris Austin
74aed7a2bb test: finish the temp-file cleanup (#14976)
Follow-up to #14785. Routes the tests that still hand-rolled temp paths through
the shared helpers and unifies the temp guards.

- Add ScopedTemporaryDir and a shared ScopedTemporaryPath base under it and
  ScopedTemporaryFile.
- Move test_3mf's round-trip .3mf output out of the TEST_DATA_DIR source tree
  (a fixed-name leak) and test_toolordering's fixed-name temp .gcode (a sharding
  collision) onto ScopedTemporaryFile.
- Move test_config, test_slicing_pipeline_bindings, the test_3mf backup dirs, and
  test_preset_bundle_loading onto the guards.
- Make slic3rutils ScopedDataDir compose ScopedTemporaryDir; dedupe
  test_network_versions' fixture and delete test_plugin_lifecycle's duplicate.
2026-08-07 13:33:37 -03:00
Kris Austin
8bff9aaf32 fix(GUI): honor "Ignore" when layer height exceeds the configured maximum (#14369)
* fix(GUI): honor "Ignore" when layer height exceeds the configured maximum

Entering a layer height above the printer's max_layer_height on the Print
Settings tab fired two guards in sequence. Tab::on_value_change prompts
"...Adjust to the set range automatically?" with an Adjust/Ignore choice, and
ConfigManipulation::update_print_fff_config then showed an OK-only "Too large
layer height. Reset to X" dialog whose result was never checked, so it always
reset the value. The second guard overrode the user's "Ignore", resetting the
layer height regardless.

Changes:
- Extract the shared Adjust/Ignore dialog into
  ConfigManipulation::layer_height_out_of_range_dialog, reused by the tab
  (Tab::on_value_change) and the per-object/part settings panels. The dialog now
  names the value it will clamp to and reads correctly for too-low as well as
  too-high.
- The tab/plate path is already covered by Tab::on_value_change, so the
  duplicate reset is dropped from update_print_fff_config.
- The per-object/part panels have no on_value_change hook, so add
  ConfigManipulation::check_object_layer_height and call it from the object
  settings update paths, gated on the edited option (changed_opt_key ==
  "layer_height"). It prompts once per layer-height edit and does not re-prompt
  when unrelated object settings change after the user chose "Ignore".

Fixes #14214

* refactor(GUI): unify the layer-height range check across tab and object panels

Copilot review of #14369 noted that the per-object check only guarded the
max at extruder 0 and skipped the too-low case, diverging from the tab.

Move the whole range check into ConfigManipulation::check_layer_height,
used by both Tab::on_value_change and the per-object/part panels. It takes
the widest [min, max] window across the printer's extruders, offers
Adjust/Ignore in both directions, and resets a near-zero value. The tab's
inline block collapses to one call, dropping the duplicated limit logic.

* fix(GUI): only enforce layer-height limits that are actually set

max_layer_height defaults to 0 (unset), so the unconditional range check
offered to clamp any layer height to 0 on presets that don't define it.
Guard each branch (near-zero, too-high, too-low) so an unset limit disables
that direction; the slice-time nozzle-diameter check still applies.

Also run check_layer_height before update_print_fff_config in the object
panels so a near-zero per-object value prompts the same way the tab does,
with update_print_fff_config's fallback still covering the no-minimum case.
2026-08-07 13:31:04 -03:00
Kris Austin
83723e2a7b fix: Slice all crash on a multi-plate project with an uninitialized toolbar (#15117)
_update_select_plate_toolbar_stats_item(true) runs from
on_action_slice_all before the select-plate toolbar has necessarily been
initialized. m_all_plates_stats_item is only assigned in
_init_select_plate_toolbar, so slicing a multi-plate project shortly
after startup (before the Preview tab has rendered) leaves the pointer
null while show_stats_item is true, and the branch dereferences it,
crashing with SIGSEGV.

Every other dereference of this pointer already null-checks it. Add the
same check here so the all-plates stats item is left unselected until the
toolbar is initialized instead of crashing.

Fixes #15116
2026-08-07 13:28:54 -03:00
Kris Austin
e2fd46f82c fix: default-initialize WallToolPathsParams fields (#15138)
min_length_factor and is_top_or_bottom_layer had no default initializers, and the FillConcentric/FillConcentricInternal callers never set them, so WallToolPaths::removeSmallLines() thresholded on stack garbage. Which short extrusion lines it dropped then depended on memory layout, so concentric solid-infill output was nondeterministic between runs and across machines. Give every member a default, matching the adjacent FillParams. The perimeter path was already fine because it builds the struct via make_paths_params().
2026-08-07 13:22:26 -03:00
TheLegendTubaGuy
b216813bf0 Add the Qidi Plus 5 (#15163)
* Add the Qidi Plus 5

* Remove ignored profiles

Qidi didn't register these, so they are essentially dead weight.

* Set Qidi profile version to 02.04.00.10
2026-08-07 13:07:27 -03:00
Felix14_v2
b3296fa199 Review AI changes in Russian localization (#15092)
* Review AI changes

* Part 2

* Part 3

* Part 4

God bless Ian Alexis

* Part 5

* Final part!

* Catches by Gemma

This 6-minute check probably saved me a week

* Tweak

* Update OrcaSlicer_ru.po
2026-08-07 12:03:53 -03:00
Surfoo
6d9a9eeb04 i18n(fr): improve French localization quality and consistency. (#15106) 2026-08-07 09:31:57 -03:00
Clifford
8e243faa3a Fix Linux unit test failure in the wipe tower temperature trace comparison (#15161)
## Problem

`Toolchange temperature commands are unchanged when the wipe tower wait
is off`
(added in #15144) fails on both Linux runners and passes on Windows and
macOS.
It is the only failing test in the suite, and it has been failing on
main since
that PR merged.

| Job | Result |
| --- | --- |
| Windows x64 / Unit Tests | pass |
| Windows arm64 / Unit Tests | pass |
| macOS arm64 / Unit Tests | pass |
| Linux x86_64 / Unit Tests | **fail** |
| Linux aarch64 / Unit Tests | **fail** |

From the merge commit
([Linux
x86_64](https://github.com/OrcaSlicer/OrcaSlicer/actions/runs/31072382258/job/92531704095),
[Linux
aarch64](https://github.com/OrcaSlicer/OrcaSlicer/actions/runs/31072382258/job/92531704075)),
still reproducing on current main:

```
first difference at trace entry 29
  main:   M104 S240 T0 ; preheat T0 time: 31s	lead 30.9s
  branch: M104 S240 T0 ; preheat T0 time: 30s	lead 30.3s
```

## Cause

Each preheat entry records the same quantity twice: `lead` at one
decimal, and
`time:` inside the command text as that value rounded to a whole second.

`split_lead` already compares `lead` with a 0.5s tolerance and explains
why the
estimate moves. `time:` sits in the exactly-compared command text, so it
never
got that tolerance — and being rounded, it flips on a drift far below
0.5s
(30.4 and 30.6 render as `30s` and `31s`). Entry 29 is the only entry in
the
163-entry golden whose lead rounds up; every other preheat sits at
30.0–30.4 and
rounds down, which is why it is the only one that fails.

The variation is per-toolchain, not run to run. Both Linux arches
produce
exactly `lead 30.3s`; Windows x64/arm64 and macOS arm64 all produce
exactly
`30.9s`. Repeated local runs are byte-identical. macOS arm64 passing
while Linux
aarch64 fails rules out the ISA — it is floating-point accumulation over
a few
thousand move durations under GCC vs Clang vs MSVC.

The mechanism makes it discrete rather than gradual: the backtrace parks
the
preheat at the first exported line at least `preheat_time` before the
tool
change, so `lead` is `preheat_time` plus the leftover of whichever move
that
landed on. A sub-tenth difference selects the neighbouring move and
`lead` steps
by that move's whole duration.

Entries 1–28 match exactly, including five earlier preheats whose leads
fall
inside the existing tolerance, so the toolpaths themselves are
identical. I also
reverted the two prime-tower commits that landed between the golden's
capture
point and now, rebuilt, and got a byte-identical trace — this is not
behavioural
drift.

That also rules out regenerating the golden: no single capture satisfies
all
three toolchains, and recapturing on Linux would turn the three
currently-green
runners red.

## Fix

Test-only.

- `lead` keeps a tolerance, widened to 1.5s (measured drift 0.6s; a
preheat
actually leaving its backtrace position would move by tens of seconds).
- `time:` is **not** compared across runs at all. Being a rounding of
`lead`, it
carries nothing the tolerance does not already cover, and comparing it
across
runs can only reproduce the flake. It is instead checked against its own
  entry's `lead` — a correct rounding keeps `|time - lead| <= 0.5`.

That second point matters: simply tolerating `time:` numerically would
have made
the test blind to a real change, because drift and a wrong rounding both
move it
by 1. The self-consistency check keeps that coverage. I verified it by
changing
`(int) std::round(time_diffs[0])` to `(int) time_diffs[0]` in
`GCodeProcessor::export_lines` — the test fails with
`"time:" is not its entry's "lead" rounded to a whole second`, where a
plain
tolerance would have passed silently.

Everything else is still compared exactly: all M104/M109 values, tool
ids,
block markers, ordering, entry count, and the annotation text including
its
trailing `s`. The other 138 entries remain byte-exact.

No production code, no golden regeneration. The golden file and these
helpers
are used by this one test and nothing else, and the tolerance only
widens, so
Windows and macOS keep passing unchanged. A note is added to the
golden's header
so the next mismatch in those fields is not "fixed" by recapturing.

## How to verify

Before, on Linux:

```bash
git checkout main && ./build_linux.sh -t
ctest --test-dir build/tests -R "Toolchange temperature commands are unchanged" --output-on-failure
# fails at trace entry 29
```

After:

```bash
cmake --build build --config Release --target fff_print_tests
ctest --test-dir build/tests --output-on-failure     # 463/463
```
2026-08-07 20:26:18 +08:00
Alexandre Folle de Menezes
b5412221b6 Verify and improve AI pt_BR translations (#15080) 2026-08-07 09:22:42 -03:00
Kiss Lorand
f444176df8 Fix Windows crash after using "Replace all with 3D files" (#15102)
Fix Windows crash in Replace all with 3D file

Keep the replacement result message as wxString and substitute the volume
name directly.

On Windows, wxString::ToStdString() cannot encode the Unicode status icon
through the active ANSI code page and returns an empty string. Passing that
empty string to boost::format with a volume-name argument throws
boost::too_many_args and exits OrcaSlicer.
2026-08-07 17:13:25 +08:00
Ian Bassi
a684c6daf6 Bump Creality (#15157)
To apply https://github.com/OrcaSlicer/OrcaSlicer/pull/14654
2026-08-06 18:44:40 -03:00
TheLegendTubaGuy
7f10c73dce Fix redundant QIDI startup tool changes (#15096)
* Fix redundant QIDI startup tool changes

Guard Q2, X-Max 4, and X-Plus 4 filament-change G-code so same-tool startup selections do not run the full cut, unload, and purge sequence.

* Guard Q2C against redundant startup tool changes

Skip the complete filament-change sequence when the requested tool is already selected during startup.

* Bump Qidi profile version
2026-08-06 18:26:42 -03:00
yw4z
945520b827 QOL Add parent preset information next to detach preset checkbox and match checkbox style on Save Preset dialog (#15076)
init
2026-08-06 22:58:39 +08:00
Kiss Lorand
b281c91b99 Fix ignored filament-specific ironing speed override (#15082)
Fix overridden ironing speed

Use filament_ironing_speed for the active filament when configured, falling back to the process setting when unset.
2026-08-06 22:54:11 +08:00
Ian Bassi
b57d7a67e2 Regression version for Bug report (#15139) 2026-08-06 22:43:37 +08:00
SoftFever
18ca06ec6b Size the prime tower from the actual flush volumes (#15149)
# Description

<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
  > * What issue does this PR address or fix?
  > * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->

The prime tower reserved its footprint from the prime volume alone,
ignoring the flush volumes it actually has to hold, so on a multi-colour
print the tower shown in Prepare and the space kept clear for it during
arrange could be far smaller than the tower that gets sliced — leaving
it overlapping objects or running off the plate. This sizes the estimate
from the configured flush volumes instead, for rib walls as well as
rectangle and cone, applies the same height-based minimum depth the
prime-volume estimate already used, and reads the flush matrix correctly
on multi-nozzle printers, where it holds one block per nozzle.

Only the pre-slice estimate changes: the generated tower is untouched,
and prints that do not purge into the prime tower keep their existing
size.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-08-06 18:17:05 +08:00
SoftFever
32a4e0fb37 Size the prime tower from the actual flush volumes
Prime towers reserved depth from the prime volume alone, ignoring the flush
matrix: rib-wall towers in both the engine and the preview, and rectangle and
cone towers in the preview, which never carried the flush-aware estimate the
engine already used. The preview also read the print preset, which does not
carry the printer- and filament-scope keys the estimate needs and so silently
fell back to defaults. On multi-nozzle printers the flush matrix, which holds
one block per nozzle, was additionally read as a single block. The tower could
come out too small for the purge it has to hold.

The flush-based estimate also skipped the height-based minimum depth that the
prime-volume one applies, so low-flush prints could estimate a tower shallower
than the one that actually gets built.
2026-08-06 17:58:41 +08:00
SoftFever
f9ed5843c0 Keep the prime tower and its approach travel on non-rectangular beds (#15146)
# Description

<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
  > * What issue does this PR address or fix?
  > * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->

On delta, circular and custom bed shapes — and on multi-nozzle printers
where each carriage only reaches part of the plate — the prime tower was
positioned and clamped against the bed's bounding box, so it could be
parked in a corner the bed does not actually have. Neither the default
placement nor dragging the tower would pull it back onto the bed, and
slicing went ahead without complaint. The tower's default position, its
drag clamp and the slice-time validation now all follow the real
printable outline, and a tower that genuinely does not fit is reported
as "Prime Tower is partially outside the printable area" instead of
being sliced into a print that cannot be produced.

The travel that approaches the tower is planned against that same
outline. Previously the router gave up whenever its clearance box fell
outside the bed and drove the nozzle straight across the tower; a tower
parked near the bed edge now keeps its detour and enters through the
wall opening as intended.

This also corrects the footprint the prime tower validation uses for a
rotated tower, which was being rotated by the wrong amount and about the
wrong point, so proximity warnings and exclusion-area errors for rotated
towers were being computed against the wrong shape.

Prime tower placement on rectangular beds is unchanged. The new
printable-area validation and the tower-approach routing fix apply to
every bed shape.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

Added unit coverage for the placement clamp against a non-rectangular
outline (a regular hexagon standing in for the shipped delta beds),
covering the rectangular-bed path, single-axis clamping while dragging,
a footprint already inside the outline, one sitting in the bounding-box
corner but off the bed, an unresolved auto brim width arriving as a
negative margin, and a footprint too large for the bed. The `fff_print`
suite passes.

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-08-06 16:09:56 +08:00
SoftFever
7c73739e1a Keep the prime tower and its approach travel on non-rectangular beds
The placement clamps and the tower-approach router both stood in the bed's
bounding box for the bed itself, so on a delta or hexagonal bed the prime tower
could be parked in a corner that does not exist and the nozzle could be routed
across it. Both now test the real printable outline, slicing reports a tower
that does not fit instead of printing it off the bed, and a tower parked near an
edge is routed along the clamped side rather than falling back to a straight
line across the tower.

Also fixes the placement validation rotating the tower hull by degrees read as
radians about the plate origin, and never rotating the generated tower footprint
at all.
2026-08-06 15:48:40 +08:00
SoftFever
aa4e28b2b5 Feature: Wait for the toolchange temperature on the wipe tower (#15144)
# Description

<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
  > * What issue does this PR address or fix?
  > * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->

Adds **Wait for temperature on wipe tower**, a printer option for
multi-extruder
machines using a Type 2 wipe tower. With it on, the new tool is picked
up without a
blocking temperature wait; the printer travels to the wipe tower and
waits there
right before purging, parked beside the tower so the ooze from the
heat-up lands
next to it rather than on the model. The incoming filament's target is
raised ahead
of the tool change, so the heat-up overlaps both the change itself and
the travel to
the tower.

The benefit is less oozing and less dead time. The tool no longer sits
at full print
temperature while it waits to be picked up or right after it undocks —
it heats on
the move and only reaches temperature once it is over the tower, so
there is far less
hot-and-idle time, and what does ooze ends up beside the tower. This
matters most on
tool changer printers with long docking and attaching cycles, such as
Tapchanger and
StealthChanger machines, where that wait is otherwise pure stall time
spent dripping.

The firmware or tool change macro must not wait for the temperature
itself. The
option is off by default and only shown for multi-extruder printers on a
Type 2 wipe
tower, and it is enabled by default for the generic toolchanger profile.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

New Catch2 cases in `tests/fff_print/test_multifilament.cpp`: the wait
moves to the
tower when enabled, priming pre-heats to the first layer temperature,
the park side
is regenerated when the tower is moved or rotated, and a regression test
pinning the
unchanged (option-off) toolchange temperature commands against a
recorded trace
(`tests/data/wipe_tower_temperature_trace_main.txt`).

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-08-06 13:32:35 +08:00
SoftFever
408db4b3b0 Wait for the toolchange temperature on the wipe tower
Adds a printer option that picks up the new tool without a blocking temperature
wait, travels to the wipe tower, and waits there right before purging, parked
beside the tower so the ooze from the heat-up lands next to it rather than on the
model. The incoming filament's target is raised ahead of the tool change, so the
heat-up overlaps both the change itself and the travel to the tower.

Off by default, and only offered for multi-extruder printers using a Type 2 wipe
tower; the generic toolchanger profile enables it.
2026-08-06 12:24:00 +08:00
peachismomo
169189498e fix regression after merge 2026-08-06 07:56:37 +08:00
peachismomo
72784cfe91 Merge branch 'main' into feat/plugin-pages 2026-08-06 06:16:28 +08:00
peachismomo
ef4815b26c fix: crash on windows 2026-08-06 06:08:02 +08:00
Alexander Haibl
b97ca3c0ac disable arc_fitting for K1 potato mcu (#14654) 2026-08-05 16:25:34 -03:00
Dipl.-Ing. Raoul Rubien, BSc
f73566dd2b Fixes 1 Technical Debt and 3 Compiler Warnings [-Wclass-memaccess] (#10707)
* fixes: memcpy(...) writing to an object of type OrientParams with no trivial copy-assignment; use copy-assignment or copy-initialization instead [-Wclass-memaccess]

* review result: replaces anonymous namespace with static
2026-08-05 21:45:48 +08:00
Dipl.-Ing. Raoul Rubien, BSc
7fbfb7ba87 Fixes 14 Compiler Warnings [-Wmaybe-uninitialized] (#10778)
* fixes: may be used uninitialized [-Wmaybe-uninitialized]

* fixes: may be used uninitialized [-Wmaybe-uninitialized]

* fixes: may be used uninitialized [-Wmaybe-uninitialized]

* fixes: may be used uninitialized [-Wmaybe-uninitialized]

* reverts {} initializer to = to keep code style consistent
2026-08-05 21:42:15 +08:00
Dipl.-Ing. Raoul Rubien, BSc
23bd320076 Fixes 2 Bugs and 13 Compiler Warnings (#10670)
* fixes: %g directive writing between 1 and 13 bytes into a region of size between 6 and 18 [-Wformat-overflow=]

* fixes: %5s directive writing between 5 and 63 bytes into a region of size 58 [-Wformat-overflow=]

* fixes: catching polymorphic type by value [-Wcatch-value=]

* fixes: [-Wcomment]; removes whitespaces

* increases buffer size from 71B to 90B to avoid potential ovfl.
2026-08-05 21:41:04 +08:00
SoftFever
a10d9e77cf Make the wipe tower's planner flush and dwell work on Klipper (#15133)
# Description

On Klipper the wipe tower's motion-queue synchronization silently did
nothing. Klipper acts on commands the moment it parses them, and its
`G4` reads only `P` in milliseconds — it ignores `S` — so the `G4 S0`
the tower used to flush the queue before a temperature change never
synchronized anything, and the cooling delay after a filament's cooling
moves passed instantly instead of waiting. The tower now emits `M400`
for the flush and `G4 P<ms>` for the dwell when the flavor is Klipper.

Only `gcode_flavor = klipper` is affected; G-code for every other flavor
is byte-identical, so no shipped profile or existing project file
changes.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-08-05 18:21:05 +08:00
SoftFever
1d023216f2 clean up 2026-08-05 18:09:36 +08:00
SoftFever
dc2796209f feat: printer agent UI (#15111)
# Description

Changes the device tab to render native wxWidgets UI and route the UI
via printer agents.

When the flag introduced in #15110 is enabled, the tab bar will show
both the native wxWidgets device tab and webview tab under the name
device (legacy)

This is a prerequisite for implementing the printer agent workflow.

<img width="3377" height="1378" alt="image"
src="https://github.com/user-attachments/assets/d72b646b-e6c6-4e10-b5d4-fc989debfca8"
/>
<img width="3377" height="1378" alt="image"
src="https://github.com/user-attachments/assets/2356c0f8-bffe-4cd5-bf4d-31f4b5c7706e"
/>

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-08-05 17:25:23 +08:00
SoftFever
194ef34080 Wait in the wipe tower with a millisecond dwell on Klipper
The wipe tower's "Delay after unloading" never happened on Klipper. It was
emitted as G4 S<seconds>, and Klipper's G4 reads only the P parameter, in
milliseconds, so the pause was silently skipped. The option now produces a
dwell Klipper actually performs.

Also corrects the planner flush rationale, which cited an extruder position
reset that Klipper resolves at parse time and does not need synchronized, and
adds end-to-end coverage that slices a two-filament print and checks the
emitted wipe tower G-code on both a Klipper and a non-Klipper flavor.

No change to any other firmware flavor's output, and no shipped profile sets a
non-zero delay, so no shipped profile's output moves either.
2026-08-05 17:15:35 +08:00
SoftFever
4e1caa39eb Flush the wipe tower planner queue with M400 on Klipper
The wipe tower emitted G4 S0 to make the firmware finish its queued moves
before commands that must not take effect early. Klipper's G4 reads only the
P parameter, so that flush never happened there and a temperature change could
land seconds ahead of the moves it was meant to follow. Klipper now gets M400
instead, through one helper shared by both wipe tower implementations.

No change to any other firmware flavor's output, so no shipped profile or saved
project is affected.
2026-08-05 17:15:35 +08:00
Ian Chua
38f5c84e7f fix: regression error 2026-08-05 16:20:58 +08:00
Ian Chua
4d8ce0e8a7 Merge branch 'main' into feat/printer-agent-ui 2026-08-05 13:40:20 +08:00
Ian Chua
38cb1ae8d1 Add developer flag for printer agents (#15110) 2026-08-05 13:40:05 +08:00
Ian Chua
32f82b64e7 fix: enable both device tabs 2026-08-05 13:07:32 +08:00
Ian Chua
e56d7aeb80 Merge branch 'feat/printer-agent-ui' of https://github.com/OrcaSlicer/OrcaSlicer into feat/printer-agent-ui 2026-08-05 13:07:08 +08:00
Ian Chua
4758dc6c68 Merge branch 'main' into feat/printer-agent-ui 2026-08-05 13:06:47 +08:00
Ian Chua
596cbb8b2d Keep printer-agent error codes available to UI workflow 2026-08-05 11:39:37 +08:00
SoftFever
6312caaf13 Add filament_retract_length_toolchange/filament_retract_restart_extra_toolchange config and update tool changer printer's profiles (#15039)
* update snapmaker profiles. largely ported for Snapmaker Orca fork

* update prime volume

* set precise_outer_wall to 1

* Update per-material multi-tool ramming to the filament library

* Add per-filament overrides for toolchange retraction

* Set toolchange retraction per filament for Snapmaker U1

* set default support type to tree

* format snapmaker profiles
2026-08-05 00:13:27 +08:00
SoftFever
0051768206 Smooth out the spiral lift when arc fitting is disabled (#15118)
The linear approximation used a heuristic segment count clamped to 4..16, so the
lift ran as a coarse polygon. Every vertex is a direction change large enough to
hit the firmware's jerk limit, forcing a decelerate/accelerate at each corner —
the lift micro-stutters instead of running at speed. The segment count now comes
from the chord deviation against the slicing resolution, reusing
Geometry::ArcWelder::arc_discretization_steps, which keeps the turn at each
vertex shallow enough for the firmware to carry speed through the whole move.

Points are emitted through GCodeG1Formatter so they carry the same quantization
as the rest of the G-code, and the move comment now trails the feedrate line to
match _travel_to_z and the G2/G3 branch. No change when arc fitting is enabled.
2026-08-05 00:09:46 +08:00
Ian Bassi
1d078e005a Mouse ear Wiki redirect (#15115)
Based in https://github.com/OrcaSlicer/OrcaSlicer/pull/15015 and https://github.com/OrcaSlicer/OrcaSlicer_WIKI/pull/323
2026-08-04 11:37:05 -03:00
Kris Austin
82759d3899 fix: make the error dialog caret point at the character it's blaming (#14886)
* fix: make the error dialog caret point at the character it's blaming

Custom G-code parse errors print the offending line with a '^' under the
character that broke, positioned with spaces so it only lines up in a
fixed-width font. Since v2.3.2 these dialogs rendered entirely in the
proportional UI font, so the caret drifted left of its column and landed
on unrelated text.

Render only the code excerpts (the offending source line and its caret) in
the fixed-width face, leaving the surrounding prose in the UI font, and
reserve the horizontal scrollbar's height so a long line does not clip.
Rename the flag to has_code_excerpts to match what it now means.

Fixes #14869

* refactor(GUI): use <code> instead of <tt> for error excerpts

wxHTML maps <tt>, <code>, <kbd> and <samp> to the same fixed-width
handler, so this renders identically. <code> is the non-deprecated
tag and matches what the original code used.

* fix(GUI): align the error caret with real spaces, not &nbsp;

The caret line was padded with &nbsp; so its spaces would survive inline
HTML. wxHTML measures every glyph by its font extent, so where the fixed
font lacks a U+00A0 glyph the fallback renders it about twice as wide, and
the all-&nbsp; caret line outran the source, drifting the ^ to the right.

Wrap the excerpts in a small <excerpt> tag, registered on the dialog's own
parser, that switches on wxHTML literal-whitespace mode so the caret uses
real spaces that match the source column in any font. It sits inside <code>
for the fixed face; <pre> would do both but forces a blank line above it.

---------

Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
2026-08-04 22:01:45 +08:00
Ian Bassi
59155f26ac Build Arch Fix (#15107)
Arch Fix
2026-08-04 21:56:15 +08:00
Ian Chua
79dcace1ac Add unsupported-command feedback to the device UI 2026-08-04 21:26:50 +08:00
Andrew
8dfc7a14b9 Gate agent mode behind use_printer_agents toggle
Replace per-printer auto-activation
(is_current_printer_agent_plugin)
with a global experimental AppConfig
toggle, default off: legacy
print-host behavior is unchanged
until the user opts in. The toggle
drives device-tab routing, print
button defaults, connect-button
visibility and sidebar layout, and
dedups machine-select dialog opens.
2026-08-04 18:12:11 +08:00
Andrew
1534268183 Reset device selection on agent swap or unload (#124)
set_live_printer_agent centralizes
the swap: deselect the machine,
clear stale sidebar state and the
previous agent's Other Devices, then
install the new agent (or null when
its provider vanished). Plugin
load/unload callbacks refresh the
dropdown and re-run agent selection.
load_last_machine no longer falls
back to the first available machine.
2026-08-04 18:12:11 +08:00
Andrew
501af81ba9 Replace fake-enum printer agent dropdown (#121)
A dedicated PrinterAgentChoice field
reads rows straight from the live
agent registry and stores the agent
id string, replacing the fake-coEnum
index mapping. The field moves to
TabPrinter and registers with the
searcher so UnsavedChanges renders
it; the PhysicalPrinterDialog copy
and its update hook are removed
(#125). switch_printer_agent now
resolves ids via
resolve_printer_agent_id.
2026-08-04 18:12:10 +08:00
Ian Chua
16c44940d2 Add developer flag for printer agents 2026-08-04 18:12:10 +08:00
yw4z
40eab797c6 match em_unit value for on_dpi_change for linux (#15043)
* Update GUI_Utils.hpp

* Update GUI_Utils.hpp
2026-08-04 08:45:31 +08:00
Kiss Lorand
ca7fbfb007 Fix missing overhang wall when no partial counterbore bridge is generated (#15100) 2026-08-03 18:02:48 -03:00
Mikhail f. Shiryaev
7b404596e9 Add Skip G-code config block to exclude the config comments from G-code files (#12455)
Add feature to skip CONFIG_BLOCK in G-code files
2026-08-03 15:10:01 -03:00
Kris Austin
06ef58bad8 test: replace the disabled convex_hull_2d test (#14892)
test(libslic3r): replace the disabled convex_hull_2d test, closing #11269

The last "failing libslic3r test" from #11269 was the disabled
SCENARIO("2D convex hull of sinking object", "[3mf][.]") in test_3mf.cpp.
It checked ModelObject::convex_hull_2d for a sinking object against
PrusaSlicer's reference hull, but Orca's convex_hull_2d does not clip
geometry below the bed the way PrusaSlicer's its_convex_hull_2d_above does,
so the reference never matched. The test also wrote a debug mesh to a
hardcoded /tmp path and its comparison loop was inverted.

Remove it and add tests/libslic3r/test_model.cpp characterizing
convex_hull_2d on non-sinking transforms (identity and scale+offset),
where the projected footprint is unambiguous. Homed in a Model test file
since it exercises ModelObject, not 3MF.
2026-08-03 22:29:00 +08:00
SoftFever
74c4a7e450 Support printer specific filament profiles in the OrcaFilamentLibrary (#15101)
* Support printer specific filament profiles in the Orca Filament Library
2026-08-03 22:25:50 +08:00
Noisyfox
dbb991bf07 Fix gizmo being closed after releasing mouse outside the gizmo floating window (#15095)
* Fix gizmo being closed after releasing mouse outside the gizmo floating window

The left up event of a drag started on the gizmo floating window (e.g.
selecting text in an input field) and released over the bed was treated
as a click on the plate, which deselected the objects and closed the
active gizmo. Add the ignore_left_up guard to the plate select branch,
matching the deselect branch above.

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix Emboss gizmo being closed after releasing mouse outside its floating window

The Emboss gizmo has its own close-on-click-away handler
(on_mouse_change_selection) that was not protected against left up events
originating from ImGui windows, so the gizmo was still closed when a drag
started on its floating window (e.g. selecting text in the input field)
ended over the 3D scene. Expose the canvas's ignore_left_up state to
gizmos and skip the close check for such releases.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-03 18:34:15 +08:00
Noisyfox
66d3f3f9c3 imgui: Clamp mouse y-coordinate in multi-line click/drag to text bounds (#15052)
* imgui: Clamp mouse y-coordinate in multi-line click/drag to text bounds

In single-line mode, click and drag already clamped y to the line's
y-coordinate so the cursor would continue to follow the x-position when
the mouse went off the top or bottom of the text.  Multi-line mode did
not clamp, so stb_text_locate_coord() would return 0 (above) or n
(below), snapping the cursor to the very start or end of text and
ignoring the x-coordinate entirely.

Now both modes walk the row layout to compute the top of the first row
(y_min) and bottom of the last row (y_max, minus half a line height to
add tolerance for rounding), then clamp y to that range before passing
it to stb_text_locate_coord().  This means dragging or clicking above
the text now places the cursor on the first line at the x-coordinate,
and dragging/clicking below places it on the last line at the
x-coordinate, matching the single-line precedent.

* Fix issue that cursor cannot be placed at the last empty line
2026-08-03 18:34:05 +08:00
Ryan Hartman
6b5c8af1c8 Pin OpenSSL libdir so the bundled Python finds it (#15047)
On Linux the bundled CPython silently links the system OpenSSL instead of
the one built in deps/, and the dependency build then fails:

  install: cannot stat 'Modules/_ssl.cpython-312-x86_64-linux-gnu.so':
           No such file or directory

The chain:

  * OpenSSL's linux-x86_64 target sets multilib=64, so 'make install_sw'
    installs the static libs to <prefix>/lib64 while every other dependency
    in the prefix uses <prefix>/lib.
  * CPython's --with-openssl=<dir> only ever emits -L<dir>/lib. It does not
    look in lib64, so -lssl resolves to the system OpenSSL.
  * gcc -shared does not error on unresolved symbols, so the link appears to
    succeed. _ssl.c was compiled against the bundled 1.1.1w headers, which
    map SSL_get1_peer_certificate onto the pre-3.0 SSL_get_peer_certificate
    -- a symbol OpenSSL 3.x removed. The module then fails to import:

      _ssl failed to import: undefined symbol: SSL_get_peer_certificate
      Could not build the ssl module!

  * With no _ssl built, 'make install' cannot stat it and the build stops.

Passing --libdir=lib keeps the prefix single-layout, so CPython's -L<dir>/lib
finds the bundled static libraries and links against the headers it was
compiled with.

CMake-based dependencies were unaffected throughout, because CMake's
FindOpenSSL searches lib64 on its own; only CPython's autoconf path is
sensitive to this.

Affects any distribution where OpenSSL selects the lib64 layout, which is the
Fedora, openSUSE and Arch families. Debian and Ubuntu are unaffected, which is
why CI has not seen it.

Verified on Arch (GCC 16.1.1, CMake 4.4.2): the dependency build completes and
the bundled interpreter reports the bundled OpenSSL rather than the system one:

  $ deps/build/OrcaSlicer_dep/usr/local/libpython/bin/python3.12 \
      -c 'import ssl; print(ssl.OPENSSL_VERSION)'
  OpenSSL 1.1.1w  11 Sep 2023

Not verified on macOS or Windows. The flag is accepted by OpenSSL's Configure
on all platforms and Darwin targets do not set multilib, so it should be a
no-op there, but CI is the check.
2026-08-03 11:03:59 +08:00
yw4z
e72a3a65b2 QOL Continue to capture mouse position while dragging ImGui controls and mouse position goes to outside of window (#14999)
* Update GLCanvas3D.cpp

* support navigation cube

* capture events for transform widgets

* camera rotation and pan

* selection frame

* object drag

* fix navigation cube stealing drag events

* fix lag on navigation cuve

* variable layer height

* fix plates toolbar scrollbar

* Update GLCanvas3D.cpp

* Fix issue that mouse button state is wrong in certain macOS mouse events

---------

Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
2026-08-02 18:59:53 +08:00
Misterff1
1b71835337 Fixed some desktop environments showing title bar on splash screen when running on Wayland (#15019)
* Remove titlebar from splash screen on Wayland

* Broadly check for window decorations and added explanatory description

* Fixed hiding title bar on Wayland for all desktop environments

* Update format

---------

Co-authored-by: noisyfox <timemanager.rick@gmail.com>
2026-08-02 18:58:49 +08:00
Dipl.-Ing. Raoul Rubien, BSc
f9fa1c117f Define WXINSPECTOR_DISABLE globally to prevent include-order-dependent class layout (#15063)
fix: define WXINSPECTOR_DISABLE globally to prevent include-order-dependent class layouts
2026-08-02 18:20:35 +08:00
Kiss Lorand
6f3ca7d1b9 Fix preview speeds and time estimates after firmware retract commands (#15066) 2026-08-02 00:01:19 -03:00
maddavo
13ae3a1c90 Add outer-only mouse ears and align ear radius controls (#15015)
Improve mouse ear brim controls
2026-08-02 10:54:16 +08:00
Valerii Bokhan
fb36d5e73b Feature: Smooth Factor for the Hilbert Curve sparse infill (#14969) 2026-08-01 17:58:04 -03:00
GlauTech
abb2ab8d3f Update OrcaSlicer_tr.po (#15060) 2026-08-01 23:26:26 +03:00
Dipl.-Ing. Raoul Rubien, BSc
95b781745d Fixes 4 Compiler Warnings (#10727)
* fixes: may be used uninitialized [-Wmaybe-uninitialized]

* fixes: arc_len_next may be used uninitialized [-Wmaybe-uninitialized]

* review result: reverts {} initializer with = to keep code style consistent
2026-08-01 18:07:15 +08:00
Kenneth Raplee
80e64f80a6 Fix 32-bit build in LayerResult::make_nop_layer_result (#15036)
LayerResult's second field is typed size_t, so std::numeric_limits::max
should also use size_t and not something related to coordinates for the
layer_id.
2026-08-01 11:49:28 +08:00
yw4z
477208a969 Remove borders and paddings from native controls on Linux (#14873)
* init

* update

* Update SpinInput.cpp

* possible fix for em_unit

* button alignment

* match titlebar height

* revert em_value for macOS and Windows

* Update GUI_Utils.hpp

* Merge branch 'main' into linux-black-borders-2

* Revert "button alignment"

This reverts commit 3fc7461071.

* Revert "match titlebar height"

This reverts commit c4aa1d9f1e.

* revert dpi changes

* match platform tags

* remove radio box borders

* Fix code indent
2026-08-01 11:28:07 +08:00
Rodrigo Faselli
2e08b19d6b Outline MSAA (#14835)
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-07-31 20:51:48 -03:00
SoftFever
ea7117b7ca Fix stringing between the model and the wipe tower (#15038)
# Description

On multi-tool printers using the type 2 wipe tower, the travel to the
tower ignored the configured Z hop type and always used a plain vertical
hop, so the nozzle rose in place over the part and oozed instead of
lifting away with the travel. It now follows the filament's Z hop
setting, matching what the type 1 tower already does.
Only toolchange travels to a type 2 tower change. Normal Lift and z_hop
= 0 are unaffected, and no extrusion moves change in any mode.

# Screenshots/Recordings/Graphs


## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-07-31 18:26:48 +08:00
SoftFever
603a8f9c8f Fix stringing between the model and the wipe tower
The tower travel took retract()'s default vertical Z hop instead of the
configured one, so the nozzle rose in place over the part and oozed
rather than departing with the travel. Pass the filament's z_hop_types
through, mapping Auto to a spiral lift as append_tcr does.
2026-07-31 18:16:06 +08:00
SoftFever
6a2a57bdf4 Bring the rib wall and skip-points prime tower to all printers (#15035)
* Sync WipeTower from BambuStudio(through ca1881761)

* Fix post-slice self-invalidation on custom multi-extruder printers

* Complete the rib wipe tower port in WipeTower2

The rib tower is now always square (prime_tower_width is ignored, as the
GUI already implies), carries the rib origin offset like the BBL tower so
the rib tips sit inside the configured position, clamps the rib length to
the tower diagonal, and extends the ribs for short towers.

* Use the squared rib tower size in arrange estimates

estimate_wipe_tower_polygon reserved the arrange footprint and clamped the
tower X position with the raw prime_tower_width, under-reserving space
whenever the rib wall squares the tower to a different width.

* Print the WipeTower2 shell with a non-support, non-soluble filament

Like the BBL tower: the layer's sparse infill, wall, and brim go to the
first toolchange to a non-support/non-soluble filament, or are printed
with the incoming filament before any toolchange. The minimal-purge
clamp now also covers toolchanges that get no finish-layer saving.
Output is unchanged when no support/soluble filament is used.

* Port the skip-points gap wall to WipeTower2

prime_tower_skip_points was stubbed for Type2 towers: the wall call
hard-coded skip_points=false, the gap cutter received an empty vector,
and append_tcr2 never routed the entry travel. Now the toolchange entry
positions are precomputed from the finalized plan, the wall is cut open
at each entry, and the entry travel approaches around the tower bounding
box through the opening when it starts outside the tower. The geometry
helpers are re-synced with the BBL versions (add_extra_point guards,
per-point side selection). The cone wall keeps its separate path, where
the option stays inert.

Behavior change: non-BBL towers now honor the (default-on) checkbox with
gap walls and routed entries; with the option off the output is
unchanged, and the BBL tower path is untouched.

* Route the in-place toolchange tower entry through the skip-point gap

On multi-tool printers without ramming the tool changes away from the
tower and the entry travel is the tcr's own positioning move, which went
straight across the printed wall. Append the avoid-perimeter path to the
change-filament gcode instead, so the head approaches around the tower
and enters through the wall opening (append_tcr parity).

* Iron the purge start out through the skip-point gap in WipeTower2

Port the BBL tower's entry line ironing: extrude the first 3 mm of the
purge, retract, drag the nozzle 1.5x back out through the wall gap at
F600, creep back at F240 and unretract, so the toolchange start blob
ends up in the gap instead of on the wall. Fires only when the purge
starts at the left-edge entry heading right (in-place toolchangers);
SEMM ram/cooling wipes start mid-box and the priming line has no wall,
so both keep their previous output.

* Reserve WipeTower2 toolchange depth to match the printed purge

The planner reserved ramming rows gated only on enable_filament_ramming and
sized them with the SEMM 0.25s time step, while toolchange_Unload rams on
(semm && enable_filament_ramming) || filament_multitool_ramming with the
multitool time step. Disabling multitool ramming therefore left ~3 unprinted
rows per toolchange as blank bands in the tower. Without ramming the first
wipe line also needs reserved depth of its own (it no longer rides the last
ramming row), plus the y_step/2 offset the wipe start inherits from the
ramming start position - otherwise the tightened boxes truncate the ordered
purge at the box edge.

* Tile WipeTower2 purge rows contiguously across toolchange blocks

Without ramming, each purge block reserved one wipe pitch more than its
rows occupy (ceil+1 rounding plus the ram-geometry start offset), and the
wipe began a full pitch inside the block, leaving a blank band of exactly
two pitches between adjacent blocks. Plan the block as whole wipe rows,
start the first row so the row lattice continues across the block
boundary, and fill the reserved box instead of stopping at the ordered
volume, mirroring how the BBL WipeTower keeps planned depth identical to
printed rows. Ram-printing toolchanges (SEMM with ramming enabled,
multitool ramming) are unchanged.

* Scrub the WipeTower2 toolchange entry with the BBL flat-ironing spiral

The entry scrub now matches the BBL tower's toolchange_wipe_new sequence:
after the ironing drag the retracted nozzle runs a dry expanding-square
spiral centred on the wall-gap entry point before resuming the purge row.
The spiral runs whenever the gap wall is on (disable per filament via
filament_tower_ironing_area = 0); WipeTower2 no longer reads
prime_tower_flat_ironing.

* Restart the WipeTower2 wipe at the box boundary after multitool ramming

With the gap wall on a multi-tool printer, quantize the ram band up to its
whole reserved rows (as the BBL tower does for the old-tool purge) and start
CP TOOLCHANGE WIPE at the left-edge boundary on a fresh row below it instead
of continuing from wherever the ram serpentine ended. The entry scrub then
runs at the wall gap on ram toolchanges too, and the wipe box is whole rows,
so it is filled completely like the no-ram case. SEMM and skip-points-off
behavior is unchanged.

* Move the WipeTower2 wall gap to the wipe start row for ram toolchanges

* code cleanup

* Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>

* fix typo

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-31 18:08:55 +08:00
SoftFever
c8aacea176 fix typo 2026-07-31 18:07:46 +08:00
SoftFever
4824a171f1 Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-31 15:34:04 +08:00
Ian Chua
101f43b2d8 fix: resolve plugins that are missing locally (physical file deleted) (#14861)
* fix: resolve plugins that are missing locally (physical file deleted)

* fix: don't treat file not found as an error
2026-07-31 14:15:51 +08:00
Ian Chua
e01ac1f0a6 fix: keep orphaned cloud plugins runnable (#14859)
* fix: keep orphaned cloud plugins runnable

* fix: tests
2026-07-31 14:15:22 +08:00
Ian Chua
b51db32bb5 fix: ota profile race (#14993)
# Description

<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
  > * What issue does this PR address or fix?
  > * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->
This PR updates OTA vendor profile handling and fixes a Windows-only
startup race that could terminate OrcaSlicer silently.

## Changes
- Correct vendor profile version comparison logic.
- Trigger vendor profile synchronization after the startup printer
preset is restored.
- Remove duplicate vendor synchronization from the general startup
updater.
- Replace global temporary archive cleanup with targeted per-vendor
cleanup.
- Add updater-thread exception handling to prevent uncaught filesystem
errors from terminating the process.

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->

## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> A guide for users on how to download the artifacts from this PR.
-->

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-07-31 14:14:34 +08:00
Ian Chua
603b02f0e7 Merge branch 'main' into fix/ota-profile-race 2026-07-31 14:14:23 +08:00
Kiss Lorand
54dc5a2f1d Hungarian localization overhaul (#15024) 2026-07-30 15:08:04 -03:00
Kris Austin
303be94262 feat(msix): add execution alias and web link associations to the Store package (#14799) 2026-07-30 10:02:44 -03:00
Ian Bassi
58bad17af9 AI translation update (#15018) 2026-07-29 18:09:32 -03:00
Nathan Schulte
ddce030322 add space after "Arranging" message (#15017) 2026-07-29 17:37:23 -03:00
Ian Bassi
2d4b431d5f Improve dimmed layers (#15001)
Co-authored-by: yw4z <yw4z@outlook.com>
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
2026-07-29 16:27:15 -03:00
Ian Chua
acb0be6ed9 Merge branch 'feat/plugin-pages' of https://github.com/OrcaSlicer/OrcaSlicer into feat/plugin-pages 2026-07-30 01:55:12 +08:00
Ian Chua
14b05a4d8e fix: regression after merge 2026-07-30 01:54:46 +08:00
Ian Chua
27c468754c feat(plugin): expose orca.host.app_language() for plugin localization (#14997)
# Description

Python plugins currently have no way to localize their own dialogs to
match the app: the UI language is stored in `OrcaSlicer.conf`, which the
plugin audit hook deny-lists by design (the file sits next to cloud
secrets), and the host API exposes no app info. As a result, localized
plugins have to guess the language from the OS locale, which does not
always match the slicer UI (and the embedded interpreter often gets no
`LANG` at all in GUI sessions).

This PR adds a minimal read-only accessor:

```python
orca.host.app_language()   # -> "en_US", "ru_RU", ...
```

It returns `GUI_App::current_language_code_safe()` — only the language
code string, nothing else from the config, so the audit-hook security
model is untouched.

No breaking changes; one file, +10 lines.

# Screenshots/Recordings/Graphs

(screenshots of the test dialog will be attached below)

## Tests

- Built on macOS (arm64, Ninja) with this change — compiles clean.
- Ran a minimal script-capability plugin calling
`orca.host.app_language()` on a system with Russian UI: the dialog shows
`'ru_RU'`.
- Guard before GUI init follows the same exception pattern as the
neighbouring `plater()`/`preset_bundle()` accessors.
<img width="903" height="826" alt="Снимок экрана 2026-07-28 в 23 10 48"
src="https://github.com/user-attachments/assets/27088265-b55d-4958-8602-7c3ab4993003"
/>
<img width="437" height="276" alt="Снимок экрана 2026-07-28 в 23 10 56"
src="https://github.com/user-attachments/assets/9845b401-dc8e-4353-aa24-5ace678270d6"
/>
2026-07-30 01:19:09 +08:00
Bartok
88632710d5 docs: add Microsoft Store install path for Windows (#15009)
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
Signed-off-by: Bartok <danielrpike9@gmail.com>
2026-07-29 10:53:20 -03:00
Nathan Schulte
d434e35488 fix STEP progress message percent format (#14994) 2026-07-29 10:48:01 -03:00
yw4z
7bd53b1283 Fix cannot type values to spin control if first digit of desired value is less then min value (#15002) 2026-07-29 10:19:10 -03:00
Ian Bassi
6489b4cad3 Fix: Only one wall top surfaces (#14929) 2026-07-29 09:23:35 -03:00
Ian Chua
71c4eebfc9 Merge branch 'main' into feat/plugin-pages 2026-07-29 19:42:04 +08:00
Ian Chua
00f558aa18 Merge branch 'main' into feat/plugin-pages 2026-07-29 19:40:40 +08:00
Ian Chua
3145f28bb7 feat: support tab icons 2026-07-29 19:37:17 +08:00
Kiss Lorand
29d4513694 Fix overlapping brims (#14991) 2026-07-28 17:46:14 -03:00
Ru
0dc14aa876 feat(plugin): expose orca.host.app_language() for plugin localization
Plugins have no way to localize their own dialogs: the UI language lives in
OrcaSlicer.conf, which the plugin audit hook deny-lists because the file sits
next to cloud secrets. Add a read-only host accessor that returns just the
language code (current_language_code_safe), so plugins can match the app
language without touching the config file.
2026-07-28 23:11:05 +03:00
peachismomo
013a9452af fix: prevent Windows OTA vendor profile update race 2026-07-28 19:48:10 +08:00
Ian Chua
e00906a833 feat: plugin pages 2026-07-28 19:17:26 +08:00
Ian Chua
56c28fc102 feat: refactor notebook/tabs to be string based instead of fixed index based 2026-07-28 19:17:05 +08:00
Noisyfox
5ede9711f5 Fix GTK3 dialog min size: SetSizer → SetSizerAndFit for dialogs without explicit SetMinSize (#14948)
* For dialog without explicitly `SetMinSize`, we should use `SetSizerAndFit` instead, otherwise the dialog will not show correctly on GTK3. (OrcaSlicer/OrcaSlicer#14561)
- and if `SetSizer` is called before the full layout has been built, then an extra `SetSizeHints` should be called before layout/fit so the min size can be properly set automatically based on children's min sizes accordingly.

* Fix GTK3 dialog min size: SetSizer → SetSizerAndFit for dialogs without explicit SetMinSize

Replace SetSizer() with SetSizerAndFit() in 11 dialog constructors that
neither call SetMinSize() nor SetSizeHints(), ensuring proper minimum
size propagation from child widgets on GTK3.

SetSizerAndFit internally calls sizer->SetSizeHints(window), which
sets the window's minimum size based on children — the same fix
applied to ProjectDropDialog in 8a7662083e.

Also drop sizer->Fit(this) calls where present, since they only
resize but don't set the min size hint needed by GTK3.

Co-Authored-By: Claude <noreply@anthropic.com>

* Update code style

* Update TroubleshootDialog.hpp

* Fix unsaved preset dialog layout

* Fix MsgDialog layout

* Fix other 3 instances in MsgDialog.cpp

* Fix a few more instances

* Fix printer option dialog too big on Windows

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-07-28 14:32:55 +08:00
Ian Bassi
6bcb809dd0 Calibrations improvements (#14759) 2026-07-27 20:11:44 -03:00
Ian Bassi
33dfb66aa5 Cyclic ordering improvement (#14784) 2026-07-27 19:58:54 -03:00
Maksym Pyrozhok
ef7bfeda9c Cyclic ordering (#13578)
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-07-27 19:52:29 -03:00
Ian Bassi
47ccca7f72 Full Orca translation via AI (tagged) (#14970)
Co-authored-by: Felix14_v2 <75726196+Felix14-v2@users.noreply.github.com>
Co-authored-by: π² <189209038+pi-squared-studio@users.noreply.github.com>
2026-07-27 19:31:33 -03:00
Kiss Lorand
04e13200aa Support bugfixes (#14678) 2026-07-26 19:16:19 -03:00
Gabriel Monteiro
0013c1da34 Merge branch 'main' into fix/clang-cl-windows-support 2026-07-10 11:10:33 -03:00
Gabriel
5afc6ae9b2 fix: wxWidgets target path for clang-cl on Windows
wxWidgets chooses target files based on the compiler id, which makes clang-cl
look under the clang_x64_lib layout.

The dependencies are built with MSVC naming/layout, and clang-cl uses the MSVC
frontend variant on Windows. Patch the generated wxWidgets config so clang-cl
loads the vc_x64_lib targets instead.
2026-06-24 00:37:00 -03:00
Gabriel
adb0ca3dc3 fix: use Ninja-compatible build target in build_release_vs.bat
ALL_BUILD is a Visual Studio generator target. Ninja uses `all`.

When building with -x (Ninja generator), the script fails with
"ninja: error: unknown target 'ALL_BUILD'". Use the correct target
name for each generator.
2026-06-24 00:36:59 -03:00
Gabriel
08128911e3 fix: copy runtime DLLs for Ninja generator on Windows
The runtime DLL copy was nested under CMAKE_CONFIGURATION_TYPES, so it only ran
for multi-config generators.

Ninja single-config leaves that variable empty, which skipped copying OCCT,
GMP, MPFR, WebView2, and freetype DLLs next to the executable. Run the copy
logic for both generator styles while keeping it Windows-only.
2026-06-24 00:36:59 -03:00
Gabriel
0a7ac3f2ac fix: disable TBB LTCG to allow linking with lld-link
oneTBB enables MSVC IPO/LTCG by default, which emits MSVC proprietary bitcode
objects when built with cl.exe.

lld-link cannot consume those /GL objects. Patch the TBB MSVC compiler settings
so IPO can be disabled and the dependency produces native COFF objects that both
link.exe and lld-link can consume.
2026-06-24 00:36:59 -03:00
Gabriel
d865e9e6e1 fix: exclude clang-cl from MSVC-only compiler guards in CMake
clang-cl defines MSVC in CMake, but some guarded blocks apply flags or behavior
that are specific to cl.exe and should not be passed to clang-cl.

Exclude Clang from those MSVC-only branches so clang-cl follows the compatible
compiler path instead of inheriting cl.exe-only settings.
2026-06-24 00:36:59 -03:00
Gabriel
7aaeea2bd2 fix: wide string literals for url_prefix concatenation on Windows
The Windows path builds url_prefix as a wide string.

MSVC accepts concatenating the narrow literals here, but clang-cl rejects the
mixed narrow/wide expression. Use wide literals so the concatenation type matches.
2026-06-24 00:36:42 -03:00
Gabriel
9e635925c8 fix: explicit cast T2A_ to const char* for clang-cl
clang-cl is stricter about converting the T2A_ helper result in this expression.

Cast the conversion helper result explicitly to const char* so the intended
string conversion is unambiguous across MSVC and clang-cl.
2026-06-24 00:36:42 -03:00
Gabriel
ec22a58c40 fix: LabelItemType underlying type to silence narrowing in clang-cl
LabelItemType values are used with Marker, which is std::size_t.

MSVC accepts the implicit narrowing in this path, but clang-cl diagnoses it more
strictly. Give the enum the same underlying type as Marker.
2026-06-24 00:36:42 -03:00
Gabriel
a636243ec0 fix: materialize Eigen cast expression before passing to distance_to_squared
Eigen's .cast<T>() returns a lazy CwiseUnaryOp expression, not a materialized
Matrix. The distance_to_squared overload taking a nearest_point output parameter
expects a concrete Eigen::Matrix, so template deduction fails on clang-cl.

Materialize the cast into a local Vec variable before passing it.
MSVC accepted the expression directly; clang-cl correctly rejects it.
2026-06-24 00:36:41 -03:00
Gabriel
b9e1db41a0 fix: explicit template instantiation for clang-cl in BoundingBox
clang-cl does not instantiate BoundingBoxBase<Point, Points>::construct for
Points::const_iterator through the same transitive path accepted by MSVC.

Add the explicit instantiation so the template definition is emitted where the
clang-cl build needs it.
2026-06-24 00:36:41 -03:00
855 changed files with 86893 additions and 32710 deletions

View File

@@ -32,9 +32,17 @@ body:
attributes:
label: OrcaSlicer Version
description: Which version of Orca Slicer are you running? You can see the full version in `Help` -> `About Orca Slicer`.
placeholder: e.g. 1.9.0
placeholder: e.g. 2.5.0
validations:
required: true
- type: input
id: working_version
attributes:
label: Regression compared to a previous version
description: Did it work in a previous version?
placeholder: e.g. 2.3.2
validations:
required: false
- type: dropdown
id: os_type
attributes:

View File

@@ -1,8 +1,12 @@
name: Check profiles
on:
pull_request:
# release/* is included because pr-merge-bot.yml lets delegates merge into
# it, and it gates on this workflow's result. Without it a delegated merge
# into a release branch would run no profile validation at all.
branches:
- main
- release/*
paths:
- 'resources/profiles/**'
- ".github/workflows/check_profiles.yml"
@@ -20,6 +24,8 @@ permissions:
jobs:
check_profiles:
# This job name is the check-run name pr-merge-bot.yml requires before a
# delegated merge. Renaming it silently disables that gate.
name: Check profiles
runs-on: ubuntu-24.04
steps:

510
.github/workflows/pr-merge-bot.yml vendored Normal file
View File

@@ -0,0 +1,510 @@
name: PR Merge Bot
# Merges a pull request on request from a delegated vendor profile maintainer.
# The merge is performed by this workflow's GITHUB_TOKEN, so a delegate needs no
# repository access.
#
# Commands, posted as a comment on the PR:
# /bot merge squash-merge the PR
# /bot merge --dry-run report the verdict without merging
#
# Merges only when the commenter holds a grant covering every changed path, the
# PR targets main or release/*, and CI is green on the head commit. Otherwise it
# comments naming the files that fell outside the grant.
#
# Grants come from the FOLDER_MERGERS variable in the `merge-delegation`
# environment: one per line, `account: path`, `#` comments and blank lines
# allowed. Paths may contain spaces. A vendor takes two grants, the folder and
# its sibling bundle JSON:
#
# # Acme profiles
# vendor-maintainer: resources/profiles/Acme/
# vendor-maintainer: resources/profiles/Acme.json
#
# Edit the grant list (environment scope, so admin only):
# gh variable set FOLDER_MERGERS --env merge-delegation --body "$(cat folder-mergers.txt)"
# gh variable get FOLDER_MERGERS --env merge-delegation
#
# Stop all merging without touching this file:
# gh variable set MERGE_BOT_DRY_RUN --body true
on:
issue_comment:
types:
- created
# One merge attempt per PR at a time, so two quick comments cannot race.
concurrency:
group: ${{ github.workflow }}-${{ github.event.issue.number }}
cancel-in-progress: false
jobs:
merge:
# Skips the job unless a PR comment mentions the command.
if: >-
github.repository == 'OrcaSlicer/OrcaSlicer'
&& github.event.issue.pull_request != null
&& contains(github.event.comment.body, '/bot merge')
permissions:
contents: write # pulls.merge
pull-requests: write # pulls.merge
issues: write # feedback comment + reactions
actions: write # re-dispatch build_all.yml after the merge
runs-on: ubuntu-latest
timeout-minutes: 10
# Supplies FOLDER_MERGERS. Must carry no protection rules, or every
# delegated merge would wait for a human reviewer.
environment: merge-delegation
steps:
- name: Merge PR on behalf of a folder delegate
uses: actions/github-script@v9
env:
# Read as env vars, never interpolated into the script body.
FOLDER_MERGERS: ${{ vars.FOLDER_MERGERS }}
MERGE_BOT_DRY_RUN: ${{ vars.MERGE_BOT_DRY_RUN }}
with:
script: |
function isPermissionDenied(error) {
return error && error.status === 403 && /Resource not accessible by integration/i.test(error.message || '');
}
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const MARKER = '<!-- pr-merge-bot -->';
// No grant may reach outside this root.
const DELEGATABLE_ROOT = 'resources/profiles/';
const ALLOWED_BASE_BRANCH = /^(?:main|release\/.+)$/;
const MERGE_METHOD = 'squash';
const REQUIRED_CHECK = 'Check profiles'; // job name in check_profiles.yml
const MAX_CHANGED_FILES = 500; // policy cap, well under listFiles' 3000
const LISTFILES_CAP = 3000;
const MAX_REPORTED_FILES = 12;
const MERGEABLE_ATTEMPTS = 5;
const MERGEABLE_DELAY_MS = 2000;
const OK_CONCLUSIONS = new Set(['success', 'neutral', 'skipped']);
const REGULAR_FILE_MODES = new Set(['100644', '100755']);
// Paths refused whatever the grants say. Checked before grants, so
// delegating a new root means removing it from this list too.
const DENIED_PATTERNS = [
/^\.github\//,
/(^|\/)\.git(attributes|modules|ignore|config)$/,
/^(?:src|deps|deps_src|tests|tools|cmake|sandboxes|scripts|docs?|localization|bbl)\//,
/(^|\/)cmakelists\.txt$/,
/\.cmake$/,
/^build_[^/]*\.(?:sh|bat)$/,
/^version\.inc$/,
// Executables, including those inside the delegatable root.
/\.(?:sh|bash|bat|cmd|ps1|py|js|mjs|cjs|ts|rb|pl|php)$/
];
function parseGrants(raw) {
// GitHub login: 1-39 chars, alphanumerics with single interior hyphens.
const loginPattern = /^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$/;
const grantsByLogin = new Map();
const problems = [];
(raw || '').split(/\r?\n/).forEach((rawLine, index) => {
const line = rawLine.trim();
if (!line || line.startsWith('#')) {
return;
}
// Splits on the first colon only, so paths may contain ':' and spaces.
const separator = line.indexOf(':');
if (separator === -1) {
problems.push(`line ${index + 1}: expected \`account: path\``);
return;
}
const login = line.slice(0, separator).trim().replace(/^@/, '');
const path = line.slice(separator + 1).trim().replace(/\/+$/, '');
if (!loginPattern.test(login)) {
problems.push(`line ${index + 1}: \`${login}\` is not a valid GitHub account name`);
return;
}
if (/[\\*?\u0000-\u001f\u007f]/.test(path) || path.split('/').includes('..') || path.includes('//')) {
problems.push(`line ${index + 1}: invalid path (no globs, \`..\`, \`//\`, backslashes or control characters)`);
return;
}
// Rejects anything outside the root, and the bare root itself.
if (!path.startsWith(DELEGATABLE_ROOT) || path.length <= DELEGATABLE_ROOT.length) {
problems.push(`line ${index + 1}: \`${path}\` is not inside \`${DELEGATABLE_ROOT}\``);
return;
}
const key = login.toLowerCase();
grantsByLogin.set(key, (grantsByLogin.get(key) || []).concat(path));
});
return { grantsByLogin, problems };
}
function isDenied(path) {
if (/[\\\u0000-\u001f\u007f]/.test(path) || path.startsWith('/') || path.split('/').includes('..')) {
return true;
}
const normalized = path.normalize('NFKC').toLowerCase();
return DENIED_PATTERNS.some((pattern) => pattern.test(normalized));
}
// Byte-exact match on directory boundaries, so a grant of
// `.../Acme` covers neither `.../Acme Labs/x.json` nor `.../Acme.json`.
function isGranted(path, grants) {
return grants.some((grant) => path === grant || path.startsWith(`${grant}/`));
}
// Both endpoints of a rename; both must satisfy the grant.
function pathsFor(file) {
return [file.filename, file.previous_filename].filter(Boolean);
}
function formatList(items) {
const unique = [...new Set(items)];
const shown = unique.slice(0, MAX_REPORTED_FILES).map((item) => `- \`${item}\``);
if (unique.length > MAX_REPORTED_FILES) {
shown.push(`- …and ${unique.length - MAX_REPORTED_FILES} more`);
}
return shown.join('\n');
}
const { owner, repo } = context.repo;
const issue = context.payload.issue;
const comment = context.payload.comment;
if (!issue.pull_request) {
core.info('Ignoring comment that is not on a pull request.');
return;
}
// Ignores a comment whose sender is not its author.
if (context.payload.action !== 'created' || context.payload.sender.login !== comment.user.login) {
core.warning('Ignoring comment whose sender does not match its author.');
return;
}
if (comment.user.type !== 'User') {
core.info('Ignoring bot-authored command.');
return;
}
const commandLine = (comment.body || '')
.split('\n')
.map((line) => line.trim())
.find((line) => /^\/bot\s+merge\b/i.test(line));
if (!commandLine) {
core.info('No /bot merge command found.');
return;
}
const commenter = comment.user.login;
const { grantsByLogin, problems } = parseGrants(process.env.FOLDER_MERGERS);
const grants = grantsByLogin.get(commenter.toLowerCase()) || [];
for (const problem of problems) {
core.warning(`FOLDER_MERGERS ${problem}`);
}
// Says nothing to accounts with no grant, so it cannot be used to spam.
if (!grants.length) {
core.info(`Ignoring /bot merge from @${commenter}: not listed in FOLDER_MERGERS.`);
return;
}
// Warns instead of failing when the token cannot post feedback.
async function bestEffort(call, warning) {
try {
await call();
} catch (error) {
if (isPermissionDenied(error)) {
core.warning(warning);
return;
}
throw error;
}
}
const react = (content) => bestEffort(
() => github.rest.reactions.createForIssueComment({ owner, repo, comment_id: comment.id, content }),
`Cannot add the "${content}" reaction because the token cannot write.`);
const say = (body) => bestEffort(
() => github.rest.issues.createComment({ owner, repo, issue_number: issue.number, body: `${MARKER}\n${body}` }),
'Cannot post a comment because the token cannot write comments.');
// Declines the command: warns in the log, reacts, explains on the PR.
async function refuse(reason) {
const configNote = problems.length
? `\n\n\`FOLDER_MERGERS\` also has problems a maintainer needs to fix:\n${problems.map((problem) => `- ${problem}`).join('\n')}`
: '';
const grantsNote = `\n\n<details><summary>Your current grants</summary>\n\n${formatList(grants)}\n\n</details>`;
core.warning(`Refused /bot merge from @${commenter}: ${reason}`);
await react('-1');
await say(`@${commenter} I can't merge this PR: ${reason}${configNote}${grantsNote}`);
}
await react('eyes');
const args = (commandLine.match(/^\/bot\s+merge\s*(.*)$/i)[1] || '').trim().split(/\s+/).filter(Boolean);
const unknownArgs = args.filter((arg) => arg.toLowerCase() !== '--dry-run');
const dryRun = String(process.env.MERGE_BOT_DRY_RUN || '').toLowerCase() === 'true'
|| unknownArgs.length !== args.length;
if (unknownArgs.length) {
return refuse(
`I don't understand ${unknownArgs.map((arg) => `\`${arg}\``).join(', ')}. ` +
'Usage: `/bot merge` or `/bot merge --dry-run`.'
);
}
// Refuses everything while the grant list is malformed.
if (problems.length) {
return refuse(
'the `FOLDER_MERGERS` grant list has malformed lines, so I refuse every merge until it is fixed.'
);
}
let { data: pr } = await github.rest.pulls.get({
owner,
repo,
pull_number: issue.number
});
if (pr.merged) {
return refuse('it is already merged.');
}
if (pr.state !== 'open') {
return refuse(`its state is \`${pr.state}\`, not \`open\`.`);
}
if (pr.draft) {
return refuse('it is still a draft. Mark it ready for review first.');
}
if (!ALLOWED_BASE_BRANCH.test(pr.base.ref)) {
return refuse(`it targets \`${pr.base.ref}\`. Delegated merges are only allowed into \`main\` and \`release/*\`.`);
}
// ---- folder scope ----
const files = await github.paginate(github.rest.pulls.listFiles, {
owner,
repo,
pull_number: pr.number,
per_page: 100
});
if (!files.length) {
return refuse('it changes no files, so there is nothing to verify or merge.');
}
// Refuses when the file list is truncated or disagrees with the PR.
if (files.length >= LISTFILES_CAP || files.length !== pr.changed_files) {
return refuse(
`it reports ${pr.changed_files} changed files but the API listed ${files.length}, ` +
'so the file list is truncated and I cannot verify the folder scope. A maintainer must merge this one.'
);
}
if (pr.changed_files > MAX_CHANGED_FILES) {
return refuse(`it changes ${pr.changed_files} files; delegated merges are capped at ${MAX_CHANGED_FILES}.`);
}
const deniedFiles = [];
const outsideFiles = [];
for (const file of files) {
for (const path of pathsFor(file)) {
if (isDenied(path)) {
deniedFiles.push(path);
} else if (!isGranted(path, grants)) {
outsideFiles.push(path);
}
}
}
if (deniedFiles.length) {
core.error(`@${commenter} attempted a delegated merge touching protected paths: ${deniedFiles.join(', ')}`);
return refuse(
'it touches paths that are never delegatable, whatever the grants say ' +
`(CI, build, scripts or executable files):\n\n${formatList(deniedFiles)}\n\nA maintainer should look at this before it goes any further.`
);
}
if (outsideFiles.length) {
return refuse(
`${outsideFiles.length} changed path(s) fall outside your grants:\n\n${formatList(outsideFiles)}\n\n` +
'A vendor needs both grants: `resources/profiles/<Vendor>/` **and** `resources/profiles/<Vendor>.json`.'
);
}
// ---- file modes: rejects symlinks and submodules ----
// Fetches the delegatable subtree only; listFiles does not report modes.
const headSha = pr.head.sha;
const { data: tree } = await github.rest.git.getTree({
owner,
repo,
tree_sha: `${headSha}:${DELEGATABLE_ROOT.replace(/\/$/, '')}`,
recursive: 'true'
});
if (tree.truncated) {
return refuse('the git tree is too large to verify file modes. A maintainer must merge this one.');
}
// Entry paths are subtree-relative.
const modesByPath = new Map(tree.tree.map((entry) => [`${DELEGATABLE_ROOT}${entry.path}`, entry.mode]));
const irregularFiles = files
.filter((file) => file.status !== 'removed')
.map((file) => [file.filename, modesByPath.get(file.filename)])
.filter(([, mode]) => !REGULAR_FILE_MODES.has(mode))
.map(([path, mode]) => `${path} (mode ${mode || 'missing'})`);
if (irregularFiles.length) {
core.error(`@${commenter} attempted a delegated merge with non-regular files: ${irregularFiles.join(', ')}`);
return refuse(
`it adds symlinks, submodules or files I cannot verify:\n\n${formatList(irregularFiles)}\n\nA maintainer should look at this before it goes any further.`
);
}
// ---- mergeability: waits for GitHub to compute it ----
for (let attempt = 0; pr.mergeable === null && attempt < MERGEABLE_ATTEMPTS; attempt += 1) {
core.info(`Mergeability not computed yet; retrying in ${MERGEABLE_DELAY_MS}ms.`);
await sleep(MERGEABLE_DELAY_MS);
({ data: pr } = await github.rest.pulls.get({
owner,
repo,
pull_number: pr.number
}));
}
if (pr.mergeable === null) {
return refuse('GitHub is still working out whether it can be merged. Try `/bot merge` again in a minute.');
}
if (!pr.mergeable) {
return refuse(`it is not mergeable (\`${pr.mergeable_state}\`) - most likely a conflict with \`${pr.base.ref}\`.`);
}
// ---- CI on the head commit ----
const checkRuns = await github.paginate(github.rest.checks.listForRef, {
owner,
repo,
ref: headSha,
filter: 'latest',
per_page: 100
});
const pendingChecks = checkRuns.filter((run) => run.status !== 'completed');
const failedChecks = checkRuns.filter((run) => run.status === 'completed' && !OK_CONCLUSIONS.has(run.conclusion));
if (pendingChecks.length) {
return refuse(
`${pendingChecks.length} check(s) are still running on \`${headSha.slice(0, 7)}\`:\n\n` +
`${formatList(pendingChecks.map((run) => run.name))}\n\nRe-run \`/bot merge\` once they finish.`
);
}
if (failedChecks.length) {
return refuse(
`${failedChecks.length} check(s) are not green on \`${headSha.slice(0, 7)}\`:\n\n` +
formatList(failedChecks.map((run) => `${run.name} (${run.conclusion})`))
);
}
const { data: combined } = await github.rest.repos.getCombinedStatusForRef({
owner,
repo,
ref: headSha
});
// total_count 0 only means there are no legacy statuses.
if (combined.total_count > 0 && combined.state !== 'success') {
return refuse(
`the combined commit status on \`${headSha.slice(0, 7)}\` is \`${combined.state}\`:\n\n` +
formatList(combined.statuses.filter((status) => status.state !== 'success')
.map((status) => `${status.context} (${status.state})`))
);
}
// Requires the check to have actually run, not merely to have not failed.
const requiredCheck = checkRuns.find((run) =>
run.name === REQUIRED_CHECK &&
run.app && run.app.slug === 'github-actions' &&
run.status === 'completed' && OK_CONCLUSIONS.has(run.conclusion));
if (!requiredCheck) {
return refuse(
`the \`${REQUIRED_CHECK}\` check has not succeeded on \`${headSha.slice(0, 7)}\`. ` +
'If it never ran, a maintainer needs to approve the workflow run first.'
);
}
const scopeSummary = `${files.length} file(s), all within:\n${formatList(grants)}`;
if (dryRun) {
core.info('Dry run: every gate passed, not merging.');
await react('+1');
await say(
`@${commenter} **dry run** - this PR passes every gate and I *would* squash-merge it ` +
`at \`${headSha.slice(0, 7)}\`.\n\nVerified scope: ${scopeSummary}`
);
return;
}
// ---- re-validate, then merge ----
// An unchanged head SHA means the verified file list still holds.
const { data: fresh } = await github.rest.pulls.get({
owner,
repo,
pull_number: pr.number
});
if (fresh.head.sha !== headSha || fresh.base.ref !== pr.base.ref || fresh.state !== 'open' || fresh.merged || fresh.draft) {
return refuse('it changed while I was checking it. Nothing was merged - re-run `/bot merge`.');
}
let merged;
try {
// Pinned to the verified head: a moved head fails with 409.
({ data: merged } = await github.rest.pulls.merge({
owner,
repo,
pull_number: pr.number,
sha: headSha,
merge_method: MERGE_METHOD,
commit_title: `${pr.title} (#${pr.number})`,
commit_message:
`Merged by /bot merge on behalf of @${commenter} (id ${comment.user.id}).\n` +
`Grants: ${grants.join(', ')}\nHead: ${headSha}\n`
}));
} catch (error) {
const hint = {
403: 'the workflow token cannot write to the repository.',
405: 'GitHub refused the merge - branch protection, a required review or check, a newly added CODEOWNERS file, or squash merging being disabled.',
409: `the head commit moved after I verified it (was \`${headSha.slice(0, 7)}\`).`,
422: 'GitHub rejected the merge as invalid.'
}[error.status];
if (!hint) {
throw error;
}
await refuse(`${hint}\n\n> ${error.message}\n\nNothing was merged.`);
core.setFailed(`Delegated merge failed: ${error.status} ${error.message}`);
return;
}
core.info(`Merged #${pr.number} as ${merged.sha}.`);
await react('rocket');
await say(
`@${commenter} squash-merged into \`${pr.base.ref}\` as ${merged.sha}.\n\nVerified scope: ${scopeSummary}`
);
// ---- re-kick the build ----
// A GITHUB_TOKEN merge fires no push event, so build_all.yml would
// otherwise never see these files.
try {
await github.rest.actions.createWorkflowDispatch({
owner,
repo,
workflow_id: 'build_all.yml',
ref: pr.base.ref
});
core.info(`Dispatched build_all.yml on ${pr.base.ref}.`);
} catch (error) {
core.warning(`Merged successfully, but dispatching build_all.yml failed: ${error.message}`);
}

View File

@@ -30,6 +30,7 @@ ctest --test-dir ./tests/fff_print
- C++17, selective C++20. PascalCase classes, snake_case functions/variables
- `#pragma once` for headers. Smart pointers and RAII preferred
- Parallelization via TBB — be mindful of shared state
- Always use `SetSizerAndFit(sizer)` instead of `SetSizer(sizer)` on top level window. Unless `SetSizer` must be called before the full layout is built, call `sizer->SetSizeHints(window)` afterwards in this case.
## Key Entry Points
@@ -55,11 +56,36 @@ ctest --test-dir ./tests/fff_print
- Add helper functions or utilities only when existing code cannot reasonably be reused. Avoid duplication.
- Keep code concise and clear. Manually simplify AI generated bloated codes before review.
- Include targeted tests or documented verification for behavior changes, especially in slicing logic, profiles, formats, and GUI defaults.
- For profile changes (`resources/profiles/<Vendor>/**`), check that `version` in the sibling `resources/profiles/<Vendor>.json` was bumped.
- For translation changes (`localization/i18n/**/*.po`), check that recurring terms match the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) for that language.
## Localization & translations
- Translation catalogs live in `localization/i18n/<lang>/OrcaSlicer_<lang>.po`.
- When creating or reviewing translations, use the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) as the source of truth for recurring terms, so the same English term is always rendered the same way within a language and terms that must stay in English (brand/product names, acronyms, file formats, G-code, macros/variables) are not translated.
- If a term's established translation changes, update both the affected `.po` files and the glossary so they stay in sync.
- Only edit `msgstr` (never `msgid`); keep placeholders (`%s`, `%1%`, `\n`), context (`msgctxt`), and file encoding/line endings intact.
Catalogs live in `localization/i18n/<lang>/OrcaSlicer_<lang>.po`; the template is `OrcaSlicer.pot`.
See the [Localization guide](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_guide.md) for the human-facing version of these principles.
### Terminology
- Use the [Localization glossary](https://github.com/OrcaSlicer/OrcaSlicer_WIKI/blob/main/guides/localization_glossary.md) as the source of truth for recurring terms, so the same English term is always rendered the same way within a language, and terms that must stay in English (brand/product names, acronyms, materials, file formats, G-code tokens, macros/variables/identifiers) are not translated.
- If a term's established translation changes, update both the affected `.po` files and the glossary (`localization_glossary.tsv`, then regenerate) so they stay in sync.
- Translate the *meaning*, not the words. Check what the string actually controls before translating it — English reuses one word for different things. `Flow ratio` (multiplier), `Flow Rate` (throughput) and `Flow Dynamics` (pressure compensation) are three different terms; `extruder` may mean the toolhead, the feeder motor, or the nozzle depending on the string.
- Reuse one template per recurring message shape (`Failed to connect to …`, `Are you sure you want to …?`), even where the English wording varies.
### Editing rules
- Only edit `msgstr`**never** change `msgid`, and never "fix" wrong English in the translation alone. Report the source string instead.
- Preserve exactly: placeholders (`%s`, `%d`, `%1%`, `%zu`, `%%`), every `\n` (count *and* position, including leading/trailing), leading/trailing spaces, HTML tags, `℃`, and the file's encoding and line endings.
- **Never reorder positional arguments** in a `c-format` string. If the msgid is `%d` then `%s`, that order must hold — swapping them breaks at runtime.
- `msgctxt` separates homonyms — always read it. `Back`/`Camera View` is the rear view of the 3D navigator, while `Back`/`Navigation` is the go-back button; `Top` exists in the *Alignment*, *Layers* and *Camera View* senses.
- When a string needs disambiguating, add context in the source (`_L_CONTEXT`/`_u8L_CONTEXT`), don't work around it in the translation.
- A literal `%` inside a string xgettext flagged `possible-c-format` will fail `msgfmt`. Fix it with a `// xgettext:no-c-format, no-boost-format` comment above the string in the source — do not mangle the translation or use `%%` in text that is never passed through printf.
- Plural entries: read `nplurals` from the catalog's `Plural-Forms` header (it is **not** always 2 — ja/ko/zh/th/vi use 1, ru/cs/pl/lt use 3, uk uses 4). Each form must be genuinely inflected for its quantity; repeating one sentence across all forms is a bug in Slavic/Baltic languages, though it is correct for Turkish and Hungarian.
- An entry whose `msgstr` equals its `msgid` is untranslated even though it is not empty; a plural entry with any empty form is likewise incomplete.
- Mark machine-produced translations with an `# AI Translated` translator comment. Don't add it to a human translation you didn't actually rewrite.
- Don't reflow or re-wrap unrelated entries — keep the diff limited to the strings you changed.
### Verifying
- `scripts/run_gettext.bat --full` (Windows) regenerates the template, merges every catalog and compiles the `.mo` files. It must exit 0.
- Or check a single catalog with `msgfmt --check-format -o <out>.mo localization/i18n/<lang>/OrcaSlicer_<lang>.po`.
- Fuzzy entries are not shown to users. If you correct one, clear its `fuzzy` flag, otherwise the fix never ships.

View File

@@ -80,8 +80,12 @@ endif()
if (DEFINED BBL_RELEASE_TO_PUBLIC)
add_compile_definitions("BBL_RELEASE_TO_PUBLIC=${BBL_RELEASE_TO_PUBLIC}")
if (BBL_RELEASE_TO_PUBLIC)
add_compile_definitions(WXINSPECTOR_DISABLE)
endif ()
else ()
add_compile_definitions("BBL_RELEASE_TO_PUBLIC=$<CONFIG:Release>")
add_compile_definitions("$<$<CONFIG:Release>:WXINSPECTOR_DISABLE>")
endif ()
find_package(Git)

View File

@@ -119,6 +119,10 @@ Download the **Windows Installer exe** for your preferred version from the [rele
- This file may already be available on your computer if you've installed visual studio. Check the following location: `%VCINSTALLDIR%Redist\MSVC\v142`
</details>
### Microsoft Store
Install from the [Microsoft Store](https://apps.microsoft.com/detail/9mv6gl23xm59) when you prefer a Store-signed package (helps on Windows 11 Smart App Control).
### Windows Package Manager
```shell

View File

@@ -152,7 +152,7 @@ echo on
set CMAKE_POLICY_VERSION_MINIMUM=3.5
if "%USE_NINJA%"=="1" (
cmake .. -G %CMAKE_GENERATOR% -DORCA_TOOLS=ON %SIG_FLAG% -DBUILD_TESTS=%BUILD_TESTS% -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target ALL_BUILD
cmake --build . --config %build_type% --target all
) else (
cmake .. -G %CMAKE_GENERATOR% -A %arch% -DORCA_TOOLS=ON %SIG_FLAG% -DBUILD_TESTS=%BUILD_TESTS% -DCMAKE_BUILD_TYPE=%build_type%
cmake --build . --config %build_type% --target ALL_BUILD -- -m

View File

@@ -52,6 +52,14 @@ ExternalProject_Add(dep_OpenSSL
CONFIGURE_COMMAND ${_conf_cmd} ${_cross_arch}
"--openssldir=${DESTDIR}"
"--prefix=${DESTDIR}"
# OpenSSL's linux-x86_64 target sets multilib=64, so it installs to
# <prefix>/lib64 while every other dep uses <prefix>/lib. CPython's
# --with-openssl only ever emits -L<dir>/lib, so it misses the bundled
# static libs and silently links the system OpenSSL instead -- which,
# against 1.1.1w headers, leaves _ssl.so with an undefined
# SSL_get_peer_certificate (removed in OpenSSL 3.x). Pin libdir so the
# prefix stays single-layout.
"--libdir=lib"
${_cross_comp_prefix_line}
no-shared
no-asm

98
deps/TBB/MSVC.cmake vendored Normal file
View File

@@ -0,0 +1,98 @@
# Copyright (c) 2020-2021 Intel Corporation
#
# 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.
set(TBB_LINK_DEF_FILE_FLAG ${CMAKE_LINK_DEF_FILE_FLAG})
set(TBB_DEF_FILE_PREFIX win${TBB_ARCH})
# Workaround for CMake issue https://gitlab.kitware.com/cmake/cmake/issues/18317.
# TODO: consider use of CMP0092 CMake policy.
string(REGEX REPLACE "/W[0-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(TBB_WARNING_LEVEL $<$<BOOL:${TBB_STRICT}>:/W4> $<$<BOOL:${TBB_STRICT}>:/WX>)
# Warning suppression C4324: structure was padded due to alignment specifier
set(TBB_WARNING_SUPPRESS /wd4324)
set(TBB_TEST_COMPILE_FLAGS /bigobj)
if (MSVC_VERSION LESS_EQUAL 1900)
# Warning suppression C4503 for VS2015 and earlier:
# decorated name length exceeded, name was truncated.
# More info can be found at
# https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4503
set(TBB_TEST_COMPILE_FLAGS ${TBB_TEST_COMPILE_FLAGS} /wd4503)
endif()
set(TBB_LIB_COMPILE_FLAGS -D_CRT_SECURE_NO_WARNINGS /GS)
set(TBB_COMMON_COMPILE_FLAGS /volatile:iso /FS /EHsc)
# Ignore /WX set through add_compile_options() or added to CMAKE_CXX_FLAGS if TBB_STRICT is disabled.
if (NOT TBB_STRICT AND COMMAND tbb_remove_compile_flag)
tbb_remove_compile_flag(/WX)
endif()
if (WINDOWS_STORE OR TBB_WINDOWS_DRIVER)
set(TBB_COMMON_COMPILE_FLAGS ${TBB_COMMON_COMPILE_FLAGS} /D_WIN32_WINNT=0x0A00)
set(TBB_COMMON_LINK_FLAGS -NODEFAULTLIB:kernel32.lib -INCREMENTAL:NO)
set(TBB_COMMON_LINK_LIBS OneCore.lib)
endif()
if (WINDOWS_STORE)
if (NOT CMAKE_SYSTEM_VERSION EQUAL 10.0)
message(FATAL_ERROR "CMAKE_SYSTEM_VERSION must be equal to 10.0")
endif()
set(TBB_COMMON_COMPILE_FLAGS ${TBB_COMMON_COMPILE_FLAGS} /ZW /ZW:nostdlib)
# CMake define this extra lib, remove it for this build type
string(REGEX REPLACE "WindowsApp.lib" "" CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES}")
if (TBB_NO_APPCONTAINER)
set(TBB_LIB_LINK_FLAGS ${TBB_LIB_LINK_FLAGS} -APPCONTAINER:NO)
endif()
endif()
if (TBB_WINDOWS_DRIVER)
# Since this is universal driver disable this variable
set(CMAKE_SYSTEM_PROCESSOR "")
# CMake define list additional libs, remove it for this build type
set(CMAKE_CXX_STANDARD_LIBRARIES "")
set(TBB_COMMON_COMPILE_FLAGS ${TBB_COMMON_COMPILE_FLAGS} /D _UNICODE /DUNICODE /DWINAPI_FAMILY=WINAPI_FAMILY_APP /D__WRL_NO_DEFAULT_LIB__)
endif()
if (NOT DEFINED TBB_ENABLE_IPO)
if (DEFINED CMAKE_INTERPROCEDURAL_OPTIMIZATION)
set(TBB_ENABLE_IPO ${CMAKE_INTERPROCEDURAL_OPTIMIZATION})
else()
set(TBB_ENABLE_IPO ON)
endif()
endif()
if (TBB_ENABLE_IPO)
if (CMAKE_CXX_COMPILER_ID MATCHES "(Clang|IntelLLVM)")
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86|AMD64)")
set(TBB_COMMON_COMPILE_FLAGS ${TBB_COMMON_COMPILE_FLAGS} -mrtm -mwaitpkg)
endif()
set(TBB_OPENMP_NO_LINK_FLAG TRUE)
set(TBB_IPO_COMPILE_FLAGS $<$<NOT:$<CONFIG:Debug>>:-flto>)
else()
set(TBB_IPO_COMPILE_FLAGS $<$<NOT:$<CONFIG:Debug>>:/GL>)
set(TBB_IPO_LINK_FLAGS $<$<NOT:$<CONFIG:Debug>>:-LTCG> $<$<NOT:$<CONFIG:Debug>>:-INCREMENTAL:NO>)
endif()
else()
if (CMAKE_CXX_COMPILER_ID MATCHES "(Clang|IntelLLVM)" AND CMAKE_SYSTEM_PROCESSOR MATCHES "(x86|AMD64)")
set(TBB_COMMON_COMPILE_FLAGS ${TBB_COMMON_COMPILE_FLAGS} -mrtm -mwaitpkg)
endif()
set(TBB_IPO_COMPILE_FLAGS "")
set(TBB_IPO_LINK_FLAGS "")
endif()
set(TBB_OPENMP_FLAG /openmp)

6
deps/TBB/TBB.cmake vendored
View File

@@ -1,4 +1,6 @@
if (FLATPAK AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
if (MSVC)
set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/MSVC.cmake ./cmake/compilers/MSVC.cmake)
elseif (FLATPAK AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
set(_patch_command ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/GNU.cmake ./cmake/compilers/GNU.cmake)
else()
set(_patch_command "")
@@ -13,6 +15,8 @@ orcaslicer_add_cmake_project(
-DTBB_BUILD_SHARED=OFF
-DTBB_BUILD_TESTS=OFF
-DTBB_TEST=OFF
-DTBB_ENABLE_IPO=OFF
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DCMAKE_DEBUG_POSTFIX=_debug
)

28
deps/wxWidgets/0001-Clang-CL-fix.patch vendored Normal file
View File

@@ -0,0 +1,28 @@
---
build/cmake/wxWidgetsConfig.cmake.in | 10 +++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/build/cmake/wxWidgetsConfig.cmake.in b/build/cmake/wxWidgetsConfig.cmake.in
index 1a83f36..70ad8a4 100644
--- a/build/cmake/wxWidgetsConfig.cmake.in
+++ b/build/cmake/wxWidgetsConfig.cmake.in
@@ -58,7 +58,16 @@ if(WIN32_MSVC_NAMING)
endif()
endif()
-include("${CMAKE_CURRENT_LIST_DIR}${wxPLATFORM_LIB_DIR}/@PROJECT_NAME@Targets.cmake")
+if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
+ if (CMAKE_GENERATOR_PLATFORM STREQUAL "ARM64" OR CMAKE_VS_PLATFORM_NAME STREQUAL "ARM64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$")
+ set(_wx_clang_msvc_lib_dir "vc_arm64_lib")
+ else()
+ set(_wx_clang_msvc_lib_dir "vc_x64_lib")
+ endif()
+ include("${CMAKE_CURRENT_LIST_DIR}${wxPLATFORM_LIB_DIR}/${_wx_clang_msvc_lib_dir}/@PROJECT_NAME@Targets.cmake")
+else()
+ include("${CMAKE_CURRENT_LIST_DIR}${wxPLATFORM_LIB_DIR}/@PROJECT_NAME@Targets.cmake")
+endif()
macro(wx_inherit_property source dest name)
# property name without _<CONFIG>
--
2.43.0

View File

@@ -28,6 +28,7 @@ orcaslicer_add_cmake_project(
GIT_SHALLOW ON
GIT_SUBMODULES 3rdparty/catch 3rdparty/pcre 3rdparty/libwebp
DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG}
PATCH_COMMAND git apply --verbose --ignore-space-change --whitespace=fix ${CMAKE_CURRENT_LIST_DIR}/0001-Clang-CL-fix.patch
CMAKE_ARGS
-DwxBUILD_PRECOMP=ON
${_wx_toolkit}

View File

@@ -37,7 +37,11 @@ target_include_directories(Clipper2
)
if (WIN32)
target_compile_options(Clipper2 PRIVATE /W4 /WX)
if (MSVC AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
target_compile_options(Clipper2 PRIVATE /W4 /WX)
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
target_compile_options(Clipper2 PRIVATE /W4)
endif()
else()
target_compile_options(Clipper2 PRIVATE -Wall -Wextra -Wpedantic -Werror)
target_link_libraries(Clipper2 PUBLIC -lm)

View File

@@ -2856,6 +2856,7 @@ const ImWchar* ImFontAtlas::GetGlyphRangesDefault()
{
0x0020, 0x00FF, // Basic Latin + Latin Supplement
0x2000, 0x206F, // General Punctuation
0x2103, 0x2103, // ℃ Celsius symbol
0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana
0x31F0, 0x31FF, // Katakana Phonetic Extensions
0xFF00, 0xFFEF, // Half-width characters

View File

@@ -465,6 +465,57 @@ static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *stat
STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
y = r.ymin;
}
else
{
// In multi-line mode, clamp y to stay within the text vertical bounds.
// This lets the click still land at a valid location if the mouse is slightly
// above or below the text.
StbTexteditRow r;
int n = STB_TEXTEDIT_STRINGLEN(str);
int i = 0;
float base_y = 0, y_min, y_max;
// Get the first row to establish y_min and start the iteration
STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
if (r.num_chars <= 0)
{
state->cursor = 0;
state->select_start = state->cursor;
state->select_end = state->cursor;
state->has_preferred_x = 0;
return;
}
y_min = r.ymin;
y_max = base_y + r.ymax;
i = r.num_chars;
base_y += r.baseline_y_delta;
// Walk the remaining rows to find the bottom of the last row
while (i < n)
{
STB_TEXTEDIT_LAYOUTROW(&r, str, i);
if (r.num_chars <= 0)
break;
y_max = base_y + r.ymax;
i += r.num_chars;
base_y += r.baseline_y_delta;
}
// If the text ends with a newline, account for the empty trailing line
// so the cursor can be placed on it
if (n > 0 && STB_TEXTEDIT_GETCHAR(str, n - 1) == STB_TEXTEDIT_NEWLINE)
{
STB_TEXTEDIT_LAYOUTROW(&r, str, n);
y_max = base_y + r.ymax;
}
// Subtract half the last line height to avoid rounding issues when the mouse
// is just barely below the last line (keep cursor on the last line, not after the text)
y_max -= (r.ymax - r.ymin) * 0.5f;
if (y < y_min) y = y_min;
if (y > y_max) y = y_max;
}
state->cursor = stb_text_locate_coord(str, x, y);
state->select_start = state->cursor;
@@ -485,6 +536,50 @@ static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state
STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
y = r.ymin;
}
else
{
// In multi-line mode, clamp y to stay within the text vertical bounds.
// This lets the drag keep working if the mouse goes off the top or bottom of the text.
StbTexteditRow r;
int n = STB_TEXTEDIT_STRINGLEN(str);
int i = 0;
float base_y = 0, y_min, y_max;
// Get the first row to establish y_min and start the iteration
STB_TEXTEDIT_LAYOUTROW(&r, str, 0);
if (r.num_chars <= 0)
return;
y_min = r.ymin;
y_max = base_y + r.ymax;
i = r.num_chars;
base_y += r.baseline_y_delta;
// Walk the remaining rows to find the bottom of the last row
while (i < n)
{
STB_TEXTEDIT_LAYOUTROW(&r, str, i);
if (r.num_chars <= 0)
break;
y_max = base_y + r.ymax;
i += r.num_chars;
base_y += r.baseline_y_delta;
}
// If the text ends with a newline, account for the empty trailing line
// so the cursor can be placed on it
if (n > 0 && STB_TEXTEDIT_GETCHAR(str, n - 1) == STB_TEXTEDIT_NEWLINE)
{
STB_TEXTEDIT_LAYOUTROW(&r, str, n);
y_max = base_y + r.ymax;
}
// Subtract half the last line height to avoid rounding issues when the mouse
// is just barely below the last line (keep cursor on the last line, not after the text)
y_max -= (r.ymax - r.ymin) * 0.5f;
if (y < y_min) y = y_min;
if (y > y_max) y = y_max;
}
if (state->select_start == state->select_end)
state->select_start = state->cursor;

View File

@@ -11,6 +11,8 @@ add_library(miniz_static STATIC
if(${CMAKE_C_COMPILER_ID} STREQUAL "GNU")
target_compile_definitions(miniz_static PRIVATE _GNU_SOURCE)
elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
target_compile_options(miniz_static PRIVATE /clang:-Wno-error=incompatible-pointer-types)
endif()
target_link_libraries(miniz INTERFACE miniz_static)

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 15:24-0300\n"
"POT-Creation-Date: 2026-08-19 14:07-0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -982,7 +982,7 @@ msgstr ""
#, possible-boost-format
msgid ""
"Objects(%1%) have duplicated connectors. Some connectors may be missing in slicing result.\n"
"Please report to PrusaSlicer team in which scenario this issue happened.\n"
"Please report to the OrcaSlicer team in which scenario this issue happened.\n"
"Thank you."
msgstr ""
@@ -3385,7 +3385,6 @@ msgstr ""
msgid "Innerloop"
msgstr ""
#. TRN To be shown in the main menu View->Top
msgid "Top"
msgstr ""
@@ -3609,6 +3608,9 @@ msgstr ""
msgid "Arranging"
msgstr ""
msgid "Arranging "
msgstr ""
msgid "Arranging canceled."
msgstr ""
@@ -4450,6 +4452,20 @@ msgstr ""
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Layer height is too small. It will be set to the minimum (%g mm)."
msgstr ""
msgid "Layer height is outside the limits set in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Adjust it to the limit (%g mm) automatically?"
msgstr ""
msgid "Adjust"
msgstr ""
msgid ""
"Layer height too small\n"
"It has been reset to 0.2"
@@ -4531,6 +4547,12 @@ msgid ""
"No - Disable Arachne Wall Generator and set [Displacement] mode of the Fuzzy Skin"
msgstr ""
msgid "Brim ear radius"
msgstr ""
msgid "Brim width"
msgstr ""
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
msgstr ""
@@ -4782,6 +4804,12 @@ msgstr ""
msgid "Calibration error"
msgstr ""
msgid "This printer is not configured with the hardware this control needs."
msgstr ""
msgid "This control is not supported on this printer."
msgstr ""
msgid "Network unavailable"
msgstr ""
@@ -5470,10 +5498,24 @@ msgstr ""
msgid "Align to Y axis"
msgstr ""
msgctxt "Camera View"
msgid "Front"
msgstr ""
msgctxt "Camera View"
msgid "Back"
msgstr ""
#. TRN To be shown in the main menu View->Top
msgctxt "Camera View"
msgid "Top"
msgstr ""
#. TRN To be shown in the main menu View->Bottom
msgctxt "Camera View"
msgid "Bottom"
msgstr ""
msgctxt "Camera View"
msgid "Left"
msgstr ""
@@ -5599,7 +5641,7 @@ msgstr ""
msgid "Size:"
msgstr ""
#, possible-c-format, possible-boost-format
#, possible-boost-format
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
msgstr ""
@@ -5774,6 +5816,9 @@ msgstr ""
msgid "Project"
msgstr ""
msgid "Device (Web)"
msgstr ""
msgid "Yes"
msgstr ""
@@ -5854,19 +5899,13 @@ msgstr ""
msgid "Top View"
msgstr ""
#. TRN To be shown in the main menu View->Bottom
msgid "Bottom"
msgstr ""
msgid "Bottom View"
msgstr ""
msgid "Front"
msgstr ""
msgid "Front View"
msgstr ""
msgctxt "Camera View"
msgid "Rear"
msgstr ""
@@ -7770,20 +7809,20 @@ msgstr ""
msgid "Replaced with 3D files from directory:\n"
msgstr ""
#, possible-boost-format
msgid "✖ Skipped %1%: same file.\n"
#, possible-c-format, possible-boost-format
msgid "✖ Skipped %s: same file.\n"
msgstr ""
#, possible-boost-format
msgid "✖ Skipped %1%: file does not exist.\n"
#, possible-c-format, possible-boost-format
msgid "✖ Skipped %s: file does not exist.\n"
msgstr ""
#, possible-boost-format
msgid "✖ Skipped %1%: failed to replace.\n"
#, possible-c-format, possible-boost-format
msgid "✖ Skipped %s: failed to replace.\n"
msgstr ""
#, possible-boost-format
msgid "✔ Replaced %1%.\n"
#, possible-c-format, possible-boost-format
msgid "✔ Replaced %s.\n"
msgstr ""
msgid "Replaced volumes"
@@ -8462,6 +8501,15 @@ msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr ""
msgid "Visible plugin pages"
msgstr ""
msgid "pages"
msgstr ""
msgid "Number of plugin pages shown as fixed tabs before the remaining pages collapse into a dropdown on the last tab."
msgstr ""
msgid "Behaviour"
msgstr ""
@@ -8654,6 +8702,17 @@ msgstr ""
msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness."
msgstr ""
msgid "Dimmed layer brightness"
msgstr ""
msgid "%"
msgstr ""
msgid ""
"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n"
"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option."
msgstr ""
msgid "Login region"
msgstr ""
@@ -8776,6 +8835,14 @@ msgstr ""
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
msgstr ""
msgid "(Experimental) Use printer agents instead of print hosts"
msgstr ""
msgid ""
"Route print jobs for non-Bambu printers through printer plug-in agents instead of the classic print-host upload flow.\n"
"When disabled, OrcaSlicer uses the legacy print-host behavior."
msgstr ""
msgid "Experimental Features"
msgstr ""
@@ -9031,9 +9098,21 @@ msgstr ""
msgid "Preset Inside Project"
msgstr ""
msgid "Copies all inherited values from the parent into this preset and removes the parent relationship. Presets compatible only with the parent may become unsupported."
msgstr ""
msgid "Detach from parent"
msgstr ""
msgid "Unique preset"
msgstr ""
msgid "Parent preset"
msgstr ""
msgid "This preset does not inherit from another preset."
msgstr ""
msgid "Name is unavailable."
msgstr ""
@@ -9711,20 +9790,6 @@ msgstr ""
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
msgstr ""
msgid ""
"Layer height is too small.\n"
"It will set to min_layer_height\n"
msgstr ""
msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
msgstr ""
msgid "Adjust to the set range automatically?\n"
msgstr ""
msgid "Adjust"
msgstr ""
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
msgstr ""
@@ -9910,6 +9975,9 @@ msgstr ""
msgid "Setting Overrides"
msgstr ""
msgid "Retraction when switching material"
msgstr ""
msgid "Basic information"
msgstr ""
@@ -10036,6 +10104,12 @@ msgstr ""
msgid "Printable space"
msgstr ""
msgid "Printer Agent"
msgstr ""
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
msgstr ""
#. TRN: The first argument is the parameter's name; the second argument is its value.
#, possible-boost-format
msgid "Invalid value provided for parameter %1%: %2%"
@@ -10158,9 +10232,6 @@ msgstr ""
msgid "Z-Hop"
msgstr ""
msgid "Retraction when switching material"
msgstr ""
msgid ""
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
"\n"
@@ -11424,6 +11495,9 @@ msgstr ""
msgid " is too close to clumping detection area, and collisions will be caused.\n"
msgstr ""
msgid " is partially outside the printable area, and it cannot be printed.\n"
msgstr ""
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
msgstr ""
@@ -11719,9 +11793,6 @@ msgstr ""
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
msgstr ""
msgid "Printer Agent"
msgstr ""
msgid "Select the network agent implementation for printer communication."
msgstr ""
@@ -12258,9 +12329,6 @@ msgstr ""
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
msgstr ""
msgid "Brim width"
msgstr ""
msgid "This is the distance from the model to the outermost brim line."
msgstr ""
@@ -12326,6 +12394,12 @@ msgid ""
"0 to deactivate."
msgstr ""
msgid "Brim ears outer only"
msgstr ""
msgid "Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections."
msgstr ""
msgid "upward compatible machine"
msgstr ""
@@ -12350,12 +12424,26 @@ msgstr ""
msgid "Intra-layer order"
msgstr ""
msgid "Print order within a single layer."
msgid ""
"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n"
"\n"
"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n"
"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n"
"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n"
"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n"
"\n"
"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate."
msgstr ""
msgid "As object list"
msgstr ""
msgid "Best of all (shortest path)"
msgstr ""
msgid "Snake"
msgstr ""
msgid "Slow printing down for better layer cooling"
msgstr ""
@@ -13324,6 +13412,12 @@ msgstr ""
msgid "Gyroid"
msgstr ""
msgid "Sparse infill smooth factor"
msgstr ""
msgid "Controls how strongly sparse infill corners are rounded. 0% keeps the original sharp path, while 100% produces the largest possible curves between adjacent infill lines."
msgstr ""
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
msgstr ""
@@ -13804,6 +13898,12 @@ msgstr ""
msgid "Klipper"
msgstr ""
msgid "Skip G-code config block"
msgstr ""
msgid "Do not write the CONFIG_BLOCK (slicer configuration key/value pairs) into the G-code file. This can help with printers whose firmware crashes when parsing these comment lines (e.g. Anycubic go-klipper). Note: the G-code file will no longer contain slicer settings, so importing it back into OrcaSlicer will not restore the configuration."
msgstr ""
msgid "Pellet Modded Printer"
msgstr ""
@@ -14729,7 +14829,7 @@ msgstr ""
msgid "Retract amount after wipe"
msgstr ""
#, possible-c-format
#, no-c-format, no-boost-format
msgid ""
"The length of fast retraction after wipe, relative to retraction length.\n"
"The value will be clamped by 100% minus the retract amount before the wipe value."
@@ -14765,6 +14865,12 @@ msgstr ""
msgid "Retraction distance when extruder change"
msgstr ""
msgid "Retraction Length (Toolchange)"
msgstr ""
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr ""
msgid "Z-hop height"
msgstr ""
@@ -14858,6 +14964,9 @@ msgstr ""
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr ""
msgid "Extra length on restart (Toolchange)"
msgstr ""
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr ""
@@ -15243,6 +15352,12 @@ msgstr ""
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
msgstr ""
msgid "Wait for temperature on wipe tower"
msgstr ""
msgid "Pick up the new tool without waiting for it to reach printing temperature, travel to the wipe tower, and wait for the temperature there, right before purging. Ooze from the heat-up lands on the tower instead of the model, and the travel overlaps with the heating. Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. The firmware or tool change macro must not wait for the temperature itself. When disabled, the temperature wait is issued right after the tool change command."
msgstr ""
msgid "No sparse layers (beta)"
msgstr ""
@@ -17211,6 +17326,15 @@ msgid ""
"Please select one that should be used."
msgstr ""
msgid "Auto-scale for nozzle"
msgstr ""
msgid ""
"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n"
"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n"
"Turn scaling off only if you wish to print the reference model exactly as-is."
msgstr ""
msgid "PA Calibration"
msgstr ""
@@ -17333,6 +17457,12 @@ msgstr ""
msgid "End speed: "
msgstr ""
msgid "Auto-adjust to max volumetric speed"
msgstr ""
msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead."
msgstr ""
msgid ""
"Please input valid values:\n"
"start > 10\n"
@@ -17340,6 +17470,39 @@ msgid ""
"end > start + step"
msgstr ""
#, possible-c-format, possible-boost-format
msgid ""
"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n"
" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n"
"\n"
"%s"
msgstr ""
#, possible-c-format, possible-boost-format
msgid ""
"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n"
"\n"
"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed."
msgstr ""
#, possible-c-format, possible-boost-format
msgid ""
"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n"
"\n"
"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n"
"\n"
"Continue?"
msgstr ""
msgid "Continue anyway?"
msgstr ""
msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?"
msgstr ""
msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?"
msgstr ""
msgid "Start retraction length: "
msgstr ""
@@ -18170,9 +18333,6 @@ msgstr ""
msgid "Print Host upload"
msgstr ""
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
msgstr ""
msgid "Select a Flashforge printer"
msgstr ""
@@ -19004,9 +19164,6 @@ msgstr ""
msgid "User canceled."
msgstr ""
msgid "Head diameter"
msgstr ""
msgid "Max angle"
msgstr ""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 15:24-0300\n"
"POT-Creation-Date: 2026-08-19 14:07-0300\n"
"PO-Revision-Date: 2026-06-17 15:44-0300\n"
"Last-Translator: Alexandre Folle de Menezes\n"
"Language-Team: \n"
@@ -978,7 +978,7 @@ msgstr ""
#, boost-format
msgid ""
"Objects(%1%) have duplicated connectors. Some connectors may be missing in slicing result.\n"
"Please report to PrusaSlicer team in which scenario this issue happened.\n"
"Please report to the OrcaSlicer team in which scenario this issue happened.\n"
"Thank you."
msgstr ""
@@ -3381,7 +3381,6 @@ msgstr ""
msgid "Innerloop"
msgstr ""
#. TRN To be shown in the main menu View->Top
msgid "Top"
msgstr ""
@@ -3605,6 +3604,9 @@ msgstr ""
msgid "Arranging"
msgstr ""
msgid "Arranging "
msgstr ""
msgid "Arranging canceled."
msgstr ""
@@ -4446,6 +4448,20 @@ msgstr ""
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
msgstr ""
#, c-format, boost-format
msgid "Layer height is too small. It will be set to the minimum (%g mm)."
msgstr ""
msgid "Layer height is outside the limits set in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
msgstr ""
#, c-format, boost-format
msgid "Adjust it to the limit (%g mm) automatically?"
msgstr ""
msgid "Adjust"
msgstr ""
msgid ""
"Layer height too small\n"
"It has been reset to 0.2"
@@ -4527,6 +4543,12 @@ msgid ""
"No - Disable Arachne Wall Generator and set [Displacement] mode of the Fuzzy Skin"
msgstr ""
msgid "Brim ear radius"
msgstr ""
msgid "Brim width"
msgstr ""
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
msgstr ""
@@ -4778,6 +4800,12 @@ msgstr ""
msgid "Calibration error"
msgstr ""
msgid "This printer is not configured with the hardware this control needs."
msgstr ""
msgid "This control is not supported on this printer."
msgstr ""
msgid "Network unavailable"
msgstr ""
@@ -5466,10 +5494,24 @@ msgstr ""
msgid "Align to Y axis"
msgstr ""
msgctxt "Camera View"
msgid "Front"
msgstr ""
msgctxt "Camera View"
msgid "Back"
msgstr ""
#. TRN To be shown in the main menu View->Top
msgctxt "Camera View"
msgid "Top"
msgstr ""
#. TRN To be shown in the main menu View->Bottom
msgctxt "Camera View"
msgid "Bottom"
msgstr ""
msgctxt "Camera View"
msgid "Left"
msgstr ""
@@ -5595,7 +5637,7 @@ msgstr ""
msgid "Size:"
msgstr ""
#, c-format, boost-format
#, boost-format
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
msgstr ""
@@ -5770,6 +5812,9 @@ msgstr ""
msgid "Project"
msgstr ""
msgid "Device (Web)"
msgstr ""
msgid "Yes"
msgstr ""
@@ -5850,19 +5895,13 @@ msgstr ""
msgid "Top View"
msgstr ""
#. TRN To be shown in the main menu View->Bottom
msgid "Bottom"
msgstr ""
msgid "Bottom View"
msgstr ""
msgid "Front"
msgstr ""
msgid "Front View"
msgstr ""
msgctxt "Camera View"
msgid "Rear"
msgstr ""
@@ -7766,20 +7805,20 @@ msgstr ""
msgid "Replaced with 3D files from directory:\n"
msgstr ""
#, boost-format
msgid "✖ Skipped %1%: same file.\n"
#, c-format, boost-format
msgid "✖ Skipped %s: same file.\n"
msgstr ""
#, boost-format
msgid "✖ Skipped %1%: file does not exist.\n"
#, c-format, boost-format
msgid "✖ Skipped %s: file does not exist.\n"
msgstr ""
#, boost-format
msgid "✖ Skipped %1%: failed to replace.\n"
#, c-format, boost-format
msgid "✖ Skipped %s: failed to replace.\n"
msgstr ""
#, boost-format
msgid "✔ Replaced %1%.\n"
#, c-format, boost-format
msgid "✔ Replaced %s.\n"
msgstr ""
msgid "Replaced volumes"
@@ -8458,6 +8497,15 @@ msgstr ""
msgid "Pop up to select filament grouping mode"
msgstr ""
msgid "Visible plugin pages"
msgstr ""
msgid "pages"
msgstr ""
msgid "Number of plugin pages shown as fixed tabs before the remaining pages collapse into a dropdown on the last tab."
msgstr ""
msgid "Behaviour"
msgstr ""
@@ -8650,6 +8698,17 @@ msgstr ""
msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness."
msgstr ""
msgid "Dimmed layer brightness"
msgstr ""
msgid "%"
msgstr ""
msgid ""
"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n"
"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option."
msgstr ""
msgid "Login region"
msgstr ""
@@ -8772,6 +8831,14 @@ msgstr ""
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
msgstr ""
msgid "(Experimental) Use printer agents instead of print hosts"
msgstr ""
msgid ""
"Route print jobs for non-Bambu printers through printer plug-in agents instead of the classic print-host upload flow.\n"
"When disabled, OrcaSlicer uses the legacy print-host behavior."
msgstr ""
msgid "Experimental Features"
msgstr ""
@@ -9027,9 +9094,21 @@ msgstr ""
msgid "Preset Inside Project"
msgstr ""
msgid "Copies all inherited values from the parent into this preset and removes the parent relationship. Presets compatible only with the parent may become unsupported."
msgstr ""
msgid "Detach from parent"
msgstr ""
msgid "Unique preset"
msgstr ""
msgid "Parent preset"
msgstr ""
msgid "This preset does not inherit from another preset."
msgstr ""
msgid "Name is unavailable."
msgstr ""
@@ -9707,20 +9786,6 @@ msgstr ""
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
msgstr ""
msgid ""
"Layer height is too small.\n"
"It will set to min_layer_height\n"
msgstr ""
msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
msgstr ""
msgid "Adjust to the set range automatically?\n"
msgstr ""
msgid "Adjust"
msgstr ""
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
msgstr ""
@@ -9906,6 +9971,9 @@ msgstr ""
msgid "Setting Overrides"
msgstr ""
msgid "Retraction when switching material"
msgstr ""
msgid "Basic information"
msgstr ""
@@ -10032,6 +10100,12 @@ msgstr ""
msgid "Printable space"
msgstr ""
msgid "Printer Agent"
msgstr ""
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
msgstr ""
#. TRN: The first argument is the parameter's name; the second argument is its value.
#, boost-format
msgid "Invalid value provided for parameter %1%: %2%"
@@ -10154,9 +10228,6 @@ msgstr ""
msgid "Z-Hop"
msgstr ""
msgid "Retraction when switching material"
msgstr ""
msgid ""
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
"\n"
@@ -11420,6 +11491,9 @@ msgstr ""
msgid " is too close to clumping detection area, and collisions will be caused.\n"
msgstr ""
msgid " is partially outside the printable area, and it cannot be printed.\n"
msgstr ""
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
msgstr ""
@@ -11715,9 +11789,6 @@ msgstr ""
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
msgstr ""
msgid "Printer Agent"
msgstr ""
msgid "Select the network agent implementation for printer communication."
msgstr ""
@@ -12254,9 +12325,6 @@ msgstr ""
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
msgstr ""
msgid "Brim width"
msgstr ""
msgid "This is the distance from the model to the outermost brim line."
msgstr ""
@@ -12322,6 +12390,12 @@ msgid ""
"0 to deactivate."
msgstr ""
msgid "Brim ears outer only"
msgstr ""
msgid "Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections."
msgstr ""
msgid "upward compatible machine"
msgstr ""
@@ -12346,12 +12420,26 @@ msgstr ""
msgid "Intra-layer order"
msgstr ""
msgid "Print order within a single layer."
msgid ""
"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n"
"\n"
"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n"
"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n"
"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n"
"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n"
"\n"
"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate."
msgstr ""
msgid "As object list"
msgstr ""
msgid "Best of all (shortest path)"
msgstr ""
msgid "Snake"
msgstr ""
msgid "Slow printing down for better layer cooling"
msgstr ""
@@ -13320,6 +13408,12 @@ msgstr ""
msgid "Gyroid"
msgstr ""
msgid "Sparse infill smooth factor"
msgstr ""
msgid "Controls how strongly sparse infill corners are rounded. 0% keeps the original sharp path, while 100% produces the largest possible curves between adjacent infill lines."
msgstr ""
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
msgstr ""
@@ -13800,6 +13894,12 @@ msgstr ""
msgid "Klipper"
msgstr ""
msgid "Skip G-code config block"
msgstr ""
msgid "Do not write the CONFIG_BLOCK (slicer configuration key/value pairs) into the G-code file. This can help with printers whose firmware crashes when parsing these comment lines (e.g. Anycubic go-klipper). Note: the G-code file will no longer contain slicer settings, so importing it back into OrcaSlicer will not restore the configuration."
msgstr ""
msgid "Pellet Modded Printer"
msgstr ""
@@ -14725,7 +14825,7 @@ msgstr ""
msgid "Retract amount after wipe"
msgstr ""
#, c-format
#, no-c-format, no-boost-format
msgid ""
"The length of fast retraction after wipe, relative to retraction length.\n"
"The value will be clamped by 100% minus the retract amount before the wipe value."
@@ -14761,6 +14861,12 @@ msgstr ""
msgid "Retraction distance when extruder change"
msgstr ""
msgid "Retraction Length (Toolchange)"
msgstr ""
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr ""
msgid "Z-hop height"
msgstr ""
@@ -14854,6 +14960,9 @@ msgstr ""
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr ""
msgid "Extra length on restart (Toolchange)"
msgstr ""
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr ""
@@ -15239,6 +15348,12 @@ msgstr ""
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
msgstr ""
msgid "Wait for temperature on wipe tower"
msgstr ""
msgid "Pick up the new tool without waiting for it to reach printing temperature, travel to the wipe tower, and wait for the temperature there, right before purging. Ooze from the heat-up lands on the tower instead of the model, and the travel overlaps with the heating. Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. The firmware or tool change macro must not wait for the temperature itself. When disabled, the temperature wait is issued right after the tool change command."
msgstr ""
msgid "No sparse layers (beta)"
msgstr ""
@@ -17207,6 +17322,15 @@ msgid ""
"Please select one that should be used."
msgstr ""
msgid "Auto-scale for nozzle"
msgstr ""
msgid ""
"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n"
"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n"
"Turn scaling off only if you wish to print the reference model exactly as-is."
msgstr ""
msgid "PA Calibration"
msgstr ""
@@ -17329,6 +17453,12 @@ msgstr ""
msgid "End speed: "
msgstr ""
msgid "Auto-adjust to max volumetric speed"
msgstr ""
msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead."
msgstr ""
msgid ""
"Please input valid values:\n"
"start > 10\n"
@@ -17336,6 +17466,39 @@ msgid ""
"end > start + step"
msgstr ""
#, c-format, boost-format
msgid ""
"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n"
" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n"
"\n"
"%s"
msgstr ""
#, c-format, boost-format
msgid ""
"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n"
"\n"
"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed."
msgstr ""
#, c-format, boost-format
msgid ""
"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n"
"\n"
"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n"
"\n"
"Continue?"
msgstr ""
msgid "Continue anyway?"
msgstr ""
msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?"
msgstr ""
msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?"
msgstr ""
msgid "Start retraction length: "
msgstr ""
@@ -18166,9 +18329,6 @@ msgstr ""
msgid "Print Host upload"
msgstr ""
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
msgstr ""
msgid "Select a Flashforge printer"
msgstr ""
@@ -19000,9 +19160,6 @@ msgstr ""
msgid "User canceled."
msgstr ""
msgid "Head diameter"
msgstr ""
msgid "Max angle"
msgstr ""

View File

@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-23 15:24-0300\n"
"POT-Creation-Date: 2026-08-19 14:07-0300\n"
"PO-Revision-Date: \n"
"Last-Translator: Ian A. Bassi <>\n"
"Language-Team: \n"
@@ -983,11 +983,11 @@ msgstr "Conector"
#, boost-format
msgid ""
"Objects(%1%) have duplicated connectors. Some connectors may be missing in slicing result.\n"
"Please report to PrusaSlicer team in which scenario this issue happened.\n"
"Please report to the OrcaSlicer team in which scenario this issue happened.\n"
"Thank you."
msgstr ""
"Los objetos(%1%) tienen conectores duplicados. Es posible que falten algunos conectores en el resultado del laminado.\n"
"Informe al equipo de PrusaSlicer sobre el escenario en el que se produjo este problema.\n"
"Informe al equipo de OrcaSlicer sobre el escenario en el que se produjo este problema.\n"
"Gracias."
msgid "Cut by Plane"
@@ -3459,7 +3459,6 @@ msgstr "Recámara"
msgid "Innerloop"
msgstr "Bucle interno"
#. TRN To be shown in the main menu View->Top
msgid "Top"
msgstr "Superior"
@@ -3687,6 +3686,10 @@ msgstr "Organizando..."
msgid "Arranging"
msgstr "Organizando"
# AI Translated
msgid "Arranging "
msgstr "Organizando "
msgid "Arranging canceled."
msgstr "Organización cancelada."
@@ -4561,6 +4564,23 @@ msgstr "La temperatura actual de la recámara es superior a la temperatura de se
msgid "The minimal chamber temperature (%d℃) is higher than the target chamber temperature (%d℃). The minimal value is the threshold at which printing starts while the chamber keeps heating toward the target, so it should not exceed it. It will be clamped to the target."
msgstr "La temperatura mínima de la recámara (%d℃) es superior a la temperatura objetivo de la recámara (%d℃). El valor mínimo es el umbral en el que comienza la impresión mientras la recámara continúa calentándose hacia el objetivo, por lo que no debería superarlo. Se ajustará al valor objetivo."
# AI Translated
#, c-format, boost-format
msgid "Layer height is too small. It will be set to the minimum (%g mm)."
msgstr "La altura de capa es demasiado pequeña. Se establecerá en el mínimo (%g mm)."
# AI Translated
msgid "Layer height is outside the limits set in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
msgstr "La altura de capa está fuera de los límites establecidos en Ajustes de la Impresora -> Extrusor -> Limite de Altura de Capa, esto puede causar problemas de calidad de impresión."
# AI Translated
#, c-format, boost-format
msgid "Adjust it to the limit (%g mm) automatically?"
msgstr "¿Ajustarla automáticamente al límite (%g mm)?"
msgid "Adjust"
msgstr "Ajustar"
msgid ""
"Layer height too small\n"
"It has been reset to 0.2"
@@ -4681,6 +4701,13 @@ msgstr ""
"Sí: habilitar el generador de muros Arachne\n"
"No: deshabilitar el generador de paredes Arachne y establecer el modo [Desplazamiento] de la piel rugosa"
# AI Translated
msgid "Brim ear radius"
msgstr "Radio de las orejas de borde"
msgid "Brim width"
msgstr "Ancho del borde de adherencia"
msgid "Spiral mode only works when wall loops is 1, support is disabled, clumping detection by probing is disabled, top shell layers is 0, sparse infill density is 0 and timelapse type is traditional."
msgstr "El modo espiral solo funciona cuando los bucles de perímetro son 1, el soporte está desactivado, la detección de agrupamientos mediante sondeo está desactivada, las capas superiores de la carcasa son 0, la densidad de relleno es 0 y el tipo de lapso de tiempo es tradicional."
@@ -4935,6 +4962,14 @@ msgstr "Fallo al generar el G-Code de calibración"
msgid "Calibration error"
msgstr "Error de calibración"
# AI Translated
msgid "This printer is not configured with the hardware this control needs."
msgstr "Esta impresora no está configurada con el hardware que necesita este control."
# AI Translated
msgid "This control is not supported on this printer."
msgstr "Este control no es compatible con esta impresora."
msgid "Network unavailable"
msgstr "Red no disponible"
@@ -5630,10 +5665,27 @@ msgstr "Evitar la zona de calibración del extrusor"
msgid "Align to Y axis"
msgstr "Alinear con el eje Y"
# AI Translated
msgctxt "Camera View"
msgid "Front"
msgstr "Frontal"
msgctxt "Camera View"
msgid "Back"
msgstr "Posterior"
# AI Translated
#. TRN To be shown in the main menu View->Top
msgctxt "Camera View"
msgid "Top"
msgstr "Superior"
# AI Translated
#. TRN To be shown in the main menu View->Bottom
msgctxt "Camera View"
msgid "Bottom"
msgstr "Inferior"
msgctxt "Camera View"
msgid "Left"
msgstr "Izquierda"
@@ -5759,7 +5811,7 @@ msgstr "Volumen:"
msgid "Size:"
msgstr "Tamaño:"
#, c-format, boost-format
#, boost-format
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
msgstr "Se han encontrado conflictos de rutas G-Code en la capa %d, Z = %.2lfmm. Por favor, separe más los objetos en conflicto (%s <-> %s)."
@@ -5940,6 +5992,10 @@ msgstr "Multi-dispositivo"
msgid "Project"
msgstr "Proyecto"
# AI Translated
msgid "Device (Web)"
msgstr "Dispositivo (Web)"
msgid "Yes"
msgstr "Sí"
@@ -6020,19 +6076,14 @@ msgstr "Vista por Defecto"
msgid "Top View"
msgstr "Vista superior"
#. TRN To be shown in the main menu View->Bottom
msgid "Bottom"
msgstr "Inferior"
msgid "Bottom View"
msgstr "Vista inferior"
msgid "Front"
msgstr "Frontal"
msgid "Front View"
msgstr "Vista frontal"
# AI Translated
msgctxt "Camera View"
msgid "Rear"
msgstr "Posterior"
@@ -7982,21 +8033,21 @@ msgstr "No se seleccionó el directorio para el reemplazo"
msgid "Replaced with 3D files from directory:\n"
msgstr "Reemplazado con archivos 3D desde el directorio:\n"
#, boost-format
msgid "✖ Skipped %1%: same file.\n"
msgstr "✖ Omitido %1%: mismo archivo.\n"
#, c-format, boost-format
msgid "✖ Skipped %s: same file.\n"
msgstr "✖ Omitido %s: mismo archivo.\n"
#, boost-format
msgid "✖ Skipped %1%: file does not exist.\n"
msgstr "✖ Omitido %1%: el archivo no existe.\n"
#, c-format, boost-format
msgid "✖ Skipped %s: file does not exist.\n"
msgstr "✖ Omitido %s: el archivo no existe.\n"
#, boost-format
msgid "✖ Skipped %1%: failed to replace.\n"
msgstr "✖ Omitido %1%: fallo al reemplazar.\n"
#, c-format, boost-format
msgid "✖ Skipped %s: failed to replace.\n"
msgstr "✖ Omitido %s: fallo al reemplazar.\n"
#, boost-format
msgid "✔ Replaced %1%.\n"
msgstr "✔ Reemplazado %1%.\n"
#, c-format, boost-format
msgid "✔ Replaced %s.\n"
msgstr "✔ Reemplazado %s.\n"
msgid "Replaced volumes"
msgstr "Volúmenes reemplazados"
@@ -8710,6 +8761,18 @@ msgstr "Con esta opción activada, puede enviar una tarea a varios dispositivos
msgid "Pop up to select filament grouping mode"
msgstr "Ventana emergente para seleccionar el modo de agrupación de filamentos"
# AI Translated
msgid "Visible plugin pages"
msgstr "Páginas de plugins visibles"
# AI Translated
msgid "pages"
msgstr "páginas"
# AI Translated
msgid "Number of plugin pages shown as fixed tabs before the remaining pages collapse into a dropdown on the last tab."
msgstr "Número de páginas de plugins que se muestran como pestañas fijas antes de que el resto de páginas se agrupe en un desplegable en la última pestaña."
msgid "Behaviour"
msgstr "Comportamiento"
@@ -8920,6 +8983,21 @@ msgstr "Atenuar las capas inferiores"
msgid "When scrubbing the layer slider in the sliced preview, render the layers below the current one darkened so that only the layer being viewed is shown at full brightness."
msgstr "Al desplazar el control deslizante de capas en la vista previa laminada, oscurece las capas inferiores a la actual para que solo la capa visualizada se muestre a pleno brillo."
# AI Translated
msgid "Dimmed layer brightness"
msgstr "Brillo de las capas atenuadas"
msgid "%"
msgstr "%"
# AI Translated
msgid ""
"How brightly the dimmed layers are rendered when \"Dim lower layers\" is enabled.\n"
"99% is barely darkened, 0% renders them black. Capped at 99% because 100% would be the same as disabling the option."
msgstr ""
"Con qué brillo se muestran las capas atenuadas cuando \"Atenuar las capas inferiores\" está activado.\n"
"99% apenas se oscurece y 0% las muestra en negro. Está limitado al 99% porque el 100% equivaldría a desactivar la opción."
msgid "Login region"
msgstr "Región de inicio de sesión"
@@ -9044,6 +9122,18 @@ msgstr "Mostrar ajustes preestablecidos no compatibles"
msgid "Show incompatible/unsupported presets in the printer and filament dropdown lists. These presets cannot be selected."
msgstr "Mostrar los ajustes preestablecidos incompatibles o no compatibles en los menús desplegables de impresoras y filamentos. Estos ajustes preestablecidos no se pueden seleccionar."
# AI Translated
msgid "(Experimental) Use printer agents instead of print hosts"
msgstr "(Experimental) Usar agentes de impresora en lugar de hosts de impresión"
# AI Translated
msgid ""
"Route print jobs for non-Bambu printers through printer plug-in agents instead of the classic print-host upload flow.\n"
"When disabled, OrcaSlicer uses the legacy print-host behavior."
msgstr ""
"Envía los trabajos de impresión de impresoras que no son Bambu a través de los agentes de plugin de impresora en lugar del flujo clásico de subida al host de impresión.\n"
"Cuando está desactivado, OrcaSlicer utiliza el comportamiento heredado del host de impresión."
msgid "Experimental Features"
msgstr "Funciones experimentales"
@@ -9303,9 +9393,25 @@ msgstr "Perfil de usuario"
msgid "Preset Inside Project"
msgstr "Perfil interno del proyecto"
# AI Translated
msgid "Copies all inherited values from the parent into this preset and removes the parent relationship. Presets compatible only with the parent may become unsupported."
msgstr "Copia en este perfil todos los valores heredados del perfil padre y elimina la relación de herencia. Los perfiles compatibles solo con el perfil padre pueden dejar de ser compatibles."
msgid "Detach from parent"
msgstr "Separar del elemento padre"
# AI Translated
msgid "Unique preset"
msgstr "Perfil único"
# AI Translated
msgid "Parent preset"
msgstr "Perfil padre"
# AI Translated
msgid "This preset does not inherit from another preset."
msgstr "Este perfil no hereda de otro perfil."
msgid "Name is unavailable."
msgstr "El nombre no está disponible."
@@ -10001,22 +10107,6 @@ msgstr "¿Está seguro de que desea activar esta opción?"
msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues. Are you sure you want to enable this option?"
msgstr "Los patrones de relleno suelen diseñarse para gestionar la rotación automáticamente y asegurar una impresión adecuada y lograr sus efectos previstos (p. ej., Giroide, Cúbico). Rotar el patrón de relleno actual puede provocar soporte insuficiente. Proceda con precaución y compruebe detenidamente posibles problemas de impresión. ¿Está seguro de que desea activar esta opción?"
msgid ""
"Layer height is too small.\n"
"It will set to min_layer_height\n"
msgstr ""
"La altura de la capa es demasiado pequeña.\n"
"Se establecerá en min_layer_height\n"
msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
msgstr "La altura de la capa excede el límite en Ajustes de la Impresora -> Extrusor -> Limite de Altura de Capa, esto puede causar problemas de calidad de impresión."
msgid "Adjust to the set range automatically?\n"
msgstr "¿Desea ajustar el rango automáticamente?\n"
msgid "Adjust"
msgstr "Ajustar"
msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications."
msgstr "Función experimental: retraer y cortar el filamento a una mayor distancia durante los cambios de filamento para minimizar el purgado. Aunque puede reducir notablemente el purgado, también puede aumentar el riesgo de atascos de boquilla u otras complicaciones de impresión.Característica experimental: Retraer y cortar el filamento a mayor distancia durante los cambios de filamento para minimizar el descarte. Aunque puede reducir notablemente el descarte, también puede elevar el riesgo de atascos de boquillas u otros problemas en la impresión."
@@ -10208,6 +10298,9 @@ msgstr "Palabras clave utilizadas y encontradas"
msgid "Setting Overrides"
msgstr "Sobreescribir Ajustes de impresora"
msgid "Retraction when switching material"
msgstr "Retracción al cambiar de material"
msgid "Basic information"
msgstr "Información básica"
@@ -10334,6 +10427,12 @@ msgstr "Perfiles de proceso compatibles"
msgid "Printable space"
msgstr "Espacio imprimible"
msgid "Printer Agent"
msgstr "Agente de impresora"
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
msgstr "Seleccione la implementación del agente de red para la comunicación con la impresora. Los agentes disponibles se registran al iniciar el sistema."
#. TRN: The first argument is the parameter's name; the second argument is its value.
#, boost-format
msgid "Invalid value provided for parameter %1%: %2%"
@@ -10459,9 +10558,6 @@ msgstr "Límites de altura de la capa"
msgid "Z-Hop"
msgstr "Salto en Z"
msgid "Retraction when switching material"
msgstr "Retracción al cambiar de material"
msgid ""
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
"\n"
@@ -11779,6 +11875,10 @@ msgstr " está demasiado cerca de una zona de exclusión, lo que provocará coli
msgid " is too close to clumping detection area, and collisions will be caused.\n"
msgstr " está demasiado cerca del área de detección de aglomeraciones, y se producirán colisiones.\n"
# AI Translated
msgid " is partially outside the printable area, and it cannot be printed.\n"
msgstr " está parcialmente fuera del área imprimible, y no se puede imprimir.\n"
msgid "Selected nozzle temperatures are incompatible. Each filament's nozzle temperature must fall within the recommended nozzle temperature range of the other filaments. Otherwise, nozzle clogging or printer damage may occur."
msgstr "Las temperaturas de boquilla seleccionadas son incompatibles. La temperatura de boquilla de cada filamento debe estar dentro del rango de temperaturas recomendado para los demás filamentos. De lo contrario, podrían producirse atascos en la boquilla o daños en la impresora."
@@ -12086,9 +12186,6 @@ msgstr "Utiliza 3MF en lugar de G-code"
msgid "Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer sends the sliced file as a .gcode.3mf, instead of a plain .gcode file."
msgstr "Activa esta opción si la impresora admite un archivo 3MF como trabajo de impresión. Cuando está activada, Orca Slicer envía el archivo cortado como un archivo .gcode.3mf, en lugar de como un archivo .gcode convencional."
msgid "Printer Agent"
msgstr "Agente de impresora"
msgid "Select the network agent implementation for printer communication."
msgstr "Seleccione la implementación del agente de red para la comunicación con la impresora."
@@ -12764,9 +12861,6 @@ msgstr ""
msgid "Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%."
msgstr "Velocidad de los puntes internos. Si se expresa como un porcentaje, será Calculado en base a la velocidad de puente. El valor por defecto es 150%."
msgid "Brim width"
msgstr "Ancho del borde de adherencia"
msgid "This is the distance from the model to the outermost brim line."
msgstr "Distancia del modelo a la línea más externa del borde de adherencia."
@@ -12846,6 +12940,14 @@ msgstr ""
"La geometría se verá diezmada antes de detectar angulos agudos. Este parámetro indica la longitud mínima de desviación para el diezmado\n"
"0 para desactivar."
# AI Translated
msgid "Brim ears outer only"
msgstr "Orejas de borde solo en el exterior"
# AI Translated
msgid "Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections."
msgstr "Genera orejas de ratón únicamente en el contorno exterior del modelo, excluyendo agujeros y secciones cerradas."
msgid "upward compatible machine"
msgstr "máquina compatible ascendente"
@@ -12870,12 +12972,37 @@ msgstr "Por objeto"
msgid "Intra-layer order"
msgstr "Orden dentro de la capa"
msgid "Print order within a single layer."
msgstr "Orden de impresión dentro de cada capa."
# AI Translated
msgid ""
"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n"
"\n"
"Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general choice.\n"
"As object list: instances are printed in the same order as the object list, without any path optimization. Use it when you need a predictable, manually controlled order.\n"
"Best of all (shortest path): every strategy is evaluated and the shortest one is used. The object instance order is decided once for the whole print, while the ordering of individual islands is decided per layer, so different layers may end up using different strategies. Slightly slower to slice.\n"
"Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of many small parts.\n"
"\n"
"With multiple filaments or tools in the same layer, minimizing tool changes takes priority: objects are grouped by filament first and this setting only orders the instances within each filament group, so the overall sequence may not look like the shortest path across the plate."
msgstr ""
"Orden en el que se recorren las instancias de objeto dentro de una misma capa, lo que determina cuánto desplazamiento se emplea para moverse entre ellas.\n"
"\n"
"Por defecto: encadenado por vecino más cercano, refinado con 2-opt y eliminación de cruces. Una buena opción general.\n"
"Como lista de objetos: las instancias se imprimen en el mismo orden que la lista de objetos, sin ninguna optimización de trayectoria. Úselo cuando necesite un orden predecible y controlado manualmente.\n"
"La mejor de todas (trayectoria más corta): se evalúan todas las estrategias y se utiliza la más corta. El orden de las instancias de objeto se decide una sola vez para toda la impresión, mientras que el orden de las islas individuales se decide capa por capa, por lo que distintas capas pueden acabar usando estrategias diferentes. El laminado es algo más lento.\n"
"Serpentina: recorrido serpenteante fila por fila, refinado con 2-opt. Muy adecuado para rejillas regulares de muchas piezas pequeñas.\n"
"\n"
"Con varios filamentos o herramientas en la misma capa, minimizar los cambios de herramienta tiene prioridad: los objetos se agrupan primero por filamento y este ajuste solo ordena las instancias dentro de cada grupo de filamento, por lo que la secuencia global puede no parecer la trayectoria más corta a lo largo de la cama."
msgid "As object list"
msgstr "Como lista de objetos"
# AI Translated
msgid "Best of all (shortest path)"
msgstr "La mejor de todas (trayectoria más corta)"
# AI Translated
msgid "Snake"
msgstr "Serpentina"
msgid "Slow printing down for better layer cooling"
msgstr "Reducir la velocidad de impresión para mejorar la refrigeración de las capas"
@@ -13956,6 +14083,14 @@ msgstr "TPMS-FK"
msgid "Gyroid"
msgstr "Giroide"
# AI Translated
msgid "Sparse infill smooth factor"
msgstr "Factor de suavizado del relleno poco denso"
# AI Translated
msgid "Controls how strongly sparse infill corners are rounded. 0% keeps the original sharp path, while 100% produces the largest possible curves between adjacent infill lines."
msgstr "Controla cuánto se redondean las esquinas del relleno poco denso. 0% mantiene el trazado original con esquinas vivas, mientras que 100% produce las curvas más amplias posibles entre líneas de relleno adyacentes."
msgid "This is the acceleration of top surface infill. Using a lower value may improve top surface quality."
msgstr "Aceleración del relleno de la superficie superior. El uso de un valor más bajo puede mejorar la calidad de la superficie superior."
@@ -14489,6 +14624,14 @@ msgstr "Con qué tipo de G-Code es compatible la impresora."
msgid "Klipper"
msgstr "Klipper"
# AI Translated
msgid "Skip G-code config block"
msgstr "Omitir el bloque de configuración del G-code"
# AI Translated
msgid "Do not write the CONFIG_BLOCK (slicer configuration key/value pairs) into the G-code file. This can help with printers whose firmware crashes when parsing these comment lines (e.g. Anycubic go-klipper). Note: the G-code file will no longer contain slicer settings, so importing it back into OrcaSlicer will not restore the configuration."
msgstr "No escribe el CONFIG_BLOCK (los pares clave/valor de la configuración del laminador) en el archivo G-code. Esto puede ayudar con impresoras cuyo firmware falla al analizar esas líneas de comentario (p. ej. Anycubic go-klipper). Nota: el archivo G-code ya no contendrá los ajustes del laminador, por lo que al importarlo de nuevo en OrcaSlicer no se restaurará la configuración."
msgid "Pellet Modded Printer"
msgstr "Impresora Modificada para Pellets"
@@ -15490,7 +15633,7 @@ msgstr "La longitud de la retracción rápida antes de la purga, en relación co
msgid "Retract amount after wipe"
msgstr "Cantidad de retracción después de la limpieza"
#, c-format
#, no-c-format, no-boost-format
msgid ""
"The length of fast retraction after wipe, relative to retraction length.\n"
"The value will be clamped by 100% minus the retract amount before the wipe value."
@@ -15528,6 +15671,14 @@ msgstr "Retracción larga al cambiar de extrusor"
msgid "Retraction distance when extruder change"
msgstr "Distancia de retracción al cambiar de extrusor"
# AI Translated
msgid "Retraction Length (Toolchange)"
msgstr "Longitud de retracción (Cambio de herramienta)"
# AI Translated
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Cuando se activa la retracción antes de un cambio de herramienta, el filamento se retrae la cantidad especificada (la longitud se mide sobre el filamento en bruto, antes de entrar en el extrusor)."
msgid "Z-hop height"
msgstr "Altura de Salto en Z"
@@ -15621,6 +15772,10 @@ msgstr "Longitud extra de reinicio"
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr "Cuando la retracción se compensa después de un desplazamiento, el extrusor expulsará esta cantidad adicional de filamento. Esta función no suele ser necesaria."
# AI Translated
msgid "Extra length on restart (Toolchange)"
msgstr "Longitud extra de reinicio (Cambio de herramienta)"
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr "Cuando se compensa la retracción después de cambiar de cabezal, el extrusor expulsará esta cantidad adicional de filamento."
@@ -16027,6 +16182,14 @@ msgstr "Cambio de herramienta en la torre de purga"
msgid "Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, which can result in the Tx command being issued above the printed part. Enable this option if you want the tool change to always be issued above the wipe tower instead."
msgstr "Obliga al cabezal a desplazarse hasta la torre de purga antes de emitir el comando de cambio de herramienta (Tx). Solo es relevante para impresoras con múltiples extrusores (múltiples cabezales) que utilicen una torre de limpieza de tipo 2. Por defecto, Orca omite el desplazamiento en máquinas con múltiples cabezales porque el firmware se encarga del cambio de cabezal, lo que puede provocar que el comando Tx se emita por encima de la pieza impresa. Habilita esta opción si deseas que el cambio de herramienta se emita siempre por encima de la torre de purga."
# AI Translated
msgid "Wait for temperature on wipe tower"
msgstr "Esperar la temperatura en la torre de purga"
# AI Translated
msgid "Pick up the new tool without waiting for it to reach printing temperature, travel to the wipe tower, and wait for the temperature there, right before purging. Ooze from the heat-up lands on the tower instead of the model, and the travel overlaps with the heating. Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. The firmware or tool change macro must not wait for the temperature itself. When disabled, the temperature wait is issued right after the tool change command."
msgstr "Recoge la nueva herramienta sin esperar a que alcance la temperatura de impresión, se desplaza a la torre de purga y espera allí la temperatura, justo antes de purgar. El rezumado del calentamiento cae sobre la torre en lugar de sobre el modelo, y el desplazamiento se solapa con el calentamiento. Solo es relevante para impresoras multiextrusor (multicabezal) que usan una torre de purga de tipo 2. El firmware o la macro de cambio de herramienta no deben esperar la temperatura por su cuenta. Cuando está desactivado, la espera de temperatura se emite justo después del comando de cambio de herramienta."
msgid "No sparse layers (beta)"
msgstr "Sin capas de baja densidad (beta)"
@@ -18111,6 +18274,20 @@ msgstr ""
"Hay varias direcciones IP resueltas del nombre del host %1%.\n"
"Por favor, seleccione la que debe usarse."
# AI Translated
msgid "Auto-scale for nozzle"
msgstr "Escalar automáticamente para la boquilla"
# AI Translated
msgid ""
"This model is designed around a 0.4 mm nozzle with a 0.2 mm layer height. \n"
"When the scaling option is enabled (recommended), it dynamically resizes to match your current nozzle diameter and an appropriate layer height, making the test both accurate and easy to read.\n"
"Turn scaling off only if you wish to print the reference model exactly as-is."
msgstr ""
"Este modelo está diseñado para una boquilla de 0,4 mm con una altura de la capa de 0,2 mm. \n"
"Cuando la opción de escalado está activada (recomendado), el modelo se redimensiona dinámicamente para adaptarse al diámetro de boquilla actual y a una altura de capa adecuada, lo que hace que la prueba sea precisa y fácil de leer.\n"
"Desactive el escalado solo si desea imprimir el modelo de referencia exactamente tal cual."
msgid "PA Calibration"
msgstr "Calibración PA"
@@ -18247,6 +18424,14 @@ msgstr "Velocidad inicial: "
msgid "End speed: "
msgstr "Velocidad final: "
# AI Translated
msgid "Auto-adjust to max volumetric speed"
msgstr "Ajustar automáticamente a la velocidad volumétrica máxima"
# AI Translated
msgid "If the end speed would exceed the filament's maximum volumetric speed, automatically lower the layer height (keeping standard values and staying within the machine's limits) to reach it. If even the minimum layer height is not enough, lower the end speed instead."
msgstr "Si la velocidad final superara la velocidad volumétrica máxima del filamento, se reduce automáticamente la altura de la capa (manteniendo valores estándar y dentro de los límites de la máquina) para alcanzarla. Si ni siquiera la altura de capa mínima es suficiente, se reduce la velocidad final."
msgid ""
"Please input valid values:\n"
"start > 10\n"
@@ -18258,6 +18443,57 @@ msgstr ""
"incremento >=0\n"
"final > inicio + paso"
# AI Translated
#, c-format, boost-format
msgid ""
"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s), which limits the outer wall to about %.0f mm/s at this line width and layer height.\n"
" Speeds above this will be clamped, so the upper blocks of the tower will not print at the requested speed.\n"
"\n"
"%s"
msgstr ""
"La velocidad final (%.0f mm/s) supera la velocidad volumétrica máxima del filamento (%.1f mm³/s), lo que limita el perímetro externo a unos %.0f mm/s con este ancho de línea y esta altura de capa.\n"
" Las velocidades superiores se recortarán, por lo que los bloques superiores de la torre no se imprimirán a la velocidad solicitada.\n"
"\n"
"%s"
# AI Translated
#, c-format, boost-format
msgid ""
"The end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s) at the default layer height (%.2f mm).\n"
"\n"
"The layer height has been reduced to %.2f mm (a value used by this printer's profiles) so the tower can reach the requested speed."
msgstr ""
"La velocidad final (%.0f mm/s) supera la velocidad volumétrica máxima del filamento (%.1f mm³/s) con la altura de capa predeterminada (%.2f mm).\n"
"\n"
"La altura de la capa se ha reducido a %.2f mm (un valor usado por los perfiles de esta impresora) para que la torre pueda alcanzar la velocidad solicitada."
# AI Translated
#, c-format, boost-format
msgid ""
"Even at the smallest layer height used by this printer's profiles (%.2f mm) the end speed (%.0f mm/s) exceeds the filament's maximum volumetric speed (%.1f mm³/s).\n"
"\n"
"The layer height will be set to %.2f mm and the end speed lowered to %.0f mm/s.\n"
"\n"
"Continue?"
msgstr ""
"Incluso con la altura de capa más pequeña usada por los perfiles de esta impresora (%.2f mm), la velocidad final (%.0f mm/s) supera la velocidad volumétrica máxima del filamento (%.1f mm³/s).\n"
"\n"
"La altura de la capa se establecerá en %.2f mm y la velocidad final se reducirá a %.0f mm/s.\n"
"\n"
"¿Continuar?"
# AI Translated
msgid "Continue anyway?"
msgstr "¿Continuar de todos modos?"
# AI Translated
msgid "Enable \"Auto-adjust\" to fix this automatically, or continue anyway?"
msgstr "¿Activar \"Ajuste automático\" para corregir esto automáticamente o continuar de todos modos?"
# AI Translated
msgid "Enable \"Auto-scale for nozzle\" and \"Auto-adjust\" to fix this automatically, or continue anyway?"
msgstr "¿Activar \"Escalar automáticamente para la boquilla\" y \"Ajuste automático\" para corregir esto automáticamente o continuar de todos modos?"
msgid "Start retraction length: "
msgstr "Longitud de retracción inicial: "
@@ -19153,9 +19389,6 @@ msgstr "Impresora física"
msgid "Print Host upload"
msgstr "Mandar al servidor de impresión"
msgid "Select the network agent implementation for printer communication. Available agents are registered at startup."
msgstr "Seleccione la implementación del agente de red para la comunicación con la impresora. Los agentes disponibles se registran al iniciar el sistema."
msgid "Select a Flashforge printer"
msgstr "Selecciona una impresora Flashforge"
@@ -19997,9 +20230,6 @@ msgstr "Ha ocurrido algo inesperado al intentar iniciar sesión, inténtelo de n
msgid "User canceled."
msgstr "Cancelado por el usuario."
msgid "Head diameter"
msgstr "Diámetro de la cabeza"
msgid "Max angle"
msgstr "Ángulo máximo"
@@ -20733,6 +20963,34 @@ msgstr ""
"Evita la deformación\n"
"¿Sabías que al imprimir materiales propensos a la deformación como el ABS, aumentar adecuadamente la temperatura de la cama térmica puede reducir la probabilidad de deformaciones?"
#~ msgid ""
#~ "Layer height is too small.\n"
#~ "It will set to min_layer_height\n"
#~ msgstr ""
#~ "La altura de la capa es demasiado pequeña.\n"
#~ "Se establecerá en min_layer_height\n"
#~ msgid "Layer height exceeds the limit in Printer Settings -> Extruder -> Layer height limits, this may cause printing quality issues."
#~ msgstr "La altura de la capa excede el límite en Ajustes de la Impresora -> Extrusor -> Limite de Altura de Capa, esto puede causar problemas de calidad de impresión."
#~ msgid "Adjust to the set range automatically?\n"
#~ msgstr "¿Desea ajustar el rango automáticamente?\n"
#~ msgid "Head diameter"
#~ msgstr "Diámetro de la cabeza"
#~ msgid "Print order within a single layer."
#~ msgstr "Orden de impresión dentro de cada capa."
#~ msgid "Bottom"
#~ msgstr "Inferior"
#~ msgid "Front"
#~ msgstr "Frontal"
#~ msgid "Rear"
#~ msgstr "Posterior"
#~ msgid "Enter"
#~ msgstr "Enter"
@@ -20817,9 +21075,6 @@ msgstr ""
#~ msgid "°C"
#~ msgstr "°C"
#~ msgid "%"
#~ msgstr "%"
#~ msgid "Anisotropic surfaces"
#~ msgstr "Superficies anisótropas"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "Creality",
"version": "02.03.02.75",
"version": "02.03.02.76",
"force_update": "0",
"description": "Creality configurations",
"machine_model_list": [

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -38,7 +38,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -38,7 +38,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -128,7 +128,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -124,7 +124,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -38,7 +38,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -128,7 +128,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -128,7 +128,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -38,7 +38,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -38,7 +38,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -39,7 +39,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "1",
"enable_support": "0",

View File

@@ -126,7 +126,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -38,7 +38,7 @@
"draft_shield": "disabled",
"elefant_foot_compensation": "0.15",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enable_prime_tower": "0",
"enable_support": "0",

View File

@@ -126,7 +126,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -126,7 +126,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -126,7 +126,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -126,7 +126,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -126,7 +126,7 @@
"detect_narrow_internal_solid_infill": "1",
"dont_filter_internal_bridges": "disabled",
"elefant_foot_compensation_layers": "1",
"enable_arc_fitting": "1",
"enable_arc_fitting": "0",
"enable_overhang_speed": "1",
"enforce_support_layers": "0",
"ensure_vertical_shell_thickness": "ensure_all",

View File

@@ -1,6 +1,6 @@
{
"name": "Custom Printer",
"version": "02.04.00.01",
"version": "02.04.00.03",
"force_update": "0",
"description": "My configurations",
"machine_model_list": [

View File

@@ -24,12 +24,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -24,12 +24,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -24,12 +24,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -24,12 +24,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -25,12 +25,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -25,12 +25,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -25,12 +25,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -25,12 +25,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -25,12 +25,6 @@
"filament_loading_speed_start": [
"50"
],
"filament_multitool_ramming": [
"1"
],
"filament_multitool_ramming_flow": [
"40"
],
"filament_stamping_distance": [
"45"
],

View File

@@ -116,7 +116,7 @@
"deretraction_speed": [
"30"
],
"z_hop_types": "Normal Lift",
"z_hop_types": "Slope Lift",
"silent_mode": "0",
"single_extruder_multi_material": "1",
"change_filament_gcode": "",

View File

@@ -118,7 +118,7 @@
"deretraction_speed": [
"30"
],
"z_hop_types": "Normal Lift",
"z_hop_types": "Slope Lift",
"silent_mode": "0",
"single_extruder_multi_material": "1",
"change_filament_gcode": "",

View File

@@ -116,7 +116,7 @@
"deretraction_speed": [
"30"
],
"z_hop_types": "Normal Lift",
"z_hop_types": "Slope Lift",
"silent_mode": "0",
"single_extruder_multi_material": "1",
"change_filament_gcode": "",

View File

@@ -6,6 +6,7 @@
"instantiation": "false",
"gcode_flavor": "klipper",
"single_extruder_multi_material": "0",
"wait_for_temp_on_wipe_tower": "1",
"default_filament_profile": [
"Generic PLA @MyToolChanger"
],
@@ -172,11 +173,11 @@
"0.4"
],
"z_hop_types": [
"Normal Lift",
"Normal Lift",
"Normal Lift",
"Normal Lift",
"Normal Lift"
"Slope Lift",
"Slope Lift",
"Slope Lift",
"Slope Lift",
"Slope Lift"
],
"purge_in_prime_tower": "0",
"machine_pause_gcode": "M601",

View File

@@ -1,6 +1,6 @@
{
"name": "OrcaFilamentLibrary",
"version": "02.04.00.03",
"version": "02.04.00.04",
"force_update": "0",
"description": "Orca Filament Library",
"filament_list": [

View File

@@ -36,6 +36,9 @@
"filament_max_volumetric_speed": [
"8"
],
"filament_multitool_ramming_flow": [
"8"
],
"filament_type": [
"PET-CF"
],

View File

@@ -39,6 +39,9 @@
"filament_max_volumetric_speed": [
"8"
],
"filament_multitool_ramming_flow": [
"8"
],
"filament_vendor": [
"Bambu Lab"
],

View File

@@ -39,6 +39,9 @@
"filament_max_volumetric_speed": [
"6"
],
"filament_multitool_ramming_flow": [
"6"
],
"filament_vendor": [
"Bambu Lab"
],

View File

@@ -21,6 +21,9 @@
"filament_max_volumetric_speed": [
"6"
],
"filament_multitool_ramming_flow": [
"6"
],
"filament_type": [
"PLA-AERO"
],

View File

@@ -27,6 +27,9 @@
"filament_max_volumetric_speed": [
"6"
],
"filament_multitool_ramming_flow": [
"6"
],
"filament_scarf_seam_type": [
"none"
],

View File

@@ -21,6 +21,9 @@
"filament_max_volumetric_speed": [
"6"
],
"filament_multitool_ramming_flow": [
"6"
],
"filament_vendor": [
"Bambu Lab"
],

View File

@@ -36,6 +36,9 @@
"filament_max_volumetric_speed": [
"1"
],
"filament_multitool_ramming_flow": [
"1"
],
"filament_retraction_minimum_travel": [
"3"
],

Some files were not shown because too many files have changed in this diff Show More