Compare commits

..
Author SHA1 Message Date
Hanif Koh 64035de87e Restore Plugin HTML After a Webview Reload
Plugin dialog content is injected with SetPage, so the webview's current URL
stays the base URL and the injected document has none of its own. Reloading the
page (context menu or keyboard shortcut) therefore re-fetches the base URL and
the plugin UI disappears, permanently: load_plugin_content() returned early once
m_content_loaded was set.

Re-inject the plugin HTML whenever a main-frame load arrives after the initial
swap. m_own_page_load marks the load caused by our own SetPage so it is not
mistaken for a reload, and in-document navigation is ignored: the MSW backend
synthesises a wxEVT_WEBVIEW_LOADED when a page changes location.hash, which
would otherwise wipe the page under the user. A post-load error is left alone
too, as it only ever means a failed subresource.
2026-09-16 14:09:46 +08:00
HanifKoh 0956b4d8fe Add a Nightly Parity Workflow (#15712)
# 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 a nightly workflow that runs the long parity checks from
[orca-test-repo](https://github.com/OrcaSlicer/orca-test-repo), which
are too slow for the per-build "Run external slicer regression tests"
step and are kept out of every PR and merge build.

## What it runs

`.github/workflows/parity_nightly.yml`, three jobs:

| Job | What it does |
|---|---|
| Find the build to test | Picks the latest successful `build_all.yml`
run for the branch (`main` by default) and records its commit. |
| Override sweep effect stage (shard 0 and 1) | Runs orca-test-repo's
override sweep with `--effect-full`: every config option that lands on
the CLI is re-sliced on its own to check that it actually changes the
G-code. Split into 2 shards, each with a 60-minute timeout. |
| GUI-vs-CLI parity harness | Slices a set of fixtures in the GUI
(headless under Xvfb) and on the CLI, compares the exports, and scores
divergences against a known-differences ledger. It reports only and
never fails on a divergence. |

## When it runs

- **Every night at 21:00 UTC,** after `build_all.yml`'s 17:00 UTC run
has finished.
- **By hand** through `workflow_dispatch`, with optional inputs:
  - `build_branch`: the branch whose latest successful build to test;
  - `test_repo_ref`: the orca-test-repo ref;
  - `fixtures`: a subset of harness fixtures;
  - `cli_presets`: `flat` or `raw`.
- **No `push` or `pull_request` trigger,** so nothing here runs on PRs
or merges. The per-build CI step is unchanged.

## How it tests a build

- **Binary:** the Linux x86_64 AppImage from the chosen `build_all` run.
- **Source:** OrcaSlicer checked out at that run's exact commit. The
AppImage only ships packed preset caches, so profiles and the CLI option
list come from this checkout, matched to the binary.
- **Output:** each job writes a summary to the run page and uploads its
report (`override-report-shard*`, `parity-scorecard`) for 30 days.
- **Failures:** a failing effect shard fails the run, and GitHub's usual
failure notification for scheduled workflows applies.

# 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.
-->

- Dispatched on this branch against orca-test-repo `main` and #15693's
build ([run
34933239912](https://github.com/OrcaSlicer/OrcaSlicer/actions/runs/34933239912)).
Every job passed:
- **effect shard 0:** 19m31s; 225 options sliced, 151 effective, none
crashed or hung, every fixture sliced;
  - **effect shard 1:** 19m33s; 349 options sliced, 254 effective, same;
  - **harness:** 4m32s; all 13 fixtures, 0 new divergences, 0 errors.
- An earlier dispatch on this branch, testing #15693's build against
orca-test-repo's parity branch ([run
34836468900](https://github.com/OrcaSlicer/OrcaSlicer/actions/runs/34836468900)),
passed: effect shards in 20m28s and 23m30s, and the harness reported 0
new divergences.
- The workflow only runs from the default branch on its schedule, so the
nightly trigger itself takes effect once this is merged.

<!--
> 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-09-15 15:01:35 +08:00
HanifKoh 5514559feb Load Each Vendor Tree Once When the CLI Resolves System Presets (#15693)
# 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?
-->

Since #15438, every CLI run that loads a system preset spends about a
second per preset file re-parsing that vendor's entire profile tree. A
slice with a machine, process and filament preset got roughly 2.5 s
slower, and a four-filament slice roughly 4 s slower. This PR loads each
vendor tree once per run instead. Resolved presets and G-code are
unchanged.

The GUI never takes this path, and no release contains #15438, so the
regression only affects CLI runs on current dev and nightly builds. That
includes print farms, slicing services and plugins that call
`orca-slicer --slice`, and CI suites.

## Changes

### Why it was slow

`PresetBundle::resolve_preset_config` resolves a system preset through
its vendor manifest by loading the whole OrcaFilamentLibrary bundle and
the whole vendor tree from JSON, then picking the one preset out. The
CLI did that separately for every `--load-settings` and
`--load-filaments` file, on a fresh `PresetBundle` each time. With BBL
presets, a machine + process + filament run opened `BBL.json` three
times and read BBL's 2,879 profile files and the library's 512 three
times over.

### Load each vendor tree once

- `PresetBundle` keeps every vendor bundle its manifest path loads,
keyed by source root, vendor and substitution rule, and reuses them for
later resolutions on the same bundle.
- OrcaFilamentLibrary is cached the same way, so vendors under one root
share a single library load and the library's own presets resolve from
that same instance. A vendor bundle only reads from its base while
loading, so sharing it is safe.
- A failed or throwing load is not kept, so error reporting is
unchanged.
- The key includes the source root, so presets from two different
profile roots still resolve separately.
- The CLI resolves every system preset through one `PresetBundle` for
the whole run, instead of creating one per file.

The resolved configurations still come from the same canonical vendor
loader, so what a preset resolves to does not change. Only the CLI calls
`resolve_preset_config`, so a long-lived GUI bundle cannot end up
holding profile trees that later change on disk.

# Screenshots/Recordings/Graphs

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

CLI slice of a 20 mm cube with X1 Carbon system presets. Both builds get
the same datadir, best of 3, Linux. "Before" is this PR's base from CI.

| System presets loaded | Before | After |
|---|---|---|
| machine | 0.95 s | 0.87 s |
| machine + process | 1.67 s | 0.92 s |
| machine + process + 1 filament | 2.51 s | 0.97 s |
| machine + process + 4 filaments | 5.00 s | 0.99 s |

Files opened during the machine + process + filament run (`strace -e
openat`):

| | Before | After |
|---|---|---|
| `BBL.json` | 3 | 1 |
| `OrcaFilamentLibrary.json` | 3 | 1 |
| `system/BBL/**/*.json` | 8,634 | 2,880 |
| `system/OrcaFilamentLibrary/**/*.json` | 1,536 | 512 |

Peak memory did not rise: max RSS 306 MB → 286 MB for the three-preset
run, and 305 MB → 285 MB for four filaments. The "before" figure is an
AppImage, so part of that gap is probably packaging.

## Tests

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

- New test "Manifest-backed resolution reuses the vendor tree it already
loaded" in `tests/libslic3r/test_preset_bundle_loading.cpp`. It resolves
one preset, changes the parent profile on disk, then resolves a sibling.
The same bundle returns the value it already loaded, and a fresh bundle
picks up the change.
- New test "Manifest-backed resolution shares the library between
vendors under one root". It resolves through one vendor, changes a
library profile on disk, then resolves through a second vendor and a
library preset on the same bundle. Both return the value already loaded,
and a fresh bundle picks up the change.
- All `[Preset][Bundle]` tests pass (87 test cases, 1,069 assertions),
including the existing manifest-backed resolution cases for source-root
scoping, malformed vendor loads, missing parents and type mismatches.
- G-code of the three-preset slice is identical before and after, header
lines excluded.
- The external CLI regression suite passes. Two cases report as
unexpectedly passing because #15639 fixed their bug. They pass the same
way on this PR's base without the change.
- A GUI-vs-CLI parity run over 10 fixtures shows no new differences.
- Builds clean on Linux (Release, with tests).

<!--
> 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-09-15 15:01:24 +08:00
Hanif Koh d5cf1502c4 Share One Library Load Between Vendors in the CLI Preset Resolver
The manifest resolver loaded OrcaFilamentLibrary once per vendor it
resolved through, so a run that mixes vendors parsed the library tree
again for each of them. The library is now cached like any other vendor
tree, keyed on its root and substitution rule, and doubles as the base
every vendor under that root loads against. A vendor bundle only reads
from its base while loading, so sharing the instance is safe.

The cache key carries the substitution rule as its enum, and the lookup
lambdas take a const bundle since they only read.
2026-09-15 13:31:30 +08:00
HanifKoh 37e2b6c928 CLI: let --export-settings - write the merged config JSON to stdout (#15698)
`--export-settings` already writes the merged config as JSON at the
right point in the CLI flow. Passing `-` now writes that same document
to stdout, so scripts can inspect the effective config without a temp
file. This replaces #14605.

- `ConfigBase::save_to_json` gains a stream overload. The file overload
serializes through it before opening the file, so the output format is
unchanged, and a config that cannot be serialized (invalid UTF-8) now
leaves the existing file untouched instead of truncating it.
- On stdout, invalid UTF-8 in string values is written as U+FFFD instead
of ending the process with an uncaught `type_error`. Files keep the
strict behaviour.
- To keep stdout pure JSON, `-` is rejected up front (stderr message,
`CLI_INVALID_PARAMS`, shell status 254) when combined with an action or
transform that can write to stdout or does real work: `--info`,
`--help`, `--orient`, slicing and exporting. Options that do nothing
without a slice (`--uptodate`, `--min-save`, `--pipe`, ...) are still
accepted.
- The one unconditional stdout write on a success path, "skip locked
instance" during arrange, now goes to the log.
- Every other value, including the default `output.json`, behaves as
before.

Tests in `tests/libslic3r/test_config.cpp`: the stream output equals the
file output and keeps the tab-indented format; invalid UTF-8 throws on
the strict path and is replaced when asked; a failed save leaves the
previous file intact.
2026-09-15 13:16:22 +08:00
Kris Austin efc9f253ee fix: resolve relative input paths given on the command line (#14803)
Opening a model with a relative path, for example `orca-slicer ./some.3mf`,
failed with "Loading of a model file failed." and "The file does not contain
any geometry data.", while the same file opened by an absolute path or by
drag and drop worked.

GUI_App::init_app_config() changes the working directory to <data_dir>/log,
and it runs from the GUI_App constructor because the app config is needed
early for instance checking. The input files are opened much later, in
post_init(), so a path still relative at that point resolved against the log
directory instead of the directory OrcaSlicer was started from, and the 3MF
reader failed to open it.

Resolve the input paths in CLI::setup(), which runs before GUI_App is
constructed and therefore before the working directory moves. Absolute paths
are returned unchanged, so the forms that open today are unaffected, and
custom open protocol URLs are passed through since post_init() hands those to
the downloader rather than the file loader.

The working directory change is left alone. It was added in #3248 so the TUTK
logs land in the data directory instead of the working directory (#3209).
2026-09-15 12:47:01 +08:00
Kris Austin 292cf0095e drop the per-frame mouse raycast that only a drag start reads (#15664) 2026-09-14 18:31:23 -03:00
Kris Austin 5c635d5e50 build: scope -Werror to the Clang family so GCC builds again (#15701) 2026-09-14 17:04:03 -03:00
Noprazandyw4z 5496883493 fix(profiles): Snapmaker U1 — cap ABS/ASA/PPS bed temps at 100 °C (#15483)
The U1's heated bed tops out at 100 °C, but these profiles requested
105-110 °C, which leads to print errors unless the user modifies the
printer's firmware configuration.

Affected profiles:
- Snapmaker ABS @U1 base (110/105 → 100)
- Snapmaker ASA @U1 base (110 → 100)
- Fiberon ASA-CF08 @Snapmaker U1 base (105 → 100)
- Fiberon PPS-GF20 @Snapmaker U1 base (105 → 100)

Bumps Snapmaker.json to 02.04.00.10.

Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-09-14 20:44:15 +03:00
packerlschupfer 31eb8a2bd1 CLI: let --export-settings - write the merged config to stdout
--export-settings already writes the merged config as JSON at the right
point in the CLI flow. Passing - writes the same document to stdout.

- ConfigBase::save_to_json gains a stream overload. The file overload
  serializes through it before opening the file, so the format is
  unchanged and a config that cannot be serialized leaves an existing
  file untouched instead of truncating it.
- On stdout, invalid UTF-8 in string values is written as U+FFFD instead
  of ending the process with an uncaught type_error; files keep the
  strict behaviour.
- - is rejected up front when combined with an action or transform that
  can write to stdout or does real work, so stdout carries only the
  JSON.
- The unconditional "skip locked instance" stdout write during arrange
  now goes to the log.
- Tests in tests/libslic3r/test_config.cpp.
2026-09-14 19:35:29 +02:00
Daniel Williams 70247ad298 Extract Layer::choose_ironing_extruder for unit-testable ironing routing (#13467)
* Extract Layer::choose_ironing_extruder for unit-testable ironing routing

The ironing extruder selection in make_ironing() was a 5-line nested
conditional inlined at the top of the loop, with no isolated test
coverage. Pull the gating into a static helper so the routing decision
is unit-testable without spinning up the slicing pipeline.

Pure refactor: the helper preserves the original logic bit-for-bit
(NoIroning -> -1; AllSolid always enabled; TopSurfaces and TopmostOnly
require some top shells or, in spiral mode, more than one bottom shell;
TopmostOnly additionally requires being on the topmost layer; enabled
ironing routes to solid_infill_filament).

Add tests/fff_print/test_choose_ironing_extruder.cpp covering:
- AllSolid regardless of layer position
- TopSurfaces with top_shell_layers > 0
- TopSurfaces with top_shell_layers=0 + spiral mode + bottom_shell_layers>1
- TopmostOnly + topmost layer
- NoIroning short-circuit
- TopSurfaces with top_shell_layers=0 (and not spiral) -> disabled
- TopSurfaces, spiral, but bottom_shell_layers=1 -> disabled
- TopmostOnly on a non-topmost layer -> disabled

* Move ironing routing test into the Fill subsystem file

Rename the test to tests/libslic3r/test_fill.cpp and tag it [Fill] to
match the subsystem it covers, use flat behavioral test cases with
GENERATE for the parameterized ones, and drop the history narration from
the code comments.

* tests: move ironing routing tests into fff_print/test_fill.cpp

Keeps the Fill tests in one file, alongside the existing ironing
rotation-template test.
2026-09-14 09:37:04 -03:00
Hanif Koh d4840901fc Test That Failed Vendor Loads Are Not Kept and the Library Base Is Reused
Cover the two cache paths the first test left open: a vendor tree that fails to load is retried on the next resolution instead of being served from the cache, and a type-probed filament resolved through resolve_preset_config_type reuses the OrcaFilamentLibrary base already loaded for a sibling.
2026-09-14 18:51:48 +08:00
Hanif Koh 5f01f21661 Load Each Vendor Tree Once When the CLI Resolves System Presets
Resolving a system preset through its vendor manifest loaded the whole vendor tree and the filament library from JSON, and the CLI did that separately for every --load-settings and --load-filaments file. A run with machine, process and filament presets parsed BBL's 2,879 profile files and the library's 512 three times over, about a second each.

Keep the library and vendor bundles loaded by the manifest path on the PresetBundle that resolved them, keyed by source root, vendor and substitution rule, and have the CLI resolve every system preset through one bundle for the whole run. A failed load is not kept, so errors are reported as before.

On a cube slice with X1C machine, process and PLA presets: 2.42 s -> 0.93 s, BBL.json opened once instead of three times, identical G-code.
2026-09-14 17:44:17 +08:00
Lam Wei Lun ecbe1b1b90 UI Bug fixes and code cleanup for Publish 3MF Dialog (#15690)
# Description
- Fixes an issue on macOS where the modified indicator can be cut-off.
- Remove unused code
2026-09-14 16:57:41 +08:00
HanifKoh 00429da739 Apply the GUI's Mixed Filament Rules on the CLI (#15636)
A valid mixed filament already slices the same on the CLI as in the GUI;
these are the places where the CLI still skipped a rule the GUI applies.

- Keep the prime tower when a mixed filament is used, even if every
  --load-filaments preset is the same. A mixed filament swaps between its
  components every layer, so turning the tower off left the swaps with
  nothing to purge on.
- Leave a mixed slot's row and column of the flush matrix at zero when
  --filament-colour triggers a recompute, as the GUI does; a mixed slot
  never reaches a nozzle.
- Refuse a mixed slot that has no filament of its own. Feature filament
  ids aimed at it were past the filament count, got reset to filament 1
  and the model silently printed in one colour.
- Refuse a plate that uses a mixed filament whose components are
  different filament types, the type half of the GUI's
  Sidebar::has_broken_mixed_filament. Missing or out-of-range components
  are already rejected for the whole project by validate().
  get_extruders_under_cli gains an expand_mixed_slots flag so the gate
  can see mixed slots rather than their components; existing callers
  keep the expanded list.

Both refusals exit with the new CLI_MIXED_FILAMENT_INVALID (-69).
2026-09-14 14:28:08 +08:00
HanifKoh 31f6eb2718 Keep the First Value When a Per-Filament Variant Option Is Too Short (#15639)
update_values_to_printer_extruders_for_multiple_filaments picks each
filament's value from the flattened (filament x variant) columns of every
per-filament variant option. When a column index fell past the end of the
option's values, it skipped that filament and left the zero the output
vector was created with.

The GUI always hands this function full columns, but the CLI does not:

- a CLI override of a single value, such as --nozzle-temperature=211 on a
  four-filament project, came out as 211,0,0,0, so three filaments would
  print at 0 C;
- loading fewer filament presets than the project has filaments left the
  remaining filaments' columns missing, so filament_cooling_before_tower
  came out as 10,10,0,0 and filament_ramming_volumetric_speed as -1,-1,0,0.

An out-of-range column now keeps the option's first value, the fallback
get_at() and the sibling gather step already use. The seven per-type copies
of the loop are replaced by that same gather_option_values helper, moved
above the function; it now takes its caller's name for its log lines. An
empty option, which has no first value, is given one registered default per
filament first; it used to be replaced with zeros.

On a partial load a filament whose preset was not loaded takes the first
filament's value rather than its own preset's, which the CLI does not load;
for the options seen in practice those agree.
2026-09-14 14:26:32 +08:00
Lam Wei Lun ffb4f192c1 Fix macOS UI issue in publish dialog. Remove item_size helper in TabCtrl and its relevant setter 2026-09-14 14:19:25 +08:00
Hanif Koh 4373bc3697 Add a Nightly Parity Workflow
Runs orca-test-repo's full override-sweep effect stage (two shards) and the GUI-vs-CLI parity harness every night against the latest successful build_all Linux AppImage, with sources checked out at that build's commit. Kept out of the per-build regression step, whose time budget it would exceed, and never gates a build.
2026-09-14 13:38:51 +08:00
Ian Chua a09d6a565c feat: plater notification API for plugins (#15318)
# 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 a really basic API to push notifications to the plater.

Plugin used in demo: 

[plater_notification.py](https://github.com/user-attachments/files/31293074/plater_notification.py)

# Screenshots/Recordings/Graphs

<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
<img width="2172" height="1241" alt="image"
src="https://github.com/user-attachments/assets/540319ca-a11a-4b48-9b80-82fb6b0849d9"
/>

## 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-09-14 11:46:43 +08:00
Ian Chua 214b5e2b0a Merge branch 'main' into feat/plater-notification-api 2026-09-14 11:46:36 +08:00
packerlschupfer c5b152b722 CLI: record command-line overrides in different_settings_to_system (#15642)
* CLI: record command-line overrides in different_settings_to_system

Settings passed on the command line (--sparse-infill-density 25% ...) override
the loaded presets when m_extra_config is applied to m_print_config, but nothing
recorded them in different_settings_to_system. The exported project therefore
carried the new value with no mark that it was modified, and re-opening it in the
GUI reverted it to the system preset's value -- the same failure the preset-leaf
diff fixes for user presets, via a different source of override.

The key set comes from m_config, not m_extra_config. read_cli() puts only what the
user typed into m_config and setup() adds nothing but CLI-own defaults (none of
the keys run() materialises there is a preset option), whereas the CLI writes its
own values into m_extra_config (has_filament_switcher, filament_colour,
filament_map ...), which must not be reported as user overrides.

Values are snapshotted just before the apply and only keys the override actually
changed are recorded: a typed value equal to the loaded one modifies nothing, and
listing it would read as a spurious difference against what the GUI writes. Each
key lands in the column(s) whose preset type owns it -- process, every filament,
printer -- and a key already present is not duplicated. Keys no preset owns
(curr_bed_type, a project setting) land nowhere, as in the GUI.

Follow-up to #15595, split out at review.

* CLI: judge command-line overrides the way the value is read

Review follow-ups on the override recording:

- Lists were compared as whole serialized strings. read_cli() builds a fresh
  one-entry list, so --nozzle-temperature 245 against 245,245,245 on a
  three-filament project was recorded in every filament column although nothing
  changed. Lists are now compared entry by entry with a missing entry read as the
  first, as get_at() reads it (and as resize() pads).

- The log line fired for every changed key, including ones no preset owns
  (curr_bed_type) and which therefore land in no column. It now fires only when a
  column took the key.

- m_print_config.has(key) straight after apply(m_extra_config, true) was always
  true, both configs sharing print_config_def; removed. columns.size() >= 2 also
  always holds after the resize to filament_count + 2 -- different_settings_to_system
  is not a CLI option, so nothing in between can shrink it -- but that rests on code
  far away, so it stays a plain check rather than an assert: release builds compile
  asserts out, and a _GLIBCXX_ASSERTIONS build would abort on columns[0].

Deliberately NOT done: comparing a key the loaded config lacks against its
built-in default. On reopen the GUI restores an unlisted key from the SYSTEM
preset, not the default. A 3MF written before an option existed leaves it absent
here, so --sparse-infill-density 20% (the default) against a Prusa system 15% would
go unrecorded and be reverted to 15%. Absent keys stay always-recorded:
over-recording is cosmetic, under-recording loses the value. Verified that such a
key really is absent at this point, rather than filled from the system preset.

Reported by HanifKoh and raistlin7447 in review of #15642.
2026-09-14 11:37:05 +08:00
Kiss LorandandRodrigo Faselli fd63164268 Fix Printer Agent preset undo (#15645)
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
2026-09-13 21:03:45 -03:00
Kiss Lorand aef9ca2efb Fix label object error for toolchanges without object instances (#15666) 2026-09-13 19:42:49 -03:00
Kris Austin 26fa1694d9 ci: save the compiler cache from cancelled and failed builds too (#15668) 2026-09-13 19:08:08 -03:00
Daniel WilliamsandRodrigo Faselli 636b623cb7 tests: regression test that every PrintRegion/Object field is in a preset key list (#13466)
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
2026-09-13 17:55:42 -03:00
Kris Austin d643b10ac4 build: expand PrintConfig.hpp option lists twice per class instead of five times (#15658) 2026-09-13 17:46:03 -03:00
Kris Austin 9e8fbc17dd ci: clear the per-run annotations and revive the weekly doxygen job (#15659) 2026-09-13 16:39:55 -03:00
yw4z 15ebdc3799 enable menu icons on macOS and Linux for plate / background menus (#15620)
Update GUI_Factories.cpp
2026-09-13 19:41:27 +08:00
TheLegendTubaGuy a7775296b0 Fix macOS custom color accuracy (#15283)
* Fix macOS custom color accuracy

* Fix wxWidgets dependency patch command

* Apply macOS color patch to current wxWidgets branch
2026-09-13 18:29:35 +08:00
Kiss Lorand c21e48450c Fix single-instance activation maximizing OrcaSlicer (#15665) 2026-09-12 16:21:14 -03:00
Kris Austin bb8c2ae5ce build: enable -Werror with a documented exception list (#15660) 2026-09-12 15:52:05 -03:00
Kris Austin fe0d47c7a3 feat(issues): add a crash report template (#15524) 2026-09-12 15:04:44 -03:00
Kiss Lorand c5965fa4d9 Fix: clear stale paths when merging perimeter regions (#15662) 2026-09-12 14:31:28 -03:00
Rodrigo Faselli db9163ec34 Set the CMake policy CMP0177 (#15657)
Update CMakeLists.txt
2026-09-12 13:26:11 -03:00
Kris Austin e7ca4fb87e build: trim GUI_App.hpp includes so edits stop rebuilding the whole GUI (#15644) 2026-09-12 12:09:39 -03:00
Valerii Bokhan 0888e331b5 fix: validate float-or-percent input ranges (#15392) 2026-09-12 10:59:13 -03:00
packerlschupfer ccd6086787 CLI: evaluate compatible_printers_condition in the compat checks (#15449)
* CLI: evaluate compatible_printers_condition in the compat checks

Slicing from the CLI with --load-settings exits with
CLI_PROCESS_NOT_COMPATIBLE (-17), "The selected printer is not compatible
with the process preset in the 3mf.", for process/printer pairs the GUI
accepts. Reproducible with stock, unmodified Prusa system profiles:

  orca-slicer --datadir <datadir> \
    --load-settings "<datadir>/system/Prusa/process/0.20mm SPEED @CORE One HF 0.4.json;<datadir>/system/Prusa/machine/Prusa CORE One HF 0.4 nozzle.json" \
    --load-filaments "<datadir>/system/Prusa/filament/Prusament PETG @CORE One HF 0.4.json" \
    --slice 0 --outputdir /tmp/out model.stl

The four compat checks in CLI::run did a literal name match against the
`compatible_printers` list only:

    for (index ...) if (new_print_compatible_printers[index] == new_printer_system_name)
        process_compatible = true;

Process profiles that declare compatibility through
`compatible_printers_condition` and leave `compatible_printers` empty are
therefore always reported incompatible -- the condition is never consulted.
For 0.20mm SPEED @CORE One HF 0.4 that condition is:

    printer_notes=~/.*PRINTER_MODEL_COREONE[^_a-zA-Z0-9].*/ and
    nozzle_diameter[0]==0.4 and printer_notes=~/.*HF_NOZZLE.*/

The GUI does not have this bug: is_compatible_with_printer() in Preset.cpp
treats an empty list as "no explicit constraint" and evaluates the
condition in that case.

Fix: replace the four loops with a check_compat lambda that calls
is_compatible_with_printer() -- the same helper the GUI uses -- wrapping
the already-loaded DynamicPrintConfigs in lightweight Preset /
PresetWithVendorProfile shells. The 3MF-embedded process/printer full
configs are kept in current_process_full_config /
current_printer_full_config so the condition can be evaluated for the
reprocess paths too; those fall back to the previous literal match when
the full config was not preserved.

Behaviour is unchanged where an explicit compatible_printers list exists:
is_compatible_with_printer() performs the same name match, and returns
true when both list and condition are empty, matching the existing
"old 3mf, no compatible printers, set to compatible" path.

Split out of #13731 (section 1) as a standalone, single-purpose change.
Orthogonal to the inherits-chain resolution work in #14718 / #15302 /
#15438; those decide which values a preset resolves to, this decides
whether the resulting pair is considered compatible.

* CLI: translate the 3MF's renamed compatibility keys before the compat check

The 3MF fallback fed the project config to is_compatible_with_printer() as-is,
but a project config does not carry compatible_printers or
compatible_printers_condition. PresetBundle::construct_full_config() erases both
and re-emits them as print_compatible_printers and
compatible_machine_expression_group; they are renamed back only on the
PresetBundle load path, which the CLI does not take. The check therefore saw no
list and no condition, read that as 'no constraint' and accepted every printer.

That is not just a wrong accept. An early true skips the !process_compatible
block that sets machine_switch, so the new printer is never appended to
print_compatible_printers and the exported 3MF stays marked compatible only with
the printer it came from -- which is exactly what that block exists to prevent.

Translate the two keys back before the check. Index 0 of the expression group is
the print preset; the group is filled print, filaments, printer.

Also note in the comment that profiles/BBL/{process,machine}_full/ are gitignored
and generated by nothing in-tree, so current_*_full_config is always empty and
this fallback is the only live path -- not the rare non-BBL case the original
comment implied.

Reported with measurements by HanifKoh in review of #15449.

Preset: add a config-level is_compatible_with_printer() overload

The CLI holds resolved DynamicPrintConfigs, not Presets, so it wrapped them in
throwaway Preset shells at the call site. Moving that into Preset.cpp puts the
compatibility policy -- including the documented fail-open on a malformed
compatible_printers_condition -- in one place for the GUI and the CLI, rather
than leaving a second copy of the plumbing in OrcaSlicer.cpp to drift.

Purely additive: neither existing overload changes, so no GUI behaviour moves.

Requested by HanifKoh in review of #15449.

(cherry picked from commit 14ca1972ef4d3c7d90935d159423013a40a6bd70)

* CLI: never overwrite a real compat key with an empty renamed one

7e7f0e3 translated compatible_machine_expression_group[0] into
compatible_printers_condition whenever the group vector was non-empty. A project
the CLI exported itself carries the real compatible_printers_condition AND an
all-empty group, ["", "", ""], so the valid condition was overwritten with
"", the check saw no constraint, and every printer was accepted.

That fixed GUI-shaped projects and broke CLI-shaped ones. Bisected across six
builds re-slicing one CLI-exported CORE One project with an MK4S: every build
before 7e7f0e3 gives 'compatible 0' and takes the machine-switch path; with it,
'compatible 1' and no switch.

The raw keys now win whenever they carry something; the renamed ones are only a
fallback, and an empty value is never written over a real one. Same for the list:
print_compatible_printers is used only when compatible_printers is absent or
empty and it itself is not.

Found by a peer session re-testing the installed build.
2026-09-12 11:17:10 +08:00
Kris Austin e998ad968a ci: cache the Flatpak job's compiled objects with ccache (#15650) 2026-09-11 22:43:48 -03:00
Kris AustinandRaoul Rubien 081bb9a703 build: clear 41 -Woverloaded-virtual warnings, the last of the category (#15637)
Co-authored-by: Raoul Rubien <rubienr@sbox.tugraz.at>
2026-09-11 21:27:30 -03:00
Kris Austin 75f5fe22e8 build: clear 12 platform-gated warnings the x64 census could not see (#15633) 2026-09-11 21:24:37 -03:00
Kris Austin 74cf148384 fix: sequential-print arrange settings are ignored and never persisted (#15425) 2026-09-11 21:22:16 -03:00
packerlschupfer 1e76e733b7 CLI: record user overrides in different_settings_to_system for 3MF export (#15595)
* CLI: record user overrides in different_settings_to_system for 3MF export

Three sites in CLI::run wrote an empty `different_settings_to_system` column
and left a //todo:

    //todo: support user machine preset's different settings
    different_settings[filament_count+1] = "";
    //todo: support system process preset
    different_settings[0] = "";
    //todo: update different settings of filaments
    different_settings[filament_index] = "";

So a 3MF exported by the CLI does not record which keys the user actually
overrode relative to the system parent. Re-opening such a project in the GUI
then shows spurious "unsaved changes", and accepting that dialog can revert
inherited process/filament/machine values to system defaults.

The column could not be filled before because the CLI had no resolved view of
the parent preset. It does now: #15438 builds a PresetBundle for inherits
resolution, so the parent can be looked up by name and diffed against the
resolved leaf. This adds no extra loading -- the bundle is the one already
built, and the helper returns "" whenever it is unavailable or the parent
cannot be found, which is the previous behaviour.

Preset metadata is filtered out of the diff: `inherits`, the three
`*_settings_id` keys, and `compatible_printers` / `compatible_prints` and
their `_condition` variants, which have their own tracking columns
(`inherits_group`, per-slot lists) and would otherwise double-count.

A value already carried by the loaded JSON still wins for the process slot, so
presets saved with a `different_settings_to_system` field behave as before;
the computed value only fills the gap where that field is absent, which is the
case for every user preset in my datadir (0 of 47 carry it).

System presets keep an empty column: there are no user overrides to record.

* CLI: diff the filament slot before load_default_gcodes_to_config

The process and machine slots compute their different_settings_to_system column
before load_default_gcodes_to_config(); the filament slot did it after. That
call materialises absent gcode keys via option(..., true), and
DynamicConfig::diff only compares keys present in both configs -- so a gcode key
the resolved leaf did not carry would go from 'not compared' to 'compared as
empty against the parent' and land in the column as an override the user never
made.

Hoisted into a local above the call, guarded by load_filament_count > 0 so the
work is skipped exactly where it was before, and assigned at the original site.
The diff now also runs before config.erase("filament_settings_id"), which is
immaterial: cli_different_settings already filters filament_settings_id along
with the other *_settings_id keys.

This is a consistency fix rather than a demonstrated defect -- resolve_preset
merges the parent config, so in practice the gcode keys are already present on
both sides and the diff is unaffected. It removes the dependence on that
invariant, which the other two slots never had.

Reported by HanifKoh in review of #15595.
2026-09-12 04:31:12 +08:00
HanifKoh f21f062ded Cache compiled objects between CI runs (#15611)
# 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?
-->

Every CI build leg compiles the whole tree from scratch: 42 to 57
minutes of each build job, on every push and every pull request, roughly
200 runs a week. This PR caches the compiled objects with ccache so that
a run only compiles what changed since the last push to main. With a
warm cache the compile steps take 1 to 4 minutes on all six legs and a
pull-request run finishes in about 30 minutes instead of 75.

Three prerequisites landed last week and made this measurable: #15537
took `GIT_COMMIT_HASH` off the compile line, #15552 made a build without
the precompiled header work on Windows, and #15501 stopped the Flatpak
job from rebuilding its dependencies.

## Changes

### Compiler cache in `build_orca.yml`

Each build leg (Linux x86_64/aarch64, Windows x64/arm64, macOS
arm64/x86_64) restores a cache entry keyed by that leg, compiles through
`ccache` via `CMAKE_<LANG>_COMPILER_LAUNCHER`, and prints its hit
statistics at the end of the job. The macOS universal combine does not
compile and is left out.

Who writes the cache is the important part. Cache entries are immutable
and a restore always takes the newest matching one, so every save is a
new entry that is never read again once a newer one exists. Therefore:

- **Pushes save.** After a successful save, the older entries for the
same leg on the same ref are deleted, so a branch holds exactly one
entry per leg. The save comes first, so a failed save leaves the
previous entry in place.
- **Pull requests restore only.** They read main's entries (GitHub lets
a PR read the base branch's caches) and keep nothing. Saving from PRs
would add about 6 GB per run that no other run can read.

The store is therefore a flat ~7 GB (one entry per leg: Linux ~1 GB,
Windows ~2 GB, macOS ~0.6 GB), not a growing one. The
`hendrikmuhs/ccache-action` only installs and configures ccache; restore
and save go through `actions/cache` with one path string, because the
cache service only matches entries saved under the identical path and
the action spells it differently on Windows. A failed ccache install
falls back to an uncached build rather than failing the job.

### Precompiled header off when the cache is on

With `SLIC3R_PCH` left on, a warm cache hit only 19 % of compiles: Clang
stamps the PCH with the build time, CMake does not pass
`-fno-pch-timestamp`, and everything that includes the PCH (libslic3r
and libslic3r_gui, ~750 files) missed every run. `build_linux.sh -p`
exists for exactly this reason. The workflow now exports
`ORCA_EXTRA_BUILD_ARGS=-DSLIC3R_PCH=OFF` whenever ccache is enabled,
which brings the warm hit rate to 98.4–98.9 %.

The cost is on cold compiles, which are 25–60 % slower than today's PCH
build (ccache preprocesses every miss before compiling it, and the miss
compiles without PCH). Main pays this once after an image update or a
wide header change; PRs pay it only for the files their change
invalidates. A change to a header included by half the tree
(`PrintConfig.hpp`, `Preset.hpp`, `Model.hpp`) lands a run at 1.2–1.9×
today's time. `ccache`'s depend mode would remove the preprocessor pass
and is the natural follow-up.

### Includes the precompiled header was supplying on macOS

A build without PCH had never been tried on macOS. Three files used what
`pchheader.hpp` happened to include: `LocalesUtils.cpp` needs
`<sstream>` and `<iomanip>`, and `AmsMappingPopup.cpp` /
`PhysicalPrinterDialog.cpp` need `<wx/tooltip.h>`. libstdc++ and the GTK
wx port pull these in transitively; libc++ and the Cocoa port do not.
This is the macOS counterpart of #15552 and is worth merging on its own.

### `ORCA_EXTRA_BUILD_ARGS` pass-through

`build_linux.sh` already forwarded this variable to the slicer
configure. `build_release_macos.sh` now reads it into an array
(shellcheck-clean), and `build_release_vs.bat` appends it on both
configure lines, so CI can add a CMake option without editing three
scripts.

## Behaviour reviewers should know about

- **Main-only cache writes need `actions: write`** on the workflow token
to delete the previous entry. The default token already has it (the
nightly deploy steps write with it), so no `permissions:` block was
added. A fork PR's read-only token never reaches the delete step.
- **A runner image update cold-starts the cache** as configured, because
ccache keys the compiler by its mtime and every image rebuild reinstalls
it. Images updated 20260819 → 20260828 during this work, about every one
to two weeks. Keying on the compiler version string (`compiler_check`)
would avoid that; left as a follow-up since it changes every hash.
- **What is now the critical path:** the two Flatpak jobs (46–66 min,
untouched here), the orca-test-repo regression suite run inline in the
Linux job (7 min), and NSIS/PDB/MSIX packaging on Windows (6 min). Those
are the next wins.
- **Open question:** CI still drives `build_release_vs.bat`. #15552 gave
`build_win.bat` a `--cache ccache --no-pch` option; moving the Windows
job onto it would replace the batch-file change here.

# Screenshots/Recordings/Graphs

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

Compile step of each build leg, minutes. Main's numbers are from run
34324625046.

| Leg | main | cold, PCH on | warm, PCH on | cold, PCH off | warm, PCH
off | ~50 % of headers changed | 5 source files changed |
|---|---|---|---|---|---|---|---|
| Linux x86_64 | 48 | ~75 | (19 % hits) | ~110 | **2.6** | 91.3 (452/928
misses) | 3.4 |
| Linux aarch64 | 41.7 | 53.4 | 52.2 (178/927 hits) | 58.8 | **2.5** |
55.8 (452/928) | 2.9 |
| Windows x64 | 57 | 85.5 | — | ~105 | **2.4** | 76.8 (449/974) | 2.5 |
| Windows arm64 | ~45 | 64.4 | — | ~78 | **4.3** | 59.6 (450/974) | 4.2
|
| macOS arm64 | 51 | ~71 | — | — | **0.8** | 79.7 (453/947) | 0.9 |
| macOS x86_64 | ~43 | 70.2 | — | — | **1.0** | 68.1 (411/742) | 1.0 |

Warm hit rates: 98.4–98.9 % on every leg; the 11–14 misses are what any
commit changes (version stamp and its includers). The "50 % of headers"
column is a real event: #15251 and #15416 merged into main between two
runs, changing 20 headers that reach 453 of 870 translation units.

Whole run, before and after (a pull-request run; wall clock to the last
non-Flatpak job):

| Job | main (run 34324625046) | warm cache (run 34444305385) | what
remains |
|---|---|---|---|
| Windows arm64 | 50.0 | 15.7 | compile 4.3, NSIS 3.5, cache save 1.6,
deps restore 1.1, cache restore 1.0 |
| Windows x64 | 67.4 | 13.2 | NSIS 3.2, PDB 2.6, compile 2.4, MSIX 0.5 |
| Linux x86_64 | 57.5 | 12.6 | orca-test-repo regression 7.6, compile
2.6 |
| macOS x86_64 | 46.9 | 6.1 | free disk space 2.3, compile 1.0 |
| Linux aarch64 | 43.9 | 4.6 | compile 2.5, apt 0.9 |
| macOS arm64 | 54.9 | 4.4 | free disk space 1.7, compile 0.8 |
| macOS universal | 7.7 | 2.2 | signing and notarisation only on main |
| Flatpak x86_64 / aarch64 | 66.6 / 46.5 | unchanged | full compile
inside flatpak-builder |
| **Wall clock** | **75 min** | **31 min** (Flatpak excluded; 66 with
it) | macOS runner queueing now exceeds job time |

Cache storage: one generation per leg is 400–680 MB compressed at PCH
on, 0.6–2 GB at PCH off; six legs ≈ 7 GB. Without the delete step, 21
main pushes a week would hold ~80 GB of entries that are never read.

## Tests

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

- Thirteen CI runs on this PR, one change per run, with the ccache
statistics printed by every leg: cold (34336272234), warm with PCH
(34346737197), cold and warm without PCH (34352209577, 34364791732), the
macOS include fixes (34435044411, 34435968806 with `ninja -k 0` to list
every remaining file, 34439532375), all legs warm (34444305385), the
keep-only-newest cleanup (34450381312, then 34452640274 after the
Windows CRLF fix), the half-tree invalidation (34452640274), the
five-file change (34463517683, 34464720539), and this final shape
(34466377763, restore-only).
- Unit tests on all five platforms, the profile slice check, the Windows
build-script suite, Shellcheck and the universal DMG build all pass on
the cached binaries.
- The cleanup was verified against the PR's own cache scope: 44 entries
from the earlier runs reduced to exactly one per leg, on all three
platforms, after fixing the CRLF that made `gh cache delete` fail on
Windows.
- A libc++ syntax-only pass over all 1986 C++ translation units on Linux
found the `LocalesUtils.cpp` include; the two wx includes only surface
in a real macOS build and were found with a keep-going build in one
round.

<!--
> 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-09-12 00:46:24 +08:00
Hanif Koh 6a88f0790e Enable ccache Depend Mode
A miss used to cost a preprocessor pass for the hash and then the real
compile. With the depend mode ccache hashes the include list the
compiler reports, so a miss costs only the compile. Ninja already asks
every compiler here for that list.
2026-09-11 23:02:31 +08:00
Hanif Koh 6f90ff6e93 Allow ccache with PCH
Clang records the modification time of every input in the precompiled
header, so a fresh checkout produces a different header and every file
that includes it misses the compiler cache. -fno-pch-timestamp makes the
header reproducible, and pch_defines lets ccache cache the header itself.
The precompiled header no longer has to be turned off when the cache is
on.
2026-09-11 23:02:21 +08:00
Hanif Koh 67f77e16c3 ci: cache compiled objects between runs
Every CI leg compiled the whole tree from scratch, 42 to 57 minutes of
each build job. Objects are now cached with ccache, one entry per leg
kept on the branch that built it: a push saves the cache and drops the
previous entry, a pull request restores main's and keeps nothing.

The precompiled header is turned off whenever the cache is on: Clang
stamps it with the build time, so every file including it missed. With
it off, a warm run hits 98.5 to 98.9 % of compiles and the compile steps
take 1 to 4 minutes; a cold run costs 25 to 60 % more than before, and a
change to a widely included header lands in between.
2026-09-11 23:02:21 +08:00
mschfhandyw4z 0a3724ed2f fix(profiles): set PETG SuperTack temperatures to 60°C (#15189)
Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-09-11 12:05:17 +03:00
TheLegendTubaGuyandyw4z 613dbcb21b Add Flashforge Creator 5 and Creator 5 Pro 0.25 mm nozzle profiles (#15282)
* Add Creator 5 0.25 mm nozzle profiles

* Fix Creator 5 process profile load order

* Bump Flashforge profile version

---------

Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-09-11 12:03:14 +03:00
TheLegendTubaGuyandyw4z 4ad3d11c7a Fix Qidi X-Plus 5 chamber heating profiles (#15556)
* Fix Qidi X-Plus 5 chamber heating profiles

* Restore Qidi ABS Odorless chamber temperature

---------

Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-09-11 11:52:37 +03:00
Alexandre Folle de Menezes 3331280b34 Verify and improve AI pt_BR translations (#15621) 2026-09-11 11:36:59 +03:00
Hanif Koh a6cf5cc1e3 Add the includes the precompiled header was supplying on macOS
A build without SLIC3R_PCH had never been tried on macOS. Three files
used what pchheader.hpp happened to include: LocalesUtils.cpp needs
<sstream> and <iomanip>, and the two dialogs need <wx/tooltip.h>. The
GTK port's headers and libstdc++ pull these in transitively, the Cocoa
port's headers and libc++ do not.
2026-09-11 13:02:57 +08:00
Ian Chua baa91282e3 Plugin system UI Fixes / Improvements (#15568)
this one is wxWidgets related ones. will send web dialogs related one
later

# Slicing-Pipeline management
• Matched UI components and colors
• All row clickable for editing to make it easier to click
• Add button also uses full row to make it easier to click
• Simplified code

before
<img width="411" height="211" alt="Screenshot-20260907131847"
src="https://github.com/user-attachments/assets/c6f12f40-0592-4723-ae2c-f6f179f8b819"
/>

after
<img width="420" height="238" alt="Screenshot-20260907131905"
src="https://github.com/user-attachments/assets/8bb63c76-00d8-44eb-9c03-0bfde4915c3e"
/>

<img width="470" height="327" alt="orca-slicer_F5Lszk6Mc3"
src="https://github.com/user-attachments/assets/90023ede-f5de-4b77-8409-39c800ab9618"
/>


# Plugin choice dialog
• Matched UI components and colors

before
<img width="313" height="189" alt="Screenshot-20260907132149"
src="https://github.com/user-attachments/assets/fc0ab0b1-f03a-407e-93f6-adecc2bcbb07"
/>

after
<img width="405" height="213" alt="Screenshot-20260907132203"
src="https://github.com/user-attachments/assets/4f73d7c3-6af8-4ba8-bfea-a2758288f999"
/>

# No plugin message
before
<img width="370" height="165" alt="Screenshot-20260908111523"
src="https://github.com/user-attachments/assets/fdf13dcd-ae18-4511-9936-42ea1c2fdacd"
/>

after
<img width="399" height="183" alt="Screenshot-20260908111338"
src="https://github.com/user-attachments/assets/875f5cdb-eecc-43e9-ac5d-a9d8c3708e05"
/>

# Progress dialog
this one also effects other progress dialogs as well
i was not able to recolor progress bar on previous version of wxWidgets.

before
<img width="373" height="164" alt="Screenshot-20260910163859"
src="https://github.com/user-attachments/assets/c6f408e7-da45-413e-9bd2-f987a7d20685"
/>

after
<img width="393" height="144" alt="Screenshot-20260910165844"
src="https://github.com/user-attachments/assets/a150294d-677a-42b9-98e2-c1b571b1d4ed"
/>


<!--
> 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-09-11 11:19:32 +08:00
Ian Chua 7a6026d3e8 Merge branch 'main' into plugin-ui-1 2026-09-11 11:19:23 +08:00
HanifKoh 8d874cdc36 Register Instance Copies and Moves with Their Plate (#15613)
# Description

Each plate keeps a registry of the instances it holds
(`PartPlate::obj_to_instance_set`). The plate's filament list
(`get_extruders`), its wipe tower preview and position clamp, the object
list grouping and the saved project's per-plate instance list all read
it. Two paths left it stale:

* `Plater::increase_instances` (the `+` key / toolbar) adds the copy to
the model but never registers it with any plate.
* `GLCanvas3D::do_move` (drag release and arrow keys) ended with
`notify_instance_update(-1, 0)`, so only instance 0 of each selected
object was re-registered. Rotate, scale and mirror already notify every
instance.

So a copy created with `+` and dragged onto another plate stayed unknown
to that plate: the project saved afterwards listed it on no plate, and a
multi-filament copy moved onto a single-filament plate drew no wipe
tower there and never got its tower position clamped. The Print side
selects instances by geometry, so the plate still sliced, which is why
this went unnoticed.

This PR

* registers new copies with their plate at creation;
* has `do_move` notify exactly the instances it moved (every instance of
the object when a part was moved in Volume mode), rather than instance 0
or all instances - notifying an instance that stayed put invalidates its
plate's slice result, so `(-1, -1)` as used by rotate would have
un-sliced every plate holding a sibling copy;
* drops the registry entry again when `decrease_instances` removes a
copy.

A second commit finishes the switch #15532 started with
`contain_any_instance_totally()`: `get_extruders_without_support()`,
`check_single_extruder_mixed_filament_risk()` and
`check_compatible_of_nozzle_and_filament()` still tested instance 0
only, so an object whose copy - not its original - sits on the plate was
skipped by all three.

No new options, no format change. The `is_new` flag is deliberately not
passed for the copies: a copy landing on a spiral-vase plate gets the
same "apply spiral mode settings?" prompt a dragged instance gets,
instead of a silent rewrite of the object's settings.

# Screenshots/Recordings/Graphs
Before:
<img width="1920" height="1080" alt="05-moved"
src="https://github.com/user-attachments/assets/3cf9f5a9-1a4e-41e8-8c57-578f849d8c29"
/>

After:
<img width="1920" height="1080" alt="05-moved"
src="https://github.com/user-attachments/assets/1b801a7e-b7cd-4ffb-bd1d-b701f90dade6"
/>


## Tests

Re-run after the rebase, both binaries driven through the same headless
harness (Xvfb 1920x1080, llvmpipe) on the same fixture: `cubeA`
(filament 1) alone on plate 1, `cubeB` (a two-part object, filaments 2
and 1) alone on plate 2, so plate 1 shows no wipe tower at load. Select
the plate-2 object, press `+`, walk the copy onto plate 1 with 36 x Left
(10 mm per press, one `do_move` each), save, slice plate 1.

Before is main `8af92214d0` - i.e. with #15532's
`contain_any_instance_totally()` already in place, so the only
difference is this PR.

* **Before:** the saved `model_settings.config` lists plate 1 with
`cubeA` only and plate 2 with `cubeB` instance 0. The copy (instance 1)
is listed **on no plate at all**, and plate 1 draws no wipe tower even
though a two-filament object is sitting on it.
* **After:** plate 1 lists `cubeA` **and** `cubeB` instance 1; plate 2
still lists instance 0. The plate-1 tower preview appears, and slicing
plate 1 succeeds with the tower actually generated - the filament panel
reports 1.10 m / 0.48 m in its Tower column over 51 filament changes,
and the G-code carries `EXCLUDE_OBJECT_END NAME=cubeB.stl_id_1_copy_0`.

Same camera and fixture on both runs, so the screenshots above are
directly comparable.
2026-09-11 11:18:36 +08:00
Kiss Lorand a49b892708 Fix bridge flow invalidation for zero-gap supports (#15626) 2026-09-10 18:23:31 -03:00
Kris Austin d127db4d99 build: clear 5 warning categories across 19 sites (#15628) 2026-09-10 18:15:39 -03:00
Kiss Lorand 0a630738f1 Fix untranslated language dialog captions (#15600) 2026-09-10 18:15:06 -03:00
Kris Austin d97dea2c41 build: clear 10 driver warnings from CGAL's fp flag pair under clang-cl (#15629) 2026-09-10 18:08:54 -03:00
yw4z a640e32a19 fix build error 2026-09-10 17:29:25 +03:00
yw4z d09c3568c5 match style of progress dialog 2026-09-10 17:02:29 +03:00
yw4z 29b3282c8b Update PluginPickerDialog.cpp 2026-09-10 15:45:00 +03:00
Ian Chua ac1ed139d7 Merge branch 'main' into plugin-ui-1 2026-09-10 20:11:44 +08:00
Ian Chua b709e3fec0 hotfix: system bundles being copied from resources folder on every startup (#15627)
# 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?
-->
#15416 introduced a bug that caused system profiles to be copied over to
the system folder in the roaming folder on every startup.

# 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-09-10 19:32:21 +08:00
Ian Chua 7e96a58770 Merge branch 'main' into hotfix/duplicate-bundle-copy 2026-09-10 19:32:05 +08:00
Ian Chua a93c6ea67b hotfix: system bundles being copied from resources folder on every startup 2026-09-10 19:29:58 +08:00
Valerii Bokhan e8d35fadd4 Fix internal bridges over Hilbert Curve/Octagram Spiral sparse infill (#15206)
* Fix internal bridges over Hilbert Curve/Octagram Spiral sparse infill

For patterns with curved/turning anchor lines (Hilbert Curve, Octagram
Spiral), the bridge_over_infill algorithm produced incorrect results:

1. determine_bridging_angle: sampling curved anchor orientations
   produced noise across all turning directions (0/90/180/270°)
   instead of a single dominant one, yielding unstable bridge angles
   with 180° spread. Fix: use the configured infill_direction + 90°
   directly, bypassing the noisy sampling. The old blind +0.25*PI
   (Hilbert) and +1/16*PI (Octagram) offsets are removed.

2. construct_anchored_polygon: curved Hilbert/Octagram anchors
   intersected each vertical scan line many times at wildly different
   Y positions, producing chaotic polygon sections — holes in random
   places, bridges over air, rotated bridges. Fix: replace the curved
   infill polylines with synthetic straight lines parallel to
   infill_direction, spaced at the real infill line spacing
   (flow_spacing / density). Lines are centered on the limiting_area
   bbox center so that after rotation they span the full bridged_area.
   Anchors are left at full bbox length (not clipped) to guarantee
   every scan line finds an anchor.

Rectilinear and other straight-line patterns are unaffected.

Known limitation: some bridge edges may still terminate over air in
edge cases where the nearest synthetic anchor line is more than one
infill spacing away from the bridge boundary. This will be addressed
in a follow-up.

* fix: anchor internal bridges to actual sparse infill

Preserve real anchors across regions and align plane-path anchor origins with printed infill. Respect lower-layer rotation templates and model alignment, and sample curved bridge boundaries more finely.

Add regression coverage for anchor alignment, bridge angles and region isolation, with Orca comments explaining the geometry constraints. Verified 175 FFF tests before the comment-only follow-up; preserve CRLF in modified files.

* Fix internal bridge support contacts and separated infill origins

Restore anchor contact after bridge smoothing and share per-body pattern origins between anchors and printed infill. Recompute origins when preparation settings change.

Cover multiline counts 1, 2 and 3 and add regressions for printed bridge support, separated infill alignment and reslicing.

* Add explicit standard headers to PrintObject tests

* test: cover surface centering when infill settings change

Verify top and bottom Archimedean Chords and Octagram Spiral paths after switching centering modes or toggling separated infills. Compare reslicing against fresh slicing and document dependent infill invalidation.

* test: preserve directional surface infill when settings change

* perf: index layer islands for connected-body detection

* test: use public print pipeline for body centering checks
2026-09-10 08:03:50 -03:00
Kris Austin 7888452666 build: clear 7 warning categories across 26 sites (#15615)
* build: clear 2 warnings - cast the NSTextField the class check already proved

mainframe_text_field is NSTextField* and was assigned a bare NSView*, which
Clang reports as -Wincompatible-pointer-types. Both assignments sit inside
if ([viewObject class] == [NSTextField self]), so the runtime type is already
guaranteed, and the line above the second one casts the same variable the same
way to call setTextColor. macOS only, since nothing else compiles this file.

* build: clear 6 warning categories from the clang-cl inventory

-Wmissing-braces (9). Aggregates whose first member is itself an aggregate.
GUID's fourth member is BYTE[8], so the trailing eight bytes take their own
braces. The others were reaching for zero-initialization with {0} and say {}
now. bbs_3mf's backup Task ends in an anonymous union, which needs braces of
its own; those braces initialize the union's first member rather than the one
named at the call site, so the RemoveBackup site says so in a comment.

-Wmacro-redefined (11). SendMultiMachinePage.hpp defines five names that
Preferences.hpp, PresetBundleDialog.hpp, ExportPresetBundleDialog.hpp and
TroubleshootDialog.hpp also define with different values, so the value in
force depended on include order. All nine of this file's DESIGN_ macros take
the SEND_ prefix it already uses for its own macros, values unchanged, so a
DESIGN_ name added elsewhere later cannot collide with it again. They read as
one page-local palette, a 900 to 400 gray ramp plus sizes, so the four with
no current readers stay: dropping them would leave gaps in a named scale. test_marchingsquares.cpp defines NOMINMAX,
which libslic3r already passes as a PUBLIC compile definition, so it takes
the #ifndef guard the other suites use.

-Wbraced-scalar-init (3). Two PushStyleVar calls resolve to the float
overload, so the braces were initializing a scalar. ConfigOptionFloatsNullable
already takes an initializer_list, so the inner braces did the same thing.

-Wmicrosoft-goto (2). Both gotos in copy_file_gui jump forward over the
initialization of size, dwRead and dwWrite, which only MSVC accepts. Those
declarations move up to join the others at the top of the function.

-Wunused-private-field (3). Every use of ColourPicker's m_clrData and
m_picker_widget is behind !defined(__linux__), so on Linux they are written
and never read; the members now carry the same guard. ParamsPanel's
m_size_move is read nowhere. Tab has its own, which is the one Tab.cpp uses.

-Wnonportable-include-path (2). BaseException.h asked for "stackwalker.h"
and the file on disk is StackWalker.h.
2026-09-10 07:39:14 -03:00
Ian Chua 6c92920aa1 fix: add opc support for ota workflow (#15416)
# 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?
-->

Addition to #14217 to support OTA updates when the zip content is an OPC
file.

# 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-09-10 15:54:56 +08:00
Ian Chua eb0b67740e Merge branch 'main' into fix/opc-support-for-ota 2026-09-10 15:42:14 +08:00
SoftFever 3788a19730 Publish 3MF Workflow (#15251)
# Description

This PR introduces a publish workflow for sharing selected slicer
settings in .3mf projects without exposing or overriding the recipient's
complete printer, filament, or process profiles. A published file
specifies "requirements" for a model — printer, process, and per-slot
filament requirements — while importing it preserves the rest of the
recipient's workflow.

Publish dialog (File → Publish, Ctrl+Shift+E)
- Tabbed dialog (Printer / Filament / Process) with search, Select All /
Select Visible, and DPI rescaling.
- Per-material pages expose three kinds of content: individually
selected filament keys, a Full Publish toggle that embeds the slot's
entire filament preset, and required type and color rows for the slot.
- Publishing is allowed with no settings selected (the file then carries
only identity/requirement data).
- Reuses configuration value formatting extracted into a shared
ConfigValueFormatter.

Export
- Published 3MFs carry published, published_keys, and
published_material_keys metadata.
- A minimal export mode serializes only the selected values, material
identity, and plate geometry, omits embedded preset files, and masks
full-publish vector options to the author's slot so unrelated slot data
never leaks into the file.

Loading
- Only author-selected settings are applied; the recipient's presets are
otherwise preserved and structural/non-publishable keys are protected
(skipped keys are reported).
- Material settings match by filament ID, type, vendor, and slot.
Per-slot type requirements keep a matching receiver material, replace a
mismatched slot with the first same-type library filament (with a
notification), and fall back to a temporary embedded preset or skipped
keys when no match exists. Required colors are applied regardless of the
type match.
- A published 3MF loads as a new project: its path is not adopted as the
project filename (Save prompts instead of overwriting the shared file),
the title reverts to "Untitled", and the published metadata is stripped
so a later save produces a normal 3MF.
- Customized-preset and modified-G-code warnings are suppressed, since
the author's presets and G-code are not applied.
- Previously published 3MF files continue to load through the existing
matching path.

# Screenshots/Recordings/Graphs
<img width="1405" height="734" alt="publish_dialog"
src="https://github.com/user-attachments/assets/96b833c1-2b86-4c09-92b4-a4471a567e62"
/>


[publish_dialog_settings.webm](https://github.com/user-attachments/assets/acf22dd9-ae9b-4a58-b77d-8c2d9ffbc7a5)


## Tests
Added tests covering:
- Coverage for export slot masking, metadata round-trip,
type-match/replace/fallback semantics, slot growth, and skipped-key
reporting.
2026-09-10 15:35:17 +08:00
Ian Chua 0acf76780f Merge branch 'main' into plugin-ui-1 2026-09-10 13:14:51 +08:00
Hanif Koh 8c8e6fd069 Let the Remaining Per-Plate Object Scans See Every Instance
get_extruders() and estimate_wipe_tower_size() already ask whether any
instance of an object sits on the plate; the support-less extruder scan, the
mixed-filament risk check and the nozzle/filament compatibility check still
tested instance 0 only, so an object whose copy - not its original - was
placed on the plate was skipped by all three.
2026-09-10 12:39:55 +08:00
Hanif Koh a5d0d33df3 Register Instance Copies and Moves with Their Plate
An instance added with "+" was never registered with the plate it landed on,
and moving an instance only re-registered instance 0 of its object, so a copy
dragged onto another plate stayed unknown to that plate's registry. The
plate's filament list, its wipe tower preview and the position clamp all read
that registry, so a multi-filament copy moved onto a single-filament plate
drew no tower there and its tower position was never clamped.

Register new copies at creation, notify exactly the instances a move changed
(every instance of the object when one of its parts moved), and drop the
registry entry when a copy is removed again.
2026-09-10 12:39:55 +08:00
Lam Wei Lun 9e4f8aac80 Merge and fix conflicts 2026-09-10 12:11:20 +08:00
Kris Austin e296d5daac build: fix 9 defects found by clang-cl warnings (#15583) 2026-09-09 19:13:05 -03:00
TheLegendTubaGuy dbeef900cc Fix Windows build test midnight race (#15616) 2026-09-09 14:18:21 -03:00
Kris Austin f18eb21b82 build: clear 11 single-site clang-cl warning categories (#15584)
build: clear eleven single-site clang-cl warning categories

Each of these is the last site left in its category, and every one is the
compiler saying it cannot tell what the code meant. Nothing here changes
defined behavior.

- OrcaSlicer_app_msvc.cpp printed a DWORD with %d
- StackWalker.cpp ran delete[] through an LPVOID
- ToolOrdering.cpp used a bare ; as a deliberate skip loop's body
- WipeTower.cpp had finish_block_tcr = finish_block_tcr, so the branch that
  reached it did nothing. Folding the condition into the enclosing if leaves
  the other branch untouched
- GCodeProcessor.cpp had an else binding to the inner if while the outer if
  carried no braces
- AmsMappingPopupUpdate.cpp wrote >= 1 || <= 3 where its own comment says &&
- CalibrationWizardPresetPage.cpp left max_decimal_length unset through a
  pair of conditions that cover every value but not visibly so
- DevManager.cpp bound map elements to pair<K, V> rather than
  pair<const K, V>, copying every one
- SyncAmsInfoDialog.cpp had extraneous parentheses around a comparison
- Http.cpp had if (speed > 0.01) speed = speed;. speed now starts at 0 as
  well, because curl_easy_getinfo leaves the target untouched when it fails
  and the value reaches Progress either way
- SnapmakerPrinterAgent.cpp truncated npos into an unsigned int, so the
  != npos guard was always true. A colour with no # still yields 0, because
  the wrap produced 0 as well

Nine categories go to zero. -Wtautological-overlap-compare and
-Wsometimes-uninitialized reach zero when #15583 merges their second site.
2026-09-09 12:01:19 -03:00
Lam Wei Lun 0927a5d5e7 Merge main 2026-09-09 19:12:23 +08:00
Kris Austin 913afc51b7 build: clear 3 warnings - lambda captures that are not required (#15596)
config_substitution_rule is a const enum with a constant initializer, so a
lambda can read it without capturing it. Capturing it explicitly is what
-Wunused-lambda-capture reports.

The category was taken to zero by #15417 and merged on 2026-09-02. These
three sites arrived on 2026-09-08 in bcb4f17d9a, "fix(cli): resolve inherited
presets through vendor manifests" (#15438). All three lambdas still read the
value, which needs no capture and is unchanged.
2026-09-09 08:07:54 -03:00
Kris Austin fa3dbfcc6f fix: clear 1 warning - report the real error when a Windows G-code export fails (#15582)
fix: report the real error when a Windows G-code export fails

copy_file built its failure message as "Error: " + errCode. Adding a DWORD
to a string literal is pointer arithmetic, not concatenation, so the pointer
lands errCode bytes into an 8-byte literal and runs past its end for any code
above 7. std::string then calls strlen on it and throws length_error, and the
catch(...) in BackgroundSlicingProcess::finalize_gcode replaces the diagnosis
with "Unknown error occurred during exporting G-code."

Every code a user is likely to hit is past the end: write-protected media is
19, no media 21, a full disk 112, and a destination held open by another
program 32. Codes 1 to 7 stay inside the literal and produce a truncated
message instead. So the "Maybe the SD card is write locked?" text has not
been reachable on Windows since this path was added in #2923.

Now that it is reachable, that guess only fits removable media, so it is
conditional on m_export_path_on_removable_media. The existing string is
untouched and keeps its 23 translations; the fixed-drive case adds one string.
2026-09-09 07:55:19 -03:00
Kris Austin 46180c3f54 build: clear 3 warnings - a precedence bug, an arm64-only pragma, and a CLI error label (#15601)
* build: clear 2 warnings - a precedence bug and an arm64-only pragma

Both were found by promoting every warning to an error across the CI matrix.
Neither is reported by clang-cl on Windows x64, which is the configuration the
#15374 inventory measures.

LineSplit.hpp reserved with path.size() + closed ? 1 : 0. Addition binds
tighter than ?:, so that parses as (path.size() + closed) ? 1 : 0, and the
function returns early when path is empty, so the condition is always true and
the reserve is always 1. The vector then grows by reallocation instead of
reserving once. Output is unaffected, since reserve only sets capacity.
Reported by Clang on Linux, macOS and Flatpak; GCC does not diagnose it.

Int128.hpp declared #pragma intrinsic(_mul128) under _WIN64, which is defined
on Windows arm64 as well, where that x64 intrinsic does not exist. The call
site at line 190 is already guarded on _M_X64 and carries a comment saying
ARM64 has no _mul128, so the pragma now uses the same guard. x64 is unchanged
because _M_X64 is defined there.

* build: clear 1 warning - CLI error label prints 1 instead of a name

construct_assemble_list is a function, so streaming it converts the function
pointer to bool. When that catch block fires the CLI prints "1: <message>".

This line was already fixed in #5963 and came back in the wholesale revert of
that PR two weeks later, which was reverting an auto-orientation regression
somewhere in its 184 files. The string is restored exactly as it was merged
then.
2026-09-09 07:51:10 -03:00
Kris Austin a3c9041c10 build: clear 2 warnings - sites GCC reports and Clang does not (#15597)
Both are in our own code and neither shows up in a clang-cl or clang census,
so the Windows and CI matrices have never reported them.

FillRectilinear.cpp draws two trapezoid diagrams whose lines end in a
backslash, which continues a // comment onto the next line. GCC calls that a
multi-line comment. The diagrams are now block comments, where the rule does
not apply, and the drawings are unchanged.

CutObjectBase has a user-provided operator= and a virtual destructor, either
of which deprecates its implicitly generated copy constructor. bbs_3mf.cpp
copies the type through CutObjectInfo. The copy constructor is now declared
and defaulted, leaving the class with no implicit copy member. Move
operations were already suppressed by the user-provided operator=, so nothing
changes there.
2026-09-09 07:45:25 -03:00
Kris Austin c70a613548 build: clear 8 warnings - && inside || without parentheses (#15587)
Every edit makes the precedence the compiler already applies explicit. None
of them regroups an expression, so behavior is unchanged at all eight sites.
Strip parentheses and whitespace from the diff and the token stream matches.

GCodeProcessor.cpp:1472 tests == where the symmetric clause below tests !=,
which reads like a typo and is not one. A comment now explains why.

OrcaSlicer.cpp:4760 was the only judgment call. Its leading !is_seq_print is
bare while both operands are parenthesized, so the written form matches what
the compiler does. Kept rather than guessed at.
2026-09-09 07:43:08 -03:00
Kris Austin 10c123f2aa build: clear 6 warnings - data passed as ImGui format strings (#15585)
ImGui::Text and ImGui::TextColored take a printf format, so these six sites
passed data where a literal belonged. A % in that data reads a vararg that
was never supplied.

Three sites in GLCanvas3D's paint toolbar passed filament text, which comes
from the filament preset config and is user-editable. Two more passed
translated strings, where a % in any of the 23 catalogs does the same.
GLGizmoSimplify passed its progress label.

That label had been built with an escaped %% because it was being used as a
format string. Passing it as an argument instead needs a single %, so it
still renders as "42%".

ToUTF8() returns a buffer class, which converts to const char* for a named
parameter but not through varargs, so those two sites need .data().

GLGizmoSimplify.cpp:335 is unchanged, because _u8L("%d triangles") is passed
with a real argument and has to stay a format string.
2026-09-09 07:41:51 -03:00
d112a0af29 Fix two stack buffer overflows in ADMesh stl_read (unbounded solid name + MW metadata parse) (#15594)
Fix two stack buffer overflows in ADMesh stl_read (solid name + MW parse)

Bound the ASCII-STL solid-name fscanf scanset to the buffer size, and bound
the OrcaSlicer-specific "MW" metadata sscanf %s conversions to their buffers:

- fscanf(fp, " solid %[^\n]", solid_name)  -> %255[^\n]   (solid_name[256])
- sscanf(mw_position+3, "%s %s %s", ...)   -> %15s %127s %15s
  (version_str[16], model_id_str[128], country_code_str[16])

Both are reachable by opening a crafted .stl and overwrite saved stack state
(instruction-pointer control on the no-PAC arm64 macOS build). The solid-name
defect is inherited from the shared ADMesh loader (bambulab/BambuStudio#12153);
the MW parse is OrcaSlicer-specific.

Co-authored-by: Kevin Finisterre <kfinisterre@KevinsMacStudio.localdomain>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-09 07:39:08 -03:00
HanifKoh 8af92214d0 Extract and Unify Wipe Tower Estimation (#15532)
# Description

The pre-slice wipe tower size estimate existed twice:
`Print::wipe_tower_data()` (validation) and
`PartPlate::estimate_wipe_tower_size()` (GUI placement clamp, default
placement, preview, arrange, CLI placement) — with a third partial copy
in the CLI, which resolved the brim itself around the second. They were
hand-written twins reading their inputs from different places, so
validation could measure a tower with one number after the clamp had
placed it with another.

This PR extracts the estimate into one function,
`estimate_wipe_tower_footprint()` in
`src/libslic3r/GCode/WipeTowerEstimate.{hpp,cpp}`. It takes a
`ConfigBase&` (static `PrintConfig` and GUI/CLI `DynamicPrintConfig`
both work), the filament count, layer height and tallest object height,
and returns width, depth, height and the resolved brim width.
`Print::wipe_tower_data()` and a new
`PartPlate::estimate_wipe_tower_footprint()` become thin adapters around
it; `PartPlate::estimate_wipe_tower_size()` had no callers left and is
deleted.

**Inputs made to agree** — sharing the arithmetic is not enough when
each caller derives the inputs from its own view of the model:

* **Layer height** — thinnest layer among the objects on the plate,
resolved per object (Print used the first object's, PartPlate the
preset's).
* **Objects setting the height** — `PartPlate::get_extruders` counts an
object if *any* instance is on the plate, matching `PrintApply` (it only
looked at instance 0).
* **Height per object** — per on-plate instance, from the cached convex
hull (same z extent as the mesh). `PrintObject::size()` still measures
the model's first instance, so objects whose instances differ in scale
or x/y tilt can still disagree; that is inherent to the two data
sources.
* **Wipe tower filament** — counted for every caller, since
`Print::extruders()` adds it to the tool ordering even when unused.
* **Rib width cap** — kept for both (Print lacked it).
* **Config source** — everything read from the config passed in
(PartPlate read `m_print->config()`, stale on fresh plates and in the
CLI).
* **Dual-nozzle test** — `nozzle_diameter.size()` from the config for
both.

**One decision about whether a tower exists.** The rectangle branch
sized a tower the generator never builds while the rib branch reported
none for one it does; with rib as the shipped default, a single-filament
plate that still prints a tower (custom G-code tool changes) validated
against depth 0, collapsing the collision/exclusion hull to a point. The
purge volume is computed first, and an empty footprint is returned only
when nothing is purged, there is no tool change, and nothing else puts a
tower on the plate. The reason a single config cannot see arrives as a
resolved input: validation counts `Print::extruders(true)`.

A raft is deliberately **not** one of those reasons.
`DynamicPrintConfig::normalize_fdm_2` clears `enable_prime_tower` for a
plate that purges one filament unless smooth timelapse or wrapping
detection is on, and `Print::apply()` runs it, so a raft alone leaves no
tower to reserve for. (It also keeps the tower for a single *mixed*
filament, which this does not model — `Print::extruders(true)` does not
expand mixed filaments.)

**Two implementation notes:**

* Enums are read **by value**: a preset-built `DynamicPrintConfig` holds
`ConfigOptionEnumGeneric`, so a `dynamic_cast` to `ConfigOptionEnum<T>`
is null for exactly the config the GUI and CLI pass. The tests build
their configs the way `PresetBundle::full_config()` does, so that
storage is what gets tested.
* `PartPlate::estimate_wipe_tower_footprint()` is CLI-reachable, so
`get_extruders(bool)` gained a config-taking core with the identical
body; the GUI wrapper passes the app's presets, the adapter passes the
config it is given. `get_extruders_under_cli()` was not substituted: it
filters the plate's instances differently (skips unprintable ones, keeps
ones the plate flags as outside), so the GUI's filament set would have
changed in edge cases.

**Also fixed here:** `WipeTowerData` carries the effective width — set
by the estimate, and then by both planners at generation, so it never
disagrees with its neighbour `depth`; the preview and the containment
check take *whether there is a tower at all* from the footprint instead
of each re-deriving it; the config-taking `get_extruders` answers for an
object-less (`.gcode.3mf`) plate the way the wx overload does; the
preview takes body *and* brim from the plate's own footprint (an auto
brim drew every plate with the selected plate's brim);
`estimate_wipe_tower_polygon` builds its margin from the resolved brim
("Auto" gave a margin of 0) and no longer calls `std::clamp` with `hi <
lo`; the estimate falls back to declared defaults instead of hand-copied
constants. `estimate_wipe_tower_size()` /
`estimate_wipe_tower_polygon()` lose four parameters every caller took
from the same config.

## Behaviour changes reviewers should know about

G-code is never affected; no 3MF, profile or string changes. But this is
**not** a pure refactor:

1. **Validation now reserves what the placement clamp reserves**, which
is in places larger than before. A saved 3MF with a tower close to an
exclusion area or the rear edge can be rejected where it previously
sliced; dragging resolves it since the clamp agrees. Nothing re-clamps a
stored position on load (out of scope; the CLI side lands with #15518).
2. **`PartPlate::get_extruders` counts any-instance-on-plate**, which
reaches every caller of it, not only the estimate. It is `PrintApply`'s
rule and closes a GUI/CLI divergence.
3. **`estimate_wipe_tower_polygon`'s rear/right bound is looser by one
brim width** (it subtracted the brim twice).
4. **A single-filament plate with a rib wall no longer reserves a
phantom tower.**
5. **A single-filament plate whose tower comes from wrapping detection
is now validated against the bed.** Neither the old estimate (which read
only the wall type and smooth timelapse) nor the old containment gate
(the filament count or smooth timelapse) knew about that tower, so
between them it was never checked. It is printed, so it can be rejected
now.

Not addressed: the estimate still does not read `wipe_tower_type` or
per-filament `filament_prime_volume`, inherited unchanged from both
copies (the generated Type 1 tower is ~10 mm larger than the estimate on
Bambu profiles). #15516 mirrors the planners and folds into this
function on rebase.

## Verification

Before/after on the same fixtures with a main build and this branch, all
numbers read from the CLI (details, method and the real-tower and
arrange-clamp tables in the first comment):

| Fixture (divergence) | Side | Before (w × d, mm) | After (w × d, mm) |
|---|---|---|---|
| control | GUI/CLI · validation | 23.585 × 23.585 · 23.585 × 23.585 |
same |
| per-object layer 0.1 | GUI/CLI · validation | **23.585** · 31.637 |
**31.638** · 31.637 |
| unused `wipe_tower_filament` | GUI/CLI · validation depth | **39.332**
· 44.542 | **44.541** · 44.542 |
| tall object, instance 0 on another plate | GUI/CLI · validation |
**23.585** · 29.391 | **29.390** · 29.391 |
| rib cap binds | GUI/CLI · validation | 11.170 · **13.910** | 11.170 ·
**11.170** |

Before, the two estimates disagree on every divergence fixture; after,
they agree to the 0.001 mm bisection resolution, the control is
unchanged, and G-code is byte-identical. GUI screenshots of the preview
on both binaries are in the same comment.

The table was measured on the first commit; none of its fixtures uses a
raft or a zero purge volume, so the second commit does not move them.
G-code equivalence was re-checked on the final tip: `Cube.3mf` sliced by
a `main` build and by this branch is byte-identical.

# Screenshots/Recordings/Graphs
Before:
No Wipe Tower Preview:
<img width="2068" height="871" alt="image"
src="https://github.com/user-attachments/assets/7875a944-b8db-4bbc-b380-e8188a45caa7"
/>

After:
Has Wipe Tower Preview:
<img width="2551" height="882" alt="image"
src="https://github.com/user-attachments/assets/b4413695-4f24-4aa3-bae4-57304e8b7865"
/>

**Per-object layer height reaching the preview.** One object with a 0.1
mm override against a 0.2 mm preset. `main` sizes the previewed tower
from the preset, so it is smaller than the one validation reserves and
the one that prints; this PR sizes it from the object. Captured
headlessly on both builds from the same project, top view:

<img width="1408" height="596" alt="D_per_object_layer_height"
src="https://github.com/user-attachments/assets/989920fc-9f14-4658-8a3d-681c92a7f754"
/>

Measured over the four evidence fixtures on both builds, this is the
only one of the corrected inputs that changes what is drawn: the others
(an object contributing through a non-zero instance, an unused
`wipe_tower_filament`) change the estimate by amounts confirmed through
the CLI bisection above, but leave the rendered tower pixel-identical.
Arrange is unaffected either way — the tower enters the arranger as a
fixed obstacle (`m_unselected`), so it never moves.



## Tests

* `tests/libslic3r/test_wipe_tower_estimate.cpp` (10 cases / 104
assertions): rectangle and rib sizing, stability floor and auto brim,
single-filament cases (timelapse, wrapping, and a raft *not* reserving
one), a tool change reserving the floor when the purge volumes resolve
to zero, both wall types agreeing on tower existence, dual-nozzle
volume, the shipped flush-matrix path, default fallback for a missing
key, and a {rectangle, cone, rib} × {type1, type2} matrix asserting a
preset-shaped `DynamicPrintConfig` and a static `FullPrintConfig` give
the same footprint.
* `tests/fff_print/test_wipe_tower.cpp`: what `Print` feeds the
estimator — thinnest object layer height, effective width reaching
validation, the width staying current through generation, a
single-filament plate reserving a tower only when one is really printed
(raft no, smooth timelapse yes), and a wrapping-detection tower being
bed-validated. The last two fail on `main` and on the first commit of
this PR.
* Full suites green on this branch: `libslic3r_tests` 342 cases / 58325
assertions, `fff_print_tests` 174 cases / 3152 assertions. `--target
all` builds clean (including `OrcaSlicer_profile_validator`, which needs
`-DORCA_TOOLS=ON`). No new warnings.
* CLI evidence run above; its unused-`wipe_tower_filament` fixture is
also the regression check for the adapter under the CLI, which no unit
test can reach (`PartPlate` needs a GL context).

[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
2026-09-09 17:46:20 +08:00
Hanif Koh 284539d762 [CLI]: Place Wipe Tower before Slicing
A plain CLI slice ran none of the placement sites, so a stored or
default tower position that no longer fits the tower the plate needs
went straight to the generation-time error. The slice loop now applies
the same clamp the GUI applies on reload to every plate it is about to
slice, skipping only plates that print no tower: by-object plates with
more than one instance, and plates whose footprint estimate is empty
(which covers single-filament plates without smooth timelapse, wrapping
detection or a raft). The plate's filaments come from the same
config-driven derivation the estimate uses everywhere else.

The two arrange sites read the brim width from the right option when
padding the default position; an auto brim uses its 8 mm cap there,
since the object heights are unknown before the estimate runs.
2026-09-09 15:45:16 +08:00
Hanif Koh 2f2a6bc3b5 Share the Estimated First-Layer Outline of the Wipe Tower
The preview brim, the placement margin and the pre-generation validation
warning each decided on their own whether the tower has a Type2 cone
base, reading the wall type and cone angle three different ways. The
preview's read cast the preset's enum to ConfigOptionEnum<T>, which a
preset-shaped config never holds, so the cone base was never previewed.

estimate_wipe_tower_first_layer_outline now answers that question once,
beside the footprint estimate, from the config and the resolved planner;
all three sites take the outline from it. The libslic3r case reads the
outline off a preset-shaped config, where the old cast came back empty.
2026-09-09 15:45:16 +08:00
Hanif Koh fae77be3db Place the Wipe Tower in the Profile Validator
The validator forces a two-filament print with the prime tower on and
slices it at the config default position (x 15, y 220), which lies off
any bed shallower than the tower. It calls validate() but slices
regardless, so the off-plate tower was exported silently; with the
generation-time footprint check it is rejected instead, and 522 of the
1013 printer presets failed the slice check.

The validator now positions the tower the way the GUI and CLI do before
slicing: beside the centred cube, clear of the edge exclusion strips some
beds carry, then pulled inside the printable outline by the tower's own
estimated footprint.
2026-09-09 15:45:16 +08:00
Hanif Koh 81357695c5 Verify WipeTower Footprint at Point of Generation
The clamps and validation work from estimates. Once the tower is
generated, _make_wipe_tower re-tests the exact first-layer footprint,
brim and cone base included, against the printable area and the
exclusion zone, so an off-plate tower fails with a clear error instead
of exporting unprintable G-code. The rectangle-wall mesh footprint
learns the Type2 cone base so that check and the post-generation
validation see the real outline.

Pre-generation, validation hard-checks the body plus an explicit brim
and warns on the estimated auto brim and cone base with the existing
"may collide" strings, so the user hears about a marginal position on
the first slice rather than only at generation time.

Two fff_print fixtures that print a tower at the default position move
it onto the 200 mm test bed, as the multifilament fixtures already do:
the shipped default y of 220 is off that bed, and the backstop now says
so instead of exporting the tower.
2026-09-09 15:45:16 +08:00
Hanif Koh 2fdc16f9f2 Size a no-purge tower at the planners' idle depth
Smooth timelapse no longer charges a prime volume it does not purge. A
tower printed with no tool change is exactly the idle depth: the
stability minimum for Type2, the wrapping detection depth for Type1.
Charging a full prime_volume on top made the previewed and arranged
tower deeper than the one that is printed.

The Type2 half of "a tool change reserves a tower whatever the purge
volumes resolve to" arrives with the base commit; here it only has to
survive the planner split, since Type1 already reserves per filament.

The wipe tower filament only joins the tool ordering when there is a
tower to join, which is the has_wipe_tower() half of the guard
Print::extruders applies.
2026-09-09 15:45:16 +08:00
Hanif Koh 869805132e Add Separate Comfort Margin for Auto Placement 2026-09-09 15:45:16 +08:00
Hanif Koh 4c583212f5 Match Drag Margin to Release Clamp 2026-09-09 15:45:16 +08:00
Hanif Koh e17965be53 Brim and Cone Aware Preview 2026-09-09 15:45:16 +08:00
Hanif Koh 99627c8e93 Size the Footprint Estimate from the Planners
The shared estimate reserved every tower with one volume-per-purge rule
and the stability floor. Both planners do more: WipeTower (Type1) wipes
each filament's own prime volume in whole lines, one block per
adhesiveness category sized by its worst layer, rams the leaving
filament at every nozzle change, and squares a rib tower from the
planned depth; WipeTower2 (Type2) spaces its lines by
wipe_tower_extra_spacing, not the Type1-only infill gap, and its extra
flow cancels out of the depth. Both extend the ribs rather than the body
below the stability minimum, size every layer including a thinner first
one, and lay the brim in whole loops, WipeTower reporting half a spacing
of line width on top.

All of that now lives in estimate_wipe_tower_footprint, fed the planner
(resolve_wipe_tower_type mirrors Print::wipe_tower_type and the CLI's
Bambu Lab detection) and the filament ids rather than a count. Print
passes its own tool set; the PartPlate adapter derives the plate's ids
from the passed config and treats an explicit count as a floor, so the
CLI's count-only callers size per filament too. The placement clamp also
reserves a Type2 cone's base bulge, which the body box does not cover.

The planner-mirroring helpers sit beside the planners in WipeTower and
WipeTower2 so the two stay in sync; the libslic3r cases pin them to
footprints measured from generated G-code.
2026-09-09 15:45:16 +08:00
Hanif Koh 98acd687f7 Fixes for Wipe Tower Position Clamping
Validation grows the estimated body by the brim before the tower is
generated, so a tower whose brim leaves the bed is rejected up front
instead of at export. The scene reload re-clamps the stored position,
since set_default_wipe_tower_pos_for_plate does not rerun when painting
changes the filament count. The rectangle-wall footprint polygon gets its
two missing brim corners (it was a skewed quad), so the post-generation
check covers the whole brim.
2026-09-09 15:45:16 +08:00
Hanif Koh e1efec7d6c Fix review findings in the shared wipe tower estimate
A raft is not a reason to reserve a tower. Print::apply runs
normalize_fdm_2, which clears enable_prime_tower for a plate that purges
one filament unless smooth timelapse or wrapping detection is on, so a
single-filament plate with a raft prints no tower at all and the estimate
was reserving bed area for one. Drop the input; need_wipe_tower is now
exactly the two exceptions normalize_fdm_2 honours, named there so the
next reason added has to be checked against it.

The GUI preview and the validation containment check each re-derived
"is a tower printed here" from the filament count instead of reading the
estimate, so both missed the towers printed with no tool change to purge
for. They now take the answer from the footprint, which is the drift this
shared estimate exists to remove. A tower that is not printed estimates to
zero, so its hull is degenerate and every check on it passes trivially -
the containment check needs no gate of its own.

WipeTowerData::width was written only by the pre-generation estimate and
left at zero for the whole post-generation life of the Print, while its
neighbour depth held the real value. Set it from the generator in both
branches.

The plate's height scan transformed every model part's full mesh per
instance on each scene reload, discarding all but the z extent. The
cached convex hull has the same z extent.

A plate loaded from a sliced .gcode.3mf holds no objects and its filaments
live in slice_filaments_info; the config-taking get_extruders overload
returned an empty list for it, which sized the tower for a placeholder two
filaments. It now answers the way the wx overload does, without reaching
the plater.

Also drop estimate_wipe_tower_size, which has no callers.
2026-09-09 15:45:16 +08:00
Hanif Koh 8df5e5e738 Extract and Unify Wipe Tower Estimation 2026-09-09 15:45:16 +08:00
HanifKoh 8a291f9d56 Confine config import to the preset directory (#15608)
import_presets reduced each zip entry to a basename by stripping only
'/', so on Windows an entry named with '\' separators kept its
directory components and was extracted wherever they pointed. Strip
both separators, and reject any entry whose name still escapes the
extraction folder.

The preset name from the JSON and the bundle id from
bundle_structure.json were joined onto the preset directory unchecked
as well, which let either of them write outside it on every platform.
Both are now validated before anything is written.

The check is the is_path_within_root helper the 3MF importer already
had, moved to Utils so both importers share it. It treats '/' and '\'
as separators on every platform, so a bundle that would escape on one
OS is rejected on all of them.
2026-09-09 15:35:21 +08:00
HanifKohandraistlin7447 4deadc9dce Make Tree-Support Deterministic (#15565)
* Make tree support deterministic without giving up its parallelism

* Break equal-distance ties in the tree support MST by coordinates

* test: cover the determinism this PR fixes

The MST unit tests here cover the tie-break, but the drop_nodes rework
has no test.

Adds two cases to the tree support suite. The thread-scheduling one
slices five configs twice each and compares the support point sequence,
which is what the node ordering moves. The MST tie one pins the branch
diameter and line width that carry Prim's equal-distance ties into the
toolpaths.

slice_with_tree_support takes an optional config list so the second case
can add the tree parameters it needs, and the double-slice comparison is
shared rather than written twice.

Both fail on main without this PR. The first passes from 60d1ceb580, the
second from e148865dd6.

---------

Co-authored-by: raistlin7447 <kris.austin@gmail.com>
2026-09-09 12:33:42 +08:00
Lam Wei Lun a4c399d250 Merge main and resolved conflicts 2026-09-09 11:05:52 +08:00
Kris Austin 0f5891f25d build: clear 107 warnings - dead private fields (#15574) 2026-09-08 18:36:48 -03:00
yw4z 8740696e75 init 2026-09-07 13:16:31 +03:00
Ian Chua 9df23cab62 fix: opc updates being discarded 2026-09-04 14:59:53 +08:00
Lam Wei Lun c6ab725584 Fixes issue with mixed filament being loaded into a real slot 2026-09-04 14:41:20 +08:00
Lam Wei Lun bbb4681b32 Merge branch 'main' into publish_3mf 2026-09-04 12:24:57 +08:00
Ian Chua 07dafaf299 fix: default enable-ota flag and fixing startup missing vendor 2026-09-03 17:13:09 +08:00
Ian Chua c5952c3308 Merge branch 'main' into fix/opc-support-for-ota 2026-09-03 14:54:51 +08:00
Lam Wei Lun 904796cf24 Correctness fixes. Remove hard-coded appends for printer settings 2026-09-03 14:12:51 +08:00
Lam Wei Lun bcff39661c Comments and dead code cleanup 2026-09-03 13:40:58 +08:00
Lam Wei Lun 8c7160079e Revert clang-format changes then reapplied chagnes for Plater/PresetBundle. Fixed extruder masking incorrectness. Fix warning notifications stacking 2026-09-03 13:17:13 +08:00
Lam Wei Lun 686b7f66ac Merge main and fixed conflicts 2026-09-03 10:55:01 +08:00
Lam Wei Lun 9b8d93bef2 merge main 2026-09-02 18:09:29 +08:00
Lam Wei Lun 85f14673f0 Only show the currently in used filaments for publishing 2026-09-02 18:09:23 +08:00
Lam Wei Lun e17f932aff Update Publish Guide Links 2026-09-02 17:22:06 +08:00
Lam Wei Lun f1719b5580 Fixes mixed filament growth bug. Fixes unit test 2026-09-02 14:29:15 +08:00
Lam Wei Lun 4654d24f6f Add a OrcaSlicer badge in the thumbnail preview for published 3MF projects. Add a visual indicator in the publish dialog to show that something in the section is toggled 2026-09-02 12:38:27 +08:00
Lam Wei Lun f5984e7523 Merge main 2026-09-02 11:43:04 +08:00
Lam Wei Lun f85902b0ce Preserving state of publish dialog 2026-09-02 10:45:47 +08:00
Lam Wei Lun d00af63a61 Removes identity matching for when slots need to grow without writing type key 2026-09-01 18:18:33 +08:00
Lam Wei Lun 6985075c5b Change the PUB badge to OrcaSlicer's color 2026-09-01 18:17:28 +08:00
Lam Wei Lun 90d5654db9 Shifted the guide links to the bottom left of the publish dialog 2026-09-01 17:56:47 +08:00
Lam Wei Lun 7133d6b225 Added wiki and youtube guide link as placeholders. Add to recently opened in home screen after publishing. Show PUB badge. Add .published as a file save name hint. 2026-09-01 16:59:25 +08:00
Lam Wei Lun 49c4b09db6 Show alias instead of full name in publish dialog 2026-09-01 14:56:03 +08:00
Lam Wei Lun 174d23e22f Fixes windows light mode text issues 2026-09-01 12:40:41 +08:00
SoftFever 7c063b2933 Merge branch 'main' into publish_3mf 2026-09-01 12:20:48 +08:00
Lam Wei Lun 6fef33cdb3 Merge main 2026-08-31 18:01:31 +08:00
Lam Wei Lun 684cd37f8d UI Fixes and Polish 2026-08-31 18:01:15 +08:00
Ian Chua b585d9f3d9 feat: add new profiles over ota & updater url via app config 2026-08-31 17:45:29 +08:00
Lam Wei Lun 21c0bf795a Fixes indentation on the Full Publish toggle 2026-08-31 16:19:10 +08:00
Ian Chua c4fea8ad24 gate workflow with enable_ota flag in app config 2026-08-31 15:48:13 +08:00
Lam Wei Lun a6483e79b2 Fix ImGui crash 2026-08-31 14:50:15 +08:00
Lam Wei Lun fff0efdb27 Fixes filament import bug 2026-08-31 13:57:21 +08:00
Lam Wei Lun 6ffb20a7f5 Update translations. Change import filament message to warning instead. Change messages to be simpler 2026-08-31 12:08:08 +08:00
Lam Wei Lun 06517e623f Fixes issue where user imports a 3MF file where filament slots exceeds the maximum number of slots that user has on its printer 2026-08-31 10:46:23 +08:00
Ian Chua d9fa43f1d7 fix: add opc support for ota workflow 2026-08-28 19:40:31 +08:00
Lam Wei Lun a62db72e02 Publish 3MF: import-side hardening and test coverage
Validate mixed-filament definitions during the published material pass: definitions whose components reference slots that do not exist or hold other mixed filaments, or that carry fewer than two components, are reported through the shared skipped_keys channel instead of shipping a mix the GUI integrity check would only flag later.

Fix the slot-limit exhaustion report being silently dropped: it wrote to published_config->skipped_keys, which the pass's final move-assignment from the local vector clobbers. All rejections now go through the local.

Remove the unreachable persist branch from add_detached_preset: no caller passes save_to_project=false, so the parameter is gone and the copy is always project-embedded.

Tests: cover the exhaustion path, the new definition validation, the identity-tier matching matrix (including substitute reporting), the structural-key denylist, whole-vector size-mismatch skips, relocation payload degradation, the "(Published 2)" uniquify chain, mixed blend colours staying out of shared preset configs, and duplicate-slot last-wins. Also fix the legacy-3mf scenario passing vacuously behind an if-guarded assertion. All existing published/3mf tests pass unchanged.
2026-08-28 15:24:03 +08:00
Lam Wei Lun 1c09ef14a5 Update translations. Update warning messages to be more user friendly. Update gradient color chips in publish dialog 2026-08-28 12:57:00 +08:00
Lam Wei Lun 25b008ba3e Merge main 2026-08-28 10:38:36 +08:00
Lam Wei Lun 28b325805b Fixed issues with remapping mixed filaments when importing published 3MF 2026-08-28 10:37:54 +08:00
Lam Wei Lun 23b98e2ca5 Initial commit for warning popup when required filaments are not selected for mixed filaments 2026-08-27 17:04:27 +08:00
Lam Wei Lun 20e5a7e042 Merge main 2026-08-27 14:11:41 +08:00
Lam Wei Lun 76d9b8bac0 Publish 3MF: support mixed filaments and per-extruder slot selection
- Publish mixed-filament slots as whole units: serialize the filament_mixed_* definition into project_config on import, grow the receiver's parallel arrays in lockstep, and report unappliable definitions as skipped instead of dropping them silently

- Per-extruder printer selection: one inner tab per extruder, rows keyed by full "#N" ids; single-extruder receivers collapse variants onto their slot (first applied, rest skipped), multi-extruder receivers override element-wise

- New per-slot "Enable" toggle gating what gets published; enabling a mix auto-enables + Full Publishes its components

- Mixed page previews: fixed-size ratio bar, ternary triangle (3 components) and Material Ratio vs Model Height graph (gradients), always visible regardless of Enable

- Tab strip shows full swatch compositions with adjustable spacing; barycentric helpers shared via FilamentBitmapUtils
2026-08-27 13:17:19 +08:00
Lam Wei Lun ce277ebbf5 Merge main + clean up code + fix missing include 2026-08-26 16:02:16 +08:00
Lam Wei Lun feb0e479fa Published flag hardening. Better error handling path for when publish fails (unlikely) 2026-08-26 13:06:24 +08:00
Lam Wei Lun 036c4004f7 Fixes publish dialog filtering issue 2026-08-26 12:33:31 +08:00
Lam Wei Lun cc267055e1 Use proper floating point comparison functions in publish unit test 2026-08-26 11:33:50 +08:00
Lam Wei Lun e1a79c4112 Code cleanup and renamed published_* flags to orca_published_* flags to be less generic 2026-08-25 17:37:04 +08:00
Lam Wei Lun 51b646efcf Better safety if publish workflow crashes. Cleanup on Button 2026-08-25 16:40:18 +08:00
Lam Wei Lun 795514900d Fix Windows paint on resize issue. Automatically resize to fit tabs and button content 2026-08-25 15:18:38 +08:00
Lam Wei Lun d4cb739b8b Dead code removal and comment cleanup 2026-08-25 14:17:56 +08:00
Ian Chua b8e0f9cdfb Merge branch 'main' into feat/plater-notification-api 2026-08-25 13:45:57 +08:00
Lam Wei Lun 0ba7bae794 Fix conflicts. Update unit tests 2026-08-25 13:18:00 +08:00
Lam Wei Lun c2357fdac6 Merge main 2026-08-25 12:34:48 +08:00
Lam Wei Lun 52aa5a52e9 Published 3MF: import Full Publish materials as standalone detached presets inside the project 2026-08-25 12:27:45 +08:00
Lam Wei Lun 3ed1f64f2e Merge main 2026-08-24 14:19:49 +08:00
Lam Wei Lun 2aff31c07a Published 3MF: match filament slots by exported identity without a Type requirement 2026-08-24 13:19:57 +08:00
Lam Wei Lun 28b1f3ab03 Merge main 2026-08-21 19:05:15 +08:00
Lam Wei Lun 36e5d4770b Code cleanup and fixes 2026-08-21 19:04:10 +08:00
Lam Wei Lun 95e392e206 Code cleanup 2026-08-21 18:36:30 +08:00
Ian Chua 790a010615 feat: plater notification API for plugins 2026-08-21 14:40:35 +08:00
Lam Wei Lun a5033afaf8 UI cleanup and translations updated 2026-08-21 14:26:20 +08:00
Lam Wei Lun a0e95abebe Fix unit test: 2026-08-21 13:26:17 +08:00
Lam Wei Lun aa3ce35683 Published 3MF: silent geometry-only fallback in old versions via tag/config-less export 2026-08-21 13:00:32 +08:00
Lam Wei Lun 19a0407560 Merge main 2026-08-21 12:28:24 +08:00
Lam Wei Lun 4c8e851b46 Direct name matching for filament import flow fixed. Merge main and conflicts resolved 2026-08-20 14:44:40 +08:00
Lam Wei Lun aeaa3c5d66 Bug fix for perfect name matching 2026-08-19 16:57:45 +08:00
Lam Wei Lun 2e0ef11b0f Merge from main and fix merge conflicts 2026-08-19 16:16:21 +08:00
Lam Wei Lun 1b770e8638 Bug fixes and test cases for import filament of published 3MF. Update translations 2026-08-19 15:47:28 +08:00
Lam Wei Lun 36a8811cc0 Change label to "Publish 3MF..." 2026-08-18 16:29:27 +08:00
Lam Wei Lun b82d4f3af8 Fix issues with filament import when receiver has fewer filament slots than the author's 3MF format 2026-08-18 15:11:00 +08:00
Lam Wei Lun 6aab2b22a1 Merge 2026-08-18 13:50:07 +08:00
Lam Wei Lun 6c429059e0 Extend Publish workflow with full-filament and type/color requirements
Per material slot, the Publish dialog can now embed the entire filament preset ("Full Publish") and require a curated filament type and/or colour:

- On export, full-publish vector options are masked to the author's slot so unrelated slot data never leaks into the published file.

- On load, slots are matched by the published type: a match keeps the receiver's material (full dumps ignored, partial keys applied); a mismatch replaces the slot with the first visible same-type library filament, falling back to a temporary embedded preset or skipped keys when none exists. Required colours apply regardless of the type match.

- The receiver's slot count grows only to the highest published slot.

- Published 3MFs load as a new project: the file's path is not adopted as the project filename, published metadata is stripped from the model, and the file is added to recent projects.

- Notifications list replaced slots, and the edited filament preset is refreshed so applied values surface in the GUI.

- Dialog: "Full Publish" toggle replaces the material opt-in and select-all headers; new Color/Type requirement rows with swatches.

- Add Ctrl+Shift+E shortcut for the Publish dialog (menu, key handling, and the keyboard shortcuts dialog).

- Tests for export slot masking, metadata round-trip, replacement semantics, slot growth, and skipped-key reporting.
2026-08-18 13:49:10 +08:00
Lam Wei Lun 2b18744cc2 Allow model to be Published without any settings modified 2026-08-17 17:50:54 +08:00
Lam Wei Lun eaaffd2706 Merge from main 2026-08-17 13:03:29 +08:00
Lam Wei Lun 92123cdc2c Add filament color next to tab button in filament setting 2026-08-14 16:50:33 +08:00
Lam Wei Lun 76ec2f10c6 Switch to a Tab layout for the Publish dialog 2026-08-14 16:19:46 +08:00
Lam Wei Lun 99db5cca38 Renamed to Publish instead of Publish Settings 2026-08-14 14:00:20 +08:00
Lam Wei Lun d124e1ccbc Update unit test 2026-08-14 13:41:38 +08:00
Lam Wei Lun 96f5a23387 Only serialize selected published settings. Minor cleanup 2026-08-14 12:53:44 +08:00
Lam Wei Lun b488067f82 Merge from main 2026-08-14 10:50:24 +08:00
Lam Wei Lun b280ab555c Initial Commit for Publish Settings workflow 2026-08-14 10:49:49 +08:00
345 changed files with 19804 additions and 3546 deletions
+17 -22
View File
@@ -1,5 +1,5 @@
name: 🐞 Bug Report name: 🐞 Bug Report
description: File a bug report description: Something behaves incorrectly while Orca Slicer keeps running
labels: ["bug"] labels: ["bug"]
body: body:
- type: markdown - type: markdown
@@ -10,6 +10,8 @@ body:
Please note that this is not the place to make feature requests or ask for help. Please note that this is not the place to make feature requests or ask for help.
For this, please use the [Feature request](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=feature_request.yml) issue type or you can discuss your idea on our [Discord server](https://discord.gg/P4VE9UY9gJ) with others. For this, please use the [Feature request](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=feature_request.yml) issue type or you can discuss your idea on our [Discord server](https://discord.gg/P4VE9UY9gJ) with others.
If Orca Slicer closes on its own, freezes or stops responding, please use the [Crash report](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=crash_report.yml) form instead. It asks for the logs a crash needs.
Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment. Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment.
- type: checkboxes - type: checkboxes
attributes: attributes:
@@ -47,7 +49,7 @@ body:
id: os_type id: os_type
attributes: attributes:
label: "Operating System (OS)" label: "Operating System (OS)"
description: "What OSes are you are experiencing issues on?" description: "What OSes are you experiencing issues on?"
multiple: true multiple: true
options: options:
- Linux - Linux
@@ -86,7 +88,7 @@ body:
id: reproduce_steps id: reproduce_steps
attributes: attributes:
label: How to reproduce label: How to reproduce
description: Please described the detailed steps to reproduce this issue description: Please describe the detailed steps to reproduce this issue
placeholder: | placeholder: |
1. Go to '...' 1. Go to '...'
2. Click on '...' 2. Click on '...'
@@ -108,28 +110,23 @@ body:
description: What should happen after the above steps? description: What should happen after the above steps?
validations: validations:
required: true required: true
- type: markdown
id: file_required
attributes:
value: |
Please be sure to add the following files:
* Please upload a ZIP archive containing the **project file** used when the problem arise. Please export it just before or after the problem occurs. Even if you did nothing and/or there is no object, export it! (We need the configurations in project file).
You can export the project file from the application menu in `File`->`Save project as...`, then zip it
* A **log file** for crashes and similar issues.
You can find your log file here:
Windows: `%APPDATA%\OrcaSlicer\log` or usually `C:\Users\<your username>\AppData\Roaming\OrcaSlicer\log`
MacOS: `$HOME/Library/Application Support/OrcaSlicer/log`
Linux: `$HOME/.config/OrcaSlicer/log`
If Orca Slicer still starts, you can also reach this directory from the application menu in `Help` -> `Show Configuration Folder`
You can zip the log directory, or just select the newest logs when this issue happens, and zip them
- type: textarea - type: textarea
id: file_uploads id: file_uploads
attributes: attributes:
label: Project file & Debug log uploads label: Project file & Debug log uploads
description: Drop the project file and debug log here description: |
Attach the files with the **Paste, drop, or click to add files** control directly underneath this box. Zip anything that is not a `.log`, `.txt` or image, since GitHub rejects other file types, and keep each file under 25 MB.
* The **project file** used when the problem happened, zipped. Export it just before or after the problem occurs. Even if you did nothing and there is no object on the plate, export it, since we need the configuration it carries. `File` -> `Save project as...`
* The **log folder**, zipped. `Help` -> `Show Configuration Folder` opens it, or find it at:
* Windows: `%APPDATA%\OrcaSlicer\log`, usually `C:\Users\<you>\AppData\Roaming\OrcaSlicer\log`
* macOS: `$HOME/Library/Application Support/OrcaSlicer/log`
* Linux: `$HOME/.config/OrcaSlicer/log`
* Flatpak: `$HOME/.var/app/com.orcaslicer.OrcaSlicer/config/OrcaSlicer/log`
* If the zip comes out over 25 MB, attach the newest logs from that folder on their own instead.
placeholder: | placeholder: |
Project File: `File` -> `Save project as...` then zip it & drop it here Zipped project file
Log File: `Help` -> `Show Configuration Folder`, then zip the log directory, or just select the newest logs in `log` when this issue happens and zip them, then drop the zip file here Zipped log folder
validations: validations:
required: true required: true
- type: checkboxes - type: checkboxes
@@ -144,7 +141,5 @@ body:
label: Anything else? label: Anything else?
description: | description: |
Screenshots? References? Anything that will give us more context about the issue you are encountering! Screenshots? References? Anything that will give us more context about the issue you are encountering!
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
validations: validations:
required: false required: false
+183
View File
@@ -0,0 +1,183 @@
name: 💥 Crash Report
description: Orca Slicer closes on its own, freezes or stops responding
labels: ["crash"]
body:
- type: markdown
attributes:
value: |
**Thank you for taking the time to report a crash.**
Use this form when Orca Slicer closes on its own, freezes, or stops responding.
If the application stays open and only produces a wrong result, please use the [Bug report](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=bug_report.yml) form instead.
A printer whose toolhead collides with the print is also a bug report rather than a crash, since the application itself did not stop.
Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment.
- type: checkboxes
attributes:
label: Is this crash reproducible in the latest nightly build?
description: >
Please verify this crash still happens in the latest nightly build first. It may already be fixed there:
[Nightly builds](https://github.com/OrcaSlicer/OrcaSlicer/releases/tag/nightly-builds).
options:
- label: I have checked the latest nightly build and the crash is still reproducible
required: true
- type: checkboxes
attributes:
label: Is there an existing issue for this crash?
description: Please search to see if an issue already exists for the crash you encountered.
options:
- label: I have searched the existing issues
required: true
- type: input
id: version
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. 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:
label: "Operating System (OS)"
description: "What OSes are you seeing the crash on?"
multiple: true
options:
- Linux
- macOS
- Windows
validations:
required: true
- type: input
id: os_version
attributes:
label: "OS Version"
description: "What OS version does this relate to?"
placeholder: "i.e. OS: Windows 7/8/10/11 ..., Ubuntu 22.04/Fedora 36 ..., macOS 10.15/11.1/12.3 ..."
validations:
required: true
- type: input
id: printer
attributes:
label: Printer
description: Which printer was selected
placeholder: Voron 2.4/VzBot/Prusa MK4/Bambu Lab X1 series/Bambu Lab P1P/...
validations:
required: true
- type: dropdown
id: crash_moment
attributes:
label: When does the crash happen?
description: Pick the point where Orca Slicer stops working.
options:
- Not sure
- On startup, before the main window appears
- When opening or importing a project or model
- While changing printer, filament or process settings
- While slicing
- In the 3D view, Preview or Assembly view
- When exporting G-code or sending a print to the printer
- On the Device tab, or connecting to a printer (camera, sync, login)
- While using a specific tool, dialog or calibration
- After resuming from sleep or changing monitors
- When closing the application
- No clear pattern
validations:
required: true
- type: dropdown
id: crash_frequency
attributes:
label: How often does it happen?
options:
- Not sure
- Every time
- Often, but not every time
- Rarely
- It only happened once
validations:
required: true
- type: dropdown
id: fresh_config
attributes:
label: Does it still crash with a fresh configuration?
description: >
Close Orca Slicer and rename your configuration folder (`%APPDATA%\OrcaSlicer` on Windows,
`$HOME/Library/Application Support/OrcaSlicer` on macOS, `$HOME/.config/OrcaSlicer` on Linux),
then start it again. Renaming keeps your settings, so you can put the folder back afterwards.
options:
- I have not tried this
- Yes, it still crashes
- No, the crash goes away
validations:
required: true
- type: textarea
id: reproduce_steps
attributes:
label: How to reproduce
description: Please describe the detailed steps that lead to the crash.
placeholder: |
1. Go to '...'
2. Click on '...'
3. Scroll down to '...'
4. Orca Slicer closes
validations:
required: true
- type: textarea
id: system_info
attributes:
label: Additional system information
description: >
Display card and driver version are worth adding for crashes on startup or in the 3D view.
CPU and memory are worth adding for crashes while slicing.
placeholder: |
CPU: 11th gen Intel r core tm i7-1185g7/AMD Ryzen 7 6800h/...
Memory: 32/16 GB...
Display Card: NVIDIA Quadro P400/...
validations:
required: false
- type: textarea
id: file_uploads
attributes:
label: Project file, logs and crash report uploads
description: |
A crash report without logs usually cannot be acted on. Attach the files with the **Paste, drop, or click to add files** control directly underneath this box. Zip anything that is not a `.log`, `.txt` or image, since GitHub rejects other file types, and keep each file under 25 MB.
* The **project file** used when the crash happened, zipped. Export it just before or after the crash, even if the plate is empty, since we need the configuration it carries. `File` -> `Save project as...`
* The whole **log folder**, zipped rather than single files picked out of it. `Help` -> `Show Configuration Folder` opens it, or find it at:
* Windows: `%APPDATA%\OrcaSlicer\log`, usually `C:\Users\<you>\AppData\Roaming\OrcaSlicer\log`
* macOS: `$HOME/Library/Application Support/OrcaSlicer/log`
* Linux: `$HOME/.config/OrcaSlicer/log`
* Flatpak: `$HOME/.var/app/com.orcaslicer.OrcaSlicer/config/OrcaSlicer/log`
* On Windows the crash itself is written to a separate `crash_*.log` in there, and that is the file we need most. If the zip comes out over 25 MB GitHub will refuse it, so attach the newest log and any `crash_*.log` on their own instead.
* The **operating system crash report**, on macOS and Linux, where Orca Slicer cannot write its own crash log. It is often the only record of where it died:
* macOS: Console.app -> Crash Reports, or `$HOME/Library/Logs/DiagnosticReports/`. The file starts with `OrcaSlicer` and ends in `.ips`. Zip it before attaching, GitHub does not accept `.ips` files.
* Linux: run `orca-slicer` from a terminal (Flatpak: `flatpak run com.orcaslicer.OrcaSlicer`) and paste everything it prints when it dies. On systemd systems `coredumpctl info orca-slicer` gives a backtrace.
placeholder: |
Zipped project file
Zipped log folder
Zipped macOS .ips crash report, or the terminal output on Linux
validations:
required: true
- type: checkboxes
id: file_checklist
attributes:
label: Checklist of files to include
options:
- label: Log folder
- label: Project file
- label: Operating system crash report (macOS and Linux)
- type: textarea
attributes:
label: Anything else?
description: |
Screenshots? References? Anything that will give us more context about the crash you are encountering!
validations:
required: false
+95 -6
View File
@@ -100,7 +100,7 @@ jobs:
matrix: matrix:
include: ${{ fromJSON(vars.SELF_HOSTED include: ${{ fromJSON(vars.SELF_HOSTED
&& '[{"arch":"x64","os":"orca-win-server","compiler":"clang"}]' && '[{"arch":"x64","os":"orca-win-server","compiler":"clang"}]'
|| '[{"arch":"x64","os":"windows-latest","compiler":"clang"},{"arch":"arm64","os":"windows-11-arm","compiler":"clang"}]') }} || '[{"arch":"x64","os":"windows-latest","compiler":"clang"},{"arch":"arm64","os":"windows-11-vs2026-arm","compiler":"clang"}]') }}
needs: check_build_script needs: check_build_script
# Don't run scheduled builds on forks: # Don't run scheduled builds on forks:
if: ${{ !cancelled() && needs.check_build_script.result == 'success' && (github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer') }} if: ${{ !cancelled() && needs.check_build_script.result == 'success' && (github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer') }}
@@ -169,7 +169,7 @@ jobs:
if: ${{ !cancelled() && success() && !vars.SELF_HOSTED }} if: ${{ !cancelled() && success() && !vars.SELF_HOSTED }}
uses: ./.github/workflows/unit_tests.yml uses: ./.github/workflows/unit_tests.yml
with: with:
os: windows-11-arm os: windows-11-vs2026-arm
artifact: ${{ github.sha }}-tests-windows-arm64 artifact: ${{ github.sha }}-tests-windows-arm64
test-dir: build-arm64/tests test-dir: build-arm64/tests
unit_tests_macos_arm64: unit_tests_macos_arm64:
@@ -283,21 +283,42 @@ jobs:
id: fp_cache_key id: fp_cache_key
run: echo "key=flatpak-builder-${{ matrix.variant.arch }}-${{ hashFiles('deps/**', 'scripts/flatpak/com.orcaslicer.OrcaSlicer.yml', 'scripts/flatpak/make_deps_tar.sh') }}" >> "$GITHUB_OUTPUT" run: echo "key=flatpak-builder-${{ matrix.variant.arch }}-${{ hashFiles('deps/**', 'scripts/flatpak/com.orcaslicer.OrcaSlicer.yml', 'scripts/flatpak/make_deps_tar.sh') }}" >> "$GITHUB_OUTPUT"
shell: bash shell: bash
# Manage flatpak-builder cache externally so PRs restore but never upload # Manage flatpak-builder cache externally so PRs restore but never upload.
# The compiler cache under it is keyed per run below, so it is left out.
- name: Restore flatpak-builder cache - name: Restore flatpak-builder cache
if: github.event_name == 'pull_request' if: github.event_name == 'pull_request'
uses: actions/cache/restore@v6 uses: actions/cache/restore@v6
with: with:
path: .flatpak-builder path: |
.flatpak-builder/*
!.flatpak-builder/ccache
key: ${{ steps.fp_cache_key.outputs.key }} key: ${{ steps.fp_cache_key.outputs.key }}
restore-keys: flatpak-builder-${{ matrix.variant.arch }}- restore-keys: flatpak-builder-${{ matrix.variant.arch }}-
- name: Save/restore flatpak-builder cache - name: Save/restore flatpak-builder cache
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
uses: actions/cache@v6 uses: actions/cache@v6
with: with:
path: .flatpak-builder path: |
.flatpak-builder/*
!.flatpak-builder/ccache
key: ${{ steps.fp_cache_key.outputs.key }} key: ${{ steps.fp_cache_key.outputs.key }}
restore-keys: flatpak-builder-${{ matrix.variant.arch }}- restore-keys: flatpak-builder-${{ matrix.variant.arch }}-
# Compiler cache for the OrcaSlicer module, as in build_orca.yml. Pull
# requests only restore it; every other run (main, release branches, the
# nightly, a dispatch) saves it. orca_deps stays on the state cache above.
- name: Name the compiler cache leg
run: |
leg="Flatpak-${{ matrix.variant.arch }}"
echo "CCACHE_LEG=$leg" >> "$GITHUB_ENV"
echo "CCACHE_ENTRY=ccache-$leg-${{ github.run_id }}-${{ github.run_attempt }}" >> "$GITHUB_ENV"
shell: bash
- name: Restore compiler cache
id: ccache_restore
uses: actions/cache/restore@v6
with:
path: .flatpak-builder/ccache
key: ${{ env.CCACHE_ENTRY }}
restore-keys: ccache-${{ env.CCACHE_LEG }}-
- name: Disable debug info for faster CI builds - name: Disable debug info for faster CI builds
run: | run: |
sed -i '/^build-options:/a\ no-debuginfo: true\n strip: true' \ sed -i '/^build-options:/a\ no-debuginfo: true\n strip: true' \
@@ -308,6 +329,33 @@ jobs:
sed -i "/name: OrcaSlicer/{n;s|buildsystem: simple|buildsystem: simple\n build-options:\n env:\n git_commit_hash: \"$git_commit_hash\"|}" \ sed -i "/name: OrcaSlicer/{n;s|buildsystem: simple|buildsystem: simple\n build-options:\n env:\n git_commit_hash: \"$git_commit_hash\"|}" \
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
shell: bash shell: bash
# flatpak-builder's --ccache only wraps cc and gcc, and the manifest builds
# with clang, so CMake's launcher runs ccache instead; --ccache is still what
# mounts the cache directory into the sandbox. The settings go into that
# directory's own config file, which the sandbox reads too.
- name: Enable compiler cache
run: |
printf ' %s\n' \
'CMAKE_C_COMPILER_LAUNCHER: ccache' \
'CMAKE_CXX_COMPILER_LAUNCHER: ccache' > "$RUNNER_TEMP/ccache-env.yml"
sed -i "/^ git_commit_hash: /r $RUNNER_TEMP/ccache-env.yml" \
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
grep -q '^ CMAKE_CXX_COMPILER_LAUNCHER: ccache$' scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
mkdir -p .flatpak-builder/ccache
export CCACHE_DIR=$PWD/.flatpak-builder/ccache
ccache --set-config=max_size=3G
# The compiler is reinstalled every run, so its mtime means nothing.
ccache --set-config=compiler_check=content
# Headers a fresh checkout has just written, the few files that use
# __DATE__ or __TIME__, and the precompiled header, whose macros ccache
# cannot see.
ccache --set-config=sloppiness=pch_defines,time_macros,include_file_mtime,include_file_ctime
# Hash the includes the compiler reports instead of preprocessing every
# miss before compiling it.
ccache --set-config=depend_mode=true
# The restored directory carries the previous run's counters.
ccache -z
shell: bash
- name: Check the manifest keeps orca_deps cacheable - name: Check the manifest keeps orca_deps cacheable
run: ./scripts/flatpak/check_manifest_cacheable.sh run: ./scripts/flatpak/check_manifest_cacheable.sh
shell: bash shell: bash
@@ -318,9 +366,50 @@ jobs:
with: with:
bundle: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak bundle: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
manifest-path: scripts/flatpak/com.orcaslicer.OrcaSlicer.yml manifest-path: scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
cache: false # cache only turns on flatpak-builder --ccache; the caching itself is above.
cache: true
restore-cache: false
save-cache: false
arch: ${{ matrix.variant.arch }} arch: ${{ matrix.variant.arch }}
upload-artifact: false upload-artifact: false
# The build has just touched everything it can use, so an object untouched
# for a week is dead, usually orphaned by a flag change.
- name: Compiler cache statistics
if: always()
run: |
export CCACHE_DIR=$PWD/.flatpak-builder/ccache
ccache --evict-older-than 7d
ccache -s -v || ccache -s
shell: bash
# Save the new entry first, then drop the older ones for this leg on this
# ref, so a failed save leaves the previous entry in place. A cancelled or
# failed build saves too, since what it compiled is still valid; a restore
# that did not finish does not, since the directory may be a truncated copy.
- name: Save compiler cache
id: ccache_save
if: ${{ always() && steps.ccache_restore.outcome == 'success' && github.event_name != 'pull_request' }}
uses: actions/cache/save@v6
with:
path: .flatpak-builder/ccache
key: ${{ env.CCACHE_ENTRY }}
- name: Drop older compiler cache entries
if: ${{ always() && steps.ccache_save.outcome == 'success' }}
# The container has no gh, so this is the list and delete over the REST API.
# Older means a lower run id, so two runs finishing close together keep
# the newer entry whichever of them cleans up last.
continue-on-error: true
env:
GH_TOKEN: ${{ github.token }}
run: |
api="$GITHUB_API_URL/repos/$GITHUB_REPOSITORY/actions/caches"
curl -sSf -H "Authorization: Bearer $GH_TOKEN" \
"$api?ref=$GITHUB_REF&key=ccache-$CCACHE_LEG-&per_page=100" \
| jq -r --arg prefix "ccache-$CCACHE_LEG-" --argjson run "$GITHUB_RUN_ID" \
'.actions_caches[] | select((.key | ltrimstr($prefix) | split("-")[0] | tonumber?) < $run) | .id' \
| while read -r id; do
curl -sSf -X DELETE -H "Authorization: Bearer $GH_TOKEN" "$api/$id"
done
shell: bash
- name: Upload artifacts Flatpak - name: Upload artifacts Flatpak
uses: actions/upload-artifact@v7 uses: actions/upload-artifact@v7
with: with:
+92
View File
@@ -76,6 +76,60 @@ jobs:
if (-not (Test-Path "$cmakeBin\cmake.exe")) { throw "cmake.exe not found at $cmakeBin" } if (-not (Test-Path "$cmakeBin\cmake.exe")) { throw "cmake.exe not found at $cmakeBin" }
Add-Content -Path $env:GITHUB_PATH -Value $cmakeBin Add-Content -Path $env:GITHUB_PATH -Value $cmakeBin
# Compiler cache. Pushes save it, so main keeps it warm; pull requests
# restore it and discard what they compiled. Objects are keyed on the
# preprocessed source, the compiler and the flags, so a leg only ever
# hits its own entries. A failed install costs the caching, not the build.
- name: Name the compiler cache leg
if: ${{ !inputs.macos-combine-only }}
shell: bash
run: |
leg="${{ runner.os }}-${{ inputs.arch || 'amd64' }}${{ runner.os == 'Windows' && format('-{0}', inputs.compiler) || '' }}"
echo "CCACHE_LEG=$leg" >> "$GITHUB_ENV"
echo "CCACHE_ENTRY=ccache-$leg-${{ github.run_id }}-${{ github.run_attempt }}" >> "$GITHUB_ENV"
# The action only installs and configures ccache. Restore and save go
# through actions/cache with one path string, since the cache service
# only matches entries saved under the identical path and the action
# spells it differently on Windows.
- name: Compiler cache
id: ccache
if: ${{ !inputs.macos-combine-only }}
continue-on-error: true
uses: hendrikmuhs/ccache-action@v1.2.24
with:
key: ${{ env.CCACHE_LEG }}
max-size: 3G
restore: false
save: false
# ccache -s runs as its own step; no summary table per job.
job-summary: ''
- name: Restore compiler cache
id: ccache_restore
if: ${{ steps.ccache.outcome == 'success' }}
uses: actions/cache/restore@v6
with:
path: ${{ github.workspace }}/.ccache
key: ${{ env.CCACHE_ENTRY }}
restore-keys: ccache-${{ env.CCACHE_LEG }}-
- name: Enable compiler cache
if: ${{ steps.ccache.outcome == 'success' }}
shell: bash
run: |
echo "CMAKE_C_COMPILER_LAUNCHER=ccache" >> "$GITHUB_ENV"
echo "CMAKE_CXX_COMPILER_LAUNCHER=ccache" >> "$GITHUB_ENV"
# Headers a fresh checkout has just written, the few files that
# use __DATE__ or __TIME__, and the precompiled header, whose
# macros ccache cannot see.
echo "CCACHE_SLOPPINESS=pch_defines,time_macros,include_file_mtime,include_file_ctime" >> "$GITHUB_ENV"
# Hash the includes the compiler reports instead of preprocessing
# every miss before compiling it.
echo "CCACHE_DEPEND=1" >> "$GITHUB_ENV"
# The restored directory carries the previous run's counters.
ccache -z
- name: Get the version and date on Ubuntu and macOS - name: Get the version and date on Ubuntu and macOS
if: runner.os != 'Windows' if: runner.os != 'Windows'
run: | run: |
@@ -670,3 +724,41 @@ jobs:
asset_name: orca_custom_preset_tests.zip asset_name: orca_custom_preset_tests.zip
asset_content_type: application/octet-stream asset_content_type: application/octet-stream
max_releases: 1 max_releases: 1
# The build has just touched everything it can use, so an object
# untouched for a week is dead, usually orphaned by a flag change.
- name: Compiler cache statistics
if: ${{ always() && steps.ccache.outcome == 'success' }}
shell: bash
run: |
ccache --evict-older-than 7d
ccache -s -v || ccache -s
# Entries are immutable, so the new one is saved first and the older
# ones for this leg on this ref are dropped afterwards: a failed save
# leaves the previous entry in place. A cancelled or failed build saves
# too, since what it compiled is still valid; a restore that did not
# finish does not, since the directory may be a truncated copy.
- name: Save compiler cache
id: ccache_save
if: ${{ always() && steps.ccache_restore.outcome == 'success' && github.event_name != 'pull_request' }}
uses: actions/cache/save@v6
with:
path: ${{ github.workspace }}/.ccache
key: ${{ env.CCACHE_ENTRY }}
- name: Drop older compiler cache entries
if: ${{ always() && steps.ccache_save.outcome == 'success' }}
# A read-only token (fork PRs) cannot delete; that only costs storage.
# Older means a lower run id, so two runs finishing close together keep
# the newer entry whichever of them cleans up last.
continue-on-error: true
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
gh cache list --ref "$GITHUB_REF" --key "ccache-$CCACHE_LEG-" --limit 100 --json id,key \
| jq -r --arg prefix "ccache-$CCACHE_LEG-" --argjson run "$GITHUB_RUN_ID" \
'.[] | select((.key | ltrimstr($prefix) | split("-")[0] | tonumber?) < $run) | .id' \
| tr -d '\r' \
| while read -r id; do gh cache delete "$id"; done
+12 -5
View File
@@ -19,11 +19,18 @@ jobs:
permissions: permissions:
contents: read contents: read
steps: steps:
- uses: thejerrybao/setup-swap-space@v1 # Doxygen with call graphs over all of src/ outgrows the runner's RAM;
with: # replace the runner's swapfile with an 8 GB one.
swap-space-path: /swapfile - name: Grow swap space
swap-size-gb: 8 run: |
remove-existing-swap-files: true set -euo pipefail
sudo swapoff -a
sudo rm -f /swapfile
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
free -h
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v7 uses: actions/checkout@v7
+219
View File
@@ -0,0 +1,219 @@
# Nightly parity checks from OrcaSlicer/orca-test-repo, kept out of the
# per-build "Run external slicer regression tests" step because they take far
# longer than that step's budget:
# effect - the CLI override sweep's full effect stage: every landed option
# re-sliced on its own to see whether it changes the G-code
# harness - the GUI-vs-CLI parity harness (metrics only, never fails)
# Both test the latest successful build_all.yml Linux AppImage from main, with
# sources checked out at the commit that build was made from. Nothing here
# gates a build or a PR.
name: Parity Nightly
on:
schedule:
# build_all.yml starts at 17:00 UTC and has finished by ~20:00
- cron: "0 21 * * *"
workflow_dispatch:
inputs:
test_repo_ref:
description: "orca-test-repo ref to run"
required: false
default: "main"
build_branch:
description: "branch whose latest successful build_all artifact to test"
required: false
default: "main"
fixtures:
description: "harness fixture ids, space-separated (empty = all)"
required: false
default: ""
cli_presets:
description: "harness lane C presets: flat = flatten inherits first, raw = leaf profile as-is"
required: false
default: "flat"
permissions:
contents: read
actions: read
jobs:
build:
name: Find the build to test
# Don't run scheduled checks on forks
if: github.event_name != 'schedule' || github.repository == 'OrcaSlicer/OrcaSlicer'
runs-on: ubuntu-24.04
outputs:
run_id: ${{ steps.find.outputs.run_id }}
head_sha: ${{ steps.find.outputs.head_sha }}
steps:
- id: find
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
run: |
set -euo pipefail
gh run list --workflow build_all.yml \
--branch "${{ inputs.build_branch || 'main' }}" \
--status success --limit 1 --json databaseId,headSha \
--jq '"run_id=\(.[0].databaseId)\nhead_sha=\(.[0].headSha)"' \
>> "$GITHUB_OUTPUT"
cat "$GITHUB_OUTPUT"
effect:
name: Override sweep effect stage (shard ${{ matrix.shard }})
needs: build
runs-on: ubuntu-24.04
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
# orca-test-repo's parity/effect_routing.json holds a 2-way split,
# ~12.5 min a shard on this runner
shard: [0, 1]
steps:
- &checkout-suite
name: Check out the test suite
uses: actions/checkout@v7
with:
repository: OrcaSlicer/orca-test-repo
ref: ${{ inputs.test_repo_ref || 'main' }}
path: orca-test-repo
# The AppImage ships only packed preset caches, so profiles and the CLI
# option surface come from the sources the build was made from
- &checkout-slicer
name: Check out OrcaSlicer at the build's commit
uses: actions/checkout@v7
with:
ref: ${{ needs.build.outputs.head_sha }}
path: slicer
lfs: 'false'
- &extract-appimage
name: Download and extract the Linux AppImage
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
run: |
set -euo pipefail
gh run download "${{ needs.build.outputs.run_id }}" --dir appimage \
--pattern "OrcaSlicer_Linux_ubuntu_2404*"
appimage=$(find appimage -name "*.AppImage" ! -name "*aarch64*" | head -1)
[ -n "$appimage" ] || { echo "no x86_64 AppImage in run ${{ needs.build.outputs.run_id }}"; exit 1; }
chmod +x "$appimage"
"$appimage" --appimage-extract > /dev/null
# The bare binary cannot find the AppImage's bundled libraries; AppRun
# sets them up and execs it, so exit codes and signals pass through
[ -x squashfs-root/AppRun ] || { echo "no AppRun in the AppImage"; exit 1; }
echo "ORCA_BIN=$PWD/squashfs-root/AppRun" >> "$GITHUB_ENV"
echo "ORCA_SOURCE=$PWD/slicer" >> "$GITHUB_ENV"
- name: Install the AppImage's host runtime dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
libopengl0 libglu1-mesa libgl1 libegl1 libwebkit2gtk-4.1-0
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Install suite dependencies
run: pip install -r orca-test-repo/requirements.txt
- name: Run the override sweep with the full effect stage
id: run
continue-on-error: true
working-directory: orca-test-repo
run: |
set -o pipefail
# -rA keeps the per-stage summaries, which pytest otherwise swallows
# for passing tests
python -m pytest test_cli_overrides.py -c pytest.ini -v -rA \
--effect-full --effect-shard ${{ matrix.shard }}/2 \
--orca-bin "$ORCA_BIN" --orca-source "$ORCA_SOURCE" \
2>&1 | tee ../sweep.log
- name: Publish job summary
if: always()
run: |
{
echo "## Override sweep effect stage, shard ${{ matrix.shard }}/2"
echo "Build ${{ needs.build.outputs.head_sha }} (run ${{ needs.build.outputs.run_id }})"
echo '```'
grep -E "\[override sweep" sweep.log || echo "no stage summaries, see the log"
grep -E "^=+ .*(passed|failed)" sweep.log | tail -1 || true
echo '```'
} >> "$GITHUB_STEP_SUMMARY"
- name: Upload the override report
if: always()
uses: actions/upload-artifact@v7
with:
name: override-report-shard${{ matrix.shard }}
path: |
orca-test-repo/.pytest_cache/override_report.json
sweep.log
if-no-files-found: warn
retention-days: 30
# The sweep step continues on error so the summary and report still get
# published; this puts the failure back on the job
- name: Fail the job if the sweep failed
if: steps.run.outcome == 'failure'
run: |
echo "the override sweep failed, see the job summary and the uploaded report" >&2
exit 1
harness:
name: GUI-vs-CLI parity harness
needs: build
runs-on: ubuntu-24.04
timeout-minutes: 180
steps:
- *checkout-suite
- *checkout-slicer
- *extract-appimage
- name: Install display tooling and the AppImage's host runtime
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
xvfb xdotool imagemagick openbox mesa-utils \
libopengl0 libglu1-mesa libgl1 libegl1 libwebkit2gtk-4.1-0
- name: Run the parity harness
run: |
set -euo pipefail
fixtures=()
for f in ${{ inputs.fixtures || '' }}; do
fixtures+=(--fixture "$f")
done
# 2 GUI displays: ~1.5 cores peak / ~1.9 GB on this 4-vCPU runner,
# and each fixture is fully isolated, so results match a serial run
python3 orca-test-repo/parity/run_parity.py \
--slicer-root "$ORCA_SOURCE" --bin "$ORCA_BIN" \
--cli-presets "${{ inputs.cli_presets || 'flat' }}" \
--gui-workers 2 --out "$PWD/parity-out" "${fixtures[@]}"
- name: Publish job summary
if: always()
run: |
if [ -f parity-out/report.md ]; then
cat parity-out/report.md >> "$GITHUB_STEP_SUMMARY"
else
echo "the harness produced no report, see the log" >> "$GITHUB_STEP_SUMMARY"
fi
- name: Drop per-lane datadirs before upload
if: always()
run: rm -rf parity-out/*/seed parity-out/*/datadir-* || true
- name: Upload the scorecard and evidence
if: always()
uses: actions/upload-artifact@v7
with:
name: parity-scorecard
path: parity-out/
if-no-files-found: warn
retention-days: 30
-1
View File
@@ -54,4 +54,3 @@ __pycache__/
*.opc *.opc
/.test/ /.test/
docs/superpowers/ docs/superpowers/
ctest_results.xml
+88 -54
View File
@@ -4,6 +4,10 @@ endif()
cmake_minimum_required(VERSION 3.13) cmake_minimum_required(VERSION 3.13)
if(POLICY CMP0177)
cmake_policy(SET CMP0177 NEW)
endif()
# The following line used to be in tests/CMakeLists.txt # The following line used to be in tests/CMakeLists.txt
# Having it there causes rebuilds of all targets on any CMakeLists.txt change under tests/ # Having it there causes rebuilds of all targets on any CMakeLists.txt change under tests/
@@ -553,59 +557,92 @@ if ((NOT MSVC OR IS_CLANG_CL) AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
elseif (NOT MINGW) elseif (NOT MINGW)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" )
endif () endif ()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reorder" )
# On GCC and Clang, no return from a non-void function is a warning only. Here, we make it an error. # Every warning is an error unless it appears in one of the two lists below.
add_compile_options(-Werror=return-type) # disabled - never wanted. Off everywhere, so it never warns or errors.
# demoted - wanted, not cleared yet. Still warns, does not error.
# Since some portions of code are just commented out or put under conditional compilation, there are # Disabled.
# a bunch of warning related to unused functions and variables. Suppress those warnings to not pollute set(warnings_disabled
# compilers diagnostics output with warnings we not going to look at reorder # members initialised in an order we chose
add_compile_options(-Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-label -Wno-unused-local-typedefs) sign-compare # signed/unsigned comparisons throughout
misleading-indentation # false positives on mixed tabs and spaces
switch # unhandled enum value in a switch
unused-function # commented-out or conditionally compiled code
unused-variable # commented-out or conditionally compiled code
unused-but-set-variable # commented-out or conditionally compiled code
unused-label # commented-out or conditionally compiled code
unused-local-typedefs # commented-out or conditionally compiled code
)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
list(APPEND warnings_disabled deprecated-declarations) # legacy OpenGL calls
endif ()
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0)
list(APPEND warnings_disabled ignored-attributes) # from Eigen headers marked SYSTEM
endif ()
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
list(APPEND warnings_disabled unknown-pragmas) # igl pragmas, GCC bug 66943
endif ()
foreach (w IN LISTS warnings_disabled)
add_compile_options(-Wno-${w})
endforeach ()
# Ignore signed/unsigned comparison warnings # GCC is not built in CI, so don't throw errors CI won't catch.
add_compile_options(-Wno-sign-compare) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_compile_options(-Werror=return-type)
else ()
# Turn everything else into an error. Dependency headers are exempt because the
# SYSTEM include flag (-imsvc on clang-cl, -isystem elsewhere) keeps their
# diagnostics out.
add_compile_options(-Werror)
endif ()
# The mismatch of tabs and spaces throughout the project can sometimes # Demoted. Remove a name once its category is cleared on every compiler.
# cause this warning to appear even though the indentation is fine. set(warnings_demoted)
# Some includes also cause the warning if (APPLE)
add_compile_options(-Wno-misleading-indentation) list(APPEND warnings_demoted
# MacDarkMode.mm makes two calls to AppKit's private titlebarViewController
# and one to a wxWidgets category on NSTableColumn whose header is not
# imported. Clearing it means declaring the private selectors ourselves, which
# needs a macOS build to verify.
objc-method-access
)
endif ()
if (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
list(APPEND warnings_demoted
# About two dozen GetProcAddress casts, most in the vendored dark_mode.hpp,
# retype FARPROC to a real signature. The __stdcall typedefs are identical to
# FARPROC on x64, so only arm64 reports them. Clearing them is a separate
# sweep.
cast-function-type-mismatch
)
endif ()
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
list(APPEND warnings_demoted
# enum-constexpr-conversion is a Clang warning that defaults to an error,
# present through clang 20 and gone in clang 21.
enum-constexpr-conversion
)
endif ()
# Disable warning if enum value does not have a corresponding case in switch statement # The list mixes names not every compiler has, so add each exception only where the
add_compile_options(-Wno-switch) # compiler knows the warning. Probe with the positive -W<name>, which an unknown
# warning fails on both compilers (GCC errors, Clang reports unknown-warning-option).
# removes LOTS of extraneous Eigen warnings (GCC only supports it since 6.1) # An option that takes a =N argument rejects the bare -W<name>, so fall back to
# https://eigen.tuxfamily.org/bz/show_bug.cgi?id=1221 # -W<name>=1 and demote with the trailing =.
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0) include(CheckCXXCompilerFlag)
add_compile_options(-Wno-ignored-attributes) # Tamas: Eigen include dirs are marked as SYSTEM foreach (category IN LISTS warnings_demoted)
endif() string(MAKE_C_IDENTIFIER "ORCA_HAS_W_${category}" _orca_has_w)
check_cxx_compiler_flag("-W${category}" ${_orca_has_w})
# Clang reports legacy OpenGL calls as deprecated. Turn off the warning for now if (${_orca_has_w})
# to reduce the clutter, we know about this one. It should be reenabled after add_compile_options(-Wno-error=${category})
# we finally get rid of the deprecated code. else ()
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") check_cxx_compiler_flag("-W${category}=1" ${_orca_has_w}_arg)
add_compile_options(-Wno-deprecated-declarations) if (${${_orca_has_w}_arg})
endif() add_compile_options(-Wno-error=${category}=)
endif ()
if((${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang") AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 15) endif ()
include(CheckCXXCompilerFlag) endforeach ()
check_cxx_compiler_flag(-Wno-error=enum-constexpr-conversion HAS_WNO_ERROR_ENUM_CONSTEXPR_CONV)
if(HAS_WNO_ERROR_ENUM_CONSTEXPR_CONV)
add_compile_options(-Wno-error=enum-constexpr-conversion)
endif()
endif()
#GCC generates loads of -Wunknown-pragmas when compiling igl. The fix is not easy due to a bug in gcc, see
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943 or
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431
# We will turn the warning of for GCC for now:
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
# GCC generates loads of -Wunknown-pragmas when compiling igl. The fix is not easy due to a bug in gcc, see
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943 or
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431
# We will turn the warning of for GCC for now:
add_compile_options(-Wno-unknown-pragmas)
endif()
# Compress the debug info with zstd to save space in Flatpak CI builds # Compress the debug info with zstd to save space in Flatpak CI builds
if(FLATPAK) if(FLATPAK)
@@ -615,10 +652,6 @@ if ((NOT MSVC OR IS_CLANG_CL) AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
endif() endif()
endif() endif()
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 14)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=template-id-cdtor" )
endif()
endif() endif()
if (SLIC3R_ASAN) if (SLIC3R_ASAN)
@@ -1208,8 +1241,9 @@ endif ()
if (NOT SLIC3R_WARNINGS) if (NOT SLIC3R_WARNINGS)
add_compile_options(-w) add_compile_options(-w)
elseif (MSVC AND NOT IS_CLANG_CL) elseif (MSVC AND NOT IS_CLANG_CL)
# /we4715 is C4715, no return from a non-void function, matching the # /we4715 is C4715, no return from a non-void function, an error on the GNU/Clang
# -Werror=return-type the GNU/Clang builds apply. # builds under -Werror. MSVC is not in that model, so this stays a single promoted
# warning.
add_compile_options(/W3 /we4715) add_compile_options(/W3 /we4715)
endif () endif ()
+7
View File
@@ -256,6 +256,13 @@ function(add_precompiled_header _target _input)
message(STATUS "Adding precompiled header ${_input} to target ${_target}.") message(STATUS "Adding precompiled header ${_input} to target ${_target}.")
target_precompile_headers(${_target} PRIVATE ${_input}) target_precompile_headers(${_target} PRIVATE ${_input})
# Clang records the modification time of every input in the precompiled
# header, which makes it differ between two checkouts of the same source
# and defeats a compiler cache. The build system already rebuilds the
# header when an input changes.
target_compile_options(${_target} PRIVATE
"$<$<CXX_COMPILER_ID:Clang,AppleClang>:SHELL:-Xclang -fno-pch-timestamp>")
get_target_property(_sources ${_target} SOURCES) get_target_property(_sources ${_target} SOURCES)
list(FILTER _sources INCLUDE REGEX ".*\\.mm?") list(FILTER _sources INCLUDE REGEX ".*\\.mm?")
@@ -0,0 +1,29 @@
diff --git a/src/osx/cocoa/colour.mm b/src/osx/cocoa/colour.mm
index 31515d146f..86b33e94a2 100644
--- a/src/osx/cocoa/colour.mm
+++ b/src/osx/cocoa/colour.mm
@@ -125,3 +125,3 @@
wxOSXEffectiveAppearanceSetter helper;
- if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] )
+ if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] )
return [colRGBA redComponent];
@@ -134,3 +134,3 @@
wxOSXEffectiveAppearanceSetter helper;
- if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] )
+ if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] )
return [colRGBA greenComponent];
@@ -143,3 +143,3 @@
wxOSXEffectiveAppearanceSetter helper;
- if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] )
+ if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] )
return [colRGBA blueComponent];
@@ -152,3 +152,3 @@
wxOSXEffectiveAppearanceSetter helper;
- if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] )
+ if ( NSColor* colRGBA = [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] )
return [colRGBA alphaComponent];
@@ -160,3 +160,3 @@
{
- return [m_nsColour colorUsingColorSpaceName:NSCalibratedRGBColorSpace] != nil;
+ return [m_nsColour colorUsingColorSpace:[NSColorSpace sRGBColorSpace]] != nil;
}
+10
View File
@@ -21,12 +21,22 @@ else ()
set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF") set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF")
endif () endif ()
set(_wx_patch_command "")
if (APPLE)
set(_wx_patch_command
${GIT_EXECUTABLE} checkout -f -- src/osx/cocoa/colour.mm
COMMAND ${GIT_EXECUTABLE} apply --verbose
${CMAKE_CURRENT_LIST_DIR}/0001-macos-use-srgb-colour-components.patch
)
endif ()
orcaslicer_add_cmake_project( orcaslicer_add_cmake_project(
wxWidgets wxWidgets
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets" GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
GIT_TAG v3.3.2 GIT_TAG v3.3.2
GIT_SHALLOW ON GIT_SHALLOW ON
GIT_SUBMODULES 3rdparty/catch 3rdparty/pcre 3rdparty/libwebp GIT_SUBMODULES 3rdparty/catch 3rdparty/pcre 3rdparty/libwebp
PATCH_COMMAND ${_wx_patch_command}
DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG} DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG}
CMAKE_ARGS CMAKE_ARGS
-DwxBUILD_PRECOMP=ON -DwxBUILD_PRECOMP=ON
+2 -2
View File
@@ -162,7 +162,7 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first, Impor
rewind(fp); rewind(fp);
try{ try{
char solid_name[256]; char solid_name[256];
int res_solid = fscanf(fp, " solid %[^\n]", solid_name); int res_solid = fscanf(fp, " solid %255[^\n]", solid_name);
if (res_solid == 1) { if (res_solid == 1) {
char* mw_position = strstr(solid_name, "MW"); char* mw_position = strstr(solid_name, "MW");
if (mw_position != NULL) { if (mw_position != NULL) {
@@ -170,7 +170,7 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first, Impor
char version_str[16]; char version_str[16];
char model_id_str[128]; char model_id_str[128];
char country_code_str[16]; char country_code_str[16];
int num_values = sscanf(mw_position + 3, "%s %s %s", version_str, model_id_str, country_code_str); int num_values = sscanf(mw_position + 3, "%15s %127s %15s", version_str, model_id_str, country_code_str);
if (num_values == 3) { if (num_values == 3) {
if (strcmp(version_str, "1.0") == 0) { if (strcmp(version_str, "1.0") == 0) {
model_id = model_id_str; model_id = model_id_str;
+95 -14
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2293,8 +2293,6 @@ msgstr ""
msgid "%s has been removed." msgid "%s has been removed."
msgstr "" msgstr ""
msgid "Switching application language"
msgstr ""
msgid "Select the language" msgid "Select the language"
msgstr "" msgstr ""
@@ -4571,6 +4569,9 @@ msgid ""
"No - Cancel enabling spiral mode" "No - Cancel enabling spiral mode"
msgstr "" msgstr ""
msgid "N/A"
msgstr ""
msgid "Printing" msgid "Printing"
msgstr "" msgstr ""
@@ -4994,9 +4995,7 @@ msgstr ""
#, possible-c-format, possible-boost-format #, possible-c-format, possible-boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
#, possible-boost-format #, possible-boost-format
@@ -5019,9 +5018,6 @@ msgstr ""
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "" msgstr ""
msgid "N/A"
msgstr ""
msgid "System agents" msgid "System agents"
msgstr "" msgstr ""
@@ -5951,6 +5947,12 @@ msgstr ""
msgid "Save current project as" msgid "Save current project as"
msgstr "" msgstr ""
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "" msgstr ""
@@ -7696,6 +7698,12 @@ msgstr ""
msgid "Customized Preset" msgid "Customized Preset"
msgstr "" msgstr ""
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "" msgstr ""
@@ -8074,6 +8082,17 @@ msgstr ""
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "" msgstr ""
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr ""
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "" msgstr ""
@@ -8271,8 +8290,6 @@ msgstr ""
msgid "Language selection" msgid "Language selection"
msgstr "" msgstr ""
msgid "Switching application language while some presets are modified."
msgstr ""
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "" msgstr ""
@@ -9124,9 +9141,6 @@ msgstr ""
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "" msgstr ""
msgid "Publish"
msgstr ""
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "" msgstr ""
@@ -9142,6 +9156,64 @@ msgstr ""
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "" msgstr ""
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, possible-c-format, possible-boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, possible-c-format, possible-boost-format #, possible-c-format, possible-boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "" msgstr ""
@@ -19337,6 +19409,15 @@ msgstr ""
msgid "Skipping objects." msgid "Skipping objects."
msgstr "" msgstr ""
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "" msgstr ""
+96 -17
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2025-03-15 10:55+0100\n" "PO-Revision-Date: 2025-03-15 10:55+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -2522,8 +2522,6 @@ msgstr "Hi ha una actualització disponible. Obriu el quadre de diàleg del paqu
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s s'ha eliminat." msgstr "%s s'ha eliminat."
msgid "Switching application language"
msgstr "Canvi d'idioma de l'aplicació"
msgid "Select the language" msgid "Select the language"
msgstr "Seleccioneu l'idioma" msgstr "Seleccioneu l'idioma"
@@ -4995,6 +4993,9 @@ msgstr ""
"Sí: canviar aquesta configuració i activar el mode d'espiral automàticament\n" "Sí: canviar aquesta configuració i activar el mode d'espiral automàticament\n"
"No - Renunciar a utilitzar el mode espiral aquesta vegada" "No - Renunciar a utilitzar el mode espiral aquesta vegada"
msgid "N/A"
msgstr "N/D"
msgid "Printing" msgid "Printing"
msgstr "Imprimint" msgstr "Imprimint"
@@ -5428,13 +5429,9 @@ msgstr "El valor %s està fora de rang. El rang vàlid és de %d a %d."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"És %s%% or %s %s?\n" "És %s%% or %s %s?"
"SÍ per %s%%.\n"
"NO per %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5456,9 +5453,6 @@ msgstr "Patró no vàlid. Utilitzeu N, N#K, o una llista separada per comes amb
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Format no vàlid. Format vectorial esperat: \"%1%\"" msgstr "Format no vàlid. Format vectorial esperat: \"%1%\""
msgid "N/A"
msgstr "N/D"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Agents del sistema" msgstr "Agents del sistema"
@@ -6421,6 +6415,12 @@ msgstr "Desa el projecte com a"
msgid "Save current project as" msgid "Save current project as"
msgstr "Desar el projecte actual com" msgstr "Desar el projecte actual com"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importar 3MF STL/STEP/SVG/OBJ/AMF" msgstr "Importar 3MF STL/STEP/SVG/OBJ/AMF"
@@ -8275,6 +8275,12 @@ msgstr "Confirmeu que els Codis-G d'aquests perfils són segurs per evitar danys
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Perfil personalitzat" msgstr "Perfil personalitzat"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
# AI Translated # AI Translated
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Els noms dels components dins del fitxer STEP no tenen format UTF-8!" msgstr "Els noms dels components dins del fitxer STEP no tenen format UTF-8!"
@@ -8687,6 +8693,17 @@ msgstr "Desa el fitxer Laminat com a:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "El fitxer %s s'ha enviat a l'emmagatzematge de la impressora i es pot visualitzar a la impressora." msgstr "El fitxer %s s'ha enviat a l'emmagatzematge de la impressora i es pot visualitzar a la impressora."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Publicar"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "El tipus de broquet no està establert. Establiu el broquet i torneu-ho a provar." msgstr "El tipus de broquet no està establert. Establiu el broquet i torneu-ho a provar."
@@ -8901,8 +8918,6 @@ msgstr "Voleu continuar?"
msgid "Language selection" msgid "Language selection"
msgstr "Selecció d'idiomes" msgstr "Selecció d'idiomes"
msgid "Switching application language while some presets are modified."
msgstr "Canviant l'idioma de l'aplicació mentre es modifiquen alguns perfils."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Àsia-Pacífic" msgstr "Àsia-Pacífic"
@@ -9880,9 +9895,6 @@ msgstr "Anar a la pàgina web de publicació de models"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Nota: La preparació pot trigar uns quants minuts. Si us plau, sigui pacient." msgstr "Nota: La preparació pot trigar uns quants minuts. Si us plau, sigui pacient."
msgid "Publish"
msgstr "Publicar"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "La publicació ha estat cancel·lada" msgstr "La publicació ha estat cancel·lada"
@@ -9898,6 +9910,64 @@ msgstr "Carregant dades"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Anar a la pàgina web" msgstr "Anar a la pàgina web"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Desar %s com a" msgstr "Desar %s com a"
@@ -21387,6 +21457,15 @@ msgstr "Aquesta acció no es pot desfer. Continuar?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Ometent objectes." msgstr "Ometent objectes."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Seleccioneu filament" msgstr "Seleccioneu filament"
+97 -18
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Jakub Hencl\n" "Last-Translator: Jakub Hencl\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2482,8 +2482,6 @@ msgstr "Je k dispozici aktualizace. Otevřete dialog balíčku předvoleb a prov
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s bylo odstraněno." msgstr "%s bylo odstraněno."
msgid "Switching application language"
msgstr "Přepnutí jazyka aplikace"
msgid "Select the language" msgid "Select the language"
msgstr "Zvolte jazyk" msgstr "Zvolte jazyk"
@@ -4953,6 +4951,10 @@ msgstr ""
"Ano změnit tato nastavení a automaticky povolit spirálový režim\n" "Ano změnit tato nastavení a automaticky povolit spirálový režim\n"
"Ne tentokrát nepoužít spirálový režim" "Ne tentokrát nepoužít spirálový režim"
# AI Translated
msgid "N/A"
msgstr "N/A"
msgid "Printing" msgid "Printing"
msgstr "Tisk" msgstr "Tisk"
@@ -5384,13 +5386,9 @@ msgstr "Hodnota %s je mimo rozsah. Platný rozsah je od %d do %d."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Je to %s%% nebo %s %s?\n" "Je to %s%% nebo %s %s?"
"ANO pro %s%%,\n"
"NE pro %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5412,10 +5410,6 @@ msgstr "Neplatný vzor. Použijte N, N#K nebo seznam oddělený čárkami s voli
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Neplatný formát. Očekávaný vektorový formát: \"%1%\"" msgstr "Neplatný formát. Očekávaný vektorový formát: \"%1%\""
# AI Translated
msgid "N/A"
msgstr "N/A"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Systémoví agenti" msgstr "Systémoví agenti"
@@ -6382,6 +6376,12 @@ msgstr "Uložit projekt jako"
msgid "Save current project as" msgid "Save current project as"
msgstr "Uložit aktuální projekt jako" msgstr "Uložit aktuální projekt jako"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importovat 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importovat 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8237,6 +8237,12 @@ msgstr "Potvrďte prosím, že je G-code v těchto předvolbách bezpečný, aby
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Přizpůsobená předvolba" msgstr "Přizpůsobená předvolba"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Názvy komponent v souboru STEP nejsou ve formátu UTF-8!" msgstr "Názvy komponent v souboru STEP nejsou ve formátu UTF-8!"
@@ -8647,6 +8653,17 @@ msgstr "Uložit rozřezaný soubor jako:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Soubor %s byl odeslán do úložiště tiskárny a lze jej zobrazit na tiskárně." msgstr "Soubor %s byl odeslán do úložiště tiskárny a lze jej zobrazit na tiskárně."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Publikovat"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Typ trysky není nastaven. Nastavte prosím trysku a zkuste to znovu." msgstr "Typ trysky není nastaven. Nastavte prosím trysku a zkuste to znovu."
@@ -8859,8 +8876,6 @@ msgstr "Chcete pokračovat?"
msgid "Language selection" msgid "Language selection"
msgstr "Výběr jazyka" msgstr "Výběr jazyka"
msgid "Switching application language while some presets are modified."
msgstr "Přepnutí jazyka aplikace, když jsou některé předvolby upraveny."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Asie-Pacifik" msgstr "Asie-Pacifik"
@@ -9828,9 +9843,6 @@ msgstr "Přejít na webovou stránku publikace modelu"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Poznámka: Příprava může trvat několik minut. Buďte prosím trpěliví." msgstr "Poznámka: Příprava může trvat několik minut. Buďte prosím trpěliví."
msgid "Publish"
msgstr "Publikovat"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Publikování bylo zrušeno" msgstr "Publikování bylo zrušeno"
@@ -9846,6 +9858,64 @@ msgstr "Nahrávání dat"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Přejít na webovou stránku" msgstr "Přejít na webovou stránku"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Uložit %s jako" msgstr "Uložit %s jako"
@@ -21331,6 +21401,15 @@ msgstr "Tuto akci nelze vrátit zpět. Pokračovat?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Přeskakování objektů." msgstr "Přeskakování objektů."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
# AI Translated # AI Translated
msgid "Select Filament" msgid "Select Filament"
msgstr "Vybrat filament" msgstr "Vybrat filament"
+96 -17
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Heiko Liebscher <hliebschergmail.com>\n" "Last-Translator: Heiko Liebscher <hliebschergmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2430,8 +2430,6 @@ msgstr "Es ist ein Update verfügbar. Öffnen Sie den Profilbündel-Dialog, um e
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s wurde entfernt." msgstr "%s wurde entfernt."
msgid "Switching application language"
msgstr "Wechsel der Sprache"
msgid "Select the language" msgid "Select the language"
msgstr "Sprache wählen" msgstr "Sprache wählen"
@@ -4859,6 +4857,9 @@ msgstr ""
"Ja - Diese Einstellungen ändern und den Spiralmodus automatisch aktivieren\n" "Ja - Diese Einstellungen ändern und den Spiralmodus automatisch aktivieren\n"
"Nein - Spiralmodus nicht aktivieren" "Nein - Spiralmodus nicht aktivieren"
msgid "N/A"
msgstr "Nicht verfügbar"
msgid "Printing" msgid "Printing"
msgstr "Drucken" msgstr "Drucken"
@@ -5290,13 +5291,9 @@ msgstr "Wert %s ist außerhalb des Bereichs. Der gültige Bereich liegt zwischen
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Heißt es %s%% oder %s %s?\n" "Heißt es %s%% oder %s %s?"
"Ja für %s%%, \n"
"Nein für %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5318,9 +5315,6 @@ msgstr "Ungültiges Muster. Verwenden Sie N, N#K oder eine durch Kommas getrennt
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Ungültiges Format. Erwartetes Vektorformat: \"%1%\"" msgstr "Ungültiges Format. Erwartetes Vektorformat: \"%1%\""
msgid "N/A"
msgstr "Nicht verfügbar"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Systemagenten" msgstr "Systemagenten"
@@ -6274,6 +6268,12 @@ msgstr "Projekt speichern als"
msgid "Save current project as" msgid "Save current project as"
msgstr "Aktuelles Projekt speichern als" msgstr "Aktuelles Projekt speichern als"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importiere 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importiere 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8107,6 +8107,12 @@ msgstr "Bitte bestätigen Sie, dass die G-Codes innerhalb dieser Profile sicher
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Benutzerdefinierte Profile" msgstr "Benutzerdefinierte Profile"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Der Name der Komponenten in der Step-Datei ist nicht im UTF-8-Format!" msgstr "Der Name der Komponenten in der Step-Datei ist nicht im UTF-8-Format!"
@@ -8519,6 +8525,17 @@ msgstr "Geslicte Datei speichern unter:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Die Datei %s wurde an den Speicher des Druckers gesendet und kann auf dem Drucker angezeigt werden." msgstr "Die Datei %s wurde an den Speicher des Druckers gesendet und kann auf dem Drucker angezeigt werden."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Veröffentlichen"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Die Düsenart ist nicht eingestellt. Bitte stellen Sie die Düse ein und versuchen Sie es erneut." msgstr "Die Düsenart ist nicht eingestellt. Bitte stellen Sie die Düse ein und versuchen Sie es erneut."
@@ -8731,8 +8748,6 @@ msgstr "Möchten Sie fortfahren?"
msgid "Language selection" msgid "Language selection"
msgstr "Sprachauswahl" msgstr "Sprachauswahl"
msgid "Switching application language while some presets are modified."
msgstr "Umschalten der Anwendungssprache, während einige Profile geändert werden."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Asien-Pazifik" msgstr "Asien-Pazifik"
@@ -9662,9 +9677,6 @@ msgstr "Zur Modellveröffentlichungs-Webseite springen"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Hinweis: Die Vorbereitung kann einige Minuten dauern. Bitte haben Sie Geduld." msgstr "Hinweis: Die Vorbereitung kann einige Minuten dauern. Bitte haben Sie Geduld."
msgid "Publish"
msgstr "Veröffentlichen"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Veröffentlichung wurde abgebrochen" msgstr "Veröffentlichung wurde abgebrochen"
@@ -9680,6 +9692,64 @@ msgstr "Daten werden hochgeladen"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Zu einer Website springen" msgstr "Zu einer Website springen"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "%s speichern als" msgstr "%s speichern als"
@@ -20816,6 +20886,15 @@ msgstr "Diese Aktion kann nicht rückgängig gemacht werden. Fortsetzen?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Objekte werden übersprungen." msgstr "Objekte werden übersprungen."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Filament auswählen" msgstr "Filament auswählen"
+95 -14
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-06-17 15:44-0300\n" "PO-Revision-Date: 2026-06-17 15:44-0300\n"
"Last-Translator: Alexandre Folle de Menezes\n" "Last-Translator: Alexandre Folle de Menezes\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2289,8 +2289,6 @@ msgstr ""
msgid "%s has been removed." msgid "%s has been removed."
msgstr "" msgstr ""
msgid "Switching application language"
msgstr ""
msgid "Select the language" msgid "Select the language"
msgstr "" msgstr ""
@@ -4567,6 +4565,9 @@ msgid ""
"No - Cancel enabling spiral mode" "No - Cancel enabling spiral mode"
msgstr "" msgstr ""
msgid "N/A"
msgstr ""
msgid "Printing" msgid "Printing"
msgstr "" msgstr ""
@@ -4990,9 +4991,7 @@ msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
#, boost-format #, boost-format
@@ -5015,9 +5014,6 @@ msgstr ""
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "" msgstr ""
msgid "N/A"
msgstr ""
msgid "System agents" msgid "System agents"
msgstr "" msgstr ""
@@ -5947,6 +5943,12 @@ msgstr ""
msgid "Save current project as" msgid "Save current project as"
msgstr "" msgstr ""
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "" msgstr ""
@@ -7692,6 +7694,12 @@ msgstr ""
msgid "Customized Preset" msgid "Customized Preset"
msgstr "" msgstr ""
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "" msgstr ""
@@ -8070,6 +8078,17 @@ msgstr ""
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "" msgstr ""
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr ""
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "" msgstr ""
@@ -8267,8 +8286,6 @@ msgstr ""
msgid "Language selection" msgid "Language selection"
msgstr "" msgstr ""
msgid "Switching application language while some presets are modified."
msgstr ""
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "" msgstr ""
@@ -9120,9 +9137,6 @@ msgstr ""
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "" msgstr ""
msgid "Publish"
msgstr ""
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "" msgstr ""
@@ -9138,6 +9152,64 @@ msgstr ""
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "" msgstr ""
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "" msgstr ""
@@ -19333,6 +19405,15 @@ msgstr ""
msgid "Skipping objects." msgid "Skipping objects."
msgstr "" msgstr ""
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "" msgstr ""
+96 -17
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Ian A. Bassi <>\n" "Last-Translator: Ian A. Bassi <>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2356,8 +2356,6 @@ msgstr "Hay una actualización disponible. Abra el cuadro de diálogo del paquet
msgid "%s has been removed." msgid "%s has been removed."
msgstr "Se ha eliminado %s." msgstr "Se ha eliminado %s."
msgid "Switching application language"
msgstr "Cambiando el idioma de la aplicación"
msgid "Select the language" msgid "Select the language"
msgstr "Seleccionar el idioma" msgstr "Seleccionar el idioma"
@@ -4729,6 +4727,9 @@ msgstr ""
"Sí - Cambiar estos ajustes y activar el modo espiral automáticamente\n" "Sí - Cambiar estos ajustes y activar el modo espiral automáticamente\n"
"No - Dejar de usar el modo espiral esta vez" "No - Dejar de usar el modo espiral esta vez"
msgid "N/A"
msgstr "N/A"
msgid "Printing" msgid "Printing"
msgstr "Imprimiendo" msgstr "Imprimiendo"
@@ -5154,13 +5155,9 @@ msgstr "El valor %s está fuera de rango. El rango válido es de %d a %d."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"¿Es %s%% o %s %s?\n" "¿Es %s%% o %s %s?"
"SÍ para %s%%, \n"
"NO para %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5182,9 +5179,6 @@ msgstr "Patrón inválido. Use N, N#K, o una lista separada por comas con #K opc
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Formato inválido. Formato de vector esperado: \"%1%\"" msgstr "Formato inválido. Formato de vector esperado: \"%1%\""
msgid "N/A"
msgstr "N/A"
msgid "System agents" msgid "System agents"
msgstr "Agentes del sistema" msgstr "Agentes del sistema"
@@ -6129,6 +6123,12 @@ msgstr "Guardar proyecto como"
msgid "Save current project as" msgid "Save current project as"
msgstr "Guardar el proyecto actual como" msgstr "Guardar el proyecto actual como"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importar 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importar 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -7910,6 +7910,12 @@ msgstr "¡Por favor, confirme que el G-Code dentro de los perfiles son seguros p
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Perfil Personalizado" msgstr "Perfil Personalizado"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "¡El nombre de los componentes dentro del archivo de pasos no tiene formato UTF-8!" msgstr "¡El nombre de los componentes dentro del archivo de pasos no tiene formato UTF-8!"
@@ -8305,6 +8311,17 @@ msgstr "Guardar el archivo laminado como:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "El archivo %s ha sido mandado al almacenamiento de la impresora y puede ser visualizado en la impresora." msgstr "El archivo %s ha sido mandado al almacenamiento de la impresora y puede ser visualizado en la impresora."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Publicar"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "El tipo de boquilla no está establecido. Configure la boquilla e inténtelo de nuevo." msgstr "El tipo de boquilla no está establecido. Configure la boquilla e inténtelo de nuevo."
@@ -8506,8 +8523,6 @@ msgstr "¿Quieres continuar?"
msgid "Language selection" msgid "Language selection"
msgstr "Selección de idiomas" msgstr "Selección de idiomas"
msgid "Switching application language while some presets are modified."
msgstr "Cambiando idioma de la aplicación mientras se modifican algunos perfiles."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Asia-Pacífico" msgstr "Asia-Pacífico"
@@ -9419,9 +9434,6 @@ msgstr "Ir a la página web de publicación de modelos"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Nota: La preparación puede llevar varios minutos. Por favor, sea paciente." msgstr "Nota: La preparación puede llevar varios minutos. Por favor, sea paciente."
msgid "Publish"
msgstr "Publicar"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "La publicación fue cancelada" msgstr "La publicación fue cancelada"
@@ -9437,6 +9449,64 @@ msgstr "Cargando datos"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Ir a la página web" msgstr "Ir a la página web"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Guardar %s como" msgstr "Guardar %s como"
@@ -20409,6 +20479,15 @@ msgstr "Esta acción no se puede deshacer. ¿Continuar?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Omitiendo objetos." msgstr "Omitiendo objetos."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Seleccionar Filamento" msgstr "Seleccionar Filamento"
+96 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-07-20 13:33+0200\n" "PO-Revision-Date: 2026-07-20 13:33+0200\n"
"Last-Translator: Manu Goiogana <mgoiogana@gmail.com>\n" "Last-Translator: Manu Goiogana <mgoiogana@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2390,8 +2390,6 @@ msgstr "Eguneratze bat dago erabilgarri. Ireki aurrezarpen-paketeen elkarrizketa
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s kendu da." msgstr "%s kendu da."
msgid "Switching application language"
msgstr "Aplikazioaren hizkuntza aldatzen"
msgid "Select the language" msgid "Select the language"
msgstr "Hautatu hizkuntza" msgstr "Hautatu hizkuntza"
@@ -4771,6 +4769,9 @@ msgstr ""
"Bai - Aldatu ezarpen hauek eta gaitu espiral/loreontzi modua automatikoki\n" "Bai - Aldatu ezarpen hauek eta gaitu espiral/loreontzi modua automatikoki\n"
"Ez - Utzi bertan behera espiral modua gaitzea" "Ez - Utzi bertan behera espiral modua gaitzea"
msgid "N/A"
msgstr "N/A"
msgid "Printing" msgid "Printing"
msgstr "Inprimatzen" msgstr "Inprimatzen"
@@ -5202,13 +5203,9 @@ msgstr "%s balioa tartetik kanpo dago. Baliozko tartea %d eta %d artekoa da."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"%s%% edo %s %s da?\n" "%s%% edo %s %s da?"
"BAI %s%%-(r)entzat,\n"
"EZ %s %s-(r)entzat."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5231,9 +5228,6 @@ msgstr "Patroi baliogabea. Erabili N, N#K edo komaz bereizitako zerrenda bat, sa
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Formatuak ez du balio. Espero den formatu bektoriala: \"%1%\"" msgstr "Formatuak ez du balio. Espero den formatu bektoriala: \"%1%\""
msgid "N/A"
msgstr "N/A"
msgid "System agents" msgid "System agents"
msgstr "Sistema-agenteak" msgstr "Sistema-agenteak"
@@ -6175,6 +6169,12 @@ msgstr "Gorde proiektua honela"
msgid "Save current project as" msgid "Save current project as"
msgstr "Gorde uneko proiektua honela" msgstr "Gorde uneko proiektua honela"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Inportatu 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Inportatu 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -7988,6 +7988,12 @@ msgstr "Berretsi aurrezarpen hauetako G-codea segurua dela, makinari kalterik ez
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Aurrezarpen pertsonalizatua" msgstr "Aurrezarpen pertsonalizatua"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "STEP fitxategiko osagai-izena(k) ez dago/daude UTF-8 formatuan!" msgstr "STEP fitxategiko osagai-izena(k) ez dago/daude UTF-8 formatuan!"
@@ -8388,6 +8394,17 @@ msgstr "Gorde xerratutako fitxategia honela:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "%s fitxategia inprimagailuaren biltegiratze-eremura bidali da eta inprimagailuan ikus daiteke." msgstr "%s fitxategia inprimagailuaren biltegiratze-eremura bidali da eta inprimagailuan ikus daiteke."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Argitaratu"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Pita mota ez dago ezarrita. Ezarri pita eta saiatu berriro." msgstr "Pita mota ez dago ezarrita. Ezarri pita eta saiatu berriro."
@@ -8587,8 +8604,6 @@ msgstr "Jarraitu nahi duzu?"
msgid "Language selection" msgid "Language selection"
msgstr "Hizkuntza-hautaketa" msgstr "Hizkuntza-hautaketa"
msgid "Switching application language while some presets are modified."
msgstr "Aplikazioaren hizkuntza aldatzen ari da aurrezarpen batzuk aldatuta dauden bitartean."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Asia-Pazifikoa" msgstr "Asia-Pazifikoa"
@@ -9505,9 +9520,6 @@ msgstr "Joan modeloa argitaratzeko web-orrira"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Oharra: prestaketak minutu batzuk iraun ditzake. Izan pazientzia." msgstr "Oharra: prestaketak minutu batzuk iraun ditzake. Izan pazientzia."
msgid "Publish"
msgstr "Argitaratu"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Argitaratzea bertan behera utzi da" msgstr "Argitaratzea bertan behera utzi da"
@@ -9523,6 +9535,64 @@ msgstr "Datuak igotzen"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Joan web-orrira" msgstr "Joan web-orrira"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Gorde %s honela" msgstr "Gorde %s honela"
@@ -20596,6 +20666,15 @@ msgstr "Ekintza hau ezin da desegin. Jarraitu?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Objektuak saltatzen." msgstr "Objektuak saltatzen."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Hautatu filamentua" msgstr "Hautatu filamentua"
+96 -17
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Guislain Cyril, Thomas Lété\n" "Language-Team: Guislain Cyril, Thomas Lété\n"
@@ -2414,8 +2414,6 @@ msgstr "Une mise à jour est disponible. Ouvrez la boîte de dialogue du paquet
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s a été supprimé." msgstr "%s a été supprimé."
msgid "Switching application language"
msgstr "Changer la langue de l'application"
msgid "Select the language" msgid "Select the language"
msgstr "Sélectionner la langue" msgstr "Sélectionner la langue"
@@ -4809,6 +4807,9 @@ msgstr ""
"Oui - Modifiez ces paramètres et activez automatiquement le mode spirale/vase\n" "Oui - Modifiez ces paramètres et activez automatiquement le mode spirale/vase\n"
"Non - Annuler l'activation du mode spirale" "Non - Annuler l'activation du mode spirale"
msgid "N/A"
msgstr "N/A"
msgid "Printing" msgid "Printing"
msgstr "Impression" msgstr "Impression"
@@ -5240,13 +5241,9 @@ msgstr "La valeur %s est hors plage. La plage valide est comprise entre %d et %d
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Est-ce %s%% ou %s %s ?\n" "Est-ce %s%% ou %s %s ?"
"OUI pour %s%%, \n"
"NON pour %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5268,9 +5265,6 @@ msgstr "Motif invalide. Utilisez N, N#K, ou une liste séparée par des virgules
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Format invalide. Format vectoriel attendu : \"%1%\"" msgstr "Format invalide. Format vectoriel attendu : \"%1%\""
msgid "N/A"
msgstr "N/A"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Agents système" msgstr "Agents système"
@@ -6223,6 +6217,12 @@ msgstr "Enregistrer le projet sous"
msgid "Save current project as" msgid "Save current project as"
msgstr "Enregistrer le projet actuel sous" msgstr "Enregistrer le projet actuel sous"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importer des fichiers 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importer des fichiers 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8044,6 +8044,12 @@ msgstr "Veuillez vous assurer que les G-codes de ces préréglages sont sûrs af
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Préréglage personnalisé" msgstr "Préréglage personnalisé"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Le nom des composants dans le fichier STEP n'est pas au format UTF-8 !" msgstr "Le nom des composants dans le fichier STEP n'est pas au format UTF-8 !"
@@ -8445,6 +8451,17 @@ msgstr "Enregistrer le fichier découpé sous :"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Le fichier %s a été envoyé vers l'espace de stockage de l'imprimante et peut être visualisé sur l'imprimante." msgstr "Le fichier %s a été envoyé vers l'espace de stockage de l'imprimante et peut être visualisé sur l'imprimante."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Publier"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Le type de buse n'est pas défini. Veuillez définir la buse et réessayer." msgstr "Le type de buse n'est pas défini. Veuillez définir la buse et réessayer."
@@ -8655,8 +8672,6 @@ msgstr "Voulez-vous continuer ?"
msgid "Language selection" msgid "Language selection"
msgstr "Sélection de la langue" msgstr "Sélection de la langue"
msgid "Switching application language while some presets are modified."
msgstr "Changement de langue de lapplication alors que certains préréglages sont modifiés."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Asie-Pacifique" msgstr "Asie-Pacifique"
@@ -9576,9 +9591,6 @@ msgstr "Accéder à la page internet de publication des modèles"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Remarque : La préparation peut prendre plusieurs minutes. Veuillez patienter." msgstr "Remarque : La préparation peut prendre plusieurs minutes. Veuillez patienter."
msgid "Publish"
msgstr "Publier"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "La publication a été annulée" msgstr "La publication a été annulée"
@@ -9594,6 +9606,64 @@ msgstr "Téléversement des données"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Ouvrir la page internet" msgstr "Ouvrir la page internet"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Enregistrer %s sous" msgstr "Enregistrer %s sous"
@@ -20708,6 +20778,15 @@ msgstr "Cette action ne peut pas être annulée. Continuer ?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Ignorer des objets." msgstr "Ignorer des objets."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Sélectionner le filament" msgstr "Sélectionner le filament"
+97 -18
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"Language: hu\n" "Language: hu\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -2460,8 +2460,6 @@ msgstr "Frissítés érhető el. Nyisd meg a beállításcsomag párbeszédablak
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s eltávolítva." msgstr "%s eltávolítva."
msgid "Switching application language"
msgstr "Alkalmazás nyelvének váltása"
msgid "Select the language" msgid "Select the language"
msgstr "Válaszd ki a nyelvet" msgstr "Válaszd ki a nyelvet"
@@ -4905,6 +4903,10 @@ msgstr ""
"Igen - Módosítsd ezeket a beállításokat, és automatikusan kapcsold be a spirál módot\n" "Igen - Módosítsd ezeket a beállításokat, és automatikusan kapcsold be a spirál módot\n"
"Nem - Most ne kapcsold be a spirál módot" "Nem - Most ne kapcsold be a spirál módot"
# AI Translated
msgid "N/A"
msgstr "N/A"
msgid "Printing" msgid "Printing"
msgstr "Nyomtatás" msgstr "Nyomtatás"
@@ -5336,13 +5338,9 @@ msgstr "%s érték tartományon kívül van. Az érvényes tartomány: %d - %d."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"%s%% vagy %s %s?\n" "%s%% vagy %s %s?"
"IGEN %s%%, \n"
"NEM %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5364,10 +5362,6 @@ msgstr "Érvénytelen minta. Használj N, N#K formátumot, vagy vesszővel elvá
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Érvénytelen formátum. Elvárt vektor formátum: \"%1%\"" msgstr "Érvénytelen formátum. Elvárt vektor formátum: \"%1%\""
# AI Translated
msgid "N/A"
msgstr "N/A"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Rendszerügynökök" msgstr "Rendszerügynökök"
@@ -6325,6 +6319,12 @@ msgstr "Projekt mentése másként"
msgid "Save current project as" msgid "Save current project as"
msgstr "Jelenlegi projekt mentése másként" msgstr "Jelenlegi projekt mentése másként"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importálás 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importálás 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8159,6 +8159,12 @@ msgstr "Kérlek, győződj meg arról, hogy a beállításokban található G-k
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Egyedi beállítás" msgstr "Egyedi beállítás"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "A STEP fájlon belüli komponens neve nem UTF-8 formátumban van!" msgstr "A STEP fájlon belüli komponens neve nem UTF-8 formátumban van!"
@@ -8571,6 +8577,17 @@ msgstr "Szeletelt fájl mentése mint:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "A(z) %s fájlt elküldtük a nyomtató tárhelyére. A fájl a nyomtatón tekinthető meg." msgstr "A(z) %s fájlt elküldtük a nyomtató tárhelyére. A fájl a nyomtatón tekinthető meg."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Közzététel"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "A fúvókatípus nincs beállítva. Állítsd be a fúvókát, majd próbáld újra." msgstr "A fúvókatípus nincs beállítva. Állítsd be a fúvókát, majd próbáld újra."
@@ -8783,8 +8800,6 @@ msgstr "Szeretnéd folytatni?"
msgid "Language selection" msgid "Language selection"
msgstr "Nyelv kiválasztása" msgstr "Nyelv kiválasztása"
msgid "Switching application language while some presets are modified."
msgstr "Alkalmazás nyelvének átváltása, miközben egyes beállítások módosultak."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Ázsia-Csendes-óceáni térség" msgstr "Ázsia-Csendes-óceáni térség"
@@ -9736,9 +9751,6 @@ msgstr "Ugrás a modell közzététele weboldalra"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Megjegyzés: Az előkészítés több percig is eltarthat. Kérlek, várj." msgstr "Megjegyzés: Az előkészítés több percig is eltarthat. Kérlek, várj."
msgid "Publish"
msgstr "Közzététel"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "A közzététel törlésre került" msgstr "A közzététel törlésre került"
@@ -9754,6 +9766,64 @@ msgstr "Adatok feltöltése"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Ugrás a weboldalra" msgstr "Ugrás a weboldalra"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "%s mentése" msgstr "%s mentése"
@@ -21110,6 +21180,15 @@ msgstr "Ez a művelet nem vonható vissza. Folytatod?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Objektumok kihagyása." msgstr "Objektumok kihagyása."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Filament kiválasztása" msgstr "Filament kiválasztása"
+96 -17
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -2466,8 +2466,6 @@ msgstr "È disponibile un aggiornamento. Apri la finestra di dialogo del bundle
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s è stato rimosso." msgstr "%s è stato rimosso."
msgid "Switching application language"
msgstr "Cambio lingua applicazione"
msgid "Select the language" msgid "Select the language"
msgstr "Seleziona la lingua" msgstr "Seleziona la lingua"
@@ -4907,6 +4905,9 @@ msgstr ""
"Sì - Modifica queste impostazioni ed abilita la modalità spirale automaticamente\n" "Sì - Modifica queste impostazioni ed abilita la modalità spirale automaticamente\n"
"No - Annulla l'attivazione della modalità a spirale" "No - Annulla l'attivazione della modalità a spirale"
msgid "N/A"
msgstr "N/D"
msgid "Printing" msgid "Printing"
msgstr "Stampa" msgstr "Stampa"
@@ -5338,13 +5339,9 @@ msgstr "Il valore %s è fuori intervallo. L'intervallo valido è da %d a %d."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"È %s%% o %s %s?\n" "È %s%% o %s %s?"
"Sì per %s%%, \n"
"NO per %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5366,9 +5363,6 @@ msgstr "Schema non valido. Utilizzare N, N#K o un elenco separato da virgole con
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Formato non valido. Formato vettoriale previsto: \"%1%\"" msgstr "Formato non valido. Formato vettoriale previsto: \"%1%\""
msgid "N/A"
msgstr "N/D"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Agenti di sistema" msgstr "Agenti di sistema"
@@ -6327,6 +6321,12 @@ msgstr "Salva progetto con nome"
msgid "Save current project as" msgid "Save current project as"
msgstr "Salva progetto corrente con nome" msgstr "Salva progetto corrente con nome"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importa 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importa 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8163,6 +8163,12 @@ msgstr "Si prega di confermare che i G-code all'interno di questi profili sono s
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Profilo personalizzato" msgstr "Profilo personalizzato"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Il nome dei componenti all'interno del file STEP non è in formato UTF-8!" msgstr "Il nome dei componenti all'interno del file STEP non è in formato UTF-8!"
@@ -8570,6 +8576,17 @@ msgstr "Salva file elaborato con nome:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Il file %s è stato inviato alla memoria della stampante e può essere visualizzato da lì." msgstr "Il file %s è stato inviato alla memoria della stampante e può essere visualizzato da lì."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Pubblica"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Il tipo di ugello non è impostato. Impostare l'ugello e riprovare." msgstr "Il tipo di ugello non è impostato. Impostare l'ugello e riprovare."
@@ -8784,8 +8801,6 @@ msgstr "Vuoi continuare?"
msgid "Language selection" msgid "Language selection"
msgstr "Selezione lingua" msgstr "Selezione lingua"
msgid "Switching application language while some presets are modified."
msgstr "Cambio lingua applicazione durante la modifica di alcuni profili."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Asia-Pacifico" msgstr "Asia-Pacifico"
@@ -9754,9 +9769,6 @@ msgstr "Vai alla pagina web di pubblicazione del modello"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Nota: la preparazione può richiedere alcuni minuti. Si prega di avere pazienza." msgstr "Nota: la preparazione può richiedere alcuni minuti. Si prega di avere pazienza."
msgid "Publish"
msgstr "Pubblica"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "La pubblicazione è stata annullata" msgstr "La pubblicazione è stata annullata"
@@ -9772,6 +9784,64 @@ msgstr "Caricamento dati"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Vai alla pagina web" msgstr "Vai alla pagina web"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Salva %s con nome" msgstr "Salva %s con nome"
@@ -21134,6 +21204,15 @@ msgstr "Questa azione non può essere annullata. Continuare?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Salto degli oggetti." msgstr "Salto degli oggetti."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Seleziona filamento" msgstr "Seleziona filamento"
+97 -17
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -2473,8 +2473,6 @@ msgstr "アップデートが利用可能です。プリセットバンドルの
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%sを削除しました。" msgstr "%sを削除しました。"
msgid "Switching application language"
msgstr "アプリケーション言語の切り替え"
msgid "Select the language" msgid "Select the language"
msgstr "言語を選択" msgstr "言語を選択"
@@ -4920,6 +4918,10 @@ msgstr ""
"はい - 変更して、スパイラルモードを有効にします\n" "はい - 変更して、スパイラルモードを有効にします\n"
"いいえ - 変更せず、スパイラルモードを有効しません" "いいえ - 変更せず、スパイラルモードを有効しません"
# AI Translated
msgid "N/A"
msgstr "N/A"
msgid "Printing" msgid "Printing"
msgstr "造形中" msgstr "造形中"
@@ -5351,12 +5353,9 @@ msgstr "値%sは範囲外です。有効な範囲は%dから%dです。"
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"%s%% か、それとも %s %sですか?\n" "%s%% か、それとも %s %sですか?"
"%s%% の場合ははい、 %s %s はいいえ。"
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5378,10 +5377,6 @@ msgstr "無効なパターンです。N、N#K、またはオプション#K付き
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "無効なフォーマット、%1%であるはずです。" msgstr "無効なフォーマット、%1%であるはずです。"
# AI Translated
msgid "N/A"
msgstr "N/A"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "システムエージェント" msgstr "システムエージェント"
@@ -6336,6 +6331,12 @@ msgstr "プロジェクトを名前を付けて保存"
msgid "Save current project as" msgid "Save current project as"
msgstr "プロジェクトを名前を付けて保存" msgstr "プロジェクトを名前を付けて保存"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "3MF/STL/STEP/SVG/OBJ/AMFをインポート" msgstr "3MF/STL/STEP/SVG/OBJ/AMFをインポート"
@@ -8177,6 +8178,12 @@ msgstr "これらのプリセット内のG-codeがマシンに損傷を与えな
msgid "Customized Preset" msgid "Customized Preset"
msgstr "カスタマイズされたプリセット" msgstr "カスタマイズされたプリセット"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "ファイルのエンコーディング方式はUTF-8形式ではありません" msgstr "ファイルのエンコーディング方式はUTF-8形式ではありません"
@@ -8589,6 +8596,17 @@ msgstr "名前を付けて保存:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "%sを送信しました、プリンターにて確認できます" msgstr "%sを送信しました、プリンターにて確認できます"
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "公開する"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "ノズルタイプが設定されていません。ノズルを設定して再試行してください。" msgstr "ノズルタイプが設定されていません。ノズルを設定して再試行してください。"
@@ -8802,8 +8820,6 @@ msgstr "続行しますか?"
msgid "Language selection" msgid "Language selection"
msgstr "言語選択" msgstr "言語選択"
msgid "Switching application language while some presets are modified."
msgstr "アプリケーション言語を切り替える時に、プリセットの変更があります"
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "アジア太平洋地域" msgstr "アジア太平洋地域"
@@ -9776,9 +9792,6 @@ msgstr "モデル公開ページに移動"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "注意: 準備するには数分かかる場合があります、暫くお待ち下さい。" msgstr "注意: 準備するには数分かかる場合があります、暫くお待ち下さい。"
msgid "Publish"
msgstr "公開する"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "公開は取り消しました" msgstr "公開は取り消しました"
@@ -9794,6 +9807,64 @@ msgstr "データをアップロード中"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "ウェブページに移動" msgstr "ウェブページに移動"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "%sを名前つけて保存" msgstr "%sを名前つけて保存"
@@ -21678,6 +21749,15 @@ msgstr "この操作は元に戻せません。続行しますか?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "オブジェクトをスキップ中。" msgstr "オブジェクトをスキップ中。"
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "フィラメントを選択" msgstr "フィラメントを選択"
+97 -18
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2025-06-02 17:12+0900\n" "PO-Revision-Date: 2025-06-02 17:12+0900\n"
"Last-Translator: crwusiz <crwusiz@gmail.com>\n" "Last-Translator: crwusiz <crwusiz@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2481,8 +2481,6 @@ msgstr "사용 가능한 업데이트가 있습니다. 사전 설정 번들 대
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s이(가) 제거되었습니다." msgstr "%s이(가) 제거되었습니다."
msgid "Switching application language"
msgstr "응용 프로그램 언어 전환"
msgid "Select the language" msgid "Select the language"
msgstr "언어 선택" msgstr "언어 선택"
@@ -4931,6 +4929,10 @@ msgstr ""
"예 - 이 설정을 변경하고 나선 모드를 자동으로 활성화합니다\n" "예 - 이 설정을 변경하고 나선 모드를 자동으로 활성화합니다\n"
"아니오 - 이번에는 나선 모드 사용을 포기합니다" "아니오 - 이번에는 나선 모드 사용을 포기합니다"
# AI Translated
msgid "N/A"
msgstr "해당 없음"
msgid "Printing" msgid "Printing"
msgstr "출력 중" msgstr "출력 중"
@@ -5362,13 +5364,9 @@ msgstr "값 %s이 범위를 벗어났습니다. 유효한 범위는 %d에서 %d
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"%s%% 또는 %s %s입니까?\n" "%s%% 또는 %s %s입니까?"
"%s%%에 대해 예,\n"
"%s %s에 대해 아니요."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5390,10 +5388,6 @@ msgstr "잘못된 패턴입니다. N, N#K 또는 항목당 선택적 #K가 있
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "잘못된 형식입니다. 필요한 벡터 형식: \"%1%\"" msgstr "잘못된 형식입니다. 필요한 벡터 형식: \"%1%\""
# AI Translated
msgid "N/A"
msgstr "해당 없음"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "시스템 에이전트" msgstr "시스템 에이전트"
@@ -6350,6 +6344,12 @@ msgstr "프로젝트 다른 이름으로 저장"
msgid "Save current project as" msgid "Save current project as"
msgstr "현재 프로젝트 다른 이름으로 저장" msgstr "현재 프로젝트 다른 이름으로 저장"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "3MF/STL/STEP/SVG/OBJ/AMF 가져오기" msgstr "3MF/STL/STEP/SVG/OBJ/AMF 가져오기"
@@ -8195,6 +8195,12 @@ msgstr "이러한 사전 설정 내의 Gcode가 기계 손상을 방지할 수
msgid "Customized Preset" msgid "Customized Preset"
msgstr "사용자 정의 프리셋" msgstr "사용자 정의 프리셋"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
# AI Translated # AI Translated
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "STEP 파일 내부의 구성 요소 이름이 UTF-8 형식이 아닙니다!" msgstr "STEP 파일 내부의 구성 요소 이름이 UTF-8 형식이 아닙니다!"
@@ -8622,6 +8628,17 @@ msgstr "슬라이스 파일을 다음으로 저장:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "%s 파일이 프린터의 저장 공간으로 전송되었으며 프린터에서 볼 수 있습니다." msgstr "%s 파일이 프린터의 저장 공간으로 전송되었으며 프린터에서 볼 수 있습니다."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "게시"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "노즐 유형이 설정되지 않았습니다. 노즐을 설정하고 다시 시도하세요." msgstr "노즐 유형이 설정되지 않았습니다. 노즐을 설정하고 다시 시도하세요."
@@ -8837,8 +8854,6 @@ msgstr "계속하시겠습니까?"
msgid "Language selection" msgid "Language selection"
msgstr "언어 선택" msgstr "언어 선택"
msgid "Switching application language while some presets are modified."
msgstr "일부 사전 설정이 수정되는 동안 응용 프로그램 언어를 전환합니다."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "아시아 태평양" msgstr "아시아 태평양"
@@ -9865,9 +9880,6 @@ msgstr "모델 게시 웹 페이지로 이동"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "참고: 준비하는 데 몇 분 정도 걸릴 수 있습니다. 조금만 기다려 주십시오." msgstr "참고: 준비하는 데 몇 분 정도 걸릴 수 있습니다. 조금만 기다려 주십시오."
msgid "Publish"
msgstr "게시"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "게시가 취소되었습니다" msgstr "게시가 취소되었습니다"
@@ -9884,6 +9896,64 @@ msgstr "데이터 업로드 중"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "웹 페이지로 이동" msgstr "웹 페이지로 이동"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "%s을(를) 다음으로 저장" msgstr "%s을(를) 다음으로 저장"
@@ -21536,6 +21606,15 @@ msgstr "이 작업은 취소할 수 없습니다. 계속하시겠습니까?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "물체 건너뛰기" msgstr "물체 건너뛰기"
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "필라멘트 선택" msgstr "필라멘트 선택"
+2
View File
@@ -136,6 +136,7 @@ src/slic3r/GUI/BackgroundSlicingProcess.cpp
src/slic3r/GUI/BedShapeDialog.cpp src/slic3r/GUI/BedShapeDialog.cpp
src/slic3r/GUI/BedShapeDialog.hpp src/slic3r/GUI/BedShapeDialog.hpp
src/slic3r/GUI/ConfigManipulation.cpp src/slic3r/GUI/ConfigManipulation.cpp
src/slic3r/GUI/ConfigValueFormatter.cpp
src/slic3r/GUI/DeviceManager.cpp src/slic3r/GUI/DeviceManager.cpp
src/slic3r/GUI/DeviceErrorDialog.cpp src/slic3r/GUI/DeviceErrorDialog.cpp
src/slic3r/GUI/ExtraRenderers.cpp src/slic3r/GUI/ExtraRenderers.cpp
@@ -175,6 +176,7 @@ src/slic3r/GUI/ProgressStatusBar.cpp
src/slic3r/GUI/PlateSettingsDialog.cpp src/slic3r/GUI/PlateSettingsDialog.cpp
src/slic3r/GUI/PrivacyUpdateDialog.cpp src/slic3r/GUI/PrivacyUpdateDialog.cpp
src/slic3r/GUI/PublishDialog.cpp src/slic3r/GUI/PublishDialog.cpp
src/slic3r/GUI/PublishSettingsDialog.cpp
src/slic3r/GUI/SavePresetDialog.cpp src/slic3r/GUI/SavePresetDialog.cpp
src/slic3r/GUI/Search.cpp src/slic3r/GUI/Search.cpp
src/slic3r/GUI/Selection.cpp src/slic3r/GUI/Selection.cpp
+96 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-07-02 14:13+0300\n" "PO-Revision-Date: 2026-07-02 14:13+0300\n"
"Last-Translator: Gintaras Kučinskas <sharanchius@gmail.com>\n" "Last-Translator: Gintaras Kučinskas <sharanchius@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2449,8 +2449,6 @@ msgstr "Yra prieinamas atnaujinimas. Atidarykite profilių paketo dialogo langą
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s buvo pašalintas." msgstr "%s buvo pašalintas."
msgid "Switching application language"
msgstr "Perjungiama programos kalba"
msgid "Select the language" msgid "Select the language"
msgstr "Pasirinkite kalbą" msgstr "Pasirinkite kalbą"
@@ -4893,6 +4891,9 @@ msgstr ""
"Taip pakeisti šiuos nustatymus ir automatiškai įjungti spiralinį režimą\n" "Taip pakeisti šiuos nustatymus ir automatiškai įjungti spiralinį režimą\n"
"Ne nenaudoti spiralinio režimo" "Ne nenaudoti spiralinio režimo"
msgid "N/A"
msgstr "N/A"
msgid "Printing" msgid "Printing"
msgstr "Spausdinimas" msgstr "Spausdinimas"
@@ -5324,13 +5325,9 @@ msgstr "Reikšmė %s yra už ribų. Galimas diapazonas yra nuo %d iki %d."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Ar tai %s%% ar %s %s?\n" "Ar tai %s%% ar %s %s?"
"TAIP %s%%, \n"
"NE %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5352,9 +5349,6 @@ msgstr "Neteisingas šablonas. Naudokite N, N#K arba kableliais atskirtą sąra
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Netinkamas formatas. Tinkamas vektorinis formatas: \"%1%\"" msgstr "Netinkamas formatas. Tinkamas vektorinis formatas: \"%1%\""
msgid "N/A"
msgstr "N/A"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Sisteminiai agentai" msgstr "Sisteminiai agentai"
@@ -6312,6 +6306,12 @@ msgstr "Įrašyti projektą kaip"
msgid "Save current project as" msgid "Save current project as"
msgstr "Įrašyti dabartinį projektą kaip" msgstr "Įrašyti dabartinį projektą kaip"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importuoti 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importuoti 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8153,6 +8153,12 @@ msgstr "Patvirtinkite, kad šiuose profiliuose esantis G-kodas yra saugus, kad i
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Pritaikytas profilis" msgstr "Pritaikytas profilis"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Komponentų pavadinimai STEP faile nėra UTF-8 formato!" msgstr "Komponentų pavadinimai STEP faile nėra UTF-8 formato!"
@@ -8564,6 +8570,17 @@ msgstr "Išsaugoti susluoksniuotą failą kaip:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Failas %s išsiųstas į spausdintuvo laikmeną ir gali būti peržiūrimas spausdintuve." msgstr "Failas %s išsiųstas į spausdintuvo laikmeną ir gali būti peržiūrimas spausdintuve."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Talpinti"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Purkštuko tipas nenustatytas. Nustatykite purkštuką ir bandykite dar kartą." msgstr "Purkštuko tipas nenustatytas. Nustatykite purkštuką ir bandykite dar kartą."
@@ -8774,8 +8791,6 @@ msgstr "Ar norite tęsti?"
msgid "Language selection" msgid "Language selection"
msgstr "Kalbos pasirinkimas" msgstr "Kalbos pasirinkimas"
msgid "Switching application language while some presets are modified."
msgstr "Keičiama programos kalba, kai yra pakeistų profilių."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Azija-Ramusis vandenynas" msgstr "Azija-Ramusis vandenynas"
@@ -9693,9 +9708,6 @@ msgstr "Pereiti į modelio talpinimo interneto puslapį"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Pastaba: paruošimas gali užtrukti kelias minutes. Būkite kantrūs." msgstr "Pastaba: paruošimas gali užtrukti kelias minutes. Būkite kantrūs."
msgid "Publish"
msgstr "Talpinti"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Publikavimas buvo atšauktas" msgstr "Publikavimas buvo atšauktas"
@@ -9711,6 +9723,64 @@ msgstr "Įkeliami duomenys"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Pereiti į interneto puslapį" msgstr "Pereiti į interneto puslapį"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Išsaugoti %s kaip" msgstr "Išsaugoti %s kaip"
@@ -20865,6 +20935,15 @@ msgstr "Šio veiksmo atšaukti nebus galima. Tęsti?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Praleidžiami objektai." msgstr "Praleidžiami objektai."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Pasirinkti giją" msgstr "Pasirinkti giją"
+96 -17
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
@@ -2679,8 +2679,6 @@ msgstr "Er is een update beschikbaar. Open het dialoogvenster voor de voorinstel
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s is verwijderd." msgstr "%s is verwijderd."
msgid "Switching application language"
msgstr "De taal van de applicatie wordt aangepast"
msgid "Select the language" msgid "Select the language"
msgstr "Kies de taal" msgstr "Kies de taal"
@@ -5325,6 +5323,9 @@ msgstr ""
"Ja - Pas de instellingen aan en zet de vaas modus automatisch aan\n" "Ja - Pas de instellingen aan en zet de vaas modus automatisch aan\n"
"Nee - Pas de vaas modus deze keer niet toe" "Nee - Pas de vaas modus deze keer niet toe"
msgid "N/A"
msgstr "N/B"
msgid "Printing" msgid "Printing"
msgstr "Printen" msgstr "Printen"
@@ -5830,13 +5831,9 @@ msgstr "Waarde %s valt buiten het bereik. Het geldige bereik loopt van %d tot %d
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Is het %s%% or %s %s?\n" "Is het %s%% or %s %s?"
"JA voor %s%%, \n"
"NEE voor %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5861,9 +5858,6 @@ msgstr "Ongeldig patroon. Gebruik N, N#K of een door komma's gescheiden lijst me
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Onjuist formaat. Het Vector formaat wordt verwacht: \"%1%\"" msgstr "Onjuist formaat. Het Vector formaat wordt verwacht: \"%1%\""
msgid "N/A"
msgstr "N/B"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Systeemagenten" msgstr "Systeemagenten"
@@ -6888,6 +6882,12 @@ msgstr "Bewaar project als"
msgid "Save current project as" msgid "Save current project as"
msgstr "Bewaar huidig project als" msgstr "Bewaar huidig project als"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "3MF/STL/STEP/SVG/OBJ/AMF importeren" msgstr "3MF/STL/STEP/SVG/OBJ/AMF importeren"
@@ -8904,6 +8904,12 @@ msgstr "Controleer of de G-codes in deze presets veilig zijn om schade aan de ma
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Aangepaste voorinstelling" msgstr "Aangepaste voorinstelling"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Naam van componenten in step-bestand is niet UTF-8-formaat!" msgstr "Naam van componenten in step-bestand is niet UTF-8-formaat!"
@@ -9339,6 +9345,17 @@ msgstr "Bewaar het geslicede bestand als:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Het bestand %s is naar de opslagruimte van de printer gestuurd en kan op de printer worden bekeken." msgstr "Het bestand %s is naar de opslagruimte van de printer gestuurd en kan op de printer worden bekeken."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Publiceren"
# AI Translated # AI Translated
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Het mondstuktype is niet ingesteld. Stel het mondstuk in en probeer het opnieuw." msgstr "Het mondstuktype is niet ingesteld. Stel het mondstuk in en probeer het opnieuw."
@@ -9579,8 +9596,6 @@ msgstr "Wilt u doorgaan?"
msgid "Language selection" msgid "Language selection"
msgstr "Taal selectie" msgstr "Taal selectie"
msgid "Switching application language while some presets are modified."
msgstr "De taal van de toepassing aanpaasen terwijl sommige voorinstellingen zijn aangepast."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Azië-Pacific" msgstr "Azië-Pacific"
@@ -10626,9 +10641,6 @@ msgstr "Ga naar de website om het model te publiceren"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Notitie: het voorbereiden kan enkele minuten duren. Even geduld alstublieft." msgstr "Notitie: het voorbereiden kan enkele minuten duren. Even geduld alstublieft."
msgid "Publish"
msgstr "Publiceren"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Het publiceren is geannuleerd" msgstr "Het publiceren is geannuleerd"
@@ -10645,6 +10657,64 @@ msgstr "Gegevens uploaden"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Ga naar de website" msgstr "Ga naar de website"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Bewaar %s als" msgstr "Bewaar %s als"
@@ -23245,6 +23315,15 @@ msgstr "Deze actie kan niet ongedaan worden gemaakt. Doorgaan?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Objecten worden overgeslagen." msgstr "Objecten worden overgeslagen."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Selecteer filament" msgstr "Selecteer filament"
+97 -27
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OrcaSlicer 2.3.0-rc\n" "Project-Id-Version: OrcaSlicer 2.3.0-rc\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: Krzysztof Morga <<tlumaczeniebs@gmail.com>>\n" "Last-Translator: Krzysztof Morga <<tlumaczeniebs@gmail.com>>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2512,8 +2512,6 @@ msgstr "Dostępna jest aktualizacja. Otwórz okno pakietu profili, aby ją zains
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s został usunięty." msgstr "%s został usunięty."
msgid "Switching application language"
msgstr "Zmiana języka aplikacji"
msgid "Select the language" msgid "Select the language"
msgstr "Wybierz język" msgstr "Wybierz język"
@@ -5013,6 +5011,10 @@ msgstr ""
"Tak - Zmień te ustawienia automatycznie i włącz tryb Wazy\n" "Tak - Zmień te ustawienia automatycznie i włącz tryb Wazy\n"
"Nie - Zrezygnuj tym razem z używania trybu Wazy" "Nie - Zrezygnuj tym razem z używania trybu Wazy"
# AI Translated
msgid "N/A"
msgstr "Nie dotyczy"
msgid "Printing" msgid "Printing"
msgstr "Drukowanie" msgstr "Drukowanie"
@@ -5450,13 +5452,9 @@ msgstr "Wartość %s jest spoza zakresu. Poprawny zakres wynosi od %d do %d."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Czy to %s%% czy %s %s?\n" "Czy to %s%% czy %s %s?"
"TAK dla %s%%,\n"
"NIE dla %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5480,10 +5478,6 @@ msgstr "Nieprawidłowy wzorzec. Użyj N, N#K lub listy rozdzielonej przecinkami
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Nieprawidłowy format. Oczekiwano formatu wektorowego: „%1%”" msgstr "Nieprawidłowy format. Oczekiwano formatu wektorowego: „%1%”"
# AI Translated
msgid "N/A"
msgstr "Nie dotyczy"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Agenci systemowi" msgstr "Agenci systemowi"
@@ -6469,6 +6463,12 @@ msgstr "Zapisz projekt jako"
msgid "Save current project as" msgid "Save current project as"
msgstr "Zapisz bieżący projekt jako" msgstr "Zapisz bieżący projekt jako"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importuj 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importuj 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8353,6 +8353,12 @@ msgstr "Proszę potwierdź, że G-code w tych profilach jest bezpieczny, aby zap
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Dostosowany profil" msgstr "Dostosowany profil"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Nazwa komponentów w pliku step nie jest w formacie UTF-8!" msgstr "Nazwa komponentów w pliku step nie jest w formacie UTF-8!"
@@ -8779,6 +8785,17 @@ msgstr "Zapisz plik po wykonaniu cięcia jako:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Plik %s został wysłany do pamięci drukarki i można go obejrzeć na urządzeniu." msgstr "Plik %s został wysłany do pamięci drukarki i można go obejrzeć na urządzeniu."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Opublikuj"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Nie ustawiono typu dyszy Wprowadź ustawienia dyszy i spróbuj ponownie." msgstr "Nie ustawiono typu dyszy Wprowadź ustawienia dyszy i spróbuj ponownie."
@@ -8993,8 +9010,6 @@ msgstr "Czy kontynuować?"
msgid "Language selection" msgid "Language selection"
msgstr "Wybór języka" msgstr "Wybór języka"
msgid "Switching application language while some presets are modified."
msgstr "Zmiana języka aplikacji przy jednoczesnym istniejących zmodyfikowanych ustawieniach."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Azja i Pacyfik" msgstr "Azja i Pacyfik"
@@ -10021,9 +10036,6 @@ msgstr "Przejdź do strony publikacji modelu"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Uwaga: Przygotowanie może zająć kilka minut. Proszę o cierpliwość." msgstr "Uwaga: Przygotowanie może zająć kilka minut. Proszę o cierpliwość."
msgid "Publish"
msgstr "Opublikuj"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Publikacja została anulowana" msgstr "Publikacja została anulowana"
@@ -10040,6 +10052,64 @@ msgstr "Przesyłanie danych"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Przejdź na stronę" msgstr "Przejdź na stronę"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Zapisz %s jako" msgstr "Zapisz %s jako"
@@ -21723,6 +21793,15 @@ msgstr "Tego działania nie będzie można cofnąć. Kontynuować?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Pomijanie obiektów." msgstr "Pomijanie obiektów."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Wybierz filament" msgstr "Wybierz filament"
@@ -25353,15 +25432,6 @@ msgstr ""
#~ msgid "Low-temperature filament (PLA/PETG/TPU) is loaded in the extruder. In order to avoid extruder clogging, it is not allowed to set the chamber temperature above 45℃." #~ msgid "Low-temperature filament (PLA/PETG/TPU) is loaded in the extruder. In order to avoid extruder clogging, it is not allowed to set the chamber temperature above 45℃."
#~ msgstr "W ekstruzorze jest załadowany filament o niskiej temperaturze (PLA/PETG/TPU). Aby uniknąć zatkania ekstruzora, nie wolno ustawiać temperatury komory powyżej 45℃." #~ msgstr "W ekstruzorze jest załadowany filament o niskiej temperaturze (PLA/PETG/TPU). Aby uniknąć zatkania ekstruzora, nie wolno ustawiać temperatury komory powyżej 45℃."
#~ msgid ""
#~ "Is it %s%% or %s %s?\n"
#~ "YES for %s%%,\n"
#~ "NO for %s %s."
#~ msgstr ""
#~ "Czy to %s%% czy %s %s?\n"
#~ "TAK dla %s%%,\n"
#~ "NIE dla %s %s."
#~ msgid "Allow multiple materials on the same plate" #~ msgid "Allow multiple materials on the same plate"
#~ msgstr "Pozwól na kilka filamentów na tej samej płycie" #~ msgstr "Pozwól na kilka filamentów na tej samej płycie"
+136 -127
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-07-26 11:14-0300\n" "PO-Revision-Date: 2026-07-26 11:14-0300\n"
"Last-Translator: Alexandre Folle de Menezes\n" "Last-Translator: Alexandre Folle de Menezes\n"
"Language-Team: Portuguese, Brazilian\n" "Language-Team: Portuguese, Brazilian\n"
@@ -2128,7 +2128,7 @@ msgid ""
"OrcaSlicer has attempted to recreate the configuration file.\n" "OrcaSlicer has attempted to recreate the configuration file.\n"
"Please note, application settings will be lost, but printer profiles will not be affected." "Please note, application settings will be lost, but printer profiles will not be affected."
msgstr "" msgstr ""
"O arquivo de configuração do OrcaSlicer pode estar corrompido e não pode ser analisado.\n" "O arquivo de configuração do OrcaSlicer pode estar corrompido e não pode ser processado.\n"
"O OrcaSlicer tentou recriar o arquivo de configuração.\n" "O OrcaSlicer tentou recriar o arquivo de configuração.\n"
"Por favor, note que as configurações do aplicativo serão perdidas, mas os perfis de impressora não serão afetados." "Por favor, note que as configurações do aplicativo serão perdidas, mas os perfis de impressora não serão afetados."
@@ -2356,8 +2356,6 @@ msgstr "Há uma atualização disponível. Abra a caixa de diálogo do pacote de
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s foi removido." msgstr "%s foi removido."
msgid "Switching application language"
msgstr "Alternando o idioma do aplicativo"
msgid "Select the language" msgid "Select the language"
msgstr "Selecione o idioma" msgstr "Selecione o idioma"
@@ -4743,6 +4741,9 @@ msgstr ""
"Sim - Alterar essas configurações e ativar o modo espiral/vaso automaticamente\n" "Sim - Alterar essas configurações e ativar o modo espiral/vaso automaticamente\n"
"Não - Cancelar ativação do modo espiral" "Não - Cancelar ativação do modo espiral"
msgid "N/A"
msgstr "N/D"
msgid "Printing" msgid "Printing"
msgstr "Imprimindo" msgstr "Imprimindo"
@@ -5168,13 +5169,9 @@ msgstr "Valor %s está fora do intervalo. O intervalo válido é de %d para %d."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"É %s%% ou %s %s?\n" "É %s%% ou %s %s?"
"SIM para %s%%, \n"
"NÃO para %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5196,9 +5193,6 @@ msgstr "Padrão inválido. Use N, N#K, ou uma lista separa por vírgulas com #K
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Formato inválido. Formato de vetor esperado: \"%1%\"" msgstr "Formato inválido. Formato de vetor esperado: \"%1%\""
msgid "N/A"
msgstr "N/D"
msgid "System agents" msgid "System agents"
msgstr "Agentes do sistema" msgstr "Agentes do sistema"
@@ -6145,6 +6139,12 @@ msgstr "Salvar projeto como"
msgid "Save current project as" msgid "Save current project as"
msgstr "Salvar o projeto atual como" msgstr "Salvar o projeto atual como"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importar 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importar 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -6671,7 +6671,7 @@ msgid "Failed to fetch model information from printer."
msgstr "Falha ao obter informação do modelo da impressora." msgstr "Falha ao obter informação do modelo da impressora."
msgid "Failed to parse model information." msgid "Failed to parse model information."
msgstr "Falha ao analisar a informação do modelo." msgstr "Falha ao processar a informação do modelo."
msgid "The .gcode.3mf file contains no G-code data. Please slice it with Orca Slicer and export a new .gcode.3mf file." msgid "The .gcode.3mf file contains no G-code data. Please slice it with Orca Slicer and export a new .gcode.3mf file."
msgstr "O arquivo .gcode.3mf não contém dados de G-code. Por favor, fatie com Orca Slicer e exporte um novo arquivo .gcode.3mf." msgstr "O arquivo .gcode.3mf não contém dados de G-code. Por favor, fatie com Orca Slicer e exporte um novo arquivo .gcode.3mf."
@@ -7941,6 +7941,12 @@ msgstr "Por favor, confirme se o G-code dentro dessas predefinições é seguro
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Predefinição Personalizada" msgstr "Predefinição Personalizada"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Os nomes dos componentes dentro do arquivo STEP não estão no formato UTF-8!" msgstr "Os nomes dos componentes dentro do arquivo STEP não estão no formato UTF-8!"
@@ -8345,6 +8351,17 @@ msgstr "Salvar arquivo fatiado como:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "O arquivo %s foi enviado para o espaço de armazenamento da impressora e pode ser visualizado na impressora." msgstr "O arquivo %s foi enviado para o espaço de armazenamento da impressora e pode ser visualizado na impressora."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Publicar"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "O tipo de bico não está configurado. Configure o bico e tente novamente." msgstr "O tipo de bico não está configurado. Configure o bico e tente novamente."
@@ -8549,8 +8566,6 @@ msgstr "Você deseja continuar?"
msgid "Language selection" msgid "Language selection"
msgstr "Seleção de idioma" msgstr "Seleção de idioma"
msgid "Switching application language while some presets are modified."
msgstr "Alternando idioma do aplicativo enquanto algumas predefinições são modificadas."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Ásia-Pacífico" msgstr "Ásia-Pacífico"
@@ -8618,7 +8633,7 @@ msgstr ""
"\n" "\n"
"Deseja baixar e instalar esta versão agora?\n" "Deseja baixar e instalar esta versão agora?\n"
"\n" "\n"
"Observação: o aplicativo pode precisar ser reiniciado após a instalação." "Nota: o aplicativo pode precisar ser reiniciado após a instalação."
msgid "Download Network Plug-in" msgid "Download Network Plug-in"
msgstr "Baixar Plug-in de Rede" msgstr "Baixar Plug-in de Rede"
@@ -9116,7 +9131,7 @@ msgid ""
"Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud." "Note: When Stealth Mode is enabled, your user profiles will not be backed up to Orca Cloud."
msgstr "" msgstr ""
"Isso desativa todos os recursos da nuvem, incluindo a sincronização de perfis do Orca Cloud. Usuários que preferem trabalhar totalmente offline podem ativar esta opção.\n" "Isso desativa todos os recursos da nuvem, incluindo a sincronização de perfis do Orca Cloud. Usuários que preferem trabalhar totalmente offline podem ativar esta opção.\n"
"Observação: quando o Modo Furtivo está ativado, seus perfis de usuário não serão copiados para o Orca Cloud." "Nota: quando o Modo Furtivo está ativado, seus perfis de usuário não serão copiados para o Orca Cloud."
msgid "Hide login side panel" msgid "Hide login side panel"
msgstr "Ocultar painel lateral de autenticação" msgstr "Ocultar painel lateral de autenticação"
@@ -9478,9 +9493,6 @@ msgstr "Ir para a página web de publicação de modelos"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Nota: A preparação pode levar vários minutos. Por favor, seja paciente." msgstr "Nota: A preparação pode levar vários minutos. Por favor, seja paciente."
msgid "Publish"
msgstr "Publicar"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Publicação cancelada" msgstr "Publicação cancelada"
@@ -9496,6 +9508,64 @@ msgstr "Enviando dados"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Ir para a página web" msgstr "Ir para a página web"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Salvar %s como" msgstr "Salvar %s como"
@@ -9701,7 +9771,6 @@ msgstr "A impressora falhou ao gerar a tabela de mapeamento automático do bico
msgid "The current nozzle mapping may produce an extra %0.2f g of waste." msgid "The current nozzle mapping may produce an extra %0.2f g of waste."
msgstr "O mapeamento de bicos atual pode gerar um desperdício adicional de %0.2f g." msgstr "O mapeamento de bicos atual pode gerar um desperdício adicional de %0.2f g."
# AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "Recommended filament arrangement saves %s->" msgid "Recommended filament arrangement saves %s->"
msgstr "A disposição de filamento recomendada economiza %s->" msgstr "A disposição de filamento recomendada economiza %s->"
@@ -9760,7 +9829,6 @@ msgstr "Este processo determina os valores de fluxo dinâmico para melhorar a qu
msgid "Internal" msgid "Internal"
msgstr "Interno" msgstr "Interno"
# AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "%s space less than 20MB. Timelapse may not save properly. You can turn it off or" msgid "%s space less than 20MB. Timelapse may not save properly. You can turn it off or"
msgstr "%s com espaço inferior a 20MB. O timelapse pode não ser salvo corretamente. Você pode desativá-lo ou" msgstr "%s com espaço inferior a 20MB. O timelapse pode não ser salvo corretamente. Você pode desativá-lo ou"
@@ -9768,15 +9836,12 @@ msgstr "%s com espaço inferior a 20MB. O timelapse pode não ser salvo corretam
msgid "Clean up files" msgid "Clean up files"
msgstr "Limpar arquivos" msgstr "Limpar arquivos"
# AI Translated
msgid "Low internal storage. This timelapse will overwrite the oldest video files." msgid "Low internal storage. This timelapse will overwrite the oldest video files."
msgstr "Armazenamento interno baixo. Este timelapse substituirá os arquivos de vídeo mais antigos." msgstr "Armazenamento interno baixo. Este timelapse substituirá os arquivos de vídeo mais antigos."
# AI Translated
msgid "Low external storage. This timelapse will overwrite the oldest video files." msgid "Low external storage. This timelapse will overwrite the oldest video files."
msgstr "Armazenamento externo baixo. Este timelapse substituirá os arquivos de vídeo mais antigos." msgstr "Armazenamento externo baixo. Este timelapse substituirá os arquivos de vídeo mais antigos."
# AI Translated
msgid "Insufficient external storage for time-lapse photography. Connect to computer to delete files, or use a larger memory card." msgid "Insufficient external storage for time-lapse photography. Connect to computer to delete files, or use a larger memory card."
msgstr "Armazenamento externo insuficiente para fotografia time-lapse. Conecte ao computador para excluir arquivos ou use um cartão de memória maior." msgstr "Armazenamento externo insuficiente para fotografia time-lapse. Conecte ao computador para excluir arquivos ou use um cartão de memória maior."
@@ -9812,7 +9877,6 @@ msgstr "Atualizando informações dos hotends (%d/%d)."
msgid "There are not enough available hotends currently." msgid "There are not enough available hotends currently."
msgstr "Não há hotends disponíveis em quantidade suficiente no momento." msgstr "Não há hotends disponíveis em quantidade suficiente no momento."
# AI Translated
msgid "Please complete the hotend rack setup and try again." msgid "Please complete the hotend rack setup and try again."
msgstr "Por favor, conclua a configuração do rack de hotend e tente novamente." msgstr "Por favor, conclua a configuração do rack de hotend e tente novamente."
@@ -9829,11 +9893,9 @@ msgstr "As informações reportadas sobre o hotend podem não ser confiáveis."
msgid "The printer has no nozzle matching the slicing file (%s)." msgid "The printer has no nozzle matching the slicing file (%s)."
msgstr "A impressora não possui um bico compatível com o arquivo de fatiamento (%s)." msgstr "A impressora não possui um bico compatível com o arquivo de fatiamento (%s)."
# AI Translated
msgid "Please install a matching nozzle in the hotend rack, or set the corresponding printer preset while slicing." msgid "Please install a matching nozzle in the hotend rack, or set the corresponding printer preset while slicing."
msgstr "Por favor, instale um bico compatível no rack de hotend, ou defina a predefinição de impressora correspondente ao fatiar." msgstr "Por favor, instale um bico compatível no rack de hotend, ou defina a predefinição de impressora correspondente ao fatiar."
# AI Translated
msgid "The toolhead and hotend rack are full. Please remove at least one hotend before printing." msgid "The toolhead and hotend rack are full. Please remove at least one hotend before printing."
msgstr "A cabeça da ferramenta e o rack de hotend estão cheios. Por favor, remova pelo menos um hotend antes de imprimir." msgstr "A cabeça da ferramenta e o rack de hotend estão cheios. Por favor, remova pelo menos um hotend antes de imprimir."
@@ -9859,24 +9921,19 @@ msgstr "ambas extrusoras"
msgid "The hardness of current material (%s) exceeds the hardness of %s(%s). Please verify the nozzle or material settings and try again." msgid "The hardness of current material (%s) exceeds the hardness of %s(%s). Please verify the nozzle or material settings and try again."
msgstr "A dureza do material atual (%s) excede a dureza de %s(%s). Verifique as configurações do bico ou do material e tente novamente." msgstr "A dureza do material atual (%s) excede a dureza de %s(%s). Verifique as configurações do bico ou do material e tente novamente."
# AI Translated
msgid "Your current firmware version cannot start this print job. Please update to the latest version and try again." msgid "Your current firmware version cannot start this print job. Please update to the latest version and try again."
msgstr "Sua versão atual do firmware não pode iniciar este trabalho de impressão. Atualize para a versão mais recente e tente novamente." msgstr "Sua versão atual do firmware não pode iniciar este trabalho de impressão. Atualize para a versão mais recente e tente novamente."
# AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "The hardness of current material (%s) exceeds the hardness of %s(%s). It may cause nozzle wear, leading to material leakage and unstable flow. Please exercise caution when using it." msgid "The hardness of current material (%s) exceeds the hardness of %s(%s). It may cause nozzle wear, leading to material leakage and unstable flow. Please exercise caution when using it."
msgstr "A dureza do material atual (%s) excede a dureza de %s(%s). Isso pode causar desgaste do bico, levando a vazamento de material e fluxo instável. Tenha cuidado ao usá-lo." msgstr "A dureza do material atual (%s) excede a dureza de %s(%s). Isso pode causar desgaste do bico, levando a vazamento de material e fluxo instável. Tenha cuidado ao usá-lo."
# AI Translated
msgid "Some filaments may switch between extruders during printing. Manual K-value calibration cannot be applied throughout the entire print, which may affect print quality. Enabling Flow Dynamics Calibration is recommended." msgid "Some filaments may switch between extruders during printing. Manual K-value calibration cannot be applied throughout the entire print, which may affect print quality. Enabling Flow Dynamics Calibration is recommended."
msgstr "Alguns filamentos podem alternar entre extrusoras durante a impressão. A calibração manual do valor K não pode ser aplicada durante toda a impressão, o que pode afetar a qualidade da impressão. Recomenda-se ativar a Calibração de Dinâmica de Fluxo." msgstr "Alguns filamentos podem alternar entre extrusoras durante a impressão. A calibração manual do valor K não pode ser aplicada durante toda a impressão, o que pode afetar a qualidade da impressão. Recomenda-se ativar a Calibração de Dinâmica de Fluxo."
# AI Translated
msgid "There is stringing-prone filament in this file. For best print quality, we recommend switching nozzle clumping detection to Auto mode." msgid "There is stringing-prone filament in this file. For best print quality, we recommend switching nozzle clumping detection to Auto mode."
msgstr "Há filamento propenso a fiapos neste arquivo. Para a melhor qualidade de impressão, recomendamos alternar a detecção de aglomeração no bico para o modo Automático." msgstr "Há filamento propenso a criar fios neste arquivo. Para a melhor qualidade de impressão, recomendamos alternar a detecção de aglomeração no bico para o modo Automático."
# AI Translated
msgid "If 'Dynamic Flow Calibration' is set to Auto/On, the system will use the manual calibration value or the default value and skip the flow calibration process. You can perform a manual flow calibration for TPU filament on the 'Calibration' page." msgid "If 'Dynamic Flow Calibration' is set to Auto/On, the system will use the manual calibration value or the default value and skip the flow calibration process. You can perform a manual flow calibration for TPU filament on the 'Calibration' page."
msgstr "Se a 'Calibração de Fluxo Dinâmico' estiver definida como Automático/Ativado, o sistema usará o valor de calibração manual ou o valor padrão e ignorará o processo de calibração de fluxo. Você pode realizar uma calibração de fluxo manual para filamento TPU na página 'Calibração'." msgstr "Se a 'Calibração de Fluxo Dinâmico' estiver definida como Automático/Ativado, o sistema usará o valor de calibração manual ou o valor padrão e ignorará o processo de calibração de fluxo. Você pode realizar uma calibração de fluxo manual para filamento TPU na página 'Calibração'."
@@ -9983,7 +10040,6 @@ msgstr "Desative a calibração de fluxo dinâmico para habilitar o valor de flu
msgid "This printer does not support printing all plates." msgid "This printer does not support printing all plates."
msgstr "Esta impressora não suporta a imprimir todas as placas." msgstr "Esta impressora não suporta a imprimir todas as placas."
# AI Translated
#, c-format, boost-format #, c-format, boost-format
msgid "The current firmware supports a maximum of %s materials. You can either reduce the number of materials to %s or fewer on the Preparation Page, or try updating the firmware. If you are still restricted after the update, please wait for subsequent firmware support." msgid "The current firmware supports a maximum of %s materials. You can either reduce the number of materials to %s or fewer on the Preparation Page, or try updating the firmware. If you are still restricted after the update, please wait for subsequent firmware support."
msgstr "O firmware atual suporta no máximo %s materiais. Você pode reduzir o número de materiais para %s ou menos na Página de Preparação, ou tentar atualizar o firmware. Se ainda estiver restrito após a atualização, aguarde o suporte de firmware subsequente." msgstr "O firmware atual suporta no máximo %s materiais. Você pode reduzir o número de materiais para %s ou menos na Página de Preparação, ou tentar atualizar o firmware. Se ainda estiver restrito após a atualização, aguarde o suporte de firmware subsequente."
@@ -9991,11 +10047,9 @@ msgstr "O firmware atual suporta no máximo %s materiais. Você pode reduzir o n
msgid "The type of external filament is unknown or does not match with the filament type in the slicing file. Please make sure you have installed the correct filament in the external spool." msgid "The type of external filament is unknown or does not match with the filament type in the slicing file. Please make sure you have installed the correct filament in the external spool."
msgstr "O tipo de filamento externo é desconhecido ou não corresponde ao tipo de filamento no arquivo de fatiamento. Certifique-se de ter instalado o filamento correto no carretel externo." msgstr "O tipo de filamento externo é desconhecido ou não corresponde ao tipo de filamento no arquivo de fatiamento. Certifique-se de ter instalado o filamento correto no carretel externo."
# AI Translated
msgid "TPU 90A/TPU 85A are too soft. It is recommended to perform manual flow calibration on the 'Calibration' page. If 'Dynamic Flow Calibration' is set to auto/on, the system will use the previous calibration value and skip the flow calibration process." msgid "TPU 90A/TPU 85A are too soft. It is recommended to perform manual flow calibration on the 'Calibration' page. If 'Dynamic Flow Calibration' is set to auto/on, the system will use the previous calibration value and skip the flow calibration process."
msgstr "TPU 90A/TPU 85A são muito macios. Recomenda-se realizar a calibração de fluxo manual na página 'Calibração'. Se a 'Calibração de Fluxo Dinâmico' estiver definida como automático/ativado, o sistema usará o valor de calibração anterior e ignorará o processo de calibração de fluxo." msgstr "TPU 90A/TPU 85A são muito macios. Recomenda-se realizar a calibração de fluxo manual na página 'Calibração'. Se a 'Calibração de Fluxo Dinâmico' estiver definida como automático/ativado, o sistema usará o valor de calibração anterior e ignorará o processo de calibração de fluxo."
# AI Translated
msgid "The filament in the AMS may be insufficient for this print. Please refill or replace it." msgid "The filament in the AMS may be insufficient for this print. Please refill or replace it."
msgstr "O filamento no AMS pode ser insuficiente para esta impressão. Por favor, reabasteça ou substitua-o." msgstr "O filamento no AMS pode ser insuficiente para esta impressão. Por favor, reabasteça ou substitua-o."
@@ -10072,7 +10126,7 @@ msgid "Failed to post ticket to server"
msgstr "Falha ao enviar o ticket para o servidor" msgstr "Falha ao enviar o ticket para o servidor"
msgid "Failed to parse login report reason" msgid "Failed to parse login report reason"
msgstr "Falha ao analisar o motivo do relatório de login" msgstr "Falha ao processar o motivo do relatório de login"
msgid "Receive login report timeout" msgid "Receive login report timeout"
msgstr "Limite de tempo excedido ao receber o relatório de login" msgstr "Limite de tempo excedido ao receber o relatório de login"
@@ -10168,11 +10222,9 @@ msgstr "Excluir esta predefinição"
msgid "Search in preset" msgid "Search in preset"
msgstr "Pesquisar nas predefinições" msgstr "Pesquisar nas predefinições"
# AI Translated
msgid "Synchronization of different extruder drives or nozzle volume types is not supported." msgid "Synchronization of different extruder drives or nozzle volume types is not supported."
msgstr "A sincronização de diferentes acionamentos de extrusora ou tipos de volume do bico não é suportada." msgstr "A sincronização de diferentes acionamentos de extrusora ou tipos de volume do bico não é suportada."
# AI Translated
msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder." msgid "Synchronize the modification of parameters to the corresponding parameters of another extruder."
msgstr "Sincroniza a modificação de parâmetros com os parâmetros correspondentes de outra extrusora." msgstr "Sincroniza a modificação de parâmetros com os parâmetros correspondentes de outra extrusora."
@@ -10242,7 +10294,7 @@ msgid "Are you sure you want to enable this option?"
msgstr "Tem certeza de que deseja habilitar esta opção?" msgstr "Tem certeza de que deseja habilitar esta opção?"
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?" 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 "Padrões de preenchimento são projetados para lidar com a rotação automaticamente para garantir a impressão adequada e atingir os efeitos pretendidos (Ex. Giroide, Cúbico). Girar o padrão de preenchimento esparso atual pode causar suporte insuficiente. Prossiga com cautela e verifique cuidadosamente se há possíveis problemas de impressão. Tem certeza de que deseja habilitar esta opção?" msgstr "Padrões de preenchimento são projetados para lidar com a rotação automaticamente para garantir a impressão adequada e atingir os efeitos pretendidos (ex.: Giroide, Cúbico). Girar o padrão de preenchimento esparso atual pode causar suporte insuficiente. Prossiga com cautela e verifique cuidadosamente se há possíveis problemas de impressão. Tem certeza de que deseja habilitar esta opção?"
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." 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 "Funcionalidade experimental: Retrair e cortar o filamento a uma distância maior durante mudanças de filamento para minimizar a purga. Embora possa reduzir notavelmente a purga, ele também pode elevar o risco de bolhas no bico ou outras complicações de impressão." msgstr "Funcionalidade experimental: Retrair e cortar o filamento a uma distância maior durante mudanças de filamento para minimizar a purga. Embora possa reduzir notavelmente a purga, ele também pode elevar o risco de bolhas no bico ou outras complicações de impressão."
@@ -10405,7 +10457,6 @@ msgstr "G-code de mudança de tipo de extrusão"
msgid "Post-processing Scripts" msgid "Post-processing Scripts"
msgstr "Scripts de pós-processamento" msgstr "Scripts de pós-processamento"
# AI Translated
msgid "Slicing Pipeline Plugin" msgid "Slicing Pipeline Plugin"
msgstr "Plugin de Pipeline de Fatiamento" msgstr "Plugin de Pipeline de Fatiamento"
@@ -10459,9 +10510,8 @@ msgstr "Temperatura da câmara de impressão"
msgid "Chamber temperature" msgid "Chamber temperature"
msgstr "Temperatura da câmara" msgstr "Temperatura da câmara"
# AI Translated
msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start" msgid "Target chamber temperature, and the minimal chamber temperature at which printing should start"
msgstr "Temperatura da câmara alvo, e a temperatura mínima da câmara na qual a impressão deve começar" msgstr "Temperatura alvo da câmara, e a temperatura mínima da câmara na qual a impressão deve começar"
msgid "Target" msgid "Target"
msgstr "Alvo" msgstr "Alvo"
@@ -10699,7 +10749,6 @@ msgstr "Limites de altura da camada"
msgid "Z-Hop" msgid "Z-Hop"
msgstr "Z-Hop" msgstr "Z-Hop"
# AI Translated
msgid "" msgid ""
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n" "The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\n"
"\n" "\n"
@@ -11007,7 +11056,6 @@ msgstr "Se ativo, este diálogo pode ser usado para transferir valores seleciona
msgid "One of the presets does not exist" msgid "One of the presets does not exist"
msgstr "Uma das predefinições não existe" msgstr "Uma das predefinições não existe"
# AI Translated
msgid "Compared presets has different printer technology" msgid "Compared presets has different printer technology"
msgstr "As predefinições comparadas têm tecnologia de impressora diferente" msgstr "As predefinições comparadas têm tecnologia de impressora diferente"
@@ -11342,9 +11390,8 @@ msgstr "Entrar"
msgid "Login failed. Please try again." msgid "Login failed. Please try again."
msgstr "Falha no login. Tente novamente." msgstr "Falha no login. Tente novamente."
# AI Translated
msgid "parse json failed" msgid "parse json failed"
msgstr "falha ao analisar o json" msgstr "falha ao processar o json"
msgid "[Action Required] " msgid "[Action Required] "
msgstr "[Ação Necessária] " msgstr "[Ação Necessária] "
@@ -11535,7 +11582,6 @@ msgctxt "Keyboard Shortcut"
msgid "Space" msgid "Space"
msgstr "Espaço" msgstr "Espaço"
# AI Translated
msgid "Open actions speed dial" msgid "Open actions speed dial"
msgstr "Abrir menu rápido de ações" msgstr "Abrir menu rápido de ações"
@@ -11617,11 +11663,9 @@ msgstr "informações de atualização da versão %s:"
msgid "Network plug-in update" msgid "Network plug-in update"
msgstr "Atualização do plug-in de rede" msgstr "Atualização do plug-in de rede"
# AI Translated
msgid "Click OK to update the Network plug-in now. If a file is in use, the update will be applied the next time Orca Slicer launches." msgid "Click OK to update the Network plug-in now. If a file is in use, the update will be applied the next time Orca Slicer launches."
msgstr "Clique em OK para atualizar o plug-in de Rede agora. Se um arquivo estiver em uso, a atualização será aplicada na próxima vez que o Orca Slicer for iniciado." msgstr "Clique em OK para atualizar o plug-in de Rede agora. Se um arquivo estiver em uso, a atualização será aplicada na próxima vez que o Orca Slicer for iniciado."
# AI Translated
msgid "A new Network plug-in is available. Do you want to install it?" msgid "A new Network plug-in is available. Do you want to install it?"
msgstr "Um novo plug-in de Rede está disponível. Deseja instalá-lo?" msgstr "Um novo plug-in de Rede está disponível. Deseja instalá-lo?"
@@ -11681,7 +11725,6 @@ msgstr "Nome da impressora"
msgid "Where to find your printer's IP and Access Code?" msgid "Where to find your printer's IP and Access Code?"
msgstr "Onde encontrar o IP e o Código de Acesso da sua impressora?" msgstr "Onde encontrar o IP e o Código de Acesso da sua impressora?"
# AI Translated
msgid "How to trouble shooting" msgid "How to trouble shooting"
msgstr "Como solucionar problemas" msgstr "Como solucionar problemas"
@@ -11829,11 +11872,9 @@ msgstr "Objeto: %1%"
msgid "Parts of the object at these heights may be too thin or the object may have a faulty mesh." msgid "Parts of the object at these heights may be too thin or the object may have a faulty mesh."
msgstr "Partes do objeto nessas alturas podem ser muito finas, ou o objeto pode ter uma malha com falhas." msgstr "Partes do objeto nessas alturas podem ser muito finas, ou o objeto pode ter uma malha com falhas."
# AI Translated
msgid "Process change extrusion role G-code" msgid "Process change extrusion role G-code"
msgstr "G-code de mudança de tipo de extrusão do processo" msgstr "G-code de mudança de tipo de extrusão do processo"
# AI Translated
msgid "Filament change extrusion role G-code" msgid "Filament change extrusion role G-code"
msgstr "G-code de mudança de tipo de extrusão do filamento" msgstr "G-code de mudança de tipo de extrusão do filamento"
@@ -12008,7 +12049,6 @@ msgstr " está muito perto de uma área de exclusão, e colisões vão ocorrer.\
msgid " is too close to clumping detection area, and collisions will be caused.\n" msgid " is too close to clumping detection area, and collisions will be caused.\n"
msgstr " está muito perto da área de detecção de aglomeração, e ocorrerão colisões.\n" msgstr " está muito perto da área de detecção de aglomeração, e ocorrerão colisões.\n"
# AI Translated
msgid " is partially outside the printable area, and it cannot be printed.\n" msgid " is partially outside the printable area, and it cannot be printed.\n"
msgstr " está parcialmente fora da área imprimível, e não pode ser impresso.\n" msgstr " está parcialmente fora da área imprimível, e não pode ser impresso.\n"
@@ -12024,7 +12064,6 @@ msgstr "Se ainda assim desejar imprimir, você pode ativar a opção em Preferê
msgid "No extrusions under current settings." msgid "No extrusions under current settings."
msgstr "Nenhuma extrusão com as configurações atuais." msgstr "Nenhuma extrusão com as configurações atuais."
# AI Translated
msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed." msgid "A gradient mixed filament is used, but 'Mixed color sublayer' is disabled. The gradient will not be printed."
msgstr "Um filamento misto com gradiente está em uso, mas 'Subcamada de cor mista' está desativado. O gradiente não será impresso." msgstr "Um filamento misto com gradiente está em uso, mas 'Subcamada de cor mista' está desativado. O gradiente não será impresso."
@@ -12064,7 +12103,6 @@ msgstr "Você pode querer reduzir o tamanho do seu modelo ou alterar as configur
msgid "Variable layer height is not supported with Organic supports." msgid "Variable layer height is not supported with Organic supports."
msgstr "A altura de camada variável não é suportada com suportes Orgânicos." msgstr "A altura de camada variável não é suportada com suportes Orgânicos."
# AI Translated
msgid "The wipe tower filament cannot be a mixed filament." msgid "The wipe tower filament cannot be a mixed filament."
msgstr "O filamento da torre de purga não pode ser um filamento misto." msgstr "O filamento da torre de purga não pode ser um filamento misto."
@@ -12701,7 +12739,6 @@ msgstr ""
msgid "Internal bridge flow ratio" msgid "Internal bridge flow ratio"
msgstr "Taxa de fluxo em ponte interna" msgstr "Taxa de fluxo em ponte interna"
# AI Translated
msgid "" msgid ""
"This value governs the thickness of the internal bridge layer. This is the first layer over sparse infill so increasing it may increase strength and upper layer quality.\n" "This value governs the thickness of the internal bridge layer. This is the first layer over sparse infill so increasing it may increase strength and upper layer quality.\n"
"Values above 1.0: Increase the amount of material while maintaining line spacing. This can improve line contact and strength.\n" "Values above 1.0: Increase the amount of material while maintaining line spacing. This can improve line contact and strength.\n"
@@ -13091,11 +13128,9 @@ msgstr ""
"A geometria será decimada antes de detectar ângulos agudos. Este parâmetro indica o comprimento mínimo da divergência para a decimação.\n" "A geometria será decimada antes de detectar ângulos agudos. Este parâmetro indica o comprimento mínimo da divergência para a decimação.\n"
"0 para desativar." "0 para desativar."
# AI Translated
msgid "Brim ears outer only" msgid "Brim ears outer only"
msgstr "Orelhas da borda apenas externas" msgstr "Apenas orelhas da borda externas"
# AI Translated
msgid "Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections." msgid "Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections."
msgstr "Gera orelhas de rato apenas no contorno externo do modelo, excluindo furos e seções fechadas." msgstr "Gera orelhas de rato apenas no contorno externo do modelo, excluindo furos e seções fechadas."
@@ -13123,7 +13158,6 @@ msgstr "Por objeto"
msgid "Intra-layer order" msgid "Intra-layer order"
msgstr "Ordem intra-camada" msgstr "Ordem intra-camada"
# AI Translated
msgid "" msgid ""
"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n" "Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n"
"\n" "\n"
@@ -13181,7 +13215,7 @@ msgid "mm/s² or %"
msgstr "mm/s² ou %" msgstr "mm/s² ou %"
msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration." msgid "Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration."
msgstr "Aceleração das pontes. Se o valor for expresso como uma porcentagem (por exemplo, 50%), será calculado com base na aceleração da parede externa." msgstr "Aceleração das pontes. Se o valor for expresso como uma porcentagem (ex.: 50%), será calculado com base na aceleração da parede externa."
msgid "Default filament profile" msgid "Default filament profile"
msgstr "Perfil de filamento padrão" msgstr "Perfil de filamento padrão"
@@ -13761,7 +13795,6 @@ msgstr "Tempo da camada"
msgid "The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time." msgid "The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time."
msgstr "A ventoinha de resfriamento de peças será ativado para camadas cujo tempo estimado seja mais curto que esse valor. A velocidade da ventoinha é interpolada entre as velocidades mínima e máxima da ventoinha de acordo com o tempo de impressão da camada." msgstr "A ventoinha de resfriamento de peças será ativado para camadas cujo tempo estimado seja mais curto que esse valor. A velocidade da ventoinha é interpolada entre as velocidades mínima e máxima da ventoinha de acordo com o tempo de impressão da camada."
# AI Translated
msgctxt "second" msgctxt "second"
msgid "s" msgid "s"
msgstr "s" msgstr "s"
@@ -14068,61 +14101,47 @@ msgstr "Material de suporte"
msgid "Support material is commonly used to print supports and support interfaces." msgid "Support material is commonly used to print supports and support interfaces."
msgstr "O material de suporte é comumente usado para imprimir suportes e interfaces de suporte." msgstr "O material de suporte é comumente usado para imprimir suportes e interfaces de suporte."
# AI Translated
msgid "Is mixed filament" msgid "Is mixed filament"
msgstr "É filamento misto" msgstr "É filamento misto"
# AI Translated
msgid "Whether this filament slot is a mixed filament composed of multiple physical filaments" msgid "Whether this filament slot is a mixed filament composed of multiple physical filaments"
msgstr "Define se este slot de filamento é um filamento misto composto por vários filamentos físicos" msgstr "Define se este slot de filamento é um filamento misto composto por vários filamentos físicos"
# AI Translated
msgid "Mixed filament components" msgid "Mixed filament components"
msgstr "Componentes do filamento misto" msgstr "Componentes do filamento misto"
# AI Translated
msgid "Comma-separated 1-based indices of component filaments, e.g. \"1,3\"" msgid "Comma-separated 1-based indices of component filaments, e.g. \"1,3\""
msgstr "Índices (começando em 1) dos filamentos componentes, separados por vírgulas; ex.: \"1,3\"" msgstr "Índices (começando em 1) dos filamentos componentes, separados por vírgulas; ex.: \"1,3\""
# AI Translated
msgid "Mixed filament sublayer ratios" msgid "Mixed filament sublayer ratios"
msgstr "Proporções de subcamada do filamento misto" msgstr "Proporções de subcamada do filamento misto"
# AI Translated
msgid "Comma-separated ratio values summing to 1.0, e.g. \"0.7,0.3\"" msgid "Comma-separated ratio values summing to 1.0, e.g. \"0.7,0.3\""
msgstr "Valores de proporção separados por vírgulas cuja soma seja 1.0; ex.: \"0.7,0.3\"" msgstr "Valores de proporção separados por vírgulas cuja soma seja 1.0; ex.: \"0.7,0.3\""
# AI Translated
msgid "Mixed filament gradient" msgid "Mixed filament gradient"
msgstr "Gradiente do filamento misto" msgstr "Gradiente do filamento misto"
# AI Translated
msgid "Enable Z-direction gradient mode for mixed filament sub-layers. When enabled, the sub-layer ratios vary linearly across layers." msgid "Enable Z-direction gradient mode for mixed filament sub-layers. When enabled, the sub-layer ratios vary linearly across layers."
msgstr "Ativa o modo de gradiente na direção Z para as subcamadas do filamento misto. Quando ativado, as proporções das subcamadas variam linearmente ao longo das camadas." msgstr "Ativa o modo de gradiente na direção Z para as subcamadas do filamento misto. Quando ativo, as proporções das subcamadas variam linearmente ao longo das camadas."
# AI Translated
msgid "Mixed filament gradient range" msgid "Mixed filament gradient range"
msgstr "Faixa do gradiente do filamento misto" msgstr "Faixa do gradiente do filamento misto"
# AI Translated
msgid "Start and end ratios for the first component in gradient mode. Comma-separated pair, e.g. \"0.10,0.90\" means 10% to 90%." msgid "Start and end ratios for the first component in gradient mode. Comma-separated pair, e.g. \"0.10,0.90\" means 10% to 90%."
msgstr "Proporções inicial e final do primeiro componente no modo de gradiente. Par separado por vírgula; ex.: \"0.10,0.90\" significa de 10% a 90%." msgstr "Proporções inicial e final do primeiro componente no modo de gradiente. Par separado por vírgula; ex.: \"0.10,0.90\" significa de 10% a 90%."
# AI Translated
msgid "Mixed filament gradient curve" msgid "Mixed filament gradient curve"
msgstr "Curva do gradiente do filamento misto" msgstr "Curva do gradiente do filamento misto"
# AI Translated
msgid "Optional Photoshop-style custom curve mapping Z progress to the first component ratio. Encoded as pipe-separated control points, either \"x,y\" (legacy) or \"x,y,m_in,m_out\" when a tangent override is needed (empty token or \"nan\" means use PCHIP default). x in [0,1]; y is clamped to the configured ratio range, e.g. \"0,0.15|0.5,0.50|1,0.85\". When empty, the linear gradient_range is used instead." msgid "Optional Photoshop-style custom curve mapping Z progress to the first component ratio. Encoded as pipe-separated control points, either \"x,y\" (legacy) or \"x,y,m_in,m_out\" when a tangent override is needed (empty token or \"nan\" means use PCHIP default). x in [0,1]; y is clamped to the configured ratio range, e.g. \"0,0.15|0.5,0.50|1,0.85\". When empty, the linear gradient_range is used instead."
msgstr "Curva personalizada opcional, no estilo do Photoshop, que mapeia o progresso em Z para a proporção do primeiro componente. Codificada como pontos de controle separados por barras verticais, no formato \"x,y\" (legado) ou \"x,y,m_in,m_out\" quando é necessário substituir a tangente (um valor vazio ou \"nan\" usa o padrão PCHIP). x está em [0,1]; y é limitado à faixa de proporção configurada; ex.: \"0,0.15|0.5,0.50|1,0.85\". Quando vazio, o gradient_range linear é usado." msgstr "Curva personalizada opcional no estilo do Photoshop, mapeando o progresso em Z para a proporção do primeiro componente. Codificada como pontos de controle separados por barras verticais, no formato \"x,y\" (legado) ou \"x,y,m_in,m_out\" quando é necessário substituir a tangente (um valor vazio ou \"nan\" usa o padrão PCHIP). X em [0,1]; Y é limitado à faixa de proporção configurada; ex.: \"0,0.15|0.5,0.50|1,0.85\". Quando vazio, o gradient_range linear é usado no lugar."
# AI Translated
msgid "Mixed filament per-part gradient" msgid "Mixed filament per-part gradient"
msgstr "Gradiente por peça do filamento misto" msgstr "Gradiente por peça do filamento misto"
# AI Translated
msgid "When gradient mode is enabled, apply the gradient to each part of an assembly independently rather than treating the whole assembly as one Z range." msgid "When gradient mode is enabled, apply the gradient to each part of an assembly independently rather than treating the whole assembly as one Z range."
msgstr "Quando o modo de gradiente está ativado, aplica o gradiente a cada peça de uma montagem de forma independente, em vez de tratar toda a montagem como uma única faixa Z." msgstr "Quando o modo de gradiente está ativado, aplica o gradiente a cada peça de uma montagem de forma independente em vez de tratar toda a montagem como uma única faixa Z."
msgid "Filament printable" msgid "Filament printable"
msgstr "Filamento imprimível" msgstr "Filamento imprimível"
@@ -14213,7 +14232,7 @@ msgid "Insert solid layers"
msgstr "Inserir camadas sólidas" msgstr "Inserir camadas sólidas"
msgid "Insert solid infill at specific layers. Use N to insert every Nth layer, N#K to insert K consecutive solid layers every N layers (K is optional, e.g. '5#' equals '5#1'), or a comma-separated list (e.g. 1,7,9) to insert at explicit layers. Layers are 1-based." msgid "Insert solid infill at specific layers. Use N to insert every Nth layer, N#K to insert K consecutive solid layers every N layers (K is optional, e.g. '5#' equals '5#1'), or a comma-separated list (e.g. 1,7,9) to insert at explicit layers. Layers are 1-based."
msgstr "Insere preenchimento sólido em camadas específicas. Use N para inserir a cada enésima camada, N#K para inserir K camadas sólidas consecutivas a cada enésima camada (K é opcional, ou seja, '5#' é igual a '5#1'), ou uma lista separada por vírgulas (Ex. 1,7,9) para inserir em camadas esplícitas. Camadas são baseadas em 1." msgstr "Insere preenchimento sólido em camadas específicas. Use N para inserir a cada enésima camada, N#K para inserir K camadas sólidas consecutivas a cada enésima camada (K é opcional, ex.: '5#' é igual a '5#1'), ou uma lista separada por vírgulas (Ex. 1,7,9) para inserir em camadas esplícitas. Camadas são baseadas em 1."
msgid "Fill Multiline" msgid "Fill Multiline"
msgstr "Multilinhas de Preenchimento" msgstr "Multilinhas de Preenchimento"
@@ -14291,11 +14310,9 @@ msgstr "TPMS-FK"
msgid "Gyroid" msgid "Gyroid"
msgstr "Giroide" msgstr "Giroide"
# AI Translated
msgid "Sparse infill smooth factor" msgid "Sparse infill smooth factor"
msgstr "Fator de suavização do preenchimento esparso" msgstr "Fator de suavização do preenchimento esparso"
# 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." 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 o quanto os cantos do preenchimento esparso são arredondados. 0% mantém o trajeto original com cantos vivos, enquanto 100% produz as maiores curvas possíveis entre linhas de preenchimento adjacentes." msgstr "Controla o quanto os cantos do preenchimento esparso são arredondados. 0% mantém o trajeto original com cantos vivos, enquanto 100% produz as maiores curvas possíveis entre linhas de preenchimento adjacentes."
@@ -14309,10 +14326,10 @@ msgid "Acceleration of inner walls."
msgstr "Aceleração das paredes internas." msgstr "Aceleração das paredes internas."
msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." msgid "Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
msgstr "Aceleração do preenchimento esparso. Se o valor for expresso como uma porcentagem (por exemplo, 100%), será calculado com base na aceleração padrão." msgstr "Aceleração do preenchimento esparso. Se o valor for expresso como uma porcentagem (ex.: 100%), será calculado com base na aceleração padrão."
msgid "Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration." msgid "Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration."
msgstr "Aceleração do preenchimento sólido interno. Se o valor for expresso como uma porcentagem (por exemplo, 100%), será calculado com base na aceleração padrão." msgstr "Aceleração do preenchimento sólido interno. Se o valor for expresso como uma porcentagem (ex.: 100%), será calculado com base na aceleração padrão."
msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion." msgid "This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion."
msgstr "Esta é a aceleração para a primeira camada. Usar aceleração limitada melhorar a adesão à placa de impressão." msgstr "Esta é a aceleração para a primeira camada. Usar aceleração limitada melhorar a adesão à placa de impressão."
@@ -14416,7 +14433,7 @@ msgid ""
"Only available when \"No cooling for the first\" is 0.\n" "Only available when \"No cooling for the first\" is 0.\n"
"Set to -1 to disable it." "Set to -1 to disable it."
msgstr "" msgstr ""
"Define uma velocidade exata da ventoinha para a primeira camada, substituindo todas as outras configurações de resfriamento. Útil para proteger peças impressas em 3D da cabeça da ferramenta (por exemplo, dutos ABS/ASA no estilo Voron) de uma mesa aquecida. Uma pequena quantidade de fluxo de ar resfria os dutos, sem usar o resfriamento total que pode, em certas condições, prejudicar a aderência da primeira camada.\n" "Define uma velocidade exata da ventoinha para a primeira camada, substituindo todas as outras configurações de resfriamento. Útil para proteger peças impressas em 3D da cabeça da ferramenta (ex.: dutos ABS/ASA no estilo Voron) de uma mesa aquecida. Uma pequena quantidade de fluxo de ar resfria os dutos, sem usar o resfriamento total que pode, em certas condições, prejudicar a aderência da primeira camada.\n"
"A partir da segunda camada, o resfriamento normal é retomado.\n" "A partir da segunda camada, o resfriamento normal é retomado.\n"
"Se \"Velocidade total da ventoinha na camada\" também estiver definida, a ventoinha aumenta suavemente deste valor na primeira camada até o seu alvo na camada escolhida.\n" "Se \"Velocidade total da ventoinha na camada\" também estiver definida, a ventoinha aumenta suavemente deste valor na primeira camada até o seu alvo na camada escolhida.\n"
"Disponível apenas quando \"Sem resfriamento nas primeiras\" é 0.\n" "Disponível apenas quando \"Sem resfriamento nas primeiras\" é 0.\n"
@@ -14787,7 +14804,7 @@ msgid ""
"Set to 0 to deactivate." "Set to 0 to deactivate."
msgstr "" msgstr ""
"Algumas ventoinhas de resfriamento de componentes não conseguem iniciar a rotação quando comandadas abaixo de um determinado ciclo de trabalho PWM. Quando definido acima de 0, qualquer comando de ventoinha de resfriamento de componentes diferente de zero será elevado para pelo menos essa porcentagem, para que a ventoinha inicie de forma confiável. Um comando de ventoinha de 0 (ventoinha desligada) é sempre atendido exatamente. Essa limitação é aplicada após cada outro cálculo da ventoinha (rampa da primeira camada, interpolação do tempo da camada, substituições de saliência/ponte/interface de suporte/alisamento), para que o dimensionamento ainda opere dentro do intervalo [este valor, 100%].\n" "Algumas ventoinhas de resfriamento de componentes não conseguem iniciar a rotação quando comandadas abaixo de um determinado ciclo de trabalho PWM. Quando definido acima de 0, qualquer comando de ventoinha de resfriamento de componentes diferente de zero será elevado para pelo menos essa porcentagem, para que a ventoinha inicie de forma confiável. Um comando de ventoinha de 0 (ventoinha desligada) é sempre atendido exatamente. Essa limitação é aplicada após cada outro cálculo da ventoinha (rampa da primeira camada, interpolação do tempo da camada, substituições de saliência/ponte/interface de suporte/alisamento), para que o dimensionamento ainda opere dentro do intervalo [este valor, 100%].\n"
"Se o seu firmware já desativa a ventoinha abaixo de um limite (por exemplo, [fan] off_below: 0.10 do Klipper desliga a ventoinha sempre que o ciclo de trabalho comandado for inferior a 10%), esta opção e o limite do firmware devem idealmente ser definidos com o mesmo valor. A correspondência entre eles (por exemplo, off_below: 0.10 no Klipper e 10% aqui) garante que o fatiador nunca emita um valor diferente de zero que o firmware emitiria a velocidade cai silenciosamente e a ventoinha nunca recebe um valor abaixo daquele que você sabe que ela pode realmente atingir.\n" "Se o seu firmware já desativa a ventoinha abaixo de um limite (por exemplo, [fan] off_below: 0.10 do Klipper desliga a ventoinha sempre que o ciclo de trabalho comandado for inferior a 10%), esta opção e o limite do firmware devem idealmente ser definidos com o mesmo valor. A correspondência entre eles (ex.: off_below: 0.10 no Klipper e 10% aqui) garante que o fatiador nunca emita um valor diferente de zero que o firmware emitiria a velocidade cai silenciosamente e a ventoinha nunca recebe um valor abaixo daquele que você sabe que ela pode realmente atingir.\n"
"Defina como 0 para desativar." "Defina como 0 para desativar."
msgid "Time cost" msgid "Time cost"
@@ -14834,13 +14851,11 @@ msgstr "Com que tipo de G-code a impressora é compatível."
msgid "Klipper" msgid "Klipper"
msgstr "Klipper" msgstr "Klipper"
# AI Translated
msgid "Skip G-code config block" msgid "Skip G-code config block"
msgstr "Omitir o bloco de configuração do G-code" msgstr "Omitir o bloco de configuração do 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." 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 "Não grava o CONFIG_BLOCK (os pares chave/valor da configuração do fatiador) no arquivo G-code. Isso pode ajudar com impressoras cujo firmware trava ao interpretar essas linhas de comentário (por exemplo, Anycubic go-klipper). Observação: o arquivo G-code não conterá mais as configurações do fatiador, então importá-lo de volta no OrcaSlicer não restaurará a configuração." msgstr "Não grava o CONFIG_BLOCK (os pares chave/valor da configuração do fatiador) no arquivo G-code. Isso pode ajudar com impressoras cujo firmware trava ao interpretar essas linhas de comentário (ex.: Anycubic go-klipper). Nota: o arquivo G-code não conterá mais as configurações do fatiador, então importá-lo de volta no OrcaSlicer não restaurará a configuração."
msgid "Pellet Modded Printer" msgid "Pellet Modded Printer"
msgstr "Impressora Modificada para Pellets" msgstr "Impressora Modificada para Pellets"
@@ -14888,13 +14903,13 @@ msgid "Sparse infill rotation template"
msgstr "Gabarito de rotação de preenchimento esparso" msgstr "Gabarito de rotação de preenchimento esparso"
msgid "Rotate the sparse infill direction per layer using a template of angles. Enter comma-separated degrees (e.g., '0,30,60,90'). Angles are applied in order by layer and repeat when the list ends. Advanced syntax is supported: '+5' rotates +5° every layer; '+5#5' rotates +5° every 5 layers. See the Wiki for details. When a template is set, the standard infill direction setting is ignored. Note: some infill patterns (e.g., Gyroid) control rotation themselves; use with care." msgid "Rotate the sparse infill direction per layer using a template of angles. Enter comma-separated degrees (e.g., '0,30,60,90'). Angles are applied in order by layer and repeat when the list ends. Advanced syntax is supported: '+5' rotates +5° every layer; '+5#5' rotates +5° every 5 layers. See the Wiki for details. When a template is set, the standard infill direction setting is ignored. Note: some infill patterns (e.g., Gyroid) control rotation themselves; use with care."
msgstr "Gira a direção do preenchimento esparso por camada usando um gabarito de ângulos. Insira graus separados por vírgula (por exemplo, '0, 30, 60, 90'). Os ângulos são aplicados em ordem por camada e repetidos quando a lista termina. Sintaxe avançada suportada: '+5' gira +5° a cada camada; '+5#5' gira +5° a cada 5 camadas. Consulte a Wiki para obter detalhes. Quando um modelo é definido, a configuração padrão de direção do preenchimento é ignorada. Observação: alguns padrões de preenchimento (por exemplo, Giróide) tem seu próprio controle de rotação, use com cuidado." msgstr "Gira a direção do preenchimento esparso por camada usando um gabarito de ângulos. Insira graus separados por vírgula (ex.: '0,30,60,90'). Os ângulos são aplicados em ordem por camada e repetidos quando a lista termina. Sintaxe avançada suportada: '+5' gira +5° a cada camada; '+5#5' gira +5° a cada 5 camadas. Consulte a Wiki para obter detalhes. Quando um modelo é definido, a configuração padrão de direção do preenchimento é ignorada. Nota: alguns padrões de preenchimento (ex.: Giróide) tem seu próprio controle de rotação, use com cuidado."
msgid "Solid infill rotation template" msgid "Solid infill rotation template"
msgstr "Gabarito de rotação de preenchimento sólido" msgstr "Gabarito de rotação de preenchimento sólido"
msgid "This parameter adds a rotation of solid infill direction to each layer according to the specified template. The template is a comma-separated list of angles in degrees, e.g. '0,90'. The first angle is applied to the first layer, the second angle to the second layer, and so on. If there are more layers than angles, the angles will be repeated. Note that not all solid infill patterns support rotation." msgid "This parameter adds a rotation of solid infill direction to each layer according to the specified template. The template is a comma-separated list of angles in degrees, e.g. '0,90'. The first angle is applied to the first layer, the second angle to the second layer, and so on. If there are more layers than angles, the angles will be repeated. Note that not all solid infill patterns support rotation."
msgstr "Este parâmetro adiciona uma rotação da direção do preenchimento sólido a cada camada, de acordo com o gabarito especificado. O gabarito é uma lista de ângulos em graus separados por vírgulas, por exemplo, '0,90'. O primeiro ângulo é aplicado à primeira camada, o segundo ângulo à segunda camada e assim por diante. Se houver mais camadas do que ângulos, os ângulos serão repetidos. Observe que nem todos os padrões de preenchimento sólido suportam rotação." msgstr "Este parâmetro adiciona uma rotação da direção do preenchimento sólido a cada camada, de acordo com o gabarito especificado. O gabarito é uma lista de ângulos em graus separados por vírgulas, como '0,90'. O primeiro ângulo é aplicado à primeira camada, o segundo ângulo à segunda camada e assim por diante. Se houver mais camadas do que ângulos, os ângulos serão repetidos. Observe que nem todos os padrões de preenchimento sólido suportam rotação."
msgid "Skeleton infill density" msgid "Skeleton infill density"
msgstr "Densidade de preenchimento de esqueleto" msgstr "Densidade de preenchimento de esqueleto"
@@ -15360,7 +15375,6 @@ msgstr "Força máxima do eixo Y"
msgid "The allowed maximum output force of Y axis" msgid "The allowed maximum output force of Y axis"
msgstr "A força máxima de saída permitida do eixo Y" msgstr "A força máxima de saída permitida do eixo Y"
# AI Translated
msgctxt "Newton" msgctxt "Newton"
msgid "N" msgid "N"
msgstr "N" msgstr "N"
@@ -15371,7 +15385,6 @@ msgstr "Massa da mesa do eixo Y"
msgid "The machine bed mass load of Y axis" msgid "The machine bed mass load of Y axis"
msgstr "A carga de massa da mesa do equipamento no eixo Y" msgstr "A carga de massa da mesa do equipamento no eixo Y"
# AI Translated
msgctxt "gram" msgctxt "gram"
msgid "g" msgid "g"
msgstr "g" msgstr "g"
@@ -15896,7 +15909,7 @@ msgid "Z-hop height"
msgstr "Altura de Z-hop" msgstr "Altura de Z-hop"
msgid "Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift Z can prevent stringing." msgid "Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift Z can prevent stringing."
msgstr "Sempre que há uma retração, o bico é levantado um pouco para criar folga entre o bico e a impressão. Isso evita que o bico atinja a impressão ao se mover. Usar linhas em espiral para levantar Z pode evitar stringing." msgstr "Sempre que há uma retração, o bico é levantado um pouco para criar folga entre o bico e a impressão. Isso evita que o bico atinja a impressão ao se mover. Usar linhas em espiral para levantar Z pode evitar criação de fios."
msgid "Z-hop lower boundary" msgid "Z-hop lower boundary"
msgstr "Limite inferior do Z-hop" msgstr "Limite inferior do Z-hop"
@@ -15977,7 +15990,7 @@ msgid "Has filament switcher"
msgstr "Tem trocador de filamentos" msgstr "Tem trocador de filamentos"
msgid "Printer has a filament switcher hardware (e.g., AMS)." msgid "Printer has a filament switcher hardware (e.g., AMS)."
msgstr "A impressora tem um sistema de troca de filamentos (Ex.: AMS)." msgstr "A impressora tem um sistema de troca de filamentos (ex.: AMS)."
msgid "Extra length on restart" msgid "Extra length on restart"
msgstr "Comprimento extra na retração" msgstr "Comprimento extra na retração"
@@ -16094,7 +16107,7 @@ msgid "Scarf joint speed"
msgstr "Velocidade da costura em bisel" msgstr "Velocidade da costura em bisel"
msgid "This option sets the printing speed for scarf joints. It is recommended to print scarf joints at a slow speed (less than 100 mm/s). It's also advisable to enable 'Extrusion rate smoothing' if the set speed varies significantly from the speed of the outer or inner walls. If the speed specified here is higher than the speed of the outer or inner walls, the printer will default to the slower of the two speeds. When specified as a percentage (e.g., 80%), the speed is calculated based on the respective outer or inner wall speed. The default value is set to 100%." msgid "This option sets the printing speed for scarf joints. It is recommended to print scarf joints at a slow speed (less than 100 mm/s). It's also advisable to enable 'Extrusion rate smoothing' if the set speed varies significantly from the speed of the outer or inner walls. If the speed specified here is higher than the speed of the outer or inner walls, the printer will default to the slower of the two speeds. When specified as a percentage (e.g., 80%), the speed is calculated based on the respective outer or inner wall speed. The default value is set to 100%."
msgstr "Esta opção define a velocidade de impressão para as costuras em bisel. É recomendável imprimir as costuras em bisel em uma velocidade baixa (menor que 100 mm/s). Também é aconselhável habilitar 'Suavização da taxa de extrusão' se a velocidade definida variar significativamente da velocidade das paredes externas ou internas. Se a velocidade especificada aqui for maior que a velocidade das paredes externas ou internas, a impressora utilizará a mais lenta das duas velocidades. Quando especificado como uma porcentagem (por exemplo, 80%), a velocidade é calculada com base na velocidade do perímetro externo ou interna respectiva. O valor padrão é definido como 100%." msgstr "Esta opção define a velocidade de impressão para as costuras em bisel. É recomendável imprimir as costuras em bisel em uma velocidade baixa (menor que 100 mm/s). Também é aconselhável habilitar 'Suavização da taxa de extrusão' se a velocidade definida variar significativamente da velocidade das paredes externas ou internas. Se a velocidade especificada aqui for maior que a velocidade das paredes externas ou internas, a impressora utilizará a mais lenta das duas velocidades. Quando especificado como uma porcentagem (ex.: 80%), a velocidade é calculada com base na velocidade do perímetro externo ou interna respectiva. O valor padrão é definido como 100%."
msgid "Scarf joint flow ratio" msgid "Scarf joint flow ratio"
msgstr "Taxa de fluxo da costura em bisel" msgstr "Taxa de fluxo da costura em bisel"
@@ -16164,7 +16177,7 @@ msgid "Wipe speed"
msgstr "Velocidade de limpeza" msgstr "Velocidade de limpeza"
msgid "The wipe speed is determined by the speed setting specified in this configuration. If the value is expressed as a percentage (e.g. 80%), it will be calculated based on the travel speed setting above. The default value for this parameter is 80%." msgid "The wipe speed is determined by the speed setting specified in this configuration. If the value is expressed as a percentage (e.g. 80%), it will be calculated based on the travel speed setting above. The default value for this parameter is 80%."
msgstr "A velocidade de limpeza é determinada pela velocidade especificada nesta configuração. Se o valor for expresso como uma porcentagem (por exemplo, 80%), será calculado com base na configuração de velocidade de deslocamento acima. O valor padrão para este parâmetro é 80%." msgstr "A velocidade de limpeza é determinada pela velocidade especificada nesta configuração. Se o valor for expresso como uma porcentagem (ex.: 80%), será calculado com base na configuração de velocidade de deslocamento acima. O valor padrão para este parâmetro é 80%."
msgid "Skirt distance" msgid "Skirt distance"
msgstr "Distância da saia" msgstr "Distância da saia"
@@ -16202,7 +16215,7 @@ msgstr ""
"Um escudo de ar é útil para proteger uma impressão ABS ou ASA de deformações e desprendimento da mesa de impressão devido à corrente de ar. Geralmente, ele é necessário apenas com impressoras de estrutura aberta, ou seja, sem um gabinete.\n" "Um escudo de ar é útil para proteger uma impressão ABS ou ASA de deformações e desprendimento da mesa de impressão devido à corrente de ar. Geralmente, ele é necessário apenas com impressoras de estrutura aberta, ou seja, sem um gabinete.\n"
"\n" "\n"
"Habilitado = a saia é tão alta quanto o objeto impresso mais alto. Caso contrário, 'Altura da saia' é usada.\n" "Habilitado = a saia é tão alta quanto o objeto impresso mais alto. Caso contrário, 'Altura da saia' é usada.\n"
"Observação: com o escudo de ar ativo, a saia será impressa na distância da saia do objeto. Portanto, se as bordas estiverem ativas, ela pode se cruzar com elas. Para evitar isso, aumente o valor da distância da saia.\n" "Nota: com o escudo de ar ativo, a saia será impressa na distância da saia do objeto. Portanto, se as bordas estiverem ativas, ela pode se cruzar com elas. Para evitar isso, aumente o valor da distância da saia.\n"
msgid "Enabled" msgid "Enabled"
msgstr "Ativado" msgstr "Ativado"
@@ -16343,10 +16356,10 @@ msgid "Preheat steps"
msgstr "Passos de pré-aquecimento" msgstr "Passos de pré-aquecimento"
msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1." msgid "Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1."
msgstr "Insire múltiplos comandos de pré-aquecimento (por exemplo, M104.1). Útil apenas para Prusa XL. Para outras impressoras, defina como 1." msgstr "Insire múltiplos comandos de pré-aquecimento (ex.: M104.1). Útil apenas para Prusa XL. Para outras impressoras, defina como 1."
msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}." msgid "G-code written at the very top of the output file, before any other content. Useful for adding metadata that printer firmware reads from the first lines of the file (e.g. estimated print time, filament usage). Supports placeholders like {print_time_sec} and {used_filament_length}."
msgstr "Código G escrito no início do arquivo de saída, antes de qualquer outro conteúdo. Útil para adicionar metadados que o firmware da impressora lê das primeiras linhas do arquivo (por exemplo, tempo estimado de impressão, consumo de filamento). Suporta marcadores como {print_time_sec} e {used_filament_length}." msgstr "Código G escrito no início do arquivo de saída, antes de qualquer outro conteúdo. Útil para adicionar metadados que o firmware da impressora lê das primeiras linhas do arquivo (ex.: tempo estimado de impressão, consumo de filamento). Suporta marcadores como {print_time_sec} e {used_filament_length}."
msgid "Start G-code" msgid "Start G-code"
msgstr "G-code Inicial" msgstr "G-code Inicial"
@@ -16367,7 +16380,7 @@ msgid "Manual Filament Change"
msgstr "Troca Manual de Filamento" msgstr "Troca Manual de Filamento"
msgid "Enable this option to omit the custom Change filament G-code only at the beginning of the print. The tool change command (e.g., T0) will be skipped throughout the entire print. This is useful for manual multi-material printing, where we use M600/PAUSE to trigger the manual filament change action." msgid "Enable this option to omit the custom Change filament G-code only at the beginning of the print. The tool change command (e.g., T0) will be skipped throughout the entire print. This is useful for manual multi-material printing, where we use M600/PAUSE to trigger the manual filament change action."
msgstr "Ative esta opção para omitir o G-code de troca de filamento personalizado apenas no início da impressão. O comando de troca de ferramenta (por exemplo, T0) será ignorado durante toda a impressão. Isso é útil para impressão manual de vários materiais, onde usamos M600/PAUSE para acionar a ação de troca manual de filamento." msgstr "Ative esta opção para omitir o G-code de troca de filamento personalizado apenas no início da impressão. O comando de troca de ferramenta (ex.: T0) será ignorado durante toda a impressão. Isso é útil para impressão manual de vários materiais, onde usamos M600/PAUSE para acionar a ação de troca manual de filamento."
msgid "Wipe tower type" msgid "Wipe tower type"
msgstr "Tipo de torre de purga" msgstr "Tipo de torre de purga"
@@ -16923,11 +16936,9 @@ msgstr ""
"\n" "\n"
"Definir um valor na configuração de quantidade de retração antes da limpeza abaixo executará qualquer retração em excesso antes da limpeza, caso contrário, será realizada após." "Definir um valor na configuração de quantidade de retração antes da limpeza abaixo executará qualquer retração em excesso antes da limpeza, caso contrário, será realizada após."
# AI Translated
msgid "Mixed color sublayer" msgid "Mixed color sublayer"
msgstr "Subcamada de cor mista" msgstr "Subcamada de cor mista"
# AI Translated
msgid "Enable mixed color sublayer splitting. When enabled, layers containing mixed color filaments will be split into sub-layers to achieve color mixing effects." msgid "Enable mixed color sublayer splitting. When enabled, layers containing mixed color filaments will be split into sub-layers to achieve color mixing effects."
msgstr "Ativa a divisão em subcamadas de cor mista. Quando ativado, as camadas que contêm filamentos de cor mista são divididas em subcamadas para obter efeitos de mistura de cores." msgstr "Ativa a divisão em subcamadas de cor mista. Quando ativado, as camadas que contêm filamentos de cor mista são divididas em subcamadas para obter efeitos de mistura de cores."
@@ -17987,9 +17998,8 @@ msgstr "A geração da malha do arquivo do modelo falhou ou não há forma váli
msgid "The supplied file couldn't be read because it's empty." msgid "The supplied file couldn't be read because it's empty."
msgstr "O arquivo fornecido não pôde ser lido porque está vazio." msgstr "O arquivo fornecido não pôde ser lido porque está vazio."
# AI Translated
msgid "The file format is incompatible and cannot be parsed." msgid "The file format is incompatible and cannot be parsed."
msgstr "O formato do arquivo é incompatível e não pode ser lido." msgstr "O formato do arquivo é incompatível e não pode ser processado."
msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension." msgid "Unknown file format: input file must have .stl, .obj, or .amf(.xml) extension."
msgstr "Formato de arquivo desconhecido: o arquivo de entrada deve ter extensão .stl, .obj, .amf(.xml)." msgstr "Formato de arquivo desconhecido: o arquivo de entrada deve ter extensão .stl, .obj, .amf(.xml)."
@@ -17998,10 +18008,10 @@ msgid "Unknown file format: input file must have .3mf or .zip.amf extension."
msgstr "Formato de arquivo desconhecido: o arquivo de entrada deve ter extensão .3mf ou .zip.amf." msgstr "Formato de arquivo desconhecido: o arquivo de entrada deve ter extensão .3mf ou .zip.amf."
msgid "load_obj: failed to parse" msgid "load_obj: failed to parse"
msgstr "load_obj: falha ao analisar" msgstr "load_obj: falha ao processar"
msgid "load mtl in obj: failed to parse" msgid "load mtl in obj: failed to parse"
msgstr "carregar mtl em obj: falha ao analisar" msgstr "carregar mtl em obj: falha ao processsar"
msgid "The file contains polygons with more than 4 vertices." msgid "The file contains polygons with more than 4 vertices."
msgstr "O arquivo contém polígonos com mais de 4 vértices." msgstr "O arquivo contém polígonos com mais de 4 vértices."
@@ -19115,7 +19125,7 @@ msgid "Serial"
msgstr "Série" msgstr "Série"
msgid "e.g. Basic, Matte, Silk, Marble" msgid "e.g. Basic, Matte, Silk, Marble"
msgstr "por exemplo, Básico, Fosco, Seda, Mármore" msgstr "Ex.: Básico, Fosco, Seda, Mármore"
msgid "Filament Preset" msgid "Filament Preset"
msgstr "Predefinição de Filamento" msgstr "Predefinição de Filamento"
@@ -19796,7 +19806,7 @@ msgid "Error. Can't get API token for authorization"
msgstr "Erro. Não foi possível obter o token de API para autorização" msgstr "Erro. Não foi possível obter o token de API para autorização"
msgid "Could not parse server response." msgid "Could not parse server response."
msgstr "Não foi possível decifrar a resposta do servidor." msgstr "Não foi possível processar a resposta do servidor."
msgid "Error saving session to file" msgid "Error saving session to file"
msgstr "Erro salvando sessão para arquivo" msgstr "Erro salvando sessão para arquivo"
@@ -19864,7 +19874,7 @@ msgstr "O host respondeu, mas não parece ser o Moonraker (falta o result.klippy
#, c-format, boost-format #, c-format, boost-format
msgid "Could not parse Moonraker server response: %s" msgid "Could not parse Moonraker server response: %s"
msgstr "Não foi possível analisar a resposta do servidor Moonraker: %s" msgstr "Não foi possível processar a resposta do servidor Moonraker: %s"
msgid "Connection to OctoPrint is working correctly." msgid "Connection to OctoPrint is working correctly."
msgstr "A conexão com o OctoPrint funciona corretamente." msgstr "A conexão com o OctoPrint funciona corretamente."
@@ -20238,7 +20248,6 @@ msgstr "Removido"
msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings" msgid "Enable smart filament assign: Assign one filament to multiple nozzles to maximize savings"
msgstr "Ativar atribuição inteligente de filamento: Atribui um filamento a vários bicos para maximizar a economia" msgstr "Ativar atribuição inteligente de filamento: Atribui um filamento a vários bicos para maximizar a economia"
# AI Translated
msgid "File Saving" msgid "File Saving"
msgstr "Salvamento de Arquivo" msgstr "Salvamento de Arquivo"
@@ -20425,7 +20434,7 @@ msgid "Connection timed out. Please check if the printer and computer network ar
msgstr "Limite de tempo de conexão esgotado. Verifique se a impressora e a rede do computador estão funcionando corretamente e confirme se estão na mesma rede." msgstr "Limite de tempo de conexão esgotado. Verifique se a impressora e a rede do computador estão funcionando corretamente e confirme se estão na mesma rede."
msgid "The Hostname/IP/URL could not be parsed, please check it and try again." msgid "The Hostname/IP/URL could not be parsed, please check it and try again."
msgstr "Não foi possível decifrar o Hostname/IP/URL; verifique-o e tente novamente." msgstr "Não foi possível processar o Hostname/IP/URL; verifique-o e tente novamente."
msgid "File/data transfer interrupted. Please check the printer and network, then try it again." msgid "File/data transfer interrupted. Please check the printer and network, then try it again."
msgstr "Transferência de arquivo/dados interrompida. Verifique a impressora e a rede e tente novamente." msgstr "Transferência de arquivo/dados interrompida. Verifique a impressora e a rede e tente novamente."
@@ -20522,6 +20531,15 @@ msgstr "Esta ação não pode ser desfeita. Continuar?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Ignorando objetos." msgstr "Ignorando objetos."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Selecionar Filamento" msgstr "Selecionar Filamento"
@@ -21199,15 +21217,6 @@ msgstr ""
#~ msgid "Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Orca Slicer?)" #~ msgid "Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Orca Slicer?)"
#~ msgstr "Seu sistema não possui codecs H.264 para o GStreamer, que são necessários para reproduzir vídeos. (Tente instalar os pacotes gstreamer1.0-plugins-bad ou gstreamer1.0-libav e depois reinicie o OrcaSlicer?)" #~ msgstr "Seu sistema não possui codecs H.264 para o GStreamer, que são necessários para reproduzir vídeos. (Tente instalar os pacotes gstreamer1.0-plugins-bad ou gstreamer1.0-libav e depois reinicie o OrcaSlicer?)"
#~ msgid "N"
#~ msgstr "N"
#~ msgid "g"
#~ msgstr "g"
#~ msgid "Fila Saving"
#~ msgstr "Econo Filamento"
#~ msgid "" #~ msgid ""
#~ "Layer height is too small.\n" #~ "Layer height is too small.\n"
#~ "It will set to min_layer_height\n" #~ "It will set to min_layer_height\n"
@@ -21535,7 +21544,7 @@ msgstr ""
#~ "Pontes externas de menor densidade podem ajudar a melhorar a confiabilidade, pois há mais espaço para o ar circular ao redor da ponte extrudada, melhorando sua velocidade de resfriamento. O mínimo é 10%.\n" #~ "Pontes externas de menor densidade podem ajudar a melhorar a confiabilidade, pois há mais espaço para o ar circular ao redor da ponte extrudada, melhorando sua velocidade de resfriamento. O mínimo é 10%.\n"
#~ "\n" #~ "\n"
#~ "Densidades mais altas podem produzir superfícies de ponte mais lisas, pois as linhas sobrepostas fornecem suporte adicional durante a impressão. O máximo é 120%.\n" #~ "Densidades mais altas podem produzir superfícies de ponte mais lisas, pois as linhas sobrepostas fornecem suporte adicional durante a impressão. O máximo é 120%.\n"
#~ "Observação: Densidade de ponte muito alta pode causar deformação ou sobrextrusão." #~ "Nota: Densidade de ponte muito alta pode causar deformação ou sobrextrusão."
#~ msgid "" #~ msgid ""
#~ "Controls the density (spacing) of internal bridge lines. 100% means solid bridge. Default is 100%.\n" #~ "Controls the density (spacing) of internal bridge lines. 100% means solid bridge. Default is 100%.\n"
@@ -21580,7 +21589,7 @@ msgstr ""
#~ "\n" #~ "\n"
#~ "Geralmente, é recomendável ter esta opção ativada, a menos que o resfriamento da impressora seja potente o suficiente ou a velocidade de impressão lenta o suficiente para que a curvatura do perímetro não aconteça. Se estiver imprimindo com uma alta velocidade de perímetro externo, este parâmetro pode introduzir pequenos artefatos ao desacelerar devido à grande variação nas velocidades de impressão. Se você notar artefatos, certifique-se de que seu pressure advance esteja ajustado corretamente.\n" #~ "Geralmente, é recomendável ter esta opção ativada, a menos que o resfriamento da impressora seja potente o suficiente ou a velocidade de impressão lenta o suficiente para que a curvatura do perímetro não aconteça. Se estiver imprimindo com uma alta velocidade de perímetro externo, este parâmetro pode introduzir pequenos artefatos ao desacelerar devido à grande variação nas velocidades de impressão. Se você notar artefatos, certifique-se de que seu pressure advance esteja ajustado corretamente.\n"
#~ "\n" #~ "\n"
#~ "Observação: quando esta opção estiver habilitada, os perímetros de saliência são tratados como saliências, o que significa que a velocidade de saliência é aplicada mesmo se o perímetro de saliência for parte de uma ponte. Por exemplo, quando os perímetros estiverem 100% salientes, sem nenhuma parede apoiando-os por baixo, a velocidade de saliência de 100% será aplicada." #~ "Nota: quando esta opção estiver habilitada, os perímetros de saliência são tratados como saliências, o que significa que a velocidade de saliência é aplicada mesmo se o perímetro de saliência for parte de uma ponte. Por exemplo, quando os perímetros estiverem 100% salientes, sem nenhuma parede apoiando-os por baixo, a velocidade de saliência de 100% será aplicada."
#~ msgid "If enabled, bridges are more reliable, can bridge longer distances, but may look worse. If disabled, bridges look better but are reliable just for shorter bridged distances." #~ msgid "If enabled, bridges are more reliable, can bridge longer distances, but may look worse. If disabled, bridges look better but are reliable just for shorter bridged distances."
#~ msgstr "Se ativado, as pontes são mais confiáveis, podem cobrir distâncias maiores, mas podem parecer piores. Se desativado, as pontes ficam melhores, mas são confiáveis apenas para distâncias de ponte mais curtas." #~ msgstr "Se ativado, as pontes são mais confiáveis, podem cobrir distâncias maiores, mas podem parecer piores. Se desativado, as pontes ficam melhores, mas são confiáveis apenas para distâncias de ponte mais curtas."
@@ -22500,7 +22509,7 @@ msgstr ""
#~ msgstr "Contagem máxima de projetos recentes" #~ msgstr "Contagem máxima de projetos recentes"
#~ msgid "This parameter adds a rotation of sparse infill direction to each layer according to the specified template. The template is a comma-separated list of angles in degrees, e.g. '0,90'. The first angle is applied to the first layer, the second angle to the second layer, and so on. If there are more layers than angles, the angles will be repeated. Note that not all sparse infill patterns support rotation." #~ msgid "This parameter adds a rotation of sparse infill direction to each layer according to the specified template. The template is a comma-separated list of angles in degrees, e.g. '0,90'. The first angle is applied to the first layer, the second angle to the second layer, and so on. If there are more layers than angles, the angles will be repeated. Note that not all sparse infill patterns support rotation."
#~ msgstr "Este parâmetro adiciona uma rotação na direção do preenchimento esparso a cada camada, de acordo com o gabarito especificado. O gabarito é uma lista de ângulos em graus separados por vírgulas, por exemplo, '0,90'. O primeiro ângulo é aplicado à primeira camada, o segundo ângulo à segunda camada e assim por diante. Se houver mais camadas do que ângulos, os ângulos serão repetidos. Observe que nem todos os padrões de preenchimento esparso suportam rotação." #~ msgstr "Este parâmetro adiciona uma rotação na direção do preenchimento esparso a cada camada, de acordo com o gabarito especificado. O gabarito é uma lista de ângulos em graus separados por vírgulas, como '0,90'. O primeiro ângulo é aplicado à primeira camada, o segundo ângulo à segunda camada e assim por diante. Se houver mais camadas do que ângulos, os ângulos serão repetidos. Observe que nem todos os padrões de preenchimento esparso suportam rotação."
#~ msgid "Set Position" #~ msgid "Set Position"
#~ msgstr "Definir Posição" #~ msgstr "Definir Posição"
+98 -19
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: OrcaSlicer V2.5.0\n" "Project-Id-Version: OrcaSlicer V2.5.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-02-25 13:38+0300\n" "PO-Revision-Date: 2026-02-25 13:38+0300\n"
"Last-Translator: Felix14_v2\n" "Last-Translator: Felix14_v2\n"
"Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg <andylg@yandex.ru>\n" "Language-Team: Felix14_v2 (ДС/ТГ: @felix14_v2, почта: aleks111001@list.ru), Andylg <andylg@yandex.ru>\n"
@@ -2431,8 +2431,6 @@ msgstr "Доступно обновление. Проверьте меню па
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s был удалён." msgstr "%s был удалён."
msgid "Switching application language"
msgstr "Изменение языка приложения"
msgid "Select the language" msgid "Select the language"
msgstr "Выбор языка" msgstr "Выбор языка"
@@ -4891,6 +4889,11 @@ msgid ""
"No - Cancel enabling spiral mode" "No - Cancel enabling spiral mode"
msgstr "Использовать эти настройки и режим вазы?" msgstr "Использовать эти настройки и режим вазы?"
# Не знаю, как и почему, но это, похоже, исправляет "вопросики" вместо
# символов
msgid "N/A"
msgstr ""
msgid "Printing" msgid "Printing"
msgstr "Печать" msgstr "Печать"
@@ -5332,13 +5335,9 @@ msgstr "Значение %s выходит за пределы допустим
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Имелось ввиду %s%%? (введено %s %s)\n" "Имелось ввиду %s%% или %s %s?"
"Да – изменить на %s%%\n"
"Нет оставить %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5360,11 +5359,6 @@ msgstr "Недопустимый шаблон. Используйте N, N#K и
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Недопустимый формат. Ожидаемый векторный формат: \"%1%\"" msgstr "Недопустимый формат. Ожидаемый векторный формат: \"%1%\""
# Не знаю, как и почему, но это, похоже, исправляет "вопросики" вместо
# символов
msgid "N/A"
msgstr ""
msgid "System agents" msgid "System agents"
msgstr "Системные агенты" msgstr "Системные агенты"
@@ -6378,6 +6372,12 @@ msgstr "Сохранить проект как"
msgid "Save current project as" msgid "Save current project as"
msgstr "Сохранить текущий проект как" msgstr "Сохранить текущий проект как"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Импорт 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Импорт 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8212,6 +8212,12 @@ msgstr "Во избежание повреждения принтера убед
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Пользовательский профиль" msgstr "Пользовательский профиль"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Имена компонентов внутри файла STEP не в формате UTF-8." msgstr "Имена компонентов внутри файла STEP не в формате UTF-8."
@@ -8624,6 +8630,17 @@ msgstr "Сохранить нарезанный файл как:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Файл %s отправлен в память принтера и может быть просмотрен на нём." msgstr "Файл %s отправлен в память принтера и может быть просмотрен на нём."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Опубликовать"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Не указан тип сопла. Укажите его и попробуйте ещё раз." msgstr "Не указан тип сопла. Укажите его и попробуйте ещё раз."
@@ -8829,8 +8846,6 @@ msgstr "Хотите продолжить?"
msgid "Language selection" msgid "Language selection"
msgstr "Выбор языка" msgstr "Выбор языка"
msgid "Switching application language while some presets are modified."
msgstr "Смена языка приложения при изменении некоторых профилей."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Азиатско-Тихоокеанский" msgstr "Азиатско-Тихоокеанский"
@@ -9770,9 +9785,6 @@ msgstr "Перейти на веб-страницу публикации мод
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Примечание: подготовка может занять несколько минут. Пожалуйста, наберитесь терпения." msgstr "Примечание: подготовка может занять несколько минут. Пожалуйста, наберитесь терпения."
msgid "Publish"
msgstr "Опубликовать"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Публикация была отменена" msgstr "Публикация была отменена"
@@ -9788,6 +9800,64 @@ msgstr "Отправка данных"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Перейти на страницу" msgstr "Перейти на страницу"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Сохранить %s как" msgstr "Сохранить %s как"
@@ -21541,6 +21611,15 @@ msgstr "Это действие необратимо. Продолжить?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Исключение объектов." msgstr "Исключение объектов."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Выбрать материал" msgstr "Выбрать материал"
+97 -18
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"Language: sv\n" "Language: sv\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -2767,8 +2767,6 @@ msgstr "Det finns en uppdatering tillgänglig. Öppna dialogrutan för förinst
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s har tagits bort." msgstr "%s har tagits bort."
msgid "Switching application language"
msgstr "Byt applikationsspråk"
msgid "Select the language" msgid "Select the language"
msgstr "Välj språk" msgstr "Välj språk"
@@ -5387,6 +5385,10 @@ msgstr ""
"JA -Ändra dessa inställningar och möjliggör Spiral läge automatiskt\n" "JA -Ändra dessa inställningar och möjliggör Spiral läge automatiskt\n"
"NEJ -Avbryt Spiral läge denna gång" "NEJ -Avbryt Spiral läge denna gång"
# AI Translated
msgid "N/A"
msgstr "Ej tillämpligt"
msgid "Printing" msgid "Printing"
msgstr "Utskrift pågår" msgstr "Utskrift pågår"
@@ -5903,13 +5905,9 @@ msgstr "Värdet %s ligger utanför intervallet. Giltigt intervall är från %d t
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Det är %s%% eller %s %s?\n" "Det är %s%% eller %s %s?"
"JA för %s%%, \n"
"NEJ för %s %s."
# AI Translated # AI Translated
#, boost-format #, boost-format
@@ -5936,10 +5934,6 @@ msgstr "Ogiltigt mönster. Använd N, N#K eller en kommaseparerad lista med valf
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Ogiltligt format. Förväntat vector format: \"%1%\"" msgstr "Ogiltligt format. Förväntat vector format: \"%1%\""
# AI Translated
msgid "N/A"
msgstr "Ej tillämpligt"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Systemagenter" msgstr "Systemagenter"
@@ -6972,6 +6966,12 @@ msgstr "Spara Projekt som"
msgid "Save current project as" msgid "Save current project as"
msgstr "Spara nuvarande projekt som" msgstr "Spara nuvarande projekt som"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Importera 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Importera 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8996,6 +8996,12 @@ msgstr "Bekräfta att G-koderna i dessa inställningar är säkra för att förh
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Anpassad inställning" msgstr "Anpassad inställning"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Komponent namnet i STEP filen är inte UTF-8 format!" msgstr "Komponent namnet i STEP filen är inte UTF-8 format!"
@@ -9432,6 +9438,17 @@ msgstr "Spara beredningen som:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Filen %s har skickats till skrivarens lagringsutrymme och kan visas på skrivaren." msgstr "Filen %s har skickats till skrivarens lagringsutrymme och kan visas på skrivaren."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Publicera"
# AI Translated # AI Translated
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Nozzeltypen är inte angiven. Ange nozzeln och försök igen." msgstr "Nozzeltypen är inte angiven. Ange nozzeln och försök igen."
@@ -9671,8 +9688,6 @@ msgstr "Fortsätta?"
msgid "Language selection" msgid "Language selection"
msgstr "Språkval" msgstr "Språkval"
msgid "Switching application language while some presets are modified."
msgstr "Byter språk medans inställningarna ändras."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Asien-Stillahavsområdet" msgstr "Asien-Stillahavsområdet"
@@ -10740,9 +10755,6 @@ msgstr "Växla till modell publicerings hemsidan"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Notera: Förberedelserna kan ta flera minuter. Vänligen vänta." msgstr "Notera: Förberedelserna kan ta flera minuter. Vänligen vänta."
msgid "Publish"
msgstr "Publicera"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Publiceringen avbröts" msgstr "Publiceringen avbröts"
@@ -10759,6 +10771,64 @@ msgstr "Laddar upp data"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Växla till hemsidan" msgstr "Växla till hemsidan"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Spara %s som" msgstr "Spara %s som"
@@ -23513,6 +23583,15 @@ msgstr "Åtgärden kan inte ångras. Vill du fortsätta?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Hoppar över objekt." msgstr "Hoppar över objekt."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Välj filament" msgstr "Välj filament"
+96 -17
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-06-19 13:40+0700\n" "PO-Revision-Date: 2026-06-19 13:40+0700\n"
"Last-Translator: Icezaza\n" "Last-Translator: Icezaza\n"
"Language-Team: Thai\n" "Language-Team: Thai\n"
@@ -2456,8 +2456,6 @@ msgstr "มีอัปเดตพร้อมใช้งาน เปิด
msgid "%s has been removed." msgid "%s has been removed."
msgstr "ลบ %s แล้ว" msgstr "ลบ %s แล้ว"
msgid "Switching application language"
msgstr "การเปลี่ยนภาษาของแอปพลิเคชัน"
msgid "Select the language" msgid "Select the language"
msgstr "เลือกภาษา" msgstr "เลือกภาษา"
@@ -4887,6 +4885,9 @@ msgstr ""
"ใช่ - เปลี่ยนการตั้งค่าเหล่านี้และเปิดใช้งานโหมดเกลียวโดยอัตโนมัติ\n" "ใช่ - เปลี่ยนการตั้งค่าเหล่านี้และเปิดใช้งานโหมดเกลียวโดยอัตโนมัติ\n"
"ไม่ - เลิกใช้โหมดเกลียวในครั้งนี้" "ไม่ - เลิกใช้โหมดเกลียวในครั้งนี้"
msgid "N/A"
msgstr "ไม่มี"
msgid "Printing" msgid "Printing"
msgstr "กำลังพิมพ์" msgstr "กำลังพิมพ์"
@@ -5318,13 +5319,9 @@ msgstr "ค่า %s อยู่นอกช่วง ช่วงที่ถ
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"มันคือ %s%% หรือ %s %s?\n" "มันคือ %s%% หรือ %s %s?"
"ใช่สำหรับ %s%% \n"
"ไม่ สำหรับ %s %s"
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5346,9 +5343,6 @@ msgstr "รูปแบบไม่ถูกต้อง ใช้ N, N#K หร
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "รูปแบบไม่ถูกต้อง รูปแบบเวกเตอร์ที่ต้องการ: \"%1%\"" msgstr "รูปแบบไม่ถูกต้อง รูปแบบเวกเตอร์ที่ต้องการ: \"%1%\""
msgid "N/A"
msgstr "ไม่มี"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "เอเจนต์ระบบ" msgstr "เอเจนต์ระบบ"
@@ -6304,6 +6298,12 @@ msgstr "บันทึกโปรเจกต์เป็น"
msgid "Save current project as" msgid "Save current project as"
msgstr "บันทึกโครงการปัจจุบันเป็น" msgstr "บันทึกโครงการปัจจุบันเป็น"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "นำเข้า 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "นำเข้า 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8118,6 +8118,12 @@ msgstr "โปรดยืนยันว่ารหัส G ภายในค
msgid "Customized Preset" msgid "Customized Preset"
msgstr "ค่าที่ตั้งไว้ล่วงหน้าที่กำหนดเอง" msgstr "ค่าที่ตั้งไว้ล่วงหน้าที่กำหนดเอง"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "ชื่อของส่วนประกอบภายในไฟล์ STEP ไม่ใช่รูปแบบ UTF-8!" msgstr "ชื่อของส่วนประกอบภายในไฟล์ STEP ไม่ใช่รูปแบบ UTF-8!"
@@ -8525,6 +8531,17 @@ msgstr "บันทึกไฟล์ที่สไลซ์เป็น:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "ไฟล์ %s ถูกส่งไปยังพื้นที่เก็บข้อมูลของเครื่องพิมพ์แล้ว และสามารถดูได้บนเครื่องพิมพ์" msgstr "ไฟล์ %s ถูกส่งไปยังพื้นที่เก็บข้อมูลของเครื่องพิมพ์แล้ว และสามารถดูได้บนเครื่องพิมพ์"
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "เผยแพร่"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "ไม่ได้ตั้งค่าประเภทหัวฉีด โปรดตั้งหัวฉีดแล้วลองอีกครั้ง" msgstr "ไม่ได้ตั้งค่าประเภทหัวฉีด โปรดตั้งหัวฉีดแล้วลองอีกครั้ง"
@@ -8735,8 +8752,6 @@ msgstr "ต้องการดำเนินการต่อหรือไ
msgid "Language selection" msgid "Language selection"
msgstr "การเลือกภาษา" msgstr "การเลือกภาษา"
msgid "Switching application language while some presets are modified."
msgstr "การสลับภาษาของแอปพลิเคชันในขณะที่มีการแก้ไขค่าที่ตั้งไว้บางส่วน"
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "เอเชียแปซิฟิก" msgstr "เอเชียแปซิฟิก"
@@ -9667,9 +9682,6 @@ msgstr "ข้ามไปที่โมเดลเผยแพร่หน้
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "หมายเหตุ: การเตรียมการอาจใช้เวลาหลายนาที กรุณาอดทน." msgstr "หมายเหตุ: การเตรียมการอาจใช้เวลาหลายนาที กรุณาอดทน."
msgid "Publish"
msgstr "เผยแพร่"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "การเผยแพร่ถูกยกเลิก" msgstr "การเผยแพร่ถูกยกเลิก"
@@ -9685,6 +9697,64 @@ msgstr "กำลังอัพโหลดข้อมูล"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "ข้ามไปที่หน้าเว็บ" msgstr "ข้ามไปที่หน้าเว็บ"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "บันทึก %s เป็น" msgstr "บันทึก %s เป็น"
@@ -20891,6 +20961,15 @@ msgstr "การทำงานนี้ไม่สามารถย้อน
msgid "Skipping objects." msgid "Skipping objects."
msgstr "ข้ามวัตถุ" msgstr "ข้ามวัตถุ"
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "เลือกเส้นพลาสติก" msgstr "เลือกเส้นพลาสติก"
+97 -18
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-08-21 23:18+0300\n" "PO-Revision-Date: 2026-08-21 23:18+0300\n"
"Last-Translator: GlauTech\n" "Last-Translator: GlauTech\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2480,8 +2480,6 @@ msgstr "Kullanılabilir bir güncelleme var. Güncellemek için ön ayar paketi
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s kaldırıldı." msgstr "%s kaldırıldı."
msgid "Switching application language"
msgstr "Uygulama dilini değiştirme"
msgid "Select the language" msgid "Select the language"
msgstr "Dili seçin" msgstr "Dili seçin"
@@ -4949,6 +4947,10 @@ msgstr ""
"Evet - Bu ayarları değiştirin ve spiral modunu otomatik olarak etkinleştirin\n" "Evet - Bu ayarları değiştirin ve spiral modunu otomatik olarak etkinleştirin\n"
"Hayır - Bu sefer spiral modunu kullanmaktan vazgeçin" "Hayır - Bu sefer spiral modunu kullanmaktan vazgeçin"
# AI Translated
msgid "N/A"
msgstr "Yok"
msgid "Printing" msgid "Printing"
msgstr "Baskı" msgstr "Baskı"
@@ -5380,13 +5382,9 @@ msgstr "Değer %s aralık dışında. Geçerli aralık %d ile %d arasındadır."
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"%s%% mi yoksa %s %s mi?\n" "%s%% mi yoksa %s %s mi?"
"%s%% için EVET,\n"
"%s %s için HAYIR."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5408,10 +5406,6 @@ msgstr "Geçersiz kalıp. N, N#K veya giriş başına isteğe bağlı #K ile vir
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Geçersiz format. Beklenen vektör formatı: \"%1%\"" msgstr "Geçersiz format. Beklenen vektör formatı: \"%1%\""
# AI Translated
msgid "N/A"
msgstr "Yok"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Sistem aracıları" msgstr "Sistem aracıları"
@@ -6372,6 +6366,12 @@ msgstr "Projeyi farklı kaydet"
msgid "Save current project as" msgid "Save current project as"
msgstr "Mevcut projeyi farklı kaydet" msgstr "Mevcut projeyi farklı kaydet"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "3MF/STL/STEP/SVG/OBJ/AMF'yi içe aktar" msgstr "3MF/STL/STEP/SVG/OBJ/AMF'yi içe aktar"
@@ -8215,6 +8215,12 @@ msgstr "Lütfen bu ön ayarlar içindeki G-code'larının makineye herhangi bir
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Özel Ayar" msgstr "Özel Ayar"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Step dosyasındaki bileşenlerin adı UTF-8 formatında değil!" msgstr "Step dosyasındaki bileşenlerin adı UTF-8 formatında değil!"
@@ -8624,6 +8630,17 @@ msgstr "Dilimlenmiş dosyayı şu şekilde kaydedin:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "%s dosyası yazıcının depolama alanına gönderildi ve yazıcıda görüntülenebiliyor." msgstr "%s dosyası yazıcının depolama alanına gönderildi ve yazıcıda görüntülenebiliyor."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Yayınla"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Nozul tipi ayarlanmamış. Lütfen nozulu ayarlayın ve tekrar deneyin." msgstr "Nozul tipi ayarlanmamış. Lütfen nozulu ayarlayın ve tekrar deneyin."
@@ -8837,8 +8854,6 @@ msgstr "Devam etmek istiyor musun?"
msgid "Language selection" msgid "Language selection"
msgstr "Dil seçimi" msgstr "Dil seçimi"
msgid "Switching application language while some presets are modified."
msgstr "Bazı ön ayarlar değiştirilirken uygulama dilinin değiştirilmesi."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Asya Pasifik" msgstr "Asya Pasifik"
@@ -9811,9 +9826,6 @@ msgstr "Model yayınlama web sayfasına git"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Not: Hazırlık birkaç dakika sürebilir. Lütfen sabırlı olun." msgstr "Not: Hazırlık birkaç dakika sürebilir. Lütfen sabırlı olun."
msgid "Publish"
msgstr "Yayınla"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Yayınlama iptal edildi" msgstr "Yayınlama iptal edildi"
@@ -9829,6 +9841,64 @@ msgstr "Veriler yükleniyor"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Web sayfasına atla" msgstr "Web sayfasına atla"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "%s'yi farklı kaydet" msgstr "%s'yi farklı kaydet"
@@ -21318,6 +21388,15 @@ msgstr "Bu eylem geri alınamaz. Devam etmek?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Nesneleri atlama." msgstr "Nesneleri atlama."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Filament Seçin" msgstr "Filament Seçin"
+96 -17
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: orcaslicerua\n" "Project-Id-Version: orcaslicerua\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-07-17 16:25+0300\n" "PO-Revision-Date: 2026-07-17 16:25+0300\n"
"Last-Translator: Andrij Mizyk <andm1zyk@proton.me>\n" "Last-Translator: Andrij Mizyk <andm1zyk@proton.me>\n"
"Language-Team: Ukrainian\n" "Language-Team: Ukrainian\n"
@@ -2424,8 +2424,6 @@ msgstr "Доступне оновлення. Відкрийте вікно на
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s вилучено." msgstr "%s вилучено."
msgid "Switching application language"
msgstr "Зміна мови програми"
msgid "Select the language" msgid "Select the language"
msgstr "Вибрати мову" msgstr "Вибрати мову"
@@ -4887,6 +4885,9 @@ msgstr ""
"Так – змінити ці налаштування та автоматично включити режим спіральна ваза\n" "Так – змінити ці налаштування та автоматично включити режим спіральна ваза\n"
"Ні - цього разу відмовитися від використання режиму спіральна ваза" "Ні - цього разу відмовитися від використання режиму спіральна ваза"
msgid "N/A"
msgstr "Н/Д"
msgid "Printing" msgid "Printing"
msgstr "Друк" msgstr "Друк"
@@ -5329,13 +5330,9 @@ msgstr "Значення %s знаходиться за межами діапа
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Це %s%% або %s %s?\n" "Це %s%% або %s %s?"
"ТАК для %s%%, \n"
"НІ для %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5358,9 +5355,6 @@ msgstr "Некоректний шаблон. Використовуйте N, N#K
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Невірний формат. Очікуваний векторний формат: \"%1%\"" msgstr "Невірний формат. Очікуваний векторний формат: \"%1%\""
msgid "N/A"
msgstr "Н/Д"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Системні агенти" msgstr "Системні агенти"
@@ -6341,6 +6335,12 @@ msgstr "Зберегти проєкт як"
msgid "Save current project as" msgid "Save current project as"
msgstr "Зберегти поточний проєкт як" msgstr "Зберегти поточний проєкт як"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Імпорт 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Імпорт 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8223,6 +8223,12 @@ msgstr "Будь ласка, підтвердьте, що G-коди в цих
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Пристосований пресет" msgstr "Пристосований пресет"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
# AI Translated # AI Translated
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Назви компонентів усередині файлу STEP не у форматі UTF-8!" msgstr "Назви компонентів усередині файлу STEP не у форматі UTF-8!"
@@ -8635,6 +8641,17 @@ msgstr "Зберегти нарізаний файл як:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "Файл %s надіслано до памʼяті принтера та доступний для перегляду на принтері." msgstr "Файл %s надіслано до памʼяті принтера та доступний для перегляду на принтері."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Публікувати"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Тип сопла не встановлений. Будь ласка, оберіть сопло та спробуйте ще раз." msgstr "Тип сопла не встановлений. Будь ласка, оберіть сопло та спробуйте ще раз."
@@ -8851,8 +8868,6 @@ msgstr "Ви хочете продовжувати?"
msgid "Language selection" msgid "Language selection"
msgstr "Вибір мови" msgstr "Вибір мови"
msgid "Switching application language while some presets are modified."
msgstr "Зміна мови програми при зміні деяких профілів."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Азіатсько-Тихоокеанський регіон" msgstr "Азіатсько-Тихоокеанський регіон"
@@ -9814,9 +9829,6 @@ msgstr "Перейти на веб-сторінку публікації мод
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Примітка. Підготовка може тривати кілька хвилин. Будь ласка, будьте терплячі." msgstr "Примітка. Підготовка може тривати кілька хвилин. Будь ласка, будьте терплячі."
msgid "Publish"
msgstr "Публікувати"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Публікація скасована" msgstr "Публікація скасована"
@@ -9832,6 +9844,64 @@ msgstr "Відвантаження даних"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Перейти на вебсторінку" msgstr "Перейти на вебсторінку"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Зберегти %s як" msgstr "Зберегти %s як"
@@ -21495,6 +21565,15 @@ msgstr "Дію не можливо завершити. Продовжити?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Пропускання обʼєктів." msgstr "Пропускання обʼєктів."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "Вибрати філамент" msgstr "Вибрати філамент"
+97 -18
View File
@@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2025-10-02 17:43+0700\n" "PO-Revision-Date: 2025-10-02 17:43+0700\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: hainguyen.ts13@gmail.com\n" "Language-Team: hainguyen.ts13@gmail.com\n"
@@ -2568,8 +2568,6 @@ msgstr "Có bản cập nhật khả dụng. Hãy mở hộp thoại gói cài
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s đã bị xóa." msgstr "%s đã bị xóa."
msgid "Switching application language"
msgstr "Đang chuyển ngôn ngữ ứng dụng"
msgid "Select the language" msgid "Select the language"
msgstr "Chọn ngôn ngữ" msgstr "Chọn ngôn ngữ"
@@ -5143,6 +5141,10 @@ msgstr ""
"Yes - Thay đổi các cài đặt này và bật chế độ spiral tự động\n" "Yes - Thay đổi các cài đặt này và bật chế độ spiral tự động\n"
"No - Từ bỏ dùng chế độ spiral lần này" "No - Từ bỏ dùng chế độ spiral lần này"
# AI Translated
msgid "N/A"
msgstr "N/A"
msgid "Printing" msgid "Printing"
msgstr "Đang in" msgstr "Đang in"
@@ -5633,13 +5635,9 @@ msgstr "Giá trị %s nằm ngoài phạm vi. Phạm vi hợp lệ từ %d đế
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"Là %s%% hay %s %s?\n" "Là %s%% hay %s %s?"
"YES cho %s%%, \n"
"NO cho %s %s."
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5661,10 +5659,6 @@ msgstr "Mẫu không hợp lệ. Dùng N, N#K, hoặc danh sách phân cách d
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "Định dạng không hợp lệ. Mong đợi định dạng vector: \"%1%\"" msgstr "Định dạng không hợp lệ. Mong đợi định dạng vector: \"%1%\""
# AI Translated
msgid "N/A"
msgstr "N/A"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "Tác nhân hệ thống" msgstr "Tác nhân hệ thống"
@@ -6689,6 +6683,12 @@ msgstr "Lưu dự án thành"
msgid "Save current project as" msgid "Save current project as"
msgstr "Lưu dự án hiện tại thành" msgstr "Lưu dự án hiện tại thành"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "Nhập 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "Nhập 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8629,6 +8629,12 @@ msgstr "Vui lòng xác nhận G-code trong các preset này an toàn để ngăn
msgid "Customized Preset" msgid "Customized Preset"
msgstr "Preset tùy chỉnh" msgstr "Preset tùy chỉnh"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "Tên của các thành phần bên trong file STEP không phải định dạng UTF-8!" msgstr "Tên của các thành phần bên trong file STEP không phải định dạng UTF-8!"
@@ -9056,6 +9062,17 @@ msgstr "Lưu file đã slice dưới dạng:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "File %s đã được gửi đến không gian lưu trữ của máy in và có thể được xem trên máy in." msgstr "File %s đã được gửi đến không gian lưu trữ của máy in và có thể được xem trên máy in."
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "Xuất bản"
# AI Translated # AI Translated
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "Chưa đặt loại đầu phun. Vui lòng đặt đầu phun rồi thử lại." msgstr "Chưa đặt loại đầu phun. Vui lòng đặt đầu phun rồi thử lại."
@@ -9286,8 +9303,6 @@ msgstr "Bạn có muốn tiếp tục?"
msgid "Language selection" msgid "Language selection"
msgstr "Chọn ngôn ngữ" msgstr "Chọn ngôn ngữ"
msgid "Switching application language while some presets are modified."
msgstr "Đang chuyển đổi ngôn ngữ ứng dụng trong khi một số preset đã được chỉnh sửa."
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "Châu Á-Thái Bình Dương" msgstr "Châu Á-Thái Bình Dương"
@@ -10326,9 +10341,6 @@ msgstr "Chuyển đến trang web xuất bản model"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "Lưu ý: Chuẩn bị có thể mất vài phút. Vui lòng kiên nhẫn." msgstr "Lưu ý: Chuẩn bị có thể mất vài phút. Vui lòng kiên nhẫn."
msgid "Publish"
msgstr "Xuất bản"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "Xuất bản đã bị hủy" msgstr "Xuất bản đã bị hủy"
@@ -10345,6 +10357,64 @@ msgstr "Đang tải dữ liệu lên"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "Chuyển đến trang web" msgstr "Chuyển đến trang web"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "Lưu %s dưới dạng" msgstr "Lưu %s dưới dạng"
@@ -22165,6 +22235,15 @@ msgstr "Thao tác này không thể hoàn tác. Tiếp tục?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "Đang bỏ qua các vật thể." msgstr "Đang bỏ qua các vật thể."
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
# AI Translated # AI Translated
msgid "Select Filament" msgid "Select Filament"
msgstr "Chọn filament" msgstr "Chọn filament"
+96 -17
View File
@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Slic3rPE\n" "Project-Id-Version: Slic3rPE\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2026-06-11 12:37-0300\n" "PO-Revision-Date: 2026-06-11 12:37-0300\n"
"Last-Translator: Handle <mail@bysb.net>\n" "Last-Translator: Handle <mail@bysb.net>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2361,8 +2361,6 @@ msgstr "有更新可用。打开预设包对话框进行更新。"
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s 已被移除。" msgstr "%s 已被移除。"
msgid "Switching application language"
msgstr "切换应用程序语言"
msgid "Select the language" msgid "Select the language"
msgstr "选择语言" msgstr "选择语言"
@@ -4743,6 +4741,9 @@ msgstr ""
"是 - 自动调整这些设置并开启旋转模式\n" "是 - 自动调整这些设置并开启旋转模式\n"
"否 - 暂不使用旋转模式" "否 - 暂不使用旋转模式"
msgid "N/A"
msgstr "不适用"
msgid "Printing" msgid "Printing"
msgstr "打印中" msgstr "打印中"
@@ -5174,13 +5175,9 @@ msgstr "值 %s 超出了范围,有效的范围是从 %d 到 %d 。"
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"%s%%还是%s %s\n" "%s%%还是%s %s"
"是:%s%%\n"
"否:%s %s"
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5202,9 +5199,6 @@ msgstr "无效的模式。请使用 N、N#K 或逗号分隔的列表(每个条
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "无效格式,应该是\"%1%\"这种数组格式" msgstr "无效格式,应该是\"%1%\"这种数组格式"
msgid "N/A"
msgstr "不适用"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "系统代理" msgstr "系统代理"
@@ -6159,6 +6153,12 @@ msgstr "项目另存为"
msgid "Save current project as" msgid "Save current project as"
msgstr "项目另存为" msgstr "项目另存为"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "导入 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "导入 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -7949,6 +7949,12 @@ msgstr "请确认这些预设中的G-codes是否安全,以防止对机器造
msgid "Customized Preset" msgid "Customized Preset"
msgstr "自定义的预设" msgstr "自定义的预设"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "STEP 文件中的部件名称不是 UTF-8 格式!" msgstr "STEP 文件中的部件名称不是 UTF-8 格式!"
@@ -8354,6 +8360,17 @@ msgstr "切片文件另存为:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "文件%s已经发送到打印机的存储空间,可以在打印机上浏览。" msgstr "文件%s已经发送到打印机的存储空间,可以在打印机上浏览。"
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "发布"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "未设置喷嘴类型。请设置喷嘴并重试。" msgstr "未设置喷嘴类型。请设置喷嘴并重试。"
@@ -8564,8 +8581,6 @@ msgstr "是否继续?"
msgid "Language selection" msgid "Language selection"
msgstr "语言选择" msgstr "语言选择"
msgid "Switching application language while some presets are modified."
msgstr "在切换应用语言之前发现某些参数预设有更改。"
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "亚太" msgstr "亚太"
@@ -9489,9 +9504,6 @@ msgstr "跳转到发布页面"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "提示:发布前需要一些准备时间,请耐心等待。" msgstr "提示:发布前需要一些准备时间,请耐心等待。"
msgid "Publish"
msgstr "发布"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "发布已取消" msgstr "发布已取消"
@@ -9507,6 +9519,64 @@ msgstr "正在上传数据"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "跳转到网页" msgstr "跳转到网页"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "另存%s为" msgstr "另存%s为"
@@ -20639,6 +20709,15 @@ msgstr "此操作无法撤消。继续?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "跳过对象。" msgstr "跳过对象。"
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "选择耗材" msgstr "选择耗材"
+96 -17
View File
@@ -9,7 +9,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Orca Slicer\n" "Project-Id-Version: Orca Slicer\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-09-02 09:39-0300\n" "POT-Creation-Date: 2026-09-03 10:27+0800\n"
"PO-Revision-Date: 2025-11-28 13:48-0600\n" "PO-Revision-Date: 2025-11-28 13:48-0600\n"
"Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n" "Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n"
"Language-Team: \n" "Language-Team: \n"
@@ -2425,8 +2425,6 @@ msgstr "有可用的更新。請開啟預設組合對話框進行更新。"
msgid "%s has been removed." msgid "%s has been removed."
msgstr "%s 已移除。" msgstr "%s 已移除。"
msgid "Switching application language"
msgstr "切換應用程式語言"
msgid "Select the language" msgid "Select the language"
msgstr "選擇語言" msgstr "選擇語言"
@@ -4872,6 +4870,9 @@ msgstr ""
"是 - 自動調整這些設定並啟用花瓶模式\n" "是 - 自動調整這些設定並啟用花瓶模式\n"
"否 - 不使用花瓶模式" "否 - 不使用花瓶模式"
msgid "N/A"
msgstr "不適用"
msgid "Printing" msgid "Printing"
msgstr "列印中" msgstr "列印中"
@@ -5303,13 +5304,9 @@ msgstr "數值 %s 超出範圍。有效範圍是從 %d 到 %d。"
#, c-format, boost-format #, c-format, boost-format
msgid "" msgid ""
"Is it %s%% or %s %s?\n" "Is it %s%% or %s %s?"
"YES for %s%%, \n"
"NO for %s %s."
msgstr "" msgstr ""
"是 %s%% 還是 %s %s\n" "是 %s%% 還是 %s %s"
"選『是』代表 %s%%\n"
"選『否』代表 %s %s。"
#, boost-format #, boost-format
msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\"" msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
@@ -5331,9 +5328,6 @@ msgstr "無效的格式。請使用 N、N#K 或逗號分隔的清單,每個項
msgid "Invalid format. Expected vector format: \"%1%\"" msgid "Invalid format. Expected vector format: \"%1%\""
msgstr "無效格式,應該是「%1%」這種格式" msgstr "無效格式,應該是「%1%」這種格式"
msgid "N/A"
msgstr "不適用"
# AI Translated # AI Translated
msgid "System agents" msgid "System agents"
msgstr "系統代理程式" msgstr "系統代理程式"
@@ -6289,6 +6283,12 @@ msgstr "另存專案為"
msgid "Save current project as" msgid "Save current project as"
msgstr "將目前專案另存為" msgstr "將目前專案另存為"
msgid "Publish 3MF"
msgstr ""
msgid "Export a 3MF file with the selected settings embedded"
msgstr ""
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF" msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "匯入 3MF/STL/STEP/SVG/OBJ/AMF" msgstr "匯入 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -8110,6 +8110,12 @@ msgstr "請確認這些預設中的 G-code 是安全的,以防止對列印裝
msgid "Customized Preset" msgid "Customized Preset"
msgstr "自訂預設" msgstr "自訂預設"
msgid "Some published settings could not be applied:"
msgstr ""
msgid "Some filament slots were changed:"
msgstr ""
msgid "Component name(s) inside step file not in UTF-8 format!" msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "STEP 檔案內部元件的名稱不是 UTF-8 格式!" msgstr "STEP 檔案內部元件的名稱不是 UTF-8 格式!"
@@ -8520,6 +8526,17 @@ msgstr "切片檔案另存為:"
msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer." msgid "The file %s has been sent to the printer's storage space and can be viewed on the printer."
msgstr "檔案 %s 已經傳送到列印裝置的儲存空間,可以在列印裝置上瀏覽。" msgstr "檔案 %s 已經傳送到列印裝置的儲存空間,可以在列印裝置上瀏覽。"
msgid "Publish 3MF file as:"
msgstr ""
msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
msgid "Publish"
msgstr "發布"
msgid "The nozzle type is not set. Please set the nozzle and try again." msgid "The nozzle type is not set. Please set the nozzle and try again."
msgstr "噴嘴類型尚未設定。請設定噴嘴後再試一次。" msgstr "噴嘴類型尚未設定。請設定噴嘴後再試一次。"
@@ -8730,8 +8747,6 @@ msgstr "是否繼續?"
msgid "Language selection" msgid "Language selection"
msgstr "語言選擇" msgstr "語言選擇"
msgid "Switching application language while some presets are modified."
msgstr "在切換應用程式語言之前發現某些參數預設有更改。"
msgid "Asia-Pacific" msgid "Asia-Pacific"
msgstr "亞太" msgstr "亞太"
@@ -9662,9 +9677,6 @@ msgstr "發布頁面"
msgid "Note: The preparation may take several minutes. Please be patient." msgid "Note: The preparation may take several minutes. Please be patient."
msgstr "提示:發布前需要一些準備時間,請耐心等待。" msgstr "提示:發布前需要一些準備時間,請耐心等待。"
msgid "Publish"
msgstr "發布"
msgid "Publish was canceled" msgid "Publish was canceled"
msgstr "發布已取消" msgstr "發布已取消"
@@ -9680,6 +9692,64 @@ msgstr "正在上傳資料"
msgid "Jump to webpage" msgid "Jump to webpage"
msgstr "跳至網頁" msgstr "跳至網頁"
msgid "Material"
msgstr ""
msgid "Mixed filament"
msgstr ""
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr ""
#, c-format, boost-format
msgid "Filament %d (mixed)"
msgstr ""
msgid "needs"
msgstr ""
msgid "not enabled"
msgstr ""
msgid "material not published"
msgstr ""
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr ""
msgid "Publish anyway"
msgstr ""
msgid "Publish 3MF..."
msgstr ""
msgid "Select which settings to be published in the 3MF file"
msgstr ""
msgid "Publish 3MF Wiki"
msgstr ""
msgid "Publish 3MF Video Guide"
msgstr ""
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr ""
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr ""
msgid "Publish this filament slot in the 3MF file"
msgstr ""
msgid "Full Publish"
msgstr ""
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr ""
msgid "Filter non-selected"
msgstr ""
#, c-format, boost-format #, c-format, boost-format
msgid "Save %s as" msgid "Save %s as"
msgstr "另存 %s 為" msgstr "另存 %s 為"
@@ -20832,6 +20902,15 @@ msgstr "此操作無法撤消。繼續?"
msgid "Skipping objects." msgid "Skipping objects."
msgstr "跳過物件。" msgstr "跳過物件。"
msgid "Material Ratio"
msgstr ""
msgid "Model Height"
msgstr ""
msgid "Ratio"
msgstr ""
msgid "Select Filament" msgid "Select Filament"
msgstr "選擇線材" msgstr "選擇線材"
+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path d="M1.5,8 14.5,1.5 7.5,14.5 6.3,9.7 Z" style="fill:none;stroke:gray;stroke-linecap:round;stroke-linejoin:round"/></svg>

After

Width:  |  Height:  |  Size: 209 B

+3 -7
View File
@@ -1,8 +1,4 @@
<svg width="25" height="25" xmlns="http://www.w3.org/2000/svg" fill="none"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
<line x1="0.5" y1="7.5" x2="14.5" y2="7.5" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/>
<g> <line x1="7.5" y1="0.5" x2="7.5" y2="14.5" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/>
<title>Layer 1</title>
<path id="svg_1" stroke-linecap="round" stroke-width="2" stroke="#262E30" d="m1,12.5l23,0"/>
<path id="svg_2" stroke-linecap="round" stroke-width="2" stroke="#262E30" d="m12.5,24l0,-23"/>
</g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 312 B

After

Width:  |  Height:  |  Size: 332 B

@@ -324,12 +324,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -318,12 +318,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -324,12 +324,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -324,12 +324,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -309,12 +309,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -318,12 +318,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -324,12 +324,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -324,12 +324,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"10" "10"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -318,12 +318,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -309,12 +309,6 @@
"slow_down_min_speed": [ "slow_down_min_speed": [
"20" "20"
], ],
"supertack_plate_temp": [
"35"
],
"supertack_plate_temp_initial_layer": [
"35"
],
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"-1" "-1"
], ],
@@ -25,6 +25,12 @@
"hot_plate_temp_initial_layer": [ "hot_plate_temp_initial_layer": [
"80" "80"
], ],
"supertack_plate_temp": [
"60"
],
"supertack_plate_temp_initial_layer": [
"60"
],
"slow_down_for_layer_cooling": [ "slow_down_for_layer_cooling": [
"1" "1"
], ],
+25 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "Flashforge", "name": "Flashforge",
"url": "", "url": "",
"version": "02.04.00.05", "version": "02.04.00.06",
"force_update": "0", "force_update": "0",
"description": "Flashforge configurations", "description": "Flashforge configurations",
"machine_model_list": [ "machine_model_list": [
@@ -439,6 +439,22 @@
"name": "0.14mm Standard @FF AD5X 0.25 nozzle", "name": "0.14mm Standard @FF AD5X 0.25 nozzle",
"sub_path": "process/0.14mm Standard @FF AD5X 0.25 nozzle.json" "sub_path": "process/0.14mm Standard @FF AD5X 0.25 nozzle.json"
}, },
{
"name": "0.08mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.08mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.10mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.10mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.12mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.12mm Standard @FF C5 0.25 nozzle.json"
},
{
"name": "0.14mm Standard @FF C5 0.25 nozzle",
"sub_path": "process/0.14mm Standard @FF C5 0.25 nozzle.json"
},
{ {
"name": "0.14mm Standard @Flashforge AD5M 0.25 Nozzle", "name": "0.14mm Standard @Flashforge AD5M 0.25 Nozzle",
"sub_path": "process/0.14mm Standard @Flashforge AD5M 0.25 Nozzle.json" "sub_path": "process/0.14mm Standard @Flashforge AD5M 0.25 Nozzle.json"
@@ -2903,6 +2919,10 @@
"name": "Flashforge AD5X 0.4 nozzle", "name": "Flashforge AD5X 0.4 nozzle",
"sub_path": "machine/Flashforge AD5X 0.4 nozzle.json" "sub_path": "machine/Flashforge AD5X 0.4 nozzle.json"
}, },
{
"name": "Flashforge Creator 5 0.25 nozzle",
"sub_path": "machine/Flashforge Creator 5 0.25 nozzle.json"
},
{ {
"name": "Flashforge Creator 5 0.4 nozzle", "name": "Flashforge Creator 5 0.4 nozzle",
"sub_path": "machine/Flashforge Creator 5 0.4 nozzle.json" "sub_path": "machine/Flashforge Creator 5 0.4 nozzle.json"
@@ -2915,6 +2935,10 @@
"name": "Flashforge Creator 5 0.8 nozzle", "name": "Flashforge Creator 5 0.8 nozzle",
"sub_path": "machine/Flashforge Creator 5 0.8 nozzle.json" "sub_path": "machine/Flashforge Creator 5 0.8 nozzle.json"
}, },
{
"name": "Flashforge Creator 5 Pro 0.25 nozzle",
"sub_path": "machine/Flashforge Creator 5 Pro 0.25 nozzle.json"
},
{ {
"name": "Flashforge Creator 5 Pro 0.4 nozzle", "name": "Flashforge Creator 5 Pro 0.4 nozzle",
"sub_path": "machine/Flashforge Creator 5 Pro 0.4 nozzle.json" "sub_path": "machine/Flashforge Creator 5 Pro 0.4 nozzle.json"
@@ -87,6 +87,12 @@
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"90" "90"
], ],
"supertack_plate_temp": [
"60"
],
"supertack_plate_temp_initial_layer": [
"60"
],
"temperature_vitrification": [ "temperature_vitrification": [
"70" "70"
] ]
@@ -93,6 +93,12 @@
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"90" "90"
], ],
"supertack_plate_temp": [
"60"
],
"supertack_plate_temp_initial_layer": [
"60"
],
"temperature_vitrification": [ "temperature_vitrification": [
"70" "70"
], ],
@@ -90,6 +90,12 @@
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"90" "90"
], ],
"supertack_plate_temp": [
"60"
],
"supertack_plate_temp_initial_layer": [
"60"
],
"temperature_vitrification": [ "temperature_vitrification": [
"70" "70"
] ]
@@ -96,6 +96,12 @@
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"90" "90"
], ],
"supertack_plate_temp": [
"60"
],
"supertack_plate_temp_initial_layer": [
"60"
],
"temperature_vitrification": [ "temperature_vitrification": [
"70" "70"
], ],
@@ -90,6 +90,12 @@
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"90" "90"
], ],
"supertack_plate_temp": [
"60"
],
"supertack_plate_temp_initial_layer": [
"60"
],
"temperature_vitrification": [ "temperature_vitrification": [
"70" "70"
] ]
@@ -96,6 +96,12 @@
"support_material_interface_fan_speed": [ "support_material_interface_fan_speed": [
"90" "90"
], ],
"supertack_plate_temp": [
"60"
],
"supertack_plate_temp_initial_layer": [
"60"
],
"temperature_vitrification": [ "temperature_vitrification": [
"70" "70"
], ],
@@ -28,6 +28,12 @@
"textured_plate_temp_initial_layer": [ "textured_plate_temp_initial_layer": [
"85" "85"
], ],
"supertack_plate_temp": [
"60"
],
"supertack_plate_temp_initial_layer": [
"60"
],
"slow_down_for_layer_cooling": [ "slow_down_for_layer_cooling": [
"1" "1"
], ],
@@ -0,0 +1,311 @@
{
"type": "machine",
"name": "Flashforge Creator 5 0.25 nozzle",
"inherits": "Flashforge Adventurer 5M Pro 0.4 Nozzle",
"from": "system",
"setting_id": "xp3cpTEGYdWjcrMM",
"instantiation": "true",
"adaptive_bed_mesh_margin": "0",
"auxiliary_fan": "1",
"bbl_use_printhost": "0",
"bed_custom_model": "",
"bed_custom_texture": "",
"bed_exclude_area": [
"0x0"
],
"bed_mesh_max": "99999,99999",
"bed_mesh_min": "-99999,-99999",
"bed_mesh_probe_distance": "50,50",
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]",
"best_object_pos": "0.5,0.5",
"change_extrusion_role_gcode": "",
"change_filament_gcode": "",
"cooling_tube_length": "0",
"cooling_tube_retraction": "0",
"default_bed_type": "",
"default_filament_profile": [
"Flashforge Generic PLA"
],
"default_print_profile": "0.12mm Standard @FF C5 0.25 nozzle",
"deretraction_speed": [
"30",
"30",
"30",
"30"
],
"disable_m73": "1",
"emit_machine_limits_to_gcode": "1",
"enable_filament_ramming": "0",
"enable_long_retraction_when_cut": "0",
"extra_loading_move": "0",
"extruder_clearance_height_to_lid": "360",
"extruder_clearance_height_to_rod": "60",
"extruder_clearance_radius": "92",
"extruder_colour": [
"#FCE94F",
"#FCE94F",
"#FCE94F",
"#FCE94F"
],
"extruder_offset": [
"0x0",
"0x0",
"0x0",
"0x0"
],
"fan_kickstart": "0",
"fan_speedup_overhangs": "1",
"fan_speedup_time": "0",
"gcode_flavor": "klipper",
"head_wrap_detect_zone": [],
"high_current_on_filament_swap": "0",
"host_type": "octoprint",
"layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]",
"long_retractions_when_cut": [
"0",
"0",
"0",
"0"
],
"machine_end_gcode": ";end_gcode\nG1 X150 Y150 E-1.2 F12000",
"machine_load_filament_time": "0",
"machine_max_acceleration_e": [
"5000",
"5000"
],
"machine_max_acceleration_extruding": [
"30000",
"20000"
],
"machine_max_acceleration_retracting": [
"5000",
"5000"
],
"machine_max_acceleration_travel": [
"20000",
"20000"
],
"machine_max_acceleration_x": [
"30000",
"20000"
],
"machine_max_acceleration_y": [
"30000",
"20000"
],
"machine_max_acceleration_z": [
"300",
"500"
],
"machine_max_jerk_e": [
"2.5",
"2.5"
],
"machine_max_jerk_x": [
"9",
"9"
],
"machine_max_jerk_y": [
"9",
"9"
],
"machine_max_jerk_z": [
"3",
"3"
],
"machine_max_junction_deviation": [
"0",
"0"
],
"machine_max_speed_e": [
"30",
"30"
],
"machine_max_speed_x": [
"600",
"600"
],
"machine_max_speed_y": [
"600",
"600"
],
"machine_max_speed_z": [
"20",
"20"
],
"machine_min_extruding_rate": [
"0",
"0"
],
"machine_min_travel_rate": [
"0",
"0"
],
"machine_pause_gcode": "M25",
"machine_start_gcode": ";start_gcode\nM140 S[bed_temperature_initial_layer_single]\nM106 P101 S0 ; L+R_PLA_Turbo_Fan_0-255\nM106 P2 S0 ; Center_Fresch_Air_Input_Fan_for_PLA30%_(80_0-255) \nM191 S0 ; Chamber temp. max65C\nM106 S0 ; Model_Fan_(Heat_Break_Cooler_80-255)100%=255\nM106 P3 S0 ; Filter_Unit_Fan_0-255(ABS=255)\nM104 S[nozzle_temperature_initial_layer]\nG90\nM83\nG1 Z5 F2400\nT[initial_extruder]\nM109 S[nozzle_temperature_initial_layer] T[initial_extruder]\nG1 X256 Y0 Z0.2 F6000\nG1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\nG1 X216 E10 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n;start_gcode end",
"machine_tool_change_time": "7",
"machine_unload_filament_time": "0",
"manual_filament_change": "0",
"max_layer_height": [
"0.14",
"0.14",
"0.14",
"0.14"
],
"max_resonance_avoidance_speed": "120",
"min_layer_height": [
"0.08",
"0.08",
"0.08",
"0.08"
],
"min_resonance_avoidance_speed": "70",
"nozzle_diameter": [
"0.25",
"0.25",
"0.25",
"0.25"
],
"nozzle_height": "4",
"nozzle_hrc": "0",
"nozzle_type": "hardened_steel",
"nozzle_volume": "0",
"parking_pos_retraction": "0",
"pellet_modded_printer": "0",
"preferred_orientation": "0",
"printable_area": [
"0x0",
"256x0",
"256x256",
"0x256"
],
"printable_height": "256",
"printer_model": "Flashforge Creator 5",
"printer_notes": "",
"printer_settings_id": "Flashforge Creator 5 0.25 nozzle",
"printer_structure": "corexy",
"printer_technology": "FFF",
"printer_variant": "0.25",
"printhost_authorization_type": "key",
"printhost_ssl_ignore_revoke": "0",
"printing_by_object_gcode": "",
"purge_in_prime_tower": "0",
"resonance_avoidance": "0",
"retract_before_wipe": [
"100%",
"100%",
"100%",
"100%"
],
"retract_length_toolchange": [
"3",
"3",
"3",
"3"
],
"retract_lift_above": [
"0",
"0",
"0",
"0"
],
"retract_lift_below": [
"0",
"0",
"0",
"0"
],
"retract_lift_enforce": [
"All Surfaces",
"All Surfaces",
"All Surfaces",
"All Surfaces"
],
"retract_restart_extra": [
"0",
"0",
"0",
"0"
],
"retract_restart_extra_toolchange": [
"-0.8",
"-0.8",
"-0.8",
"-0.8"
],
"retract_when_changing_layer": [
"1",
"1",
"1",
"1"
],
"retraction_distances_when_cut": [
"18",
"18",
"18",
"18"
],
"retraction_length": [
"0.8",
"0.8",
"0.8",
"0.8"
],
"retraction_minimum_travel": [
"2",
"2",
"2",
"2"
],
"retraction_speed": [
"30",
"30",
"30",
"30"
],
"scan_first_layer": "0",
"silent_mode": "0",
"single_extruder_multi_material": "0",
"support_air_filtration": "0",
"support_chamber_temp_control": "0",
"support_multi_bed_types": "1",
"template_custom_gcode": "",
"thumbnails": "140x110/PNG",
"thumbnails_format": "PNG",
"time_cost": "0",
"time_lapse_gcode": "",
"travel_slope": [
"3",
"3",
"3",
"3"
],
"upward_compatible_machine": [],
"use_firmware_retraction": "0",
"use_relative_e_distances": "1",
"wipe": [
"1",
"1",
"1",
"1"
],
"wipe_distance": [
"2",
"2",
"2",
"2"
],
"z_hop": [
"0.4",
"0.4",
"0.4",
"0.4"
],
"z_hop_types": [
"Auto Lift",
"Auto Lift",
"Auto Lift",
"Auto Lift"
],
"z_offset": "0"
}
@@ -0,0 +1,311 @@
{
"type": "machine",
"name": "Flashforge Creator 5 Pro 0.25 nozzle",
"inherits": "Flashforge Adventurer 5M Pro 0.4 Nozzle",
"from": "system",
"setting_id": "rpmib7bIKa85LNMR",
"instantiation": "true",
"adaptive_bed_mesh_margin": "0",
"auxiliary_fan": "1",
"bbl_use_printhost": "0",
"bed_custom_model": "",
"bed_custom_texture": "",
"bed_exclude_area": [
"0x0"
],
"bed_mesh_max": "99999,99999",
"bed_mesh_min": "-99999,-99999",
"bed_mesh_probe_distance": "50,50",
"before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]",
"best_object_pos": "0.5,0.5",
"change_extrusion_role_gcode": "",
"change_filament_gcode": "",
"cooling_tube_length": "0",
"cooling_tube_retraction": "0",
"default_bed_type": "",
"default_filament_profile": [
"Flashforge Generic PLA"
],
"default_print_profile": "0.12mm Standard @FF C5 0.25 nozzle",
"deretraction_speed": [
"30",
"30",
"30",
"30"
],
"disable_m73": "1",
"emit_machine_limits_to_gcode": "1",
"enable_filament_ramming": "0",
"enable_long_retraction_when_cut": "0",
"extra_loading_move": "0",
"extruder_clearance_height_to_lid": "360",
"extruder_clearance_height_to_rod": "60",
"extruder_clearance_radius": "92",
"extruder_colour": [
"#FCE94F",
"#FCE94F",
"#FCE94F",
"#FCE94F"
],
"extruder_offset": [
"0x0",
"0x0",
"0x0",
"0x0"
],
"fan_kickstart": "0",
"fan_speedup_overhangs": "1",
"fan_speedup_time": "0",
"gcode_flavor": "klipper",
"head_wrap_detect_zone": [],
"high_current_on_filament_swap": "0",
"host_type": "octoprint",
"layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]",
"long_retractions_when_cut": [
"0",
"0",
"0",
"0"
],
"machine_end_gcode": ";end_gcode\nG1 X150 Y150 E-1.2 F12000",
"machine_load_filament_time": "0",
"machine_max_acceleration_e": [
"5000",
"5000"
],
"machine_max_acceleration_extruding": [
"30000",
"20000"
],
"machine_max_acceleration_retracting": [
"5000",
"5000"
],
"machine_max_acceleration_travel": [
"20000",
"20000"
],
"machine_max_acceleration_x": [
"30000",
"20000"
],
"machine_max_acceleration_y": [
"30000",
"20000"
],
"machine_max_acceleration_z": [
"300",
"500"
],
"machine_max_jerk_e": [
"2.5",
"2.5"
],
"machine_max_jerk_x": [
"9",
"9"
],
"machine_max_jerk_y": [
"9",
"9"
],
"machine_max_jerk_z": [
"3",
"3"
],
"machine_max_junction_deviation": [
"0",
"0"
],
"machine_max_speed_e": [
"30",
"30"
],
"machine_max_speed_x": [
"600",
"600"
],
"machine_max_speed_y": [
"600",
"600"
],
"machine_max_speed_z": [
"20",
"20"
],
"machine_min_extruding_rate": [
"0",
"0"
],
"machine_min_travel_rate": [
"0",
"0"
],
"machine_pause_gcode": "M25",
"machine_start_gcode": ";start_gcode\nM140 S[bed_temperature_initial_layer_single]\nM106 P101 S0 ; L+R_PLA_Turbo_Fan_0-255\nM106 P2 S0 ; Center_Fresch_Air_Input_Fan_for_PLA30%_(80_0-255) \nM191 S0 ; Chamber temp. max65C\nM106 S0 ; Model_Fan_(Heat_Break_Cooler_80-255)100%=255\nM106 P3 S0 ; Filter_Unit_Fan_0-255(ABS=255)\nM104 S[nozzle_temperature_initial_layer]\nG90\nM83\nG1 Z5 F2400\nT[initial_extruder]\nM109 S[nozzle_temperature_initial_layer] T[initial_extruder]\nG1 X256 Y0 Z0.2 F6000\nG1 E5 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\nG1 X216 E10 F{filament_max_volumetric_speed[initial_no_support_extruder]/2.4053*60}\n;start_gcode end",
"machine_tool_change_time": "7",
"machine_unload_filament_time": "0",
"manual_filament_change": "0",
"max_layer_height": [
"0.14",
"0.14",
"0.14",
"0.14"
],
"max_resonance_avoidance_speed": "120",
"min_layer_height": [
"0.08",
"0.08",
"0.08",
"0.08"
],
"min_resonance_avoidance_speed": "70",
"nozzle_diameter": [
"0.25",
"0.25",
"0.25",
"0.25"
],
"nozzle_height": "4",
"nozzle_hrc": "0",
"nozzle_type": "hardened_steel",
"nozzle_volume": "0",
"parking_pos_retraction": "0",
"pellet_modded_printer": "0",
"preferred_orientation": "0",
"printable_area": [
"0x0",
"256x0",
"256x256",
"0x256"
],
"printable_height": "256",
"printer_model": "Flashforge Creator 5 Pro",
"printer_notes": "",
"printer_settings_id": "Flashforge Creator 5 Pro 0.25 nozzle",
"printer_structure": "corexy",
"printer_technology": "FFF",
"printer_variant": "0.25",
"printhost_authorization_type": "key",
"printhost_ssl_ignore_revoke": "0",
"printing_by_object_gcode": "",
"purge_in_prime_tower": "0",
"resonance_avoidance": "0",
"retract_before_wipe": [
"100%",
"100%",
"100%",
"100%"
],
"retract_length_toolchange": [
"3",
"3",
"3",
"3"
],
"retract_lift_above": [
"0",
"0",
"0",
"0"
],
"retract_lift_below": [
"0",
"0",
"0",
"0"
],
"retract_lift_enforce": [
"All Surfaces",
"All Surfaces",
"All Surfaces",
"All Surfaces"
],
"retract_restart_extra": [
"0",
"0",
"0",
"0"
],
"retract_restart_extra_toolchange": [
"-0.8",
"-0.8",
"-0.8",
"-0.8"
],
"retract_when_changing_layer": [
"1",
"1",
"1",
"1"
],
"retraction_distances_when_cut": [
"18",
"18",
"18",
"18"
],
"retraction_length": [
"0.8",
"0.8",
"0.8",
"0.8"
],
"retraction_minimum_travel": [
"2",
"2",
"2",
"2"
],
"retraction_speed": [
"30",
"30",
"30",
"30"
],
"scan_first_layer": "0",
"silent_mode": "0",
"single_extruder_multi_material": "0",
"support_air_filtration": "1",
"support_chamber_temp_control": "1",
"support_multi_bed_types": "1",
"template_custom_gcode": "",
"thumbnails": "140x110/PNG",
"thumbnails_format": "PNG",
"time_cost": "0",
"time_lapse_gcode": "",
"travel_slope": [
"3",
"3",
"3",
"3"
],
"upward_compatible_machine": [],
"use_firmware_retraction": "0",
"use_relative_e_distances": "1",
"wipe": [
"1",
"1",
"1",
"1"
],
"wipe_distance": [
"2",
"2",
"2",
"2"
],
"z_hop": [
"0.4",
"0.4",
"0.4",
"0.4"
],
"z_hop_types": [
"Auto Lift",
"Auto Lift",
"Auto Lift",
"Auto Lift"
],
"z_offset": "0"
}
@@ -2,7 +2,7 @@
"type": "machine_model", "type": "machine_model",
"name": "Flashforge Creator 5 Pro", "name": "Flashforge Creator 5 Pro",
"model_id": "Flashforge-Creator-5-Pro", "model_id": "Flashforge-Creator-5-Pro",
"nozzle_diameter": "0.4;0.6;0.8", "nozzle_diameter": "0.25;0.4;0.6;0.8",
"machine_tech": "FFF", "machine_tech": "FFF",
"family": "Flashforge", "family": "Flashforge",
"bed_model": "flashforge_c5_buildplate_model.stl", "bed_model": "flashforge_c5_buildplate_model.stl",
@@ -2,7 +2,7 @@
"type": "machine_model", "type": "machine_model",
"name": "Flashforge Creator 5", "name": "Flashforge Creator 5",
"model_id": "Flashforge-Creator-5", "model_id": "Flashforge-Creator-5",
"nozzle_diameter": "0.4;0.6;0.8", "nozzle_diameter": "0.25;0.4;0.6;0.8",
"machine_tech": "FFF", "machine_tech": "FFF",
"family": "Flashforge", "family": "Flashforge",
"bed_model": "flashforge_c5_buildplate_model.stl", "bed_model": "flashforge_c5_buildplate_model.stl",
@@ -0,0 +1,28 @@
{
"type": "process",
"name": "0.08mm Standard @FF C5 0.25 nozzle",
"inherits": "0.10mm Standard @FF AD5X 0.25 nozzle",
"from": "system",
"setting_id": "KrOSCGKyvNy9v08u",
"instantiation": "true",
"bottom_solid_infill_flow_ratio": "1",
"compatible_printers": [
"Flashforge Creator 5 0.25 nozzle",
"Flashforge Creator 5 Pro 0.25 nozzle"
],
"initial_layer_print_height": "0.1",
"internal_bridge_flow": "1",
"layer_height": "0.08",
"ooze_prevention": "1",
"preheat_time": "20",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"print_settings_id": "0.08mm Standard @FF C5 0.25 nozzle",
"small_perimeter_speed": "30",
"standby_temperature_delta": "-100",
"top_solid_infill_flow_ratio": "1"
}
@@ -0,0 +1,27 @@
{
"type": "process",
"name": "0.10mm Standard @FF C5 0.25 nozzle",
"inherits": "0.10mm Standard @FF AD5X 0.25 nozzle",
"from": "system",
"setting_id": "0Mep1gVTvD4RwK53",
"instantiation": "true",
"bottom_solid_infill_flow_ratio": "1",
"compatible_printers": [
"Flashforge Creator 5 0.25 nozzle",
"Flashforge Creator 5 Pro 0.25 nozzle"
],
"initial_layer_print_height": "0.1",
"internal_bridge_flow": "1",
"ooze_prevention": "1",
"preheat_time": "20",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"print_settings_id": "0.10mm Standard @FF C5 0.25 nozzle",
"small_perimeter_speed": "30",
"standby_temperature_delta": "-100",
"top_solid_infill_flow_ratio": "1"
}
@@ -0,0 +1,28 @@
{
"type": "process",
"name": "0.12mm Standard @FF C5 0.25 nozzle",
"inherits": "0.10mm Standard @FF AD5X 0.25 nozzle",
"from": "system",
"setting_id": "rcKQBKZJvCfrfzqV",
"instantiation": "true",
"bottom_solid_infill_flow_ratio": "1",
"compatible_printers": [
"Flashforge Creator 5 0.25 nozzle",
"Flashforge Creator 5 Pro 0.25 nozzle"
],
"initial_layer_print_height": "0.1",
"internal_bridge_flow": "1",
"layer_height": "0.12",
"ooze_prevention": "1",
"preheat_time": "20",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"print_settings_id": "0.12mm Standard @FF C5 0.25 nozzle",
"small_perimeter_speed": "30",
"standby_temperature_delta": "-100",
"top_solid_infill_flow_ratio": "1"
}
@@ -0,0 +1,28 @@
{
"type": "process",
"name": "0.14mm Standard @FF C5 0.25 nozzle",
"inherits": "0.10mm Standard @FF AD5X 0.25 nozzle",
"from": "system",
"setting_id": "749mQY3CU2jk0MOd",
"instantiation": "true",
"bottom_solid_infill_flow_ratio": "1",
"compatible_printers": [
"Flashforge Creator 5 0.25 nozzle",
"Flashforge Creator 5 Pro 0.25 nozzle"
],
"initial_layer_print_height": "0.1",
"internal_bridge_flow": "1",
"layer_height": "0.14",
"ooze_prevention": "1",
"preheat_time": "20",
"print_extruder_id": [
"1"
],
"print_extruder_variant": [
"Direct Drive Standard"
],
"print_settings_id": "0.14mm Standard @FF C5 0.25 nozzle",
"small_perimeter_speed": "30",
"standby_temperature_delta": "-100",
"top_solid_infill_flow_ratio": "1"
}
@@ -8,6 +8,9 @@
"box_temperature_range_high": [ "box_temperature_range_high": [
"45" "45"
], ],
"chamber_temperature": [
"55"
],
"close_fan_the_first_x_layers": [ "close_fan_the_first_x_layers": [
"3" "3"
], ],
@@ -14,9 +14,15 @@
"box_temperature": [ "box_temperature": [
"55" "55"
], ],
"chamber_temperature": [
"55"
],
"close_fan_the_first_x_layers": [ "close_fan_the_first_x_layers": [
"3" "3"
], ],
"during_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp_initial_layer": [ "cool_plate_temp_initial_layer": [
"60" "60"
], ],
@@ -14,9 +14,15 @@
"box_temperature": [ "box_temperature": [
"60" "60"
], ],
"chamber_temperature": [
"55"
],
"close_fan_the_first_x_layers": [ "close_fan_the_first_x_layers": [
"3" "3"
], ],
"during_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp_initial_layer": [ "cool_plate_temp_initial_layer": [
"80" "80"
], ],
@@ -14,9 +14,15 @@
"box_temperature": [ "box_temperature": [
"60" "60"
], ],
"chamber_temperature": [
"55"
],
"close_fan_the_first_x_layers": [ "close_fan_the_first_x_layers": [
"3" "3"
], ],
"during_print_exhaust_fan_speed": [
"0"
],
"cool_plate_temp_initial_layer": [ "cool_plate_temp_initial_layer": [
"80" "80"
], ],
@@ -14,8 +14,8 @@
"box_temperature": [ "box_temperature": [
"65" "65"
], ],
"chamber_temperatures": [ "chamber_temperature": [
"0" "55"
], ],
"close_fan_the_first_x_layers": [ "close_fan_the_first_x_layers": [
"3" "3"
@@ -14,6 +14,9 @@
"box_temperature": [ "box_temperature": [
"60" "60"
], ],
"chamber_temperature": [
"55"
],
"close_fan_the_first_x_layers": [ "close_fan_the_first_x_layers": [
"3" "3"
], ],
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "Snapmaker", "name": "Snapmaker",
"version": "02.04.00.12", "version": "02.04.00.13",
"force_update": "0", "force_update": "0",
"description": "Snapmaker configurations", "description": "Snapmaker configurations",
"machine_model_list": [ "machine_model_list": [
@@ -15,13 +15,13 @@
"1" "1"
], ],
"cool_plate_temp": [ "cool_plate_temp": [
"105" "100"
], ],
"cool_plate_temp_initial_layer": [ "cool_plate_temp_initial_layer": [
"105" "100"
], ],
"eng_plate_temp": [ "eng_plate_temp": [
"105" "100"
], ],
"eng_plate_temp_initial_layer": [ "eng_plate_temp_initial_layer": [
"100" "100"
@@ -48,7 +48,7 @@
"Polymaker" "Polymaker"
], ],
"hot_plate_temp": [ "hot_plate_temp": [
"105" "100"
], ],
"hot_plate_temp_initial_layer": [ "hot_plate_temp_initial_layer": [
"100" "100"
@@ -72,7 +72,7 @@
"110.8" "110.8"
], ],
"textured_plate_temp": [ "textured_plate_temp": [
"105" "100"
], ],
"textured_plate_temp_initial_layer": [ "textured_plate_temp_initial_layer": [
"100" "100"
@@ -15,16 +15,16 @@
"1" "1"
], ],
"cool_plate_temp": [ "cool_plate_temp": [
"105" "100"
], ],
"cool_plate_temp_initial_layer": [ "cool_plate_temp_initial_layer": [
"105" "100"
], ],
"eng_plate_temp": [ "eng_plate_temp": [
"105" "100"
], ],
"eng_plate_temp_initial_layer": [ "eng_plate_temp_initial_layer": [
"105" "100"
], ],
"fan_cooling_layer_time": [ "fan_cooling_layer_time": [
"12" "12"
@@ -51,10 +51,10 @@
"Polymaker" "Polymaker"
], ],
"hot_plate_temp": [ "hot_plate_temp": [
"105" "100"
], ],
"hot_plate_temp_initial_layer": [ "hot_plate_temp_initial_layer": [
"105" "100"
], ],
"nozzle_temperature": [ "nozzle_temperature": [
"300" "300"
@@ -81,10 +81,10 @@
"110" "110"
], ],
"textured_plate_temp": [ "textured_plate_temp": [
"105" "100"
], ],
"textured_plate_temp_initial_layer": [ "textured_plate_temp_initial_layer": [
"105" "100"
], ],
"filament_type": [ "filament_type": [
"ABS" "ABS"
@@ -9,10 +9,10 @@
"" ""
], ],
"hot_plate_temp": [ "hot_plate_temp": [
"110" "100"
], ],
"hot_plate_temp_initial_layer": [ "hot_plate_temp_initial_layer": [
"105" "100"
], ],
"overhang_fan_speed": [ "overhang_fan_speed": [
"20" "20"
@@ -9,7 +9,7 @@
"" ""
], ],
"hot_plate_temp": [ "hot_plate_temp": [
"110" "100"
], ],
"hot_plate_temp_initial_layer": [ "hot_plate_temp_initial_layer": [
"100" "100"
+8 -2
View File
@@ -415,7 +415,9 @@ img.ModelThumbnail {
border-width: 1px; border-width: 1px;
border-style: solid; border-style: solid;
border-radius: 4px; border-radius: 4px;
background-color: inherit; border-color: var(--border-color);
background-color: var(--bg-color);
color: var(--fg-color-text);
position: absolute; position: absolute;
left: 50%; left: 50%;
top: 200px; top: 200px;
@@ -423,13 +425,17 @@ img.ModelThumbnail {
} }
#NoticeBar { #NoticeBar {
background-color:#00f0d8; background-color: var(--main-color);
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
color: #fff; color: #fff;
text-align: center; text-align: center;
} }
#NoticeBar.notice-error {
background-color: var(--button-bg-alert);
}
#NoticeContent { #NoticeContent {
padding: 4mm 10mm; padding: 4mm 10mm;
} }
+36 -1
View File
@@ -37,6 +37,34 @@ function HandleStudio( pVal )
{ {
HandleModelList(pVal['response']); HandleModelList(pVal['response']);
} }
else if(strCmd=='check_new_printers_result')
{
let button = document.getElementById("CheckNewPrintersBtn");
if (button) {
button.style.pointerEvents = "auto";
button.style.opacity = "1";
}
let noticeBar = document.getElementById("NoticeBar");
let noticeText = document.getElementById("NoticeText");
let hasError = pVal.hasOwnProperty("error");
noticeBar.classList.toggle("notice-error", hasError);
if (hasError) {
noticeBar.textContent = "Error";
noticeText.textContent = pVal["error"];
} else if (pVal["vendors"] && pVal["vendors"].length > 0) {
noticeBar.textContent = "New printers found";
noticeText.textContent = "New printer vendors installed: " + pVal["vendors"].join(", ");
} else if (pVal["declined"]) {
noticeBar.textContent = "Information";
noticeText.textContent = "New printer vendors were found, but installation was cancelled.";
} else {
noticeBar.textContent = "Information";
noticeText.textContent = "No new printers found.";
}
ShowNotice(1);
}
} }
function HandleModelList( pVal ) function HandleModelList( pVal )
@@ -78,9 +106,13 @@ function HandleModelList( pVal )
} }
//Update Nozzel Html Append //Update Nozzel Html Append
// ORCA: HandleModelList can now be called more than once per dialog (e.g. after a new vendor
// is installed via "check for new printers"). pModel always holds the full, current list, so
// clear each vendor's printer area before repopulating instead of appending on top of a
// previous render.
for( let key in ModelHtml ) for( let key in ModelHtml )
{ {
$(".OneVendorBlock[vendor='"+key+"'] .PrinterArea").append( ModelHtml[key] ); $(".OneVendorBlock[vendor='"+key+"'] .PrinterArea").empty().append( ModelHtml[key] );
} }
//Update Checkbox //Update Checkbox
@@ -343,6 +375,9 @@ function OnExit()
let nTotal=ModelSelect.length; let nTotal=ModelSelect.length;
if( nTotal==0 ) { if( nTotal==0 ) {
let noticeBar = document.getElementById("NoticeBar");
noticeBar.classList.add("notice-error");
noticeBar.textContent = "Error";
ShowNotice(1); ShowNotice(1);
return 0; return 0;
} }
+16
View File
@@ -36,6 +36,22 @@ function ConfirmSelect()
} }
} }
function CheckForNewPrinters()
{
var tSend={};
tSend['sequence_id']=Math.round(new Date() / 1000);
tSend['command']="check_for_new_printers";
tSend['data']={};
var button = document.getElementById("CheckNewPrintersBtn");
if (button) {
button.style.pointerEvents = "none";
button.style.opacity = "0.6";
}
SendWXMessage( JSON.stringify(tSend) );
}
function CreateNewPrinter() function CreateNewPrinter()
{ {
var tSend={}; var tSend={};
+1
View File
@@ -82,6 +82,7 @@
</div> </div>
<div id="AcceptArea"> <div id="AcceptArea">
<div class="ButtonStyleRegular ButtonTypeChoice trans" id="CreateBtn" onclick="CreateNewPrinter()">Create</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" id="CreateBtn" onclick="CreateNewPrinter()">Create</div>
<div class="ButtonStyleRegular ButtonTypeChoice" id="CheckNewPrintersBtn" onclick="CheckForNewPrinters()">Check for new printers</div>
<div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t39" id="AcceptBtn" onclick="ConfirmSelect()">Confirm</div> <div class="ButtonStyleConfirm ButtonTypeChoice trans" tid="t39" id="AcceptBtn" onclick="ConfirmSelect()">Confirm</div>
<div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t38" id="PreBtn" onclick="CancelSelect()">Cancel</div> <div class="ButtonStyleRegular ButtonTypeChoice trans" tid="t38" id="PreBtn" onclick="CancelSelect()">Cancel</div>
</div> </div>
+43
View File
@@ -717,6 +717,7 @@ body
border-radius: 8px; border-radius: 8px;
width: 184px; width: 184px;
height: 184px; height: 184px;
position: relative;
} }
.FileItem img .FileItem img
@@ -728,6 +729,19 @@ body
object-fit: cover; object-fit: cover;
} }
.FileImg .FileLogoBadge
{
position: absolute;
top: 8px;
left: 8px;
width: 26px;
height: 26px;
padding: 2px;
box-sizing: border-box;
background-color: rgba(255,255,255,0.85);
border-radius: 50%;
}
.FileName .FileName
{ {
white-space: nowrap; white-space: nowrap;
@@ -736,6 +750,35 @@ body
word-break: break-all; word-break: break-all;
} }
.FileNamePack
{
display: flex;
align-items: center;
min-width: 0;
overflow: hidden;
}
.FileNamePack .FileName
{
flex: 1 1 auto;
min-width: 0;
}
.FilePublishedBadge
{
flex: 0 0 auto;
margin-right: 4px;
padding: 0 4px;
height: 16px;
line-height: 16px;
font-size: 10px;
font-weight: 600;
color: #FFFFFF;
background-color: #009688;
border-radius: 2px;
white-space: nowrap;
}
.FileDate .FileDate
{ {
color: #A8A8A8; color: #A8A8A8;
+6 -2
View File
@@ -305,15 +305,19 @@ function ShowRecentFileList( pList )
let sImg=OneFile["image"] || sImages[sPath]; let sImg=OneFile["image"] || sImages[sPath];
let sTime=OneFile['time']; let sTime=OneFile['time'];
let sName=OneFile['project_name']; let sName=OneFile['project_name'];
let sPublished=OneFile['published'] == '1';
sImages[sPath] = sImg; sImages[sPath] = sImg;
//let index=sPath.lastIndexOf('\\')>0?sPath.lastIndexOf('\\'):sPath.lastIndexOf('\/'); //let index=sPath.lastIndexOf('\\')>0?sPath.lastIndexOf('\\'):sPath.lastIndexOf('\/');
//let sShortName=sPath.substring(index+1,sPath.length); //let sShortName=sPath.substring(index+1,sPath.length);
let sBadge=sPublished? '<span class="FilePublishedBadge">PUB</span>':'';
let sLogoBadge=sPublished? '<img class="FileLogoBadge" src="../../images/OrcaSlicer_gradient_circle.svg" alt="" />':'';
let TmpHtml='<div class="FileItem" fpath="'+sPath+'" >'+ let TmpHtml='<div class="FileItem" fpath="'+sPath+'" >'+
'<a class="FileTip" title="'+sPath+'"></a>'+ '<a class="FileTip" title="'+sPath+'"></a>'+
'<div class="FileImg" ><img src="'+sImg+'" onerror="this.onerror=null;this.src=\'img/d.png\';" alt="No Image" /></div>'+ '<div class="FileImg" ><img src="'+sImg+'" onerror="this.onerror=null;this.src=\'img/d.png\';" alt="No Image" />'+sLogoBadge+'</div>'+
'<div class="FileName TextS1">'+sName+'</div>'+ '<div class="FileNamePack">'+sBadge+'<div class="FileName TextS1">'+sName+'</div></div>'+
'<div class="FileDate">'+sTime+'</div>'+ '<div class="FileDate">'+sTime+'</div>'+
'</div>'; '</div>';
-18
View File
@@ -17,24 +17,6 @@ cd "${ROOT_DIR}" || exit 1
TEST_DIR="${1:-build/tests}" TEST_DIR="${1:-build/tests}"
BUILD_CONFIG="${2:-}" BUILD_CONFIG="${2:-}"
# The slic3rutils plugin-host tests build numpy arrays through the CPython copied next
# to the test binary (see tests/slic3rutils/CMakeLists.txt); that runtime ships pip but
# no numpy, so those tests SKIP without it. Install it into that interpreter's own
# site-packages -- no PYTHONPATH needed, and re-checked every run because a rebuild of
# the test target wipes and re-copies the runtime. Needs network on the first run only;
# a failure here is not fatal, the tests just keep skipping.
find_args=("${TEST_DIR}" \( -path '*/python/bin/python3' -o -path '*/python/python.exe' \))
# Multi-config trees hold one copy per configuration; only bootstrap the one being run.
[ -n "${BUILD_CONFIG}" ] && find_args+=(-path "*/${BUILD_CONFIG}/*")
python_exe="$(find "${find_args[@]}" -print -quit 2>/dev/null)"
if [ -z "${python_exe}" ]; then
echo "No bundled Python under ${TEST_DIR}; numpy-backed binding tests will skip."
elif ! "${python_exe}" -c "import numpy" >/dev/null 2>&1; then
echo "Installing numpy into the embedded test interpreter (${python_exe})..."
"${python_exe}" -m pip install --quiet --disable-pip-version-check --retries 1 "numpy<3" \
|| echo "numpy install failed; numpy-backed binding tests will skip."
fi
# Run the whole suite, excluding tests tagged [NotWorking]. # Run the whole suite, excluding tests tagged [NotWorking].
# --no-tests=error fails the job if the filter matches nothing (instead of passing green). # --no-tests=error fails the job if the filter matches nothing (instead of passing green).
args=(--test-dir "${TEST_DIR}" -LE "NotWorking" --no-tests=error --output-junit "$(pwd)/ctest_results.xml" --output-on-failure -j) args=(--test-dir "${TEST_DIR}" -LE "NotWorking" --no-tests=error --output-junit "$(pwd)/ctest_results.xml" --output-on-failure -j)
+15 -9
View File
@@ -22,6 +22,7 @@
Match regexes; each must match at least one output line Match regexes; each must match at least one output line
NotMatch regexes; none may match any output line NotMatch regexes; none may match any output line
NotExists paths that must not exist after the case runs NotExists paths that must not exist after the case runs
DateStampedZip require a bundle date from during this case's invocation
.PARAMETER Name .PARAMETER Name
Run only the cases whose name matches this regex. Headings with no Run only the cases whose name matches this regex. Headings with no
@@ -109,12 +110,6 @@ $slnDir = Join-Path $fixtures 'sln'
New-Item -ItemType Directory -Force -Path $slnDir | Out-Null New-Item -ItemType Directory -Force -Path $slnDir | Out-Null
Set-Content -Path (Join-Path $slnDir 'OrcaSlicer.sln') -Value '' -Encoding ascii Set-Content -Path (Join-Path $slnDir 'OrcaSlicer.sln') -Value '' -Encoding ascii
# The pack stamp is checked against real dates, so a locale-dependent parse
# in the script cannot pass by looking date-shaped. Yesterday is accepted too,
# so a run that crosses midnight does not flake.
$dateStamps = @((Get-Date -Format 'yyyyMMdd'), (Get-Date).AddDays(-1).ToString('yyyyMMdd'))
$stampPattern = '_(' + ($dateStamps -join '|') + ')\.zip$'
$cases = @( $cases = @(
'argument handling' 'argument handling'
@{ Name = 'no arguments prints help'; Args = @(); DryRun = $false @{ Name = 'no arguments prints help'; Args = @(); DryRun = $false
@@ -326,12 +321,12 @@ $cases = @(
Contains = @('OrcaSlicer_dep_win-x64_') Contains = @('OrcaSlicer_dep_win-x64_')
NotContains = @('-clang', '-Release') } NotContains = @('-clang', '-Release') }
@{ Name = 'the bundle is stamped with today, not a shuffled date'; Args = @('-p') @{ Name = 'the bundle is stamped with today, not a shuffled date'; Args = @('-p')
Match = @($stampPattern) } DateStampedZip = $true }
# powershell.exe is not in System32 itself, so a trimmed PATH used to # powershell.exe is not in System32 itself, so a trimmed PATH used to
# leave the stamp empty and the bundle named OrcaSlicer_dep_win-x64_.zip. # leave the stamp empty and the bundle named OrcaSlicer_dep_win-x64_.zip.
@{ Name = 'the bundle is stamped even with a bare PATH'; Args = @('-p') @{ Name = 'the bundle is stamped even with a bare PATH'; Args = @('-p')
Env = @{ PATH = 'C:\Windows\system32;C:\Windows' } Env = @{ PATH = 'C:\Windows\system32;C:\Windows' }
Match = @($stampPattern) } DateStampedZip = $true }
@{ Name = '-p packs without rebuilding'; Args = @('-p') @{ Name = '-p packs without rebuilding'; Args = @('-p')
Match = @('^\+ .*(7z\.exe a|tar\.exe -a -c -f) ') Match = @('^\+ .*(7z\.exe a|tar\.exe -a -c -f) ')
NotContains = @('cmake -S deps') } NotContains = @('cmake -S deps') }
@@ -861,7 +856,7 @@ function Invoke-BuildScript {
$knownFields = @( $knownFields = @(
'Name', 'Args', 'ExpectExit', 'DryRun', 'First', 'Env', 'Name', 'Args', 'ExpectExit', 'DryRun', 'First', 'Env',
'Contains', 'NotContains', 'Match', 'NotMatch', 'NotExists' 'Contains', 'NotContains', 'Match', 'NotMatch', 'NotExists', 'DateStampedZip'
) )
function Test-Case { function Test-Case {
@@ -876,7 +871,9 @@ function Test-Case {
$expect = 0 $expect = 0
if ($Case.ContainsKey('ExpectExit')) { $expect = $Case['ExpectExit'] } if ($Case.ContainsKey('ExpectExit')) { $expect = $Case['ExpectExit'] }
$started = Get-Date
$result = Invoke-BuildScript -Arguments $argv -Environment $Case['Env'] $result = Invoke-BuildScript -Arguments $argv -Environment $Case['Env']
$finished = Get-Date
$problems = @() $problems = @()
@@ -902,6 +899,15 @@ function Test-Case {
$problems += "no line matching /$pattern/" $problems += "no line matching /$pattern/"
} }
} }
if ($Case['DateStampedZip']) {
# Bound the accepted dates to this invocation so crossing midnight is
# valid without allowing an unrelated past or future date.
$dateStamps = @($started.ToString('yyyyMMdd'), $finished.ToString('yyyyMMdd')) | Select-Object -Unique
$pattern = '_(' + ($dateStamps -join '|') + ')\.zip$'
if (@($lines | Where-Object { $_ -match $pattern }).Count -eq 0) {
$problems += "no line matching /$pattern/"
}
}
foreach ($pattern in $Case['NotMatch']) { foreach ($pattern in $Case['NotMatch']) {
foreach ($line in @($lines | Where-Object { $_ -match $pattern })) { foreach ($line in @($lines | Where-Object { $_ -match $pattern })) {
$problems += "line matches /$pattern/: $line" $problems += "line matches /$pattern/: $line"
+389 -72
View File
@@ -53,6 +53,8 @@ using namespace nlohmann;
#include "libslic3r/libslic3r.h" #include "libslic3r/libslic3r.h"
#include "libslic3r/Config.hpp" #include "libslic3r/Config.hpp"
#include "libslic3r/FilamentMixer.hpp"
#include "libslic3r/Preset.hpp"
#include "libslic3r/Geometry.hpp" #include "libslic3r/Geometry.hpp"
#include "libslic3r/GCode.hpp" #include "libslic3r/GCode.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
@@ -77,8 +79,9 @@ using namespace nlohmann;
#include "libslic3r/ObjColorUtils.hpp" #include "libslic3r/ObjColorUtils.hpp"
#include "OrcaSlicer.hpp" #include "OrcaSlicer.hpp"
//BBS: add exception handler for win32 #include <wx/filename.h>
#include <wx/stdpaths.h> #include <wx/stdpaths.h>
//BBS: add exception handler for win32
#ifdef WIN32 #ifdef WIN32
#include "dev-utils/BaseException.h" #include "dev-utils/BaseException.h"
#endif #endif
@@ -160,6 +163,7 @@ std::map<int, std::string> cli_errors = {
{CLI_FILAMENT_CAN_NOT_MAP, "Some filaments cannot be mapped to correct extruders for multi-extruder Printer."}, {CLI_FILAMENT_CAN_NOT_MAP, "Some filaments cannot be mapped to correct extruders for multi-extruder Printer."},
{CLI_ONLY_ONE_TPU_SUPPORTED, "Not support printing 2 or more TPU filaments."}, {CLI_ONLY_ONE_TPU_SUPPORTED, "Not support printing 2 or more TPU filaments."},
{CLI_FILAMENTS_NOT_SUPPORTED_BY_EXTRUDER, "Some filaments cannot be printed on the extruder mapped to."}, {CLI_FILAMENTS_NOT_SUPPORTED_BY_EXTRUDER, "Some filaments cannot be printed on the extruder mapped to."},
{CLI_MIXED_FILAMENT_INVALID, "A mixed filament is invalid: its components are different filament types, or it has no filament of its own."},
{CLI_SLICING_ERROR, "Failed slicing the model. Please verify the slicing of all plates on Orca Slicer before uploading."}, {CLI_SLICING_ERROR, "Failed slicing the model. Please verify the slicing of all plates on Orca Slicer before uploading."},
{CLI_GCODE_PATH_CONFLICTS, " G-code conflicts detected after slicing. Please make sure the 3mf file can be successfully sliced in the latest Orca Slicer. If the file slices normally in Orca Slicer, try moving the wipe tower further from other models, as we use more conservative parameters for it during upload."}, {CLI_GCODE_PATH_CONFLICTS, " G-code conflicts detected after slicing. Please make sure the 3mf file can be successfully sliced in the latest Orca Slicer. If the file slices normally in Orca Slicer, try moving the wipe tower further from other models, as we use more conservative parameters for it during upload."},
{CLI_GCODE_PATH_IN_UNPRINTABLE_AREA, "Found G-code in unprintable area of multi-extruder printers after slicing. Please make sure the 3mf file can be successfully sliced in the latest Orca Slicer."} {CLI_GCODE_PATH_IN_UNPRINTABLE_AREA, "Found G-code in unprintable area of multi-extruder printers after slicing. Please make sure the 3mf file can be successfully sliced in the latest Orca Slicer."}
@@ -1383,6 +1387,25 @@ int CLI::run(int argc, char **argv)
if (downward_check_option) if (downward_check_option)
downward_check = downward_check_option->value; downward_check = downward_check_option->value;
// --export-settings - writes its JSON to stdout, so reject every action or transform that may write there
// too (--info, --help, --orient, slicing and exporting). The allowed ones do nothing when nothing is
// sliced or exported.
if (std::find(m_actions.begin(), m_actions.end(), "export_settings") != m_actions.end() && m_config.opt_string("export_settings") == "-") {
static const std::set<std::string> stdout_compatible = { "export_settings", "uptodate", "load_defaultfila", "min_save",
"mtcpp", "mstpp", "no_check", "normative_check", "pipe" };
for (const std::vector<std::string> *opt_keys : { &m_actions, &m_transforms }) {
for (const std::string &opt_key : *opt_keys) {
if (stdout_compatible.count(opt_key) == 0) {
std::string flag = opt_key;
std::replace(flag.begin(), flag.end(), '_', '-');
boost::nowide::cerr << "--export-settings - cannot be combined with --" << flag << std::endl;
record_exit_reson(outfile_dir, CLI_INVALID_PARAMS, 0, cli_errors[CLI_INVALID_PARAMS], sliced_info);
flush_and_exit(CLI_INVALID_PARAMS);
}
}
}
}
bool start_gui = m_actions.empty() && !downward_check; bool start_gui = m_actions.empty() && !downward_check;
if (start_gui) { if (start_gui) {
BOOST_LOG_TRIVIAL(info) << "no action, start gui directly" << std::endl; BOOST_LOG_TRIVIAL(info) << "no action, start gui directly" << std::endl;
@@ -1466,6 +1489,10 @@ int CLI::run(int argc, char **argv)
std::vector<std::string> upward_compatible_printers, new_print_compatible_printers, current_print_compatible_printers, current_different_settings; std::vector<std::string> upward_compatible_printers, new_print_compatible_printers, current_print_compatible_printers, current_different_settings;
std::vector<std::string> current_filaments_name, current_filaments_system_name, current_inherits_group, current_extruder_variants, new_extruder_variants, current_print_extruder_variants, new_printer_extruder_variants; std::vector<std::string> current_filaments_name, current_filaments_system_name, current_inherits_group, current_extruder_variants, new_extruder_variants, current_print_extruder_variants, new_printer_extruder_variants;
DynamicPrintConfig load_process_config, load_machine_config; DynamicPrintConfig load_process_config, load_machine_config;
//ORCA: full configs of the "current" (3MF-embedded) process/printer presets, kept so that
// compatible_printers_condition can be evaluated for them below. Previously only the
// literal compatible_printers list was extracted.
DynamicPrintConfig current_process_full_config, current_printer_full_config;
bool new_process_config_is_system = true, new_printer_config_is_system = true; bool new_process_config_is_system = true, new_printer_config_is_system = true;
std::string pipe_name, makerlab_name, makerlab_version, different_process_setting; std::string pipe_name, makerlab_name, makerlab_version, different_process_setting;
const std::vector<std::string> &metadata_name = m_config.option<ConfigOptionStrings>("metadata_name", true)->values; const std::vector<std::string> &metadata_name = m_config.option<ConfigOptionStrings>("metadata_name", true)->values;
@@ -1925,7 +1952,7 @@ int CLI::run(int argc, char **argv)
} }
} }
catch (std::exception& e) { catch (std::exception& e) {
boost::nowide::cerr << construct_assemble_list << ": " << e.what() << std::endl; boost::nowide::cerr << "construct_assemble_list: " << e.what() << std::endl;
record_exit_reson(outfile_dir, CLI_DATA_FILE_ERROR, 0, cli_errors[CLI_DATA_FILE_ERROR], sliced_info); record_exit_reson(outfile_dir, CLI_DATA_FILE_ERROR, 0, cli_errors[CLI_DATA_FILE_ERROR], sliced_info);
flush_and_exit(CLI_DATA_FILE_ERROR); flush_and_exit(CLI_DATA_FILE_ERROR);
} }
@@ -1975,7 +2002,7 @@ int CLI::run(int argc, char **argv)
} }
std::unique_ptr<PresetBundle> cli_preset_bundle; std::unique_ptr<PresetBundle> cli_preset_bundle;
auto ensure_cli_preset_bundle = [&cli_preset_bundle, config_substitution_rule](std::string &error) -> PresetBundle * { auto ensure_cli_preset_bundle = [&cli_preset_bundle](std::string &error) -> PresetBundle * {
if (cli_preset_bundle) if (cli_preset_bundle)
return cli_preset_bundle.get(); return cli_preset_bundle.get();
try { try {
@@ -2002,19 +2029,21 @@ int CLI::run(int argc, char **argv)
} }
}; };
auto resolve_preset = [&ensure_cli_preset_bundle, config_substitution_rule](const std::string &file, DynamicPrintConfig &config, // One resolver for the whole run, so presets from the same vendor tree share its load.
std::unique_ptr<PresetBundle> system_preset_resolver;
auto resolve_preset = [&ensure_cli_preset_bundle, &system_preset_resolver](const std::string &file, DynamicPrintConfig &config,
std::string &config_type, const std::string &config_from, std::string &config_type, const std::string &config_from,
bool probe_type, std::string &error) { bool probe_type, std::string &error) {
const auto *inherits = config.option<ConfigOptionString>(BBL_JSON_KEY_INHERITS); const auto *inherits = config.option<ConfigOptionString>(BBL_JSON_KEY_INHERITS);
if (!probe_type && (inherits == nullptr || inherits->value.empty())) if (!probe_type && (inherits == nullptr || inherits->value.empty()))
return true; return true;
std::unique_ptr<PresetBundle> source_bundle;
PresetBundle *bundle = nullptr; PresetBundle *bundle = nullptr;
bool allow_source_manifest = false; bool allow_source_manifest = false;
if (config_from == "system") { if (config_from == "system") {
source_bundle = std::make_unique<PresetBundle>(); if (!system_preset_resolver)
bundle = source_bundle.get(); system_preset_resolver = std::make_unique<PresetBundle>();
bundle = system_preset_resolver.get();
allow_source_manifest = true; allow_source_manifest = true;
} else { } else {
bundle = ensure_cli_preset_bundle(error); bundle = ensure_cli_preset_bundle(error);
@@ -2046,7 +2075,52 @@ int CLI::run(int argc, char **argv)
error, allow_source_manifest); error, allow_source_manifest);
}; };
auto load_config_file = [config_substitution_rule, &resolve_preset](const std::string& file, DynamicPrintConfig& config, std::string& config_type, //ORCA: list the keys a user preset overrides relative to its system parent, for the
// `different_settings_to_system` column of an exported 3MF. Without it the CLI
// writes an empty column, so re-opening a CLI-exported project in the GUI shows
// spurious "unsaved changes" and can revert inherited process/filament/machine
// values to system defaults.
//
// The parent comes from the preset bundle that inherits resolution already builds,
// so this adds no extra loading. Returns "" whenever the parent cannot be resolved,
// which is exactly the previous behaviour.
auto cli_different_settings = [&ensure_cli_preset_bundle](const DynamicPrintConfig &resolved,
const std::string &parent_name,
Preset::Type type) -> std::string {
if (parent_name.empty())
return std::string();
std::string error;
PresetBundle *bundle = ensure_cli_preset_bundle(error);
if (bundle == nullptr) {
BOOST_LOG_TRIVIAL(warning) << "CLI: no preset bundle for different_settings_to_system: " << error;
return std::string();
}
const PresetCollection *collection = nullptr;
switch (type) {
case Preset::TYPE_PRINT: collection = &bundle->prints; break;
case Preset::TYPE_FILAMENT: collection = &bundle->filaments; break;
case Preset::TYPE_PRINTER: collection = &bundle->printers; break;
default: return std::string();
}
const Preset *parent = collection->find_preset2(parent_name, true);
if (parent == nullptr) {
BOOST_LOG_TRIVIAL(warning) << boost::format("CLI: parent preset '%1%' not found; leaving different_settings_to_system empty")%parent_name;
return std::string();
}
std::vector<std::string> keys = resolved.diff(parent->config);
//ORCA: preset metadata, not user-tunable settings. compatible_printers /
// compatible_prints have their own tracking columns and would double-count.
keys.erase(std::remove_if(keys.begin(), keys.end(), [](const std::string &k) {
return k == "inherits" || k == "compatible_printers" || k == "compatible_prints"
|| k == "compatible_printers_condition" || k == "compatible_prints_condition"
|| k == "print_settings_id" || k == "filament_settings_id" || k == "printer_settings_id";
}),
keys.end());
BOOST_LOG_TRIVIAL(info) << boost::format("CLI: %1% overrides vs parent '%2%'")%keys.size()%parent_name;
return Slic3r::escape_strings_cstyle(keys);
};
auto load_config_file = [&resolve_preset](const std::string& file, DynamicPrintConfig& config, std::string& config_type,
std::string& config_name, std::string& filament_id, std::string& config_from) { std::string& config_name, std::string& filament_id, std::string& config_from) {
if (! boost::filesystem::exists(file)) { if (! boost::filesystem::exists(file)) {
boost::nowide::cerr << __FUNCTION__<< ": can not find setting file: " << file << std::endl; boost::nowide::cerr << __FUNCTION__<< ": can not find setting file: " << file << std::endl;
@@ -2635,6 +2709,8 @@ int CLI::run(int argc, char **argv)
flush_and_exit(ret); flush_and_exit(ret);
} }
upward_compatible_printers = config.option<ConfigOptionStrings>("upward_compatible_machine", true)->values; upward_compatible_printers = config.option<ConfigOptionStrings>("upward_compatible_machine", true)->values;
//ORCA: keep the full config so compatible_printers_condition can be evaluated against it below
current_printer_full_config = std::move(config);
} }
} }
} }
@@ -2657,6 +2733,8 @@ int CLI::run(int argc, char **argv)
flush_and_exit(ret); flush_and_exit(ret);
} }
current_print_compatible_printers = config.option<ConfigOptionStrings>("compatible_printers", true)->values; current_print_compatible_printers = config.option<ConfigOptionStrings>("compatible_printers", true)->values;
//ORCA: keep the full config so compatible_printers_condition can be evaluated against it below
current_process_full_config = std::move(config);
} }
} }
} }
@@ -2675,46 +2753,88 @@ int CLI::run(int argc, char **argv)
for (int index = 0; index < upward_compatible_printers.size(); index++) { for (int index = 0; index < upward_compatible_printers.size(); index++) {
BOOST_LOG_TRIVIAL(info) << boost::format("index %1%, upward_compatible_printers %2%")%index %upward_compatible_printers[index]; BOOST_LOG_TRIVIAL(info) << boost::format("index %1%, upward_compatible_printers %2%")%index %upward_compatible_printers[index];
} }
//ORCA: Replace the four manual equality-loop checks below with is_compatible_with_printer(), the
// same helper the GUI uses, which also evaluates compatible_printers_condition. Process
// profiles that declare compatibility via condition only -- leaving compatible_printers
// empty -- were always reported incompatible by the literal-name match, so a CLI slice with
// such a preset exited with CLI_PROCESS_NOT_COMPATIBLE (-17) even though the GUI accepts the
// same pair. Behaviour is unchanged where an explicit list exists: is_compatible_with_printer
// does the same name match, and returns true when both list and condition are empty (which
// matches the "old 3mf, no compatible printers" path below).
auto check_compat = [](const DynamicPrintConfig &process_cfg,
const DynamicPrintConfig &printer_cfg,
const std::string &printer_name) -> bool {
return is_compatible_with_printer(process_cfg, Preset::TYPE_PRINT, printer_cfg, printer_name);
};
//ORCA: a 3MF's project config does not carry compatible_printers / compatible_printers_condition.
// PresetBundle::construct_full_config() erases both and re-emits them as
// print_compatible_printers and compatible_machine_expression_group; they are renamed back
// only on the PresetBundle load path, which the CLI does not take. Feeding the project config
// to the check as-is therefore presents no list and no condition, and
// is_compatible_with_printer() reads that as "no constraint" and accepts every printer.
// Translate the two keys back. Index 0 of the expression group is the print preset -- the
// group is filled print, filaments, printer (PresetBundle.cpp).
// The raw keys win whenever they carry something. A project the CLI exported itself has the
// real compatible_printers_condition AND an all-empty compatible_machine_expression_group,
// so copying the group's first entry unconditionally would overwrite a valid condition with
// "" and accept every printer. The renamed keys are only a fallback, and an empty value is
// never written over a real one.
auto cli_process_compat_config = [](const DynamicPrintConfig &project_cfg) -> DynamicPrintConfig {
DynamicPrintConfig cfg = project_cfg;
const auto *raw_list = project_cfg.option<ConfigOptionStrings>("compatible_printers");
const auto *list = project_cfg.option<ConfigOptionStrings>("print_compatible_printers");
if ((raw_list == nullptr || raw_list->values.empty()) && list != nullptr && !list->values.empty())
cfg.set_key_value("compatible_printers", new ConfigOptionStrings(list->values));
const auto *raw_cond = project_cfg.option<ConfigOptionString>("compatible_printers_condition");
const auto *group = project_cfg.option<ConfigOptionStrings>("compatible_machine_expression_group");
if ((raw_cond == nullptr || raw_cond->value.empty()) && group != nullptr && !group->values.empty() &&
!group->values.front().empty())
cfg.set_key_value("compatible_printers_condition", new ConfigOptionString(group->values.front()));
return cfg;
};
if (!new_printer_name.empty()) { if (!new_printer_name.empty()) {
if (!new_process_name.empty()) { if (!new_process_name.empty()) {
for (int index = 0; index < new_print_compatible_printers.size(); index++) { //new process + new printer: both configs came from --load-settings
if (new_print_compatible_printers[index] == new_printer_system_name) { process_compatible = check_compat(load_process_config, load_machine_config, new_printer_system_name);
process_compatible = true;
break;
}
}
BOOST_LOG_TRIVIAL(info) << boost::format("new printer %1%, inherited from %2%, new process %3%, inherited from %4% ,compatible %5%") BOOST_LOG_TRIVIAL(info) << boost::format("new printer %1%, inherited from %2%, new process %3%, inherited from %4% ,compatible %5%")
%new_printer_name %new_printer_system_name %new_process_name %new_process_system_name %process_compatible; %new_printer_name %new_printer_system_name %new_process_name %new_process_system_name %process_compatible;
} }
else { else {
for (int index = 0; index < current_print_compatible_printers.size(); index++) { //3MF-embedded process vs new printer. current_process_full_config is only populated from
if (current_print_compatible_printers[index] == new_printer_system_name) { //profiles/BBL/process_full/, so for every other vendor fall back to the 3MF's own project
process_compatible = true; //config in m_print_config, with its renamed compatibility keys translated back (see
break; //cli_process_compat_config above). Without this a 3MF built from a condition-only process
} //is rejected when re-sliced with the very printer it was made for.
{
//ORCA: profiles/BBL/{process,machine}_full/ are gitignored and not generated in-tree,
// so current_*_full_config is always empty and this fallback is the only live path.
const DynamicPrintConfig process_cfg = current_process_full_config.empty()
? cli_process_compat_config(m_print_config)
: current_process_full_config;
process_compatible = check_compat(process_cfg, load_machine_config, new_printer_system_name);
} }
BOOST_LOG_TRIVIAL(info) << boost::format("new printer %1%, inherited from %2%, old process %3%, inherited from %4% ,compatible %5%") BOOST_LOG_TRIVIAL(info) << boost::format("new printer %1%, inherited from %2%, old process %3%, inherited from %4% ,compatible %5%")
%new_printer_name %new_printer_system_name %current_process_name %current_process_system_name %process_compatible; %new_printer_name %new_printer_system_name %current_process_name %current_process_system_name %process_compatible;
} }
} }
else if (!new_process_name.empty()) { else if (!new_process_name.empty()) {
for (int index = 0; index < new_print_compatible_printers.size(); index++) { //new process vs 3MF-embedded printer. As above, current_printer_full_config only resolves for
if (new_print_compatible_printers[index] == current_printer_system_name) { //BBL profiles; otherwise evaluate against the 3MF's own project config in m_print_config, which
process_compatible = true; //holds the embedded printer's printer_notes / nozzle_diameter.
break; {
} const DynamicPrintConfig &printer_cfg = current_printer_full_config.empty() ? m_print_config : current_printer_full_config;
process_compatible = check_compat(load_process_config, printer_cfg, current_printer_system_name);
} }
BOOST_LOG_TRIVIAL(info) << boost::format("old printer %1%, inherited from %2%, new process %3%, inherited from %4% ,compatible %5%") BOOST_LOG_TRIVIAL(info) << boost::format("old printer %1%, inherited from %2%, new process %3%, inherited from %4% ,compatible %5%")
%current_printer_name %current_printer_system_name %new_process_name %new_process_system_name %process_compatible; %current_printer_name %current_printer_system_name %new_process_name %new_process_system_name %process_compatible;
} }
else { else {
//check the compatible of old printer&&process //both sides 3MF-embedded (pure reprocess)
for (int index = 0; index < current_print_compatible_printers.size(); index++) { if (!current_process_full_config.empty() && !current_printer_full_config.empty())
if (current_print_compatible_printers[index] == current_printer_system_name) { process_compatible = check_compat(current_process_full_config, current_printer_full_config, current_printer_system_name);
process_compatible = true; else
break; process_compatible = std::find(current_print_compatible_printers.begin(), current_print_compatible_printers.end(), current_printer_system_name) != current_print_compatible_printers.end();
}
}
if (!process_compatible && current_print_compatible_printers.empty()) if (!process_compatible && current_print_compatible_printers.empty())
{ {
BOOST_LOG_TRIVIAL(info) << boost::format("old 3mf, no compatible printers, set to compatible"); BOOST_LOG_TRIVIAL(info) << boost::format("old 3mf, no compatible printers, set to compatible");
@@ -2937,8 +3057,10 @@ int CLI::run(int argc, char **argv)
} }
} }
else { else {
//todo: support user machine preset's different settings //ORCA: was a //todo — compute the user's overrides instead of writing an empty column.
different_settings[filament_count+1] = ""; different_settings[filament_count+1] = new_printer_config_is_system
? std::string()
: cli_different_settings(load_machine_config, new_printer_system_name, Preset::TYPE_PRINTER);
if (new_printer_config_is_system) if (new_printer_config_is_system)
inherits_group[filament_count+1] = ""; inherits_group[filament_count+1] = "";
else else
@@ -3080,8 +3202,14 @@ int CLI::run(int argc, char **argv)
print_compatible_printers = std::move(current_print_compatible_printers); print_compatible_printers = std::move(current_print_compatible_printers);
} }
else { else {
//todo: support system process preset //ORCA: was a //todo. Prefer a value the loaded JSON already carried, otherwise
different_settings[0] = ""; // compute the overrides against the system parent.
if (!different_process_setting.empty())
different_settings[0] = different_process_setting;
else
different_settings[0] = new_process_config_is_system
? std::string()
: cli_different_settings(load_process_config, new_process_system_name, Preset::TYPE_PRINT);
if (new_process_config_is_system) if (new_process_config_is_system)
inherits_group[0] = ""; inherits_group[0] = "";
else else
@@ -3268,6 +3396,16 @@ int CLI::run(int argc, char **argv)
int filament_index = load_filaments_index[index]; int filament_index = load_filaments_index[index];
std::vector<std::string> different_keys; std::vector<std::string> different_keys;
//ORCA: diff before load_default_gcodes_to_config, the way the process and machine
// slots above already do. That call materialises absent gcode keys via
// option(..., true), and DynamicConfig::diff only compares keys present in
// both configs -- so a gcode key the leaf did not carry would go from "not
// compared" to "compared as empty against the parent" and land in the column
// as an override the user never made.
std::string filament_different_settings;
if (load_filament_count > 0)
filament_different_settings = cli_different_settings(config, load_filaments_inherit[index], Preset::TYPE_FILAMENT);
load_default_gcodes_to_config(config, Preset::TYPE_FILAMENT); load_default_gcodes_to_config(config, Preset::TYPE_FILAMENT);
if (load_filament_count > 0) { if (load_filament_count > 0) {
@@ -3279,8 +3417,8 @@ int CLI::run(int argc, char **argv)
opt_filament_settings->set_at(filament_name_setting, filament_index-1, 0); opt_filament_settings->set_at(filament_name_setting, filament_index-1, 0);
config.erase("filament_settings_id"); config.erase("filament_settings_id");
//todo: update different settings of filaments //ORCA: was a //todo — same treatment as process/machine above.
different_settings[filament_index] = ""; different_settings[filament_index] = filament_different_settings;
inherits_group[filament_index] = load_filaments_inherit[index]; inherits_group[filament_index] = load_filaments_inherit[index];
} }
else { else {
@@ -3585,6 +3723,15 @@ int CLI::run(int argc, char **argv)
} }
} }
// A mixed slot never reaches a nozzle, so its row and column stay empty, as in the GUI.
// Command line options are not merged into m_print_config yet, so they win here.
const ConfigOptionBools *is_mixed_opt = m_extra_config.option<ConfigOptionBools>("filament_is_mixed");
if (!is_mixed_opt)
is_mixed_opt = m_print_config.option<ConfigOptionBools>("filament_is_mixed");
auto is_mixed_slot = [is_mixed_opt](int idx) {
return is_mixed_opt && idx < static_cast<int>(is_mixed_opt->values.size()) && is_mixed_opt->values[idx];
};
for (size_t nozzle_id = 0; nozzle_id < new_extruder_count; ++nozzle_id) { for (size_t nozzle_id = 0; nozzle_id < new_extruder_count; ++nozzle_id) {
std::vector<double> flush_vol_mtx = get_flush_volumes_matrix(flush_vol_matrix, nozzle_id, new_extruder_count); std::vector<double> flush_vol_mtx = get_flush_volumes_matrix(flush_vol_matrix, nozzle_id, new_extruder_count);
for (int from_idx = 0; from_idx < project_filament_count; from_idx++) { for (int from_idx = 0; from_idx < project_filament_count; from_idx++) {
@@ -3594,7 +3741,7 @@ int CLI::run(int argc, char **argv)
bool is_from_support = filament_is_support->get_at(from_idx); bool is_from_support = filament_is_support->get_at(from_idx);
for (int to_idx = 0; to_idx < project_filament_count; to_idx++) { for (int to_idx = 0; to_idx < project_filament_count; to_idx++) {
bool is_to_support = filament_is_support->get_at(to_idx); bool is_to_support = filament_is_support->get_at(to_idx);
if (from_idx == to_idx) { if (from_idx == to_idx || is_mixed_slot(from_idx) || is_mixed_slot(to_idx)) {
flush_vol_mtx[project_filament_count * from_idx + to_idx] = 0.f; flush_vol_mtx[project_filament_count * from_idx + to_idx] = 0.f;
} else { } else {
int flushing_volume = 0; int flushing_volume = 0;
@@ -3731,12 +3878,113 @@ int CLI::run(int argc, char **argv)
} }
} }
//ORCA: settings passed on the command line (--sparse-infill-density 25% ...) override the loaded
// presets right here, so they belong in different_settings_to_system just as a preset
// override does. Without them re-opening the exported project in the GUI shows nothing
// modified and reverts those values to the system presets'.
//
// The keys come from m_config, not m_extra_config: read_cli() puts only what the user typed
// into m_config (setup() adds nothing but CLI-own defaults), whereas the CLI writes its own
// values into m_extra_config. Only keys whose value the override actually changed are
// recorded -- a typed value equal to the loaded one modifies nothing -- and each lands in
// the column(s) whose preset type owns it: [0] process, [1..n-2] filaments, [n-1] printer.
//
// "Changed" is judged the way the value is read: a list is compared entry by entry with a
// missing entry read as the first, as get_at() does -- so --nozzle-temperature 245 against
// 245,245,245 is no change, although the two serialize differently.
//
// A key the loaded config does not carry at all is always recorded, even if the typed value
// equals the built-in default. On reopen the GUI restores an unlisted key from the SYSTEM
// preset, which need not match that default: a 3MF written before an option existed leaves
// it absent here, and --sparse-infill-density 20% (the default) against a Prusa system 15%
// would otherwise go unrecorded and be reverted. Over-recording is cosmetic; under-recording
// loses the value.
std::map<std::string, std::unique_ptr<ConfigOption>> cli_override_before;
for (const std::string &key : m_config.keys()) {
if (!m_extra_config.has(key))
continue;
const ConfigOption *loaded = m_print_config.option(key);
cli_override_before[key].reset(loaded != nullptr ? loaded->clone() : nullptr); // null: always recorded
}
// Apply command line options to a more specific DynamicPrintConfig which provides normalize() // Apply command line options to a more specific DynamicPrintConfig which provides normalize()
// (command line options override --load files) // (command line options override --load files)
m_print_config.apply(m_extra_config, true); m_print_config.apply(m_extra_config, true);
if (!cli_override_before.empty()) {
std::vector<std::string> &columns = m_print_config.option<ConfigOptionStrings>("different_settings_to_system", true)->values;
auto owned_by = [](const std::vector<std::string> &options, const std::string &key) {
return std::find(options.begin(), options.end(), key) != options.end();
};
auto add_to_column = [&columns](size_t index, const std::string &key) {
std::vector<std::string> keys;
Slic3r::unescape_strings_cstyle(columns[index], keys);
if (std::find(keys.begin(), keys.end(), key) == keys.end()) {
keys.push_back(key);
columns[index] = Slic3r::escape_strings_cstyle(keys);
}
};
auto same_value = [](const ConfigOption *a, const ConfigOption *b) {
if (a == nullptr || b == nullptr)
return false;
const auto *va = dynamic_cast<const ConfigOptionVectorBase *>(a);
const auto *vb = dynamic_cast<const ConfigOptionVectorBase *>(b);
if (va == nullptr || vb == nullptr)
return va == vb && a->serialize() == b->serialize();
const std::vector<std::string> ea = va->vserialize(), eb = vb->vserialize();
if (ea.empty() || eb.empty())
return ea.empty() && eb.empty();
for (size_t i = 0; i < std::max(ea.size(), eb.size()); ++i)
if (ea[i < ea.size() ? i : 0] != eb[i < eb.size() ? i : 0])
return false;
return true;
};
//ORCA: always true after the resize to filament_count + 2 above, and nothing in between can
// shrink the column vector -- different_settings_to_system is not a CLI option. Kept as
// a check rather than an assert: release builds compile asserts out, so an assert would
// protect nothing, while a build with _GLIBCXX_ASSERTIONS would abort on columns[0].
if (columns.size() >= 2) {
for (const auto &[key, before] : cli_override_before) {
if (same_value(before.get(), m_print_config.option(key)))
continue;
bool recorded = false;
if (owned_by(Preset::print_options(), key)) {
add_to_column(0, key);
recorded = true;
}
if (owned_by(Preset::filament_options(), key)) {
for (size_t i = 1; i + 1 < columns.size(); ++i)
add_to_column(i, key);
recorded = true;
}
if (owned_by(Preset::printer_options(), key)) {
add_to_column(columns.size() - 1, key);
recorded = true;
}
if (recorded)
BOOST_LOG_TRIVIAL(info) << boost::format("CLI: override %1% recorded in different_settings_to_system") % key;
}
}
}
// Normalizing after importing the 3MFs / AMFs // Normalizing after importing the 3MFs / AMFs
m_print_config.normalize_fdm(); m_print_config.normalize_fdm();
// A mixed slot is virtual but still needs a filament entry of its own. Without one, feature
// filament ids aimed at it fall outside the filament count, are reset to the first filament
// and the model silently prints in a single colour.
if (const auto *is_mixed_opt = m_print_config.option<ConfigOptionBools>("filament_is_mixed")) {
const auto &is_mixed = is_mixed_opt->values;
for (size_t slot = static_cast<size_t>(std::max(filament_count, 0)); slot < is_mixed.size(); ++slot) {
if (!is_mixed[slot])
continue;
BOOST_LOG_TRIVIAL(error) << boost::format("mixed filament slot %1% has no filament of its own, only %2% filaments are loaded; "
"load one filament per slot, including each mixed one")
% (slot + 1) % filament_count;
record_exit_reson(outfile_dir, CLI_MIXED_FILAMENT_INVALID, 0, cli_errors[CLI_MIXED_FILAMENT_INVALID], sliced_info);
flush_and_exit(CLI_MIXED_FILAMENT_INVALID);
}
}
m_print_config.option<ConfigOptionEnum<PrinterTechnology>>("printer_technology", true)->value = printer_technology; m_print_config.option<ConfigOptionEnum<PrinterTechnology>>("printer_technology", true)->value = printer_technology;
bool has_wipe_tower_position = m_print_config.option<ConfigOptionFloats>("wipe_tower_x") && m_print_config.option<ConfigOptionFloats>("wipe_tower_y"); bool has_wipe_tower_position = m_print_config.option<ConfigOptionFloats>("wipe_tower_x") && m_print_config.option<ConfigOptionFloats>("wipe_tower_y");
@@ -3791,6 +4039,15 @@ int CLI::run(int argc, char **argv)
bool is_smooth_timelapse = false; bool is_smooth_timelapse = false;
if (enable_timelapse && timelapse_type_opt && (timelapse_type_opt->getInt() == TimelapseType::tlSmooth)) if (enable_timelapse && timelapse_type_opt && (timelapse_type_opt->getInt() == TimelapseType::tlSmooth))
is_smooth_timelapse = true; is_smooth_timelapse = true;
// A mixed filament swaps between its components every layer, so it needs the tower even when
// every loaded preset is the same.
if (disable_wipe_tower_after_mapping) {
if (const auto *is_mixed_opt = m_print_config.option<ConfigOptionBools>("filament_is_mixed");
is_mixed_opt && has_any_mixed_filament(is_mixed_opt->values)) {
disable_wipe_tower_after_mapping = false;
BOOST_LOG_TRIVIAL(info) << boost::format("%1%, set disable_wipe_tower_after_mapping back to false due to a mixed filament")%__LINE__;
}
}
if (disable_wipe_tower_after_mapping) { if (disable_wipe_tower_after_mapping) {
if (is_smooth_timelapse) if (is_smooth_timelapse)
{ {
@@ -4015,7 +4272,7 @@ int CLI::run(int argc, char **argv)
} }
}; };
auto check_plate_wipe_tower = [get_print_sequence, is_smooth_timelapse, new_extruder_count](Slic3r::GUI::PartPlate* plate, int plate_index, DynamicPrintConfig& print_config, plate_obj_size_info_t &plate_obj_size_info) { auto check_plate_wipe_tower = [get_print_sequence, is_smooth_timelapse](Slic3r::GUI::PartPlate* plate, int plate_index, DynamicPrintConfig& print_config, plate_obj_size_info_t &plate_obj_size_info) {
plate_obj_size_info.obj_bbox= plate->get_objects_bounding_box(); plate_obj_size_info.obj_bbox= plate->get_objects_bounding_box();
BOOST_LOG_TRIVIAL(info) << boost::format("plate %1%, object bbox: min {%2%, %3%, %4%} - max {%5%, %6%, %7%}") BOOST_LOG_TRIVIAL(info) << boost::format("plate %1%, object bbox: min {%2%, %3%, %4%} - max {%5%, %6%, %7%}")
%(plate_index+1) %plate_obj_size_info.obj_bbox.min.x() % plate_obj_size_info.obj_bbox.min.y() % plate_obj_size_info.obj_bbox.min.z() %plate_obj_size_info.obj_bbox.max.x() % plate_obj_size_info.obj_bbox.max.y() % plate_obj_size_info.obj_bbox.max.z(); %(plate_index+1) %plate_obj_size_info.obj_bbox.min.x() % plate_obj_size_info.obj_bbox.min.y() % plate_obj_size_info.obj_bbox.min.z() %plate_obj_size_info.obj_bbox.max.x() % plate_obj_size_info.obj_bbox.max.y() % plate_obj_size_info.obj_bbox.max.z();
@@ -4059,22 +4316,13 @@ int CLI::run(int argc, char **argv)
plate_obj_size_info.wipe_x = wipe_x_option->get_at(plate_index); plate_obj_size_info.wipe_x = wipe_x_option->get_at(plate_index);
plate_obj_size_info.wipe_y = wipe_y_option->get_at(plate_index); plate_obj_size_info.wipe_y = wipe_y_option->get_at(plate_index);
ConfigOptionFloat* width_option = print_config.option<ConfigOptionFloat>("prime_tower_width", true); // Body and brim from one estimate: resolving an auto (-1) brim against a different
plate_obj_size_info.wipe_width = width_option->value; // height would size the two halves of the same tower from two different objects.
const WipeTowerFootprint footprint = plate->estimate_wipe_tower_footprint(print_config, filaments_cnt);
float brim_width = float(footprint.brim_width);
ConfigOptionFloat* brim_width_option = print_config.option<ConfigOptionFloat>("prime_tower_brim_width", true); plate_obj_size_info.wipe_width = footprint.width;
float brim_width = brim_width_option->value; plate_obj_size_info.wipe_depth = footprint.depth;
if (brim_width < 0) brim_width = WipeTower::get_auto_brim_by_height((float)plate_obj_size_info.obj_bbox.max.z());
ConfigOptionFloat* volume_option = print_config.option<ConfigOptionFloat>("prime_volume", true);
float wipe_volume = volume_option->value;
const ConfigOptionBool * wrapping_detection = print_config.option<ConfigOptionBool>("enable_wrapping_detection");
bool enable_wrapping = (wrapping_detection != nullptr) && wrapping_detection->value;
Vec3d wipe_tower_size = plate->estimate_wipe_tower_size(print_config, plate_obj_size_info.wipe_width, wipe_volume, new_extruder_count, filaments_cnt, false, enable_wrapping);
plate_obj_size_info.wipe_width = wipe_tower_size(0);
plate_obj_size_info.wipe_depth = wipe_tower_size(1);
Vec3d origin = plate->get_origin(); Vec3d origin = plate->get_origin();
Vec3d start(origin(0) + plate_obj_size_info.wipe_x - brim_width, origin(1) + plate_obj_size_info.wipe_y, 0.f); Vec3d start(origin(0) + plate_obj_size_info.wipe_x - brim_width, origin(1) + plate_obj_size_info.wipe_y, 0.f);
@@ -4835,13 +5083,16 @@ int CLI::run(int argc, char **argv)
} }
} }
if (!arrange_cfg.is_seq_print && (assemble_plate.filaments_count > 1)||(enable_wrapping_detect && !current_wrapping_exclude_area.empty())) if ((!arrange_cfg.is_seq_print && (assemble_plate.filaments_count > 1))||(enable_wrapping_detect && !current_wrapping_exclude_area.empty()))
{ {
//prepare the wipe tower //prepare the wipe tower
int plate_count = partplate_list.get_plate_count(); int plate_count = partplate_list.get_plate_count();
auto printer_structure_opt = m_print_config.option<ConfigOptionEnum<PrinterStructure>>("printer_structure"); auto printer_structure_opt = m_print_config.option<ConfigOptionEnum<PrinterStructure>>("printer_structure");
const float tower_brim_width = m_print_config.option<ConfigOptionFloat>("prime_tower_width", true)->value; // This margin only pre-adjusts the default away from the near edges;
// estimate_wipe_tower_polygon below computes the real clamped position.
float tower_brim_width = m_print_config.option<ConfigOptionFloat>("prime_tower_brim_width", true)->value;
if (tower_brim_width < 0.f) tower_brim_width = 8.f; // auto: object heights unknown here, 8 mm is the auto cap
const float tower_margin = WIPE_TOWER_MARGIN + tower_brim_width; const float tower_margin = WIPE_TOWER_MARGIN + tower_brim_width;
// set the default position, the same with print config(left top) // set the default position, the same with print config(left top)
@@ -4875,7 +5126,7 @@ int CLI::run(int argc, char **argv)
wipe_y_option->set_at(&wt_y_opt, i, 0); wipe_y_option->set_at(&wt_y_opt, i, 0);
Vec3d wipe_tower_size, wipe_tower_pos; Vec3d wipe_tower_size, wipe_tower_pos;
ArrangePolygon wipe_tower_ap = cur_plate->estimate_wipe_tower_polygon(m_print_config, i, wipe_tower_pos, wipe_tower_size, new_extruder_count, assemble_plate.filaments_count, true); ArrangePolygon wipe_tower_ap = cur_plate->estimate_wipe_tower_polygon(m_print_config, i, wipe_tower_pos, wipe_tower_size, assemble_plate.filaments_count, true);
//update the new wp position //update the new wp position
wt_x_opt.value = wipe_tower_pos(0); wt_x_opt.value = wipe_tower_pos(0);
@@ -5118,7 +5369,7 @@ int CLI::run(int argc, char **argv)
//skip this object due to be locked in plate //skip this object due to be locked in plate
ap.itemid = locked_aps.size(); ap.itemid = locked_aps.size();
locked_aps.emplace_back(ap); locked_aps.emplace_back(ap);
boost::nowide::cout <<__FUNCTION__ << boost::format(": skip locked instance, obj_id %1%, instance_id %2%") % oidx % inst_idx; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": skip locked instance, obj_id %1%, instance_id %2%") % oidx % inst_idx;
} }
} }
} }
@@ -5138,7 +5389,10 @@ int CLI::run(int argc, char **argv)
int extruder_size = used_filament_set.size(); int extruder_size = used_filament_set.size();
auto printer_structure_opt = m_print_config.option<ConfigOptionEnum<PrinterStructure>>("printer_structure"); auto printer_structure_opt = m_print_config.option<ConfigOptionEnum<PrinterStructure>>("printer_structure");
const float tower_brim_width = m_print_config.option<ConfigOptionFloat>("prime_tower_width", true)->value; // This margin only pre-adjusts the default away from the near edges;
// estimate_wipe_tower_polygon below computes the real clamped position.
float tower_brim_width = m_print_config.option<ConfigOptionFloat>("prime_tower_brim_width", true)->value;
if (tower_brim_width < 0.f) tower_brim_width = 8.f; // auto: object heights unknown here, 8 mm is the auto cap
const float tower_margin = WIPE_TOWER_MARGIN + tower_brim_width; const float tower_margin = WIPE_TOWER_MARGIN + tower_brim_width;
// set the default position, the same with print config(left top) // set the default position, the same with print config(left top)
float x = WIPE_TOWER_DEFAULT_X_POS; float x = WIPE_TOWER_DEFAULT_X_POS;
@@ -5175,7 +5429,7 @@ int CLI::run(int argc, char **argv)
} }
Vec3d wipe_tower_size, wipe_tower_pos; Vec3d wipe_tower_size, wipe_tower_pos;
ArrangePolygon wipe_tower_ap = partplate_list.get_plate(plate_index_valid)->estimate_wipe_tower_polygon(m_print_config, plate_index_valid, wipe_tower_pos, wipe_tower_size, new_extruder_count, extruder_size, true); ArrangePolygon wipe_tower_ap = partplate_list.get_plate(plate_index_valid)->estimate_wipe_tower_polygon(m_print_config, plate_index_valid, wipe_tower_pos, wipe_tower_size, extruder_size, true);
//update the new wp position //update the new wp position
if (bedid < plate_count) { if (bedid < plate_count) {
@@ -5276,22 +5530,16 @@ int CLI::run(int argc, char **argv)
//float depth = v * (filaments_cnt - 1) / (layer_height * w); //float depth = v * (filaments_cnt - 1) / (layer_height * w);
const ConfigOptionBool *wrapping_detection = m_print_config.option<ConfigOptionBool>("enable_wrapping_detection"); const WipeTowerFootprint footprint = cur_plate->estimate_wipe_tower_footprint(m_print_config, filaments_cnt);
bool enable_wrapping = (wrapping_detection != nullptr) && wrapping_detection->value; Vec3d wipe_tower_size(footprint.width, footprint.depth, footprint.height);
Vec3d wipe_tower_size = cur_plate->estimate_wipe_tower_size(m_print_config, w, v, new_extruder_count, filaments_cnt, false, enable_wrapping);
Vec3d plate_origin = cur_plate->get_origin(); Vec3d plate_origin = cur_plate->get_origin();
int plate_width, plate_depth; int plate_width, plate_depth;
double plate_height; double plate_height;
partplate_list.get_plate_size(plate_width, plate_depth, plate_height); partplate_list.get_plate_size(plate_width, plate_depth, plate_height);
float depth = wipe_tower_size(1); float depth = wipe_tower_size(1);
float margin = 15.f, wp_brim_width = 0.f; // Brim already resolved against the height the body was sized from.
ConfigOption *wipe_tower_brim_width_opt = m_print_config.option("prime_tower_brim_width"); float margin = 15.f, wp_brim_width = float(footprint.brim_width);
if (wipe_tower_brim_width_opt ) { BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("arrange wipe_tower: wp_brim_width %1%")%wp_brim_width;
wp_brim_width = wipe_tower_brim_width_opt->getFloat();
if (wp_brim_width < 0) wp_brim_width = WipeTower::get_auto_brim_by_height((float) wipe_tower_size.z());
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("arrange wipe_tower: wp_brim_width %1%")%wp_brim_width;
}
w = wipe_tower_size(0); w = wipe_tower_size(0);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("arrange wipe_tower: x=%1%, y=%2%, width=%3%, depth=%4%, angle=%5%, prime_volume=%6%, filaments_cnt=%7%, layer_height=%8%, plate_width=%9%, plate_depth=%10%") BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("arrange wipe_tower: x=%1%, y=%2%, width=%3%, depth=%4%, angle=%5%, prime_volume=%6%, filaments_cnt=%7%, layer_height=%8%, plate_width=%9%, plate_depth=%10%")
@@ -5710,7 +5958,11 @@ int CLI::run(int argc, char **argv)
//FIXME check for mixing the FFF / SLA parameters. //FIXME check for mixing the FFF / SLA parameters.
// or better save fff_print_config vs. sla_print_config // or better save fff_print_config vs. sla_print_config
//m_print_config.save(m_config.opt_string("save")); //m_print_config.save(m_config.opt_string("save"));
m_print_config.save_to_json(m_config.opt_string(opt_key), std::string("project_settings"), std::string("project"), std::string(SoftFever_VERSION)); const std::string &settings_file = m_config.opt_string(opt_key);
if (settings_file == "-")
m_print_config.save_to_json(boost::nowide::cout, "project_settings", "project", SoftFever_VERSION, /*replace_invalid_utf8=*/true);
else
m_print_config.save_to_json(settings_file, std::string("project_settings"), std::string("project"), std::string(SoftFever_VERSION));
} else if (opt_key == "info") { } else if (opt_key == "info") {
// --info works on unrepaired model // --info works on unrepaired model
for (Model &model : m_models) { for (Model &model : m_models) {
@@ -5807,6 +6059,34 @@ int CLI::run(int argc, char **argv)
//Print fff_print; //Print fff_print;
std::vector<size_t> plate_triangle_counts(partplate_list.get_plate_count(), 0); std::vector<size_t> plate_triangle_counts(partplate_list.get_plate_count(), 0);
// The stored (or default) tower position may not fit the tower these plates
// need, and no CLI placement site runs on a plain slice - mirror the GUI's
// reload clamp and fit every plate's tower into the printable area first.
if (m_print_config.option<ConfigOptionBool>("enable_prime_tower", true)->value) {
for (int index = 0; index < partplate_list.get_plate_count(); index++) {
if ((plate_to_slice != 0) && (plate_to_slice != (index + 1)))
continue;
Slic3r::GUI::PartPlate *plate = partplate_list.get_plate(index);
// Printing by object disables the tower only with more than one instance.
bool is_seq_print = false;
get_print_sequence(plate, m_print_config, is_seq_print);
if (is_seq_print && plate->printable_instance_size() > 1)
continue;
// An empty estimate is a plate that prints no tower (one filament and
// neither smooth timelapse, wrapping detection nor a raft).
Vec3d wt_pos, wt_size;
plate->estimate_wipe_tower_polygon(m_print_config, index, wt_pos, wt_size);
if (wt_size(0) < EPSILON || wt_size(1) < EPSILON)
continue;
ConfigOptionFloat wt_x_opt((float) wt_pos(0));
ConfigOptionFloat wt_y_opt((float) wt_pos(1));
m_print_config.option<ConfigOptionFloats>("wipe_tower_x", true)->set_at(&wt_x_opt, index, 0);
m_print_config.option<ConfigOptionFloats>("wipe_tower_y", true)->set_at(&wt_y_opt, index, 0);
BOOST_LOG_TRIVIAL(info) << boost::format("plate %1%: wipe tower clamped to {%2%, %3%}, size {%4%, %5%}")
% (index + 1) % wt_pos(0) % wt_pos(1) % wt_size(0) % wt_size(1);
}
}
while(!finished) while(!finished)
{ {
//BBS: slice every partplate one by one //BBS: slice every partplate one by one
@@ -5978,6 +6258,36 @@ int CLI::run(int argc, char **argv)
flush_and_exit(CLI_ONLY_ONE_TPU_SUPPORTED); flush_and_exit(CLI_ONLY_ONE_TPU_SUPPORTED);
} }
// Same type gate as the GUI's Sidebar::has_broken_mixed_filament: refuse a plate that uses a
// mixed slot whose components are different filament types. Missing or out-of-range
// components never get here, validate() already rejects them for the whole project.
const auto *is_mixed_opt = m_print_config.option<ConfigOptionBools>("filament_is_mixed");
const auto *components_opt = m_print_config.option<ConfigOptionStrings>("filament_mixed_components");
if (is_mixed_opt && components_opt && has_any_mixed_filament(is_mixed_opt->values)) {
const auto &is_mixed = is_mixed_opt->values;
const auto &components = components_opt->values;
const size_t num_physical = static_cast<size_t>(filament_count) - static_cast<size_t>(std::count(is_mixed.begin(), is_mixed.end(), true));
std::vector<std::string> physical_types(num_physical);
for (size_t f_index = 0; f_index < num_physical; ++f_index) {
std::string displayed_type;
physical_types[f_index] = m_print_config.get_filament_type(displayed_type, static_cast<int>(f_index));
if (physical_types[f_index].empty())
physical_types[f_index] = "PLA";
}
const std::vector<size_t> mismatched_slots = check_mixed_filament_type_consistency(is_mixed, components, physical_types);
// plate_filaments has mixed slots expanded to their components; the gate needs the slots.
const std::vector<int> plate_slots = mismatched_slots.empty() ? std::vector<int>() :
part_plate->get_extruders_under_cli(true, m_print_config, false);
for (size_t slot : mismatched_slots) {
if (std::find(plate_slots.begin(), plate_slots.end(), static_cast<int>(slot) + 1) == plate_slots.end())
continue;
BOOST_LOG_TRIVIAL(error) << boost::format("plate %1%: mixed filament %2% mixes components of different filament types")
% (index + 1) % (slot + 1);
record_exit_reson(outfile_dir, CLI_MIXED_FILAMENT_INVALID, index + 1, cli_errors[CLI_MIXED_FILAMENT_INVALID], sliced_info);
flush_and_exit(CLI_MIXED_FILAMENT_INVALID);
}
}
if (new_extruder_count > 1) { if (new_extruder_count > 1) {
std::vector<std::vector<int>> unprintable_filament_vec; std::vector<std::vector<int>> unprintable_filament_vec;
for (const std::set<int>& filamnt_ids : unprintable_filament_ids) { for (const std::set<int>& filamnt_ids : unprintable_filament_ids) {
@@ -7430,6 +7740,13 @@ bool CLI::setup(int argc, char **argv)
this->print_help(); this->print_help();
return false; return false;
} }
// Orca: resolve here, while the process is still in the directory the user invoked it from.
// GUI_App's constructor moves the working directory to <data_dir>/log, long before the GUI
// opens these files in post_init(), and a relative path would then resolve against that.
for (std::string &input_file : m_input_files)
input_file = resolve_cli_input_path(input_file);
// Parse actions and transform options. // Parse actions and transform options.
for (auto const &opt_key : opt_order) { for (auto const &opt_key : opt_order) {
if (cli_actions_config_def.has(opt_key)) if (cli_actions_config_def.has(opt_key))
+1 -1
View File
@@ -297,7 +297,7 @@ int wmain(int argc, wchar_t **argv)
// printf("Loading Slic3r library: %S\n", path_to_slic3r); // printf("Loading Slic3r library: %S\n", path_to_slic3r);
HINSTANCE hInstance_Slic3r = LoadLibraryExW(path_to_slic3r, nullptr, 0); HINSTANCE hInstance_Slic3r = LoadLibraryExW(path_to_slic3r, nullptr, 0);
if (hInstance_Slic3r == nullptr) { if (hInstance_Slic3r == nullptr) {
printf("OrcaSlicer.dll was not loaded, error=%d\n", GetLastError()); printf("OrcaSlicer.dll was not loaded, error=%lu\n", GetLastError());
return -1; return -1;
} }
+1 -1
View File
@@ -1,7 +1,7 @@
#pragma once #pragma once
#include <boost/nowide/cstdio.hpp> #include <boost/nowide/cstdio.hpp>
#include <boost/nowide/fstream.hpp> #include <boost/nowide/fstream.hpp>
#include "stackwalker.h" #include "StackWalker.h"
#include <eh.h> #include <eh.h>
class CBaseException : public CStackWalker class CBaseException : public CStackWalker
+35 -1
View File
@@ -8,7 +8,11 @@
#define NANOSVGRAST_IMPLEMENTATION #define NANOSVGRAST_IMPLEMENTATION
#include "nanosvg/nanosvgrast.h" #include "nanosvg/nanosvgrast.h"
#include "libslic3r/BoundingBox.hpp"
#include "libslic3r/GCode.hpp" #include "libslic3r/GCode.hpp"
#include "libslic3r/GCode/WipeTower.hpp"
#include "libslic3r/GCode/WipeTowerEstimate.hpp"
#include "libslic3r/Geometry.hpp"
#include "libslic3r/Preset.hpp" #include "libslic3r/Preset.hpp"
#include "libslic3r/Config.hpp" #include "libslic3r/Config.hpp"
#include "libslic3r/PresetBundle.hpp" #include "libslic3r/PresetBundle.hpp"
@@ -116,15 +120,45 @@ Vec2d printable_area_center(const DynamicPrintConfig &cfg)
return 0.5 * (lo + hi); return 0.5 * (lo + hi);
} }
// Put the prime tower where the GUI and CLI would before slicing. The config default (x 15, y 220)
// lies off any bed shallower than the tower, and generation rejects an off-plate tower instead of
// exporting it. Beside the centred cube, clear of the edge exclusion strips some beds carry, then
// pulled inside the printable outline by the tower's own estimated footprint, with a few mm of
// clearance so the conflict checker never sees the two touch.
void place_wipe_tower(DynamicPrintConfig &cfg, const Vec2d &center)
{
const auto *area = cfg.option<ConfigOptionPoints>("printable_area");
if (area == nullptr || area->values.size() < 3)
return;
const WipeTowerFootprint footprint = estimate_wipe_tower_footprint(cfg, resolve_wipe_tower_type(cfg), {0, 1}, cfg.opt_float("layer_height"), 10.);
if (footprint.depth < EPSILON)
return;
const double margin = WIPE_TOWER_MARGIN + footprint.brim_width;
// The position is the tower's own origin; a rotated tower extends from it in another
// direction, so place the rotated box's extents rather than the origin.
Slic3r::Polygon box({Point::new_scale(0., 0.), Point::new_scale(footprint.width, 0.), Point::new_scale(footprint.width, footprint.depth), Point::new_scale(0., footprint.depth)});
box.rotate(Geometry::deg2rad(cfg.opt_float("wipe_tower_rotation_angle")));
const BoundingBox local = get_extents(box);
const Vec2d lo = unscale(local.min);
const Vec2d size = unscale(local.max) - lo;
Vec2d pos(center.x() + 5. + margin + 5. - lo.x(), center.y() - size.y() / 2. - lo.y());
box.translate(Point::new_scale(pos.x(), pos.y()));
const Vec2f move = WipeTower::move_box_inside_polygon(get_extents(box), Polygons{Polygon::new_scale(area->values)}, scaled<coord_t>(margin));
pos += move.cast<double>();
cfg.option<ConfigOptionFloats>("wipe_tower_x", true)->values = {pos.x()};
cfg.option<ConfigOptionFloats>("wipe_tower_y", true)->values = {pos.y()};
}
// Slice one centered cube that switches from filament 1 to filament 2 partway up, so exactly one // Slice one centered cube that switches from filament 1 to filament 2 partway up, so exactly one
// filament change fires, then export. The change drives the printer's own change_filament_gcode: on a // filament change fires, then export. The change drives the printer's own change_filament_gcode: on a
// single-nozzle machine it rides the AMS prime tower (append_tcr), on a multi-nozzle machine it routes // single-nozzle machine it rides the AMS prime tower (append_tcr), on a multi-nozzle machine it routes
// through the nozzle swap (set_extruder / append_tcr2) - the engine picks the path from the printer's // through the nozzle swap (set_extruder / append_tcr2) - the engine picks the path from the printer's
// topology, so one model covers both. An undefined placeholder in any shipped custom g-code throws // topology, so one model covers both. An undefined placeholder in any shipped custom g-code throws
// Slic3r::PlaceholderParserError from export. // Slic3r::PlaceholderParserError from export.
std::string slice_two_color_cube_and_export(const DynamicPrintConfig &cfg, bool is_bbl) std::string slice_two_color_cube_and_export(DynamicPrintConfig cfg, bool is_bbl)
{ {
const Vec2d center = printable_area_center(cfg); const Vec2d center = printable_area_center(cfg);
place_wipe_tower(cfg, center);
TriangleMesh m = make_cube(10, 10, 10); TriangleMesh m = make_cube(10, 10, 10);
m.translate(float(center.x() - 5.), float(center.y() - 5.), 0.f); m.translate(float(center.x() - 5.), float(center.y() - 5.), 0.f);
+2 -2
View File
@@ -364,7 +364,7 @@ void CStackWalker::GetModuleInformation(LPMODULE_INFO pmi)
if (dwInfoSize > 0) if (dwInfoSize > 0)
{ {
LPVOID lpData = new byte[dwInfoSize]; byte *lpData = new byte[dwInfoSize];
ZeroMemory(lpData, dwInfoSize * sizeof(byte)); ZeroMemory(lpData, dwInfoSize * sizeof(byte));
if (GetFileVersionInfo(pmi->szModulePath, dwHandle, dwInfoSize, lpData) > 0 ) if (GetFileVersionInfo(pmi->szModulePath, dwHandle, dwInfoSize, lpData) > 0 )
@@ -425,7 +425,7 @@ LPSTACKINFO CStackWalker::StackWalker(HANDLE hThread, const CONTEXT* context)
else else
c = *context; c = *context;
STACKFRAME64 sf = {0}; STACKFRAME64 sf = {};
DWORD imageType; DWORD imageType;
//intel X86 //intel X86
+1 -1
View File
@@ -49,7 +49,7 @@ SplittedLine split_line(const PathType& path, const ExPolygons& clip, bool close
// Convert the input path into an open ZPath // Convert the input path into an open ZPath
ClipperZUtils::ZPath p; ClipperZUtils::ZPath p;
p.reserve(path.size() + closed ? 1 : 0); p.reserve(path.size() + (closed ? 1 : 0));
ClipperLib_Z::cInt z = 0; ClipperLib_Z::cInt z = 0;
for (const auto& point : path) { for (const auto& point : path) {
p.emplace_back(point.x(), point.y(), z); p.emplace_back(point.x(), point.y(), z);
+12 -1
View File
@@ -42,6 +42,9 @@ namespace Slic3r {
static const std::string VERSION_CHECK_URL = "https://check-version.orcaslicer.com/latest"; static const std::string VERSION_CHECK_URL = "https://check-version.orcaslicer.com/latest";
static const std::string PROFILE_UPDATE_URL = "https://check-version.orcaslicer.com/profile"; static const std::string PROFILE_UPDATE_URL = "https://check-version.orcaslicer.com/profile";
constexpr const char* CONFIG_ORCA_UPDATER_URL = "orca_updater_url";
static const std::string MODELS_STR = "models"; static const std::string MODELS_STR = "models";
const std::string AppConfig::SECTION_FILAMENTS = "filaments"; const std::string AppConfig::SECTION_FILAMENTS = "filaments";
@@ -635,6 +638,11 @@ void AppConfig::set_defaults()
set_bool("use_printer_agents", false); set_bool("use_printer_agents", false);
} }
if (get("enable_ota").empty())
{
set_bool("enable_ota", false);
}
// Remove legacy window positions/sizes // Remove legacy window positions/sizes
erase("app", "main_frame_maximized"); erase("app", "main_frame_maximized");
erase("app", "main_frame_pos"); erase("app", "main_frame_pos");
@@ -1815,7 +1823,10 @@ std::string AppConfig::version_check_url() const
std::string AppConfig::profile_update_url() const std::string AppConfig::profile_update_url() const
{ {
return PROFILE_UPDATE_URL; std::string orca_updater_url = get(CONFIG_ORCA_UPDATER_URL);
if (orca_updater_url.empty())
return PROFILE_UPDATE_URL;
return orca_updater_url;
} }
bool AppConfig::exists() bool AppConfig::exists()
+10
View File
@@ -272,6 +272,8 @@ set(lisbslic3r_sources
GCode/WipeTower2.hpp GCode/WipeTower2.hpp
GCode/WipeTower.cpp GCode/WipeTower.cpp
GCode/WipeTower.hpp GCode/WipeTower.hpp
GCode/WipeTowerEstimate.cpp
GCode/WipeTowerEstimate.hpp
GCodeWriter.cpp GCodeWriter.cpp
GCodeWriter.hpp GCodeWriter.hpp
Geometry/ArcWelder.hpp Geometry/ArcWelder.hpp
@@ -370,6 +372,8 @@ set(lisbslic3r_sources
Preset.hpp Preset.hpp
PrincipalComponents2D.cpp PrincipalComponents2D.cpp
PrincipalComponents2D.hpp PrincipalComponents2D.hpp
PublishSettings.cpp
PublishSettings.hpp
PrintApply.cpp PrintApply.cpp
PrintBase.cpp PrintBase.cpp
PrintBase.hpp PrintBase.hpp
@@ -554,6 +558,12 @@ if (_opts)
target_compile_options(libslic3r_cgal PRIVATE "${_opts_bad}") target_compile_options(libslic3r_cgal PRIVATE "${_opts_bad}")
endif() endif()
if (IS_CLANG_CL)
# CGAL passes /fp:strict /fp:except-. clang-cl reports the second as overriding part of
# the first; the settings cc1 receives are the same ones MSVC produces from that pair.
target_compile_options(libslic3r_cgal PRIVATE -Wno-overriding-option)
endif ()
target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} admesh libigl mcut boost_libs) target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} admesh libigl mcut boost_libs)
if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround
+15 -6
View File
@@ -7,6 +7,7 @@
#include <algorithm> #include <algorithm>
#include <assert.h> #include <assert.h>
#include <fstream> #include <fstream>
#include <sstream>
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
#include <regex> #include <regex>
@@ -1515,6 +1516,19 @@ std::optional<PluginCapabilityRef> parse_capability_ref(const std::string& value
//BBS: add json support //BBS: add json support
void ConfigBase::save_to_json(const std::string &file, const std::string &name, const std::string &from, const std::string &version) const void ConfigBase::save_to_json(const std::string &file, const std::string &name, const std::string &from, const std::string &version) const
{
// Serialize first: if that throws (invalid UTF-8), the existing file stays untouched.
std::ostringstream ss;
this->save_to_json(ss, name, from, version);
boost::nowide::ofstream c;
c.open(file, std::ios::out | std::ios::trunc);
c << ss.str();
c.close();
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ":" <<__LINE__ << boost::format(", saved config to %1%\n")%file;
}
void ConfigBase::save_to_json(std::ostream &os, const std::string &name, const std::string &from, const std::string &version, bool replace_invalid_utf8) const
{ {
json j; json j;
//record the headers //record the headers
@@ -1561,12 +1575,7 @@ void ConfigBase::save_to_json(const std::string &file, const std::string &name,
j["plugins"] = unique_refs; j["plugins"] = unique_refs;
} }
boost::nowide::ofstream c; os << j.dump(1, '\t', false, replace_invalid_utf8 ? json::error_handler_t::replace : json::error_handler_t::strict) << std::endl;
c.open(file, std::ios::out | std::ios::trunc);
c << j.dump(1, '\t') << std::endl;
c.close();
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << ":" <<__LINE__ << boost::format(", saved config to %1%\n")%file;
} }
void ConfigBase::save(const std::string &file) const void ConfigBase::save(const std::string &file) const
+15
View File
@@ -1006,6 +1006,7 @@ public:
int getInt() const override { return this->value; } int getInt() const override { return this->value; }
void setInt(int val) override { this->value = val; } void setInt(int val) override { this->value = val; }
ConfigOption* clone() const override { return new ConfigOptionInt(*this); } ConfigOption* clone() const override { return new ConfigOptionInt(*this); }
using ConfigOptionSingle<int>::operator==;
bool operator==(const ConfigOptionInt &rhs) const throw() { return this->value == rhs.value; } bool operator==(const ConfigOptionInt &rhs) const throw() { return this->value == rhs.value; }
std::string serialize() const override std::string serialize() const override
@@ -1048,6 +1049,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionIntsTempl(*this); } ConfigOption* clone() const override { return new ConfigOptionIntsTempl(*this); }
ConfigOptionIntsTempl& operator= (const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionIntsTempl& operator= (const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionVector<int>::operator==;
bool operator==(const ConfigOptionIntsTempl &rhs) const throw() { return this->values == rhs.values; } bool operator==(const ConfigOptionIntsTempl &rhs) const throw() { return this->values == rhs.values; }
bool operator< (const ConfigOptionIntsTempl &rhs) const throw() { return this->values < rhs.values; } bool operator< (const ConfigOptionIntsTempl &rhs) const throw() { return this->values < rhs.values; }
// Could a special "nil" value be stored inside the vector, indicating undefined value? // Could a special "nil" value be stored inside the vector, indicating undefined value?
@@ -1137,6 +1139,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionString(*this); } ConfigOption* clone() const override { return new ConfigOptionString(*this); }
ConfigOptionString& operator=(const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionString& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionSingle<std::string>::operator==;
bool operator==(const ConfigOptionString &rhs) const throw() { return this->value == rhs.value; } bool operator==(const ConfigOptionString &rhs) const throw() { return this->value == rhs.value; }
bool operator< (const ConfigOptionString &rhs) const throw() { return this->value < rhs.value; } bool operator< (const ConfigOptionString &rhs) const throw() { return this->value < rhs.value; }
bool empty() const { return this->value.empty(); } bool empty() const { return this->value.empty(); }
@@ -1171,6 +1174,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionStrings(*this); } ConfigOption* clone() const override { return new ConfigOptionStrings(*this); }
ConfigOptionStrings& operator=(const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionStrings& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionVector<std::string>::operator==;
bool operator==(const ConfigOptionStrings &rhs) const throw() { return this->values == rhs.values; } bool operator==(const ConfigOptionStrings &rhs) const throw() { return this->values == rhs.values; }
bool operator< (const ConfigOptionStrings &rhs) const throw() { return this->values < rhs.values; } bool operator< (const ConfigOptionStrings &rhs) const throw() { return this->values < rhs.values; }
bool is_nil(size_t) const override { return false; } bool is_nil(size_t) const override { return false; }
@@ -1215,6 +1219,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionPercent(*this); } ConfigOption* clone() const override { return new ConfigOptionPercent(*this); }
ConfigOptionPercent& operator= (const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionPercent& operator= (const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionFloat::operator==;
bool operator==(const ConfigOptionPercent &rhs) const throw() { return this->value == rhs.value; } bool operator==(const ConfigOptionPercent &rhs) const throw() { return this->value == rhs.value; }
bool operator< (const ConfigOptionPercent &rhs) const throw() { return this->value < rhs.value; } bool operator< (const ConfigOptionPercent &rhs) const throw() { return this->value < rhs.value; }
@@ -1257,6 +1262,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionPercentsTempl(*this); } ConfigOption* clone() const override { return new ConfigOptionPercentsTempl(*this); }
ConfigOptionPercentsTempl& operator=(const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionPercentsTempl& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionFloatsTempl<NULLABLE>::operator==;
bool operator==(const ConfigOptionPercentsTempl &rhs) const throw() { return ConfigOptionFloatsTempl<NULLABLE>::vectors_equal(this->values, rhs.values); } bool operator==(const ConfigOptionPercentsTempl &rhs) const throw() { return ConfigOptionFloatsTempl<NULLABLE>::vectors_equal(this->values, rhs.values); }
bool operator< (const ConfigOptionPercentsTempl &rhs) const throw() { return ConfigOptionFloatsTempl<NULLABLE>::vectors_lower(this->values, rhs.values); } bool operator< (const ConfigOptionPercentsTempl &rhs) const throw() { return ConfigOptionFloatsTempl<NULLABLE>::vectors_lower(this->values, rhs.values); }
@@ -1502,6 +1508,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionPoint(*this); } ConfigOption* clone() const override { return new ConfigOptionPoint(*this); }
ConfigOptionPoint& operator=(const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionPoint& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionSingle<Vec2d>::operator==;
bool operator==(const ConfigOptionPoint &rhs) const throw() { return this->value == rhs.value; } bool operator==(const ConfigOptionPoint &rhs) const throw() { return this->value == rhs.value; }
bool operator< (const ConfigOptionPoint &rhs) const throw() { return this->value < rhs.value; } bool operator< (const ConfigOptionPoint &rhs) const throw() { return this->value < rhs.value; }
@@ -1539,6 +1546,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionPoints(*this); } ConfigOption* clone() const override { return new ConfigOptionPoints(*this); }
ConfigOptionPoints& operator= (const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionPoints& operator= (const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionVector<Vec2d>::operator==;
bool operator==(const ConfigOptionPoints &rhs) const throw() { return this->values == rhs.values; } bool operator==(const ConfigOptionPoints &rhs) const throw() { return this->values == rhs.values; }
bool operator< (const ConfigOptionPoints &rhs) const throw() bool operator< (const ConfigOptionPoints &rhs) const throw()
{ return std::lexicographical_compare(this->values.begin(), this->values.end(), rhs.values.begin(), rhs.values.end(), [](const auto &l, const auto &r){ return l < r; }); } { return std::lexicographical_compare(this->values.begin(), this->values.end(), rhs.values.begin(), rhs.values.end(), [](const auto &l, const auto &r){ return l < r; }); }
@@ -1617,6 +1625,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionPoint3(*this); } ConfigOption* clone() const override { return new ConfigOptionPoint3(*this); }
ConfigOptionPoint3& operator=(const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionPoint3& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionSingle<Vec3d>::operator==;
bool operator==(const ConfigOptionPoint3 &rhs) const throw() { return this->value == rhs.value; } bool operator==(const ConfigOptionPoint3 &rhs) const throw() { return this->value == rhs.value; }
bool operator< (const ConfigOptionPoint3 &rhs) const throw() bool operator< (const ConfigOptionPoint3 &rhs) const throw()
{ return this->value.x() < rhs.value.x() || (this->value.x() == rhs.value.x() && (this->value.y() < rhs.value.y() || (this->value.y() == rhs.value.y() && this->value.z() < rhs.value.z()))); } { return this->value.x() < rhs.value.x() || (this->value.x() == rhs.value.x() && (this->value.y() < rhs.value.y() || (this->value.y() == rhs.value.y() && this->value.z() < rhs.value.z()))); }
@@ -1860,6 +1869,7 @@ public:
bool getBool() const override { return this->value; } bool getBool() const override { return this->value; }
ConfigOption* clone() const override { return new ConfigOptionBool(*this); } ConfigOption* clone() const override { return new ConfigOptionBool(*this); }
ConfigOptionBool& operator=(const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionBool& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionSingle<bool>::operator==;
bool operator==(const ConfigOptionBool &rhs) const throw() { return this->value == rhs.value; } bool operator==(const ConfigOptionBool &rhs) const throw() { return this->value == rhs.value; }
bool operator< (const ConfigOptionBool &rhs) const throw() { return int(this->value) < int(rhs.value); } bool operator< (const ConfigOptionBool &rhs) const throw() { return int(this->value) < int(rhs.value); }
@@ -1911,6 +1921,7 @@ public:
ConfigOptionType type() const override { return static_type(); } ConfigOptionType type() const override { return static_type(); }
ConfigOption* clone() const override { return new ConfigOptionBoolsTempl(*this); } ConfigOption* clone() const override { return new ConfigOptionBoolsTempl(*this); }
ConfigOptionBoolsTempl& operator=(const ConfigOption *opt) { this->set(opt); return *this; } ConfigOptionBoolsTempl& operator=(const ConfigOption *opt) { this->set(opt); return *this; }
using ConfigOptionVector<unsigned char>::operator==;
bool operator==(const ConfigOptionBoolsTempl &rhs) const throw() { return this->values == rhs.values; } bool operator==(const ConfigOptionBoolsTempl &rhs) const throw() { return this->values == rhs.values; }
bool operator< (const ConfigOptionBoolsTempl &rhs) const throw() { return this->values < rhs.values; } bool operator< (const ConfigOptionBoolsTempl &rhs) const throw() { return this->values < rhs.values; }
// Could a special "nil" value be stored inside the vector, indicating undefined value? // Could a special "nil" value be stored inside the vector, indicating undefined value?
@@ -2163,6 +2174,7 @@ public:
ConfigOptionEnumsGenericTempl& operator= (const ConfigOption* opt) { this->set(opt); return *this; } ConfigOptionEnumsGenericTempl& operator= (const ConfigOption* opt) { this->set(opt); return *this; }
bool operator< (const ConfigOptionInts& rhs) const throw() { return this->values < rhs.values; } bool operator< (const ConfigOptionInts& rhs) const throw() { return this->values < rhs.values; }
using ConfigOptionInts::operator==;
bool operator==(const ConfigOptionInts& rhs) const bool operator==(const ConfigOptionInts& rhs) const
{ {
if (rhs.type() != this->type()) if (rhs.type() != this->type())
@@ -2813,6 +2825,9 @@ public:
//BBS: add json support //BBS: add json support
void save_to_json(const std::string &file, const std::string &name, const std::string &from, const std::string &version) const; void save_to_json(const std::string &file, const std::string &name, const std::string &from, const std::string &version) const;
// Same document, written to a stream. Invalid UTF-8 in a string value throws nlohmann's type_error unless
// replace_invalid_utf8 is set, which writes U+FFFD instead (for callers such as stdout with no handler).
void save_to_json(std::ostream &os, const std::string &name, const std::string &from, const std::string &version, bool replace_invalid_utf8 = false) const;
// Rebuild the in-memory "plugins" manifest (the "name;uuid;capability" references the plugin // Rebuild the in-memory "plugins" manifest (the "name;uuid;capability" references the plugin
// dispatchers consume) from the plugin-backed options via the registered resolver. save_to_json() // dispatchers consume) from the plugin-backed options via the registered resolver. save_to_json()
+5 -5
View File
@@ -968,10 +968,10 @@ EmbossStyles Emboss::get_font_list_by_register() {
} }
// TODO: Fix global function // TODO: Fix global function
bool CALLBACK EnumFamCallBack(LPLOGFONT lplf, int CALLBACK EnumFamCallBack(const LOGFONT *lplf,
LPNEWTEXTMETRIC lpntm, const TEXTMETRIC *lpntm,
DWORD FontType, DWORD FontType,
LPVOID aFontList) LPARAM aFontList)
{ {
std::vector<std::wstring> *fontList = std::vector<std::wstring> *fontList =
(std::vector<std::wstring> *) (aFontList); (std::vector<std::wstring> *) (aFontList);
@@ -988,7 +988,7 @@ EmbossStyles Emboss::get_font_list_by_enumeration() {
HDC hDC = GetDC(NULL); HDC hDC = GetDC(NULL);
std::vector<std::wstring> font_names; std::vector<std::wstring> font_names;
EnumFontFamilies(hDC, (LPCTSTR) NULL, (FONTENUMPROC) EnumFamCallBack, EnumFontFamilies(hDC, (LPCTSTR) NULL, EnumFamCallBack,
(LPARAM) &font_names); (LPARAM) &font_names);
EmbossStyles font_list; EmbossStyles font_list;
+59 -52
View File
@@ -11,7 +11,7 @@
#include "AABBTreeLines.hpp" #include "AABBTreeLines.hpp"
#include "ExtrusionEntity.hpp" #include "ExtrusionEntity.hpp"
#include "FillBase.hpp" #include "Fill.hpp"
#include "FillRectilinear.hpp" #include "FillRectilinear.hpp"
#include "FillLightning.hpp" #include "FillLightning.hpp"
#include "FillConcentricInternal.hpp" #include "FillConcentricInternal.hpp"
@@ -1234,6 +1234,33 @@ std::vector<SurfaceFill> group_fills(const Layer &layer, LockRegionParam &lock_p
return surface_fills; return surface_fills;
} }
// Orca: Anchors and printed infill must share the same body origin. Keep the choice
// here so per-model surface centering and separated sparse infill cannot drift apart.
static BoundingBox infill_bounding_box(const Layer &layer, const SurfaceFill &fill, const ExPolygon &expoly, BoundingBox bbox)
{
const auto &params = fill.params;
const auto &config = layer.regions()[fill.region_id]->region().config();
const bool external = params.extrusion_role == erTopSolidInfill || params.extrusion_role == erBottomSurface;
const bool per_model = external && params.center_of_surface_pattern == CenterOfSurfacePattern::Each_Model &&
(params.pattern == ipArchimedeanChords || params.pattern == ipOctagramSpiral);
const bool separate = !external && params.separated_infills &&
(is_separable_infill_pattern(params.pattern) || !config.solid_infill_rotate_template.value.empty() ||
!config.sparse_infill_rotate_template.value.empty());
if (per_model || separate) {
double best_overlap = 0.;
for (size_t i = 0; i < layer.lslices.size() && i < layer.lslices_separated_component_bboxes.size(); ++i) {
const double overlap = area(intersection_ex(layer.lslices[i], expoly));
if (overlap > best_overlap) {
best_overlap = overlap;
const Point center = layer.lslices_separated_component_bboxes[i].center();
bbox = layer.object()->bounding_box();
bbox.translate(center.x(), center.y());
}
}
}
return bbox;
}
#ifdef SLIC3R_DEBUG_SLICE_PROCESSING #ifdef SLIC3R_DEBUG_SLICE_PROCESSING
void export_group_fills_to_svg(const char *path, const std::vector<SurfaceFill> &fills) void export_group_fills_to_svg(const char *path, const std::vector<SurfaceFill> &fills)
{ {
@@ -1353,19 +1380,9 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
// Orca: Checking the filling of a centered surface by drawing for each model parts // Orca: Checking the filling of a centered surface by drawing for each model parts
bool is_top_or_bottom = params.extrusion_role == erTopSolidInfill || params.extrusion_role == erBottomSurface; bool is_top_or_bottom = params.extrusion_role == erTopSolidInfill || params.extrusion_role == erBottomSurface;
bool is_centered_infill = surface_fill.params.pattern == ipArchimedeanChords || surface_fill.params.pattern == ipOctagramSpiral;
if (is_top_or_bottom) { if (is_top_or_bottom) {
params.center_of_surface_pattern = surface_fill.params.center_of_surface_pattern; // Orca: center of surface pattern params.center_of_surface_pattern = surface_fill.params.center_of_surface_pattern; // Orca: center of surface pattern
} }
// Orca: Each_Model centers the pattern on each model part's bbox; Each_Surface / Each_Assembly
// fall through to the default (whole-object) bounding box below.
bool is_per_model_center = is_top_or_bottom && params.center_of_surface_pattern == CenterOfSurfacePattern::Each_Model && is_centered_infill;
bool is_separate_infill = !is_top_or_bottom && surface_fill.params.separated_infills &&
(
is_separable_infill_pattern(surface_fill.params.pattern) ||
params.config->solid_infill_rotate_template != "" ||
params.config->sparse_infill_rotate_template != "" );
if( surface_fill.params.pattern == ipLockedZag ) { if( surface_fill.params.pattern == ipLockedZag ) {
params.locked_zag = true; params.locked_zag = true;
params.infill_lock_depth = surface_fill.params.infill_lock_depth; params.infill_lock_depth = surface_fill.params.infill_lock_depth;
@@ -1389,34 +1406,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive:
params.can_reverse = false; params.can_reverse = false;
for (ExPolygon& expoly : surface_fill.expolygons) { for (ExPolygon& expoly : surface_fill.expolygons) {
// Orca: separate infill / per-model pattern centering. // Orca: Reuse the body origin used for bridge anchoring, resetting it for each surface.
// f->set_bounding_box(infill_bounding_box(*this, surface_fill, expoly, bbox));
// Center the pattern on each connected body of the object independently, so every piece
// is filled exactly as if it were sliced on its own: touching/overlapping parts merge
// into one body sharing a center, while separate parts and disconnected islands (even
// interleaved-but-not-touching ones, e.g. chain links) each get their own. The body each
// island belongs to, and its full bounding box, were resolved in 3D by PrintObject::
// infill() (lslices_separated_component_bboxes, aligned with this layer's lslices). We
// match this fill region to the island it overlaps most, then re-use the whole-object
// bounding box (origin-centered — identical extent to the default, so coverage and cost
// are unchanged) re-centered on that body.
if (is_per_model_center || is_separate_infill) {
double best_overlap = 0.;
BoundingBox best_component;
for (size_t r = 0; r < this->lslices.size() && r < this->lslices_separated_component_bboxes.size(); ++ r) {
const double overlap = area(intersection_ex(this->lslices[r], expoly));
if (overlap > best_overlap) {
best_overlap = overlap;
best_component = this->lslices_separated_component_bboxes[r];
}
}
if (best_component.defined) {
const Point c = best_component.center();
BoundingBox part_bbox = bbox; // origin-centered, whole-object extent (from above)
part_bbox.translate(c.x(), c.y()); // re-center on this body
f->set_bounding_box(part_bbox);
}
} // - End: separate infill / per-model pattern centering
f->no_overlap_expolygons = intersection_ex(surface_fill.no_overlap_expolygons, ExPolygons() = {expoly}, ApplySafetyOffset::Yes); f->no_overlap_expolygons = intersection_ex(surface_fill.no_overlap_expolygons, ExPolygons() = {expoly}, ApplySafetyOffset::Yes);
if (params.symmetric_infill_y_axis) { if (params.symmetric_infill_y_axis) {
@@ -1583,8 +1574,14 @@ Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Oc
params.multiline = surface_fill.params.multiline; params.multiline = surface_fill.params.multiline;
params.gyroid_optimized = surface_fill.params.gyroid_optimized; params.gyroid_optimized = surface_fill.params.gyroid_optimized;
params.smooth_factor = surface_fill.params.smooth_factor; params.smooth_factor = surface_fill.params.smooth_factor;
// Orca: Match make_fills() when choosing the origin of plane-path patterns.
// Without the sparse extrusion role, the filler uses each surface's bounds
// instead of the object's bounds, so bridge anchors shift away from printed infill.
params.extrusion_role = surface_fill.params.extrusion_role;
for (ExPolygon &expoly : surface_fill.expolygons) { for (ExPolygon &expoly : surface_fill.expolygons) {
// Orca: Match the per-body origin of make_fills() before generating physical anchors.
f->set_bounding_box(infill_bounding_box(*this, surface_fill, expoly, bbox));
// Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon. // Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon.
f->spacing = surface_fill.params.spacing; f->spacing = surface_fill.params.spacing;
surface_fill.surface.expolygon = std::move(expoly); surface_fill.surface.expolygon = std::move(expoly);
@@ -1598,6 +1595,25 @@ Polylines Layer::generate_sparse_infill_polylines_for_anchoring(FillAdaptive::Oc
return sparse_infill_polylines; return sparse_infill_polylines;
} }
// Returns the filament id (1-based) the region is ironed with, or -1 when the
// region is not ironed. AllSolid always irons. TopSurfaces and TopmostOnly need
// either some top shells or, in spiral mode, more than one bottom shell, and
// TopmostOnly additionally needs the layer to be the topmost one.
int Layer::choose_ironing_extruder(const PrintRegionConfig &cfg,
bool spiral_mode,
bool is_topmost_layer)
{
if (cfg.ironing_type == IroningType::NoIroning)
return -1;
const bool gate = (cfg.ironing_type == IroningType::AllSolid)
|| ((cfg.top_shell_layers > 0 || (spiral_mode && cfg.bottom_shell_layers > 1))
&& (cfg.ironing_type == IroningType::TopSurfaces
|| (cfg.ironing_type == IroningType::TopmostOnly && is_topmost_layer)));
if (!gate)
return -1;
return cfg.top_surface_filament_id;
}
// Create ironing extrusions over top surfaces. // Create ironing extrusions over top surfaces.
void Layer::make_ironing() void Layer::make_ironing()
{ {
@@ -1667,19 +1683,10 @@ void Layer::make_ironing()
if (! layerm->slices.empty()) { if (! layerm->slices.empty()) {
IroningParams ironing_params; IroningParams ironing_params;
const PrintRegionConfig &config = layerm->region().config(); const PrintRegionConfig &config = layerm->region().config();
if (config.ironing_type != IroningType::NoIroning && ironing_params.extruder = Layer::choose_ironing_extruder(
(config.ironing_type == IroningType::AllSolid || config,
((config.top_shell_layers > 0 || (this->object()->print()->config().spiral_mode && config.bottom_shell_layers > 1)) && /*spiral_mode=*/this->object()->print()->config().spiral_mode,
(config.ironing_type == IroningType::TopSurfaces || /*is_topmost_layer=*/layerm->layer()->upper_layer == nullptr);
(config.ironing_type == IroningType::TopmostOnly && layerm->layer()->upper_layer == nullptr))))) {
if (config.outer_wall_filament_id == config.top_surface_filament_id || config.wall_loops == 0) {
// Iron the whole face.
ironing_params.extruder = config.top_surface_filament_id;
} else {
// Iron just the infill.
ironing_params.extruder = config.top_surface_filament_id;
}
}
if (ironing_params.extruder != -1) { if (ironing_params.extruder != -1) {
//TODO just_infill is currently not used. //TODO just_infill is currently not used.
ironing_params.just_infill = false; ironing_params.just_infill = false;
+6
View File
@@ -14,6 +14,12 @@ namespace Slic3r {
class ExtrusionEntityCollection; class ExtrusionEntityCollection;
class LayerRegion; class LayerRegion;
class PrintObject;
// Orca: Share the layer rotation calculation between infill generation and internal
// bridge angle selection so both interpret rotation templates in the same way.
double calculate_infill_rotation_angle(const PrintObject *object, size_t layer_id,
const double &fixed_infill_angle, const std::string &template_string);
// An interface class to Perl, aggregating an instance of a Fill and a FillData. // An interface class to Perl, aggregating an instance of a Fill and a FillData.
class Filler class Filler
+2 -2
View File
@@ -1395,8 +1395,8 @@ void Filler::_fill_surface_single(
} }
#endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */ #endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */
const auto hook_length = coordf_t(std::min<float>(std::numeric_limits<coord_t>::max(), scale_(params.anchor_length))); const auto hook_length = coordf_t(scale_(params.anchor_length));
const auto hook_length_max = coordf_t(std::min<float>(std::numeric_limits<coord_t>::max(), scale_(params.anchor_length_max))); const auto hook_length_max = coordf_t(scale_(params.anchor_length_max));
Polylines all_polylines_with_hooks = all_polylines.size() > 1 ? connect_lines_using_hooks(std::move(all_polylines), expolygon, this->spacing, hook_length, hook_length_max) : std::move(all_polylines); Polylines all_polylines_with_hooks = all_polylines.size() > 1 ? connect_lines_using_hooks(std::move(all_polylines), expolygon, this->spacing, hook_length, hook_length_max) : std::move(all_polylines);
+11 -8
View File
@@ -3090,10 +3090,11 @@ bool FillRectilinear::fill_surface_trapezoidal(
case 0: // Grid / Trapezoidal case 0: // Grid / Trapezoidal
{ {
// Generate a non-crossing trapezoidal pattern to avoid overextrusion at intersections when `multiline > 1`. // Generate a non-crossing trapezoidal pattern to avoid overextrusion at intersections when `multiline > 1`.
// P2--P3 /*
// / \ * P2--P3
// P0_P1/ \P4_ * / \
// * P0_P1/ \P4_
*/
// P0xP1x=P4xP0x=d1/2 // P0xP1x=P4xP0x=d1/2
// P2xP3x=d1 // P2xP3x=d1
// P1yP2y=P2yP3y=d2 // P1yP2y=P2yP3y=d2
@@ -3171,10 +3172,12 @@ bool FillRectilinear::fill_surface_trapezoidal(
case 1: // Triangular case 1: // Triangular
{ {
// Generate a non-crossing trapezoidal pattern with a base line below. // Generate a non-crossing trapezoidal pattern with a base line below.
// P1-P2 /*
// / \ * P1-P2
// P0/ \P3_P4 * / \
// ---------------- * P0/ \P3_P4
* ----------------
*/
// P1xP2x=P3xP4x=d2 // P1xP2x=P3xP4x=d2
// P0yP1y=P2yP3y=h-2d1 // P0yP1y=P2yP3y=h-2d1
// //

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