mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-09-30 12:21:05 +00:00
Merge branch 'main' of https://github.com/OrcaSlicer/OrcaSlicer_priv into feat/printer-agent-impl
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
name: 🐞 Bug Report
|
||||
description: File a bug report
|
||||
description: Something behaves incorrectly while Orca Slicer keeps running
|
||||
labels: ["bug"]
|
||||
body:
|
||||
- type: markdown
|
||||
@@ -10,6 +10,8 @@ body:
|
||||
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.
|
||||
|
||||
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.
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
@@ -47,7 +49,7 @@ body:
|
||||
id: os_type
|
||||
attributes:
|
||||
label: "Operating System (OS)"
|
||||
description: "What OSes are you are experiencing issues on?"
|
||||
description: "What OSes are you experiencing issues on?"
|
||||
multiple: true
|
||||
options:
|
||||
- Linux
|
||||
@@ -86,7 +88,7 @@ body:
|
||||
id: reproduce_steps
|
||||
attributes:
|
||||
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: |
|
||||
1. Go to '...'
|
||||
2. Click on '...'
|
||||
@@ -108,28 +110,23 @@ body:
|
||||
description: What should happen after the above steps?
|
||||
validations:
|
||||
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
|
||||
id: file_uploads
|
||||
attributes:
|
||||
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: |
|
||||
Project File: `File` -> `Save project as...` then zip it & drop it here
|
||||
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 project file
|
||||
Zipped log folder
|
||||
validations:
|
||||
required: true
|
||||
- type: checkboxes
|
||||
@@ -144,7 +141,5 @@ body:
|
||||
label: Anything else?
|
||||
description: |
|
||||
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:
|
||||
required: false
|
||||
|
||||
@@ -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
|
||||
@@ -100,7 +100,7 @@ jobs:
|
||||
matrix:
|
||||
include: ${{ fromJSON(vars.SELF_HOSTED
|
||||
&& '[{"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
|
||||
# Don't run scheduled builds on forks:
|
||||
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 }}
|
||||
uses: ./.github/workflows/unit_tests.yml
|
||||
with:
|
||||
os: windows-11-arm
|
||||
os: windows-11-vs2026-arm
|
||||
artifact: ${{ github.sha }}-tests-windows-arm64
|
||||
test-dir: build-arm64/tests
|
||||
unit_tests_macos_arm64:
|
||||
@@ -283,21 +283,42 @@ jobs:
|
||||
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"
|
||||
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
|
||||
if: github.event_name == 'pull_request'
|
||||
uses: actions/cache/restore@v6
|
||||
with:
|
||||
path: .flatpak-builder
|
||||
path: |
|
||||
.flatpak-builder/*
|
||||
!.flatpak-builder/ccache
|
||||
key: ${{ steps.fp_cache_key.outputs.key }}
|
||||
restore-keys: flatpak-builder-${{ matrix.variant.arch }}-
|
||||
- name: Save/restore flatpak-builder cache
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: actions/cache@v6
|
||||
with:
|
||||
path: .flatpak-builder
|
||||
path: |
|
||||
.flatpak-builder/*
|
||||
!.flatpak-builder/ccache
|
||||
key: ${{ steps.fp_cache_key.outputs.key }}
|
||||
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
|
||||
run: |
|
||||
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\"|}" \
|
||||
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml
|
||||
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
|
||||
run: ./scripts/flatpak/check_manifest_cacheable.sh
|
||||
shell: bash
|
||||
@@ -318,9 +366,50 @@ jobs:
|
||||
with:
|
||||
bundle: OrcaSlicer-Linux-flatpak_${{ env.ver }}_${{ matrix.variant.arch }}.flatpak
|
||||
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 }}
|
||||
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
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
|
||||
@@ -76,6 +76,60 @@ jobs:
|
||||
if (-not (Test-Path "$cmakeBin\cmake.exe")) { throw "cmake.exe not found at $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
|
||||
if: runner.os != 'Windows'
|
||||
run: |
|
||||
@@ -670,3 +724,41 @@ jobs:
|
||||
asset_name: orca_custom_preset_tests.zip
|
||||
asset_content_type: application/octet-stream
|
||||
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
|
||||
|
||||
@@ -9,6 +9,10 @@ on:
|
||||
- release/*
|
||||
paths:
|
||||
- 'resources/profiles/**'
|
||||
# The extra JSON check also validates resources/printers/bambu_filament_ids.json,
|
||||
# and lives in scripts/, so a PR touching only those must still run this workflow.
|
||||
- 'resources/printers/**'
|
||||
- 'scripts/**'
|
||||
- ".github/workflows/check_profiles.yml"
|
||||
|
||||
workflow_dispatch:
|
||||
@@ -64,13 +68,14 @@ jobs:
|
||||
set +e
|
||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -s -l 2 2>&1 | tee ${{ runner.temp }}/validate_slice.log
|
||||
exit ${PIPESTATUS[0]}
|
||||
# For now run filament subtype check only for BBL profiles until we fix other vendors' profiles.
|
||||
- name: validate filament subtype check for BBL profiles
|
||||
# All vendors' filament_id collisions were fixed (see scripts/filament_id_snapshot.json),
|
||||
# so the duplicate-filament-subtype check runs tree-wide.
|
||||
- name: validate filament subtype check
|
||||
id: validate_filament_subtypes
|
||||
continue-on-error: true
|
||||
run: |
|
||||
set +e
|
||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 -v BBL -f 2>&1 | tee ${{ runner.temp }}/validate_filament_subtypes.log
|
||||
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 -f 2>&1 | tee ${{ runner.temp }}/validate_filament_subtypes.log
|
||||
exit ${PIPESTATUS[0]}
|
||||
|
||||
- name: validate custom presets
|
||||
@@ -217,7 +222,7 @@ jobs:
|
||||
fi
|
||||
|
||||
if [ "${{ steps.validate_filament_subtypes.outcome }}" = "failure" ]; then
|
||||
echo "### BBL Filament Subtype Validation Failed"
|
||||
echo "### Filament Subtype Validation Failed"
|
||||
echo ""
|
||||
echo '```'
|
||||
head -c 30000 ${{ runner.temp }}/validate_filament_subtypes.log || echo "No output captured"
|
||||
|
||||
@@ -19,11 +19,18 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- uses: thejerrybao/setup-swap-space@v1
|
||||
with:
|
||||
swap-space-path: /swapfile
|
||||
swap-size-gb: 8
|
||||
remove-existing-swap-files: true
|
||||
# Doxygen with call graphs over all of src/ outgrows the runner's RAM;
|
||||
# replace the runner's swapfile with an 8 GB one.
|
||||
- name: Grow swap space
|
||||
run: |
|
||||
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
|
||||
uses: actions/checkout@v7
|
||||
|
||||
@@ -53,3 +53,4 @@ __pycache__/
|
||||
*.pyc
|
||||
*.opc
|
||||
/.test/
|
||||
docs/superpowers/
|
||||
@@ -25,6 +25,13 @@ ctest --test-dir ./tests/libslic3r # individual suite
|
||||
ctest --test-dir ./tests/fff_print
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
- Docs live in `docs/`; the high-level design of a subsystem goes in `docs/HLSD/<subsystem>.md`.
|
||||
- Describe the design as it stands — what the subsystem does, why it exists, and the constraints that shape it. Not the route that got there: no phases, task lists, status markers, or "before/after this PR" framing.
|
||||
- Planning and investigation output (brainstorms, superpowers design and plan docs) stays in `docs/superpowers/`, which is gitignored. Never commit it.
|
||||
- Write a doc only when the design is not evident from the code, and when a change invalidates an existing one, update it in the same PR.
|
||||
|
||||
## Code Style
|
||||
|
||||
- C++17, selective C++20. PascalCase classes, snake_case functions/variables
|
||||
|
||||
+110
-80
@@ -4,6 +4,10 @@ endif()
|
||||
|
||||
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
|
||||
# Having it there causes rebuilds of all targets on any CMakeLists.txt change under tests/
|
||||
@@ -95,33 +99,6 @@ else ()
|
||||
add_compile_definitions("$<$<CONFIG:Release>:WXINSPECTOR_DISABLE>")
|
||||
endif ()
|
||||
|
||||
find_package(Git)
|
||||
if(DEFINED ENV{git_commit_hash} AND NOT "$ENV{git_commit_hash}" STREQUAL "")
|
||||
message(STATUS "Specified git commit hash: $ENV{git_commit_hash}")
|
||||
if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
||||
# Convert the given hash to short hash
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} rev-parse --short "$ENV{git_commit_hash}"
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
else()
|
||||
# No .git directory (e.g., Flatpak sandbox) — truncate directly
|
||||
string(SUBSTRING "$ENV{git_commit_hash}" 0 7 GIT_COMMIT_HASH)
|
||||
endif()
|
||||
add_definitions("-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
||||
elseif(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
||||
# Check current Git commit hash
|
||||
execute_process(
|
||||
COMMAND ${GIT_EXECUTABLE} log -1 --format=%h
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
add_definitions("-DGIT_COMMIT_HASH=\"${GIT_COMMIT_HASH}\"")
|
||||
endif()
|
||||
|
||||
if(DEFINED ENV{SLIC3R_STATIC})
|
||||
set(SLIC3R_STATIC_INITIAL $ENV{SLIC3R_STATIC})
|
||||
else()
|
||||
@@ -137,6 +114,7 @@ option(SLIC3R_WARNINGS "Emit compiler warnings for OrcaSlicer sources"
|
||||
option(SLIC3R_BUNDLED_WARNINGS "Emit compiler warnings for bundled third-party sources" 0)
|
||||
option(SLIC3R_MSVC_COMPILE_PARALLEL "Compile on Visual Studio in parallel" 1)
|
||||
option(SLIC3R_MSVC_PDB "Generate PDB files on MSVC in Release mode" 1)
|
||||
option(SLIC3R_RELATIVE_DEBUG_PATHS "Record a relative compilation directory in debug info (clang-cl)" 0)
|
||||
option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0)
|
||||
|
||||
# Python stubgen module
|
||||
@@ -379,11 +357,14 @@ if (MSVC)
|
||||
add_compile_options(/Zc:lambda)
|
||||
endif ()
|
||||
# /bigobj (Increase Number of Sections in .Obj file)
|
||||
add_compile_options(-bigobj)
|
||||
# error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-Zm90' or greater
|
||||
# Generate symbols at every build target, even for the release.
|
||||
# -Zm520 fixes error C3859 but forces the compiler to pre-allocate that memory for every translation unit regardless
|
||||
# combining /Zi with /FS frees up a significant amount of memory pressure across all parallel compile jobs and makes /MP faster overall.
|
||||
add_compile_options(-bigobj /Zi /FS)
|
||||
if (SLIC3R_MSVC_PDB)
|
||||
add_compile_options(/Zi /FS)
|
||||
endif ()
|
||||
# Disable STL4007: Many result_type typedefs and all argument_type, first_argument_type, and second_argument_type typedefs are deprecated in C++17.
|
||||
#FIXME Remove this line after eigen library adapts to the new C++17 adaptor rules.
|
||||
add_compile_options(-D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING)
|
||||
@@ -401,6 +382,16 @@ if (MSVC)
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LTCG")
|
||||
endif ()
|
||||
|
||||
# Without this every object names its build directory and two worktrees never
|
||||
# share cache entries. The linker still writes absolute paths into the PDB.
|
||||
if (SLIC3R_RELATIVE_DEBUG_PATHS)
|
||||
if (IS_CLANG_CL)
|
||||
add_compile_options(-ffile-compilation-dir=.)
|
||||
else ()
|
||||
message(WARNING "SLIC3R_RELATIVE_DEBUG_PATHS is only implemented for clang-cl")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang" AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 15)
|
||||
add_compile_definitions(BOOST_NO_CXX98_FUNCTION_BASE _HAS_AUTO_PTR_ETC=0)
|
||||
endif()
|
||||
@@ -566,59 +557,101 @@ if ((NOT MSVC OR IS_CLANG_CL) AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
|
||||
elseif (NOT MINGW)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" )
|
||||
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.
|
||||
add_compile_options(-Werror=return-type)
|
||||
# Every warning is an error unless it appears in one of the two lists below.
|
||||
# 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
|
||||
# a bunch of warning related to unused functions and variables. Suppress those warnings to not pollute
|
||||
# compilers diagnostics output with warnings we not going to look at
|
||||
add_compile_options(-Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-label -Wno-unused-local-typedefs)
|
||||
# Disabled.
|
||||
set(warnings_disabled
|
||||
reorder # members initialised in an order we chose
|
||||
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
|
||||
add_compile_options(-Wno-sign-compare)
|
||||
# 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,
|
||||
# apart from GCC's maybe-uninitialized, demoted below.
|
||||
add_compile_options(-Werror)
|
||||
|
||||
# The mismatch of tabs and spaces throughout the project can sometimes
|
||||
# cause this warning to appear even though the indentation is fine.
|
||||
# Some includes also cause the warning
|
||||
add_compile_options(-Wno-misleading-indentation)
|
||||
# Demoted. Remove a name once its category is cleared on every compiler.
|
||||
set(warnings_demoted)
|
||||
if (APPLE)
|
||||
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 STREQUAL "GNU")
|
||||
list(APPEND warnings_demoted
|
||||
# maybe-uninitialized runs after inlining and reports inside boost/variant,
|
||||
# boost/tuple and the bundled clipper header even with -isystem.
|
||||
maybe-uninitialized
|
||||
|
||||
# Disable warning if enum value does not have a corresponding case in switch statement
|
||||
add_compile_options(-Wno-switch)
|
||||
# array-bounds is reported once, where ConfigOptionVector::set_at inlines
|
||||
# into OrcaSlicer.cpp on a branch the preceding type test rules out.
|
||||
array-bounds
|
||||
|
||||
# removes LOTS of extraneous Eigen warnings (GCC only supports it since 6.1)
|
||||
# https://eigen.tuxfamily.org/bz/show_bug.cgi?id=1221
|
||||
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0)
|
||||
add_compile_options(-Wno-ignored-attributes) # Tamas: Eigen include dirs are marked as SYSTEM
|
||||
endif()
|
||||
# template-id-cdtor is a GCC 14+ warning in the bundled Clipper2 headers.
|
||||
template-id-cdtor
|
||||
)
|
||||
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 ()
|
||||
|
||||
# Clang reports legacy OpenGL calls as deprecated. Turn off the warning for now
|
||||
# to reduce the clutter, we know about this one. It should be reenabled after
|
||||
# we finally get rid of the deprecated code.
|
||||
if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
add_compile_options(-Wno-deprecated-declarations)
|
||||
endif()
|
||||
|
||||
if((${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "AppleClang") AND ${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 15)
|
||||
include(CheckCXXCompilerFlag)
|
||||
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()
|
||||
# The list mixes names not every compiler has, so add each exception only where the
|
||||
# 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).
|
||||
# An option that takes a =N argument rejects the bare -W<name>, so fall back to
|
||||
# -W<name>=1 and demote with the trailing =.
|
||||
include(CheckCXXCompilerFlag)
|
||||
foreach (category IN LISTS warnings_demoted)
|
||||
string(MAKE_C_IDENTIFIER "ORCA_HAS_W_${category}" _orca_has_w)
|
||||
check_cxx_compiler_flag("-W${category}" ${_orca_has_w})
|
||||
if (${_orca_has_w})
|
||||
add_compile_options(-Wno-error=${category})
|
||||
else ()
|
||||
check_cxx_compiler_flag("-W${category}=1" ${_orca_has_w}_arg)
|
||||
if (${${_orca_has_w}_arg})
|
||||
add_compile_options(-Wno-error=${category}=)
|
||||
endif ()
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
# Compress the debug info with zstd to save space in Flatpak CI builds
|
||||
if(FLATPAK)
|
||||
@@ -628,10 +661,6 @@ if ((NOT MSVC OR IS_CLANG_CL) AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
|
||||
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()
|
||||
|
||||
if (SLIC3R_ASAN)
|
||||
@@ -1272,8 +1301,9 @@ endif ()
|
||||
if (NOT SLIC3R_WARNINGS)
|
||||
add_compile_options(-w)
|
||||
elseif (MSVC AND NOT IS_CLANG_CL)
|
||||
# /we4715 is C4715, no return from a non-void function, matching the
|
||||
# -Werror=return-type the GNU/Clang builds apply.
|
||||
# /we4715 is C4715, no return from a non-void function, an error on the GNU/Clang
|
||||
# builds under -Werror. MSVC is not in that model, so this stays a single promoted
|
||||
# warning.
|
||||
add_compile_options(/W3 /we4715)
|
||||
endif ()
|
||||
|
||||
|
||||
+66
-3
@@ -52,6 +52,7 @@ call :add_section "Build configuration"
|
||||
call :add_arg config string "" config "release, debug, relwithdebinfo or minsizerel (default: release)"
|
||||
call :add_arg target_arch string "" arch "x64 or arm64 (default: the host architecture)"
|
||||
call :add_arg slicer_asan bool a asan "Build the slicer with ASAN enabled"
|
||||
call :add_arg no_pch bool "" no-pch "Build without the precompiled header, implied by --cache"
|
||||
|
||||
call :add_section "Toolchain"
|
||||
call :add_arg use_clang_cl bool l clang-cl "Use clang-cl as the compiler"
|
||||
@@ -60,6 +61,7 @@ call :add_arg use_ninja bool x ninja "Use the Ninja Multi-Config generator"
|
||||
call :add_arg use_msbuild bool "" msbuild "Use the Visual Studio generator (default)"
|
||||
call :add_arg vs_version string "" vs "Visual Studio release: 2019, 2022 or 2026 (default: autodetect)"
|
||||
call :add_arg clang_path string "" clang-path "Path to clang-cl.exe, requires -x (default: the one from Visual Studio)"
|
||||
call :add_arg cache string "" cache "Compiler cache: ccache, sccache or off, requires -l -x (default: off)"
|
||||
|
||||
call :add_section "How much gets rebuilt"
|
||||
call :add_arg slicer_target string "" slicer-target "Build one slicer target instead of all, e.g. libslic3r"
|
||||
@@ -391,6 +393,49 @@ if not "%clang_path%" == "" if not "%using_ninja%" == "ON" (
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
set "cache_args="
|
||||
if "%cache%" == "" goto :cache_ready
|
||||
if /I "%cache%" == "off" goto :cache_ready
|
||||
if /I "%cache%" == "ccache" goto :cache_named
|
||||
if /I "%cache%" == "sccache" goto :cache_named
|
||||
echo Unknown --cache value "%cache%". Expected ccache, sccache or off.
|
||||
exit /b 1
|
||||
|
||||
REM CMake accepts a compiler launcher under any generator but only runs it
|
||||
REM under Makefile and Ninja. ccache also refuses cl.exe because the build
|
||||
REM passes /Zi.
|
||||
:cache_named
|
||||
REM Only a configure records the launcher, so --no-configure needs none.
|
||||
if "%no_configure%" == "ON" goto :cache_ready
|
||||
if "%build_deps%%build_slicer%" == "" goto :cache_ready
|
||||
if not "%using_ninja%" == "ON" goto :cache_needs_clang
|
||||
if not "%use_clang_cl%" == "ON" goto :cache_needs_clang
|
||||
goto :cache_tool
|
||||
|
||||
:cache_needs_clang
|
||||
echo --cache needs clang-cl and Ninja; add -l -x.
|
||||
exit /b 1
|
||||
|
||||
REM Name a full path, so the recorded launcher does not depend on PATH.
|
||||
:cache_tool
|
||||
set "cache_exe="
|
||||
for /f "tokens=*" %%i in ('where %cache% 2^>nul') do (
|
||||
if not defined cache_exe set "cache_exe=%%i"
|
||||
)
|
||||
if not defined cache_exe (
|
||||
echo %cache% is not on PATH. Install it, or leave --cache off.
|
||||
exit /b 1
|
||||
)
|
||||
REM Forward slashes, so CMake does not read a backslash as an escape.
|
||||
set "cache_exe=%cache_exe:\=/%"
|
||||
set "cache_args=-DCMAKE_C_COMPILER_LAUNCHER="%cache_exe%" -DCMAKE_CXX_COMPILER_LAUNCHER="%cache_exe%""
|
||||
REM Neither cache stores a compile that uses a precompiled header. sccache
|
||||
REM refuses /Fp outright. ccache does too unless its sloppiness is loosened,
|
||||
REM and even then most hits fall back to the slower preprocessed mode.
|
||||
set "no_pch=ON"
|
||||
|
||||
:cache_ready
|
||||
|
||||
REM Ninja prints [123/456] by default, which says nothing about how far
|
||||
REM along it is or how long is left. %p is a percentage, %w and %W are
|
||||
REM elapsed and remaining, but those two arrived in ninja 1.12 and an
|
||||
@@ -474,6 +519,8 @@ REM real path rather than one glued onto the repository root.
|
||||
for %%p in ("!build_dir!") do set "build_full=%%~fp"
|
||||
echo Configuration: %build_type%, %arch%
|
||||
if not "%clang_exe%" == "" echo Compiler: %clang_exe%
|
||||
if "%no_pch%" == "ON" echo Precompiled header: off
|
||||
if not "%cache_args%" == "" echo Compiler cache: %cache_exe%
|
||||
|
||||
set "SIG_FLAG="
|
||||
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
||||
@@ -570,6 +617,10 @@ if "%build_deps%" == "ON" (
|
||||
%error_check%
|
||||
)
|
||||
|
||||
if not "!cache_args!" == "" (
|
||||
set "deps_args=!deps_args! !cache_args!"
|
||||
)
|
||||
|
||||
if not "%no_configure%" == "ON" (
|
||||
call :print_and_run cmake -S deps -B "!DEP_TREE!" -G "%generator%" %gen_args% -DCMAKE_BUILD_TYPE=%build_type% !deps_args! %ORCA_DEPS_CMAKE_ARGS%
|
||||
%error_check%
|
||||
@@ -641,6 +692,17 @@ if "%build_slicer%" == "ON" (
|
||||
set "slicer_args=!slicer_args! -DSLIC3R_ASAN=ON"
|
||||
)
|
||||
|
||||
REM A later -DSLIC3R_PCH=ON in ORCA_SLICER_CMAKE_ARGS still wins, because
|
||||
REM CMake takes the last definition on the command line.
|
||||
if "%no_pch%" == "ON" (
|
||||
set "slicer_args=!slicer_args! -DSLIC3R_PCH=OFF"
|
||||
)
|
||||
|
||||
if not "!cache_args!" == "" (
|
||||
REM Relative debug paths as well, so another tree can reuse the objects.
|
||||
set "slicer_args=!slicer_args! !cache_args! -DSLIC3R_RELATIVE_DEBUG_PATHS=ON"
|
||||
)
|
||||
|
||||
REM Configuring against a tree that was never built fails deep inside
|
||||
REM package resolution. Name it here instead. Skipped when -d is about to
|
||||
REM build it in this same run, and under a dry run, which configures
|
||||
@@ -870,17 +932,18 @@ REM get_str_len <string> -> length in %ret%
|
||||
echo %script_name% -s --no-configure -j 8 Rebuild quickly while iterating
|
||||
echo %script_name% -s --slicer-target glad Compile one target to check the toolchain
|
||||
echo %script_name% -l -x --run-tests Test that toolchain's build, not the default one
|
||||
echo %script_name% -s -l -x --cache ccache Rebuild through a compiler cache
|
||||
echo.
|
||||
echo Environment:
|
||||
echo ORCA_DEPS_CMAKE_ARGS Extra arguments for the deps configure
|
||||
echo ORCA_SLICER_CMAKE_ARGS Extra arguments for the slicer configure
|
||||
echo ORCA_UPDATER_SIG_KEY Update signing key baked into the slicer
|
||||
echo git_commit_hash Revision to stamp, so a commit does not rebuild everything
|
||||
echo git_commit_hash Revision to stamp into the build, as CI does
|
||||
echo NINJA_STATUS Ninja progress format, if you want your own
|
||||
echo debugscript Set to ON to trace this script
|
||||
echo.
|
||||
echo set ORCA_SLICER_CMAKE_ARGS=-DSLIC3R_PCH=OFF -DSLIC3R_MSVC_PDB=OFF
|
||||
echo $env:ORCA_SLICER_CMAKE_ARGS = '-DSLIC3R_PCH=OFF' (PowerShell)
|
||||
echo set ORCA_SLICER_CMAKE_ARGS=-DSLIC3R_BUILD_SANDBOXES=ON -DSLIC3R_WARNINGS=OFF
|
||||
echo $env:ORCA_SLICER_CMAKE_ARGS = '-DSLIC3R_BUILD_SANDBOXES=ON' (PowerShell)
|
||||
echo.
|
||||
echo --deps-args and --slicer-args cannot carry a value with spaces; use
|
||||
echo these instead. Neither form supports a value containing an ampersand.
|
||||
|
||||
@@ -256,6 +256,13 @@ function(add_precompiled_header _target _input)
|
||||
message(STATUS "Adding precompiled header ${_input} to target ${_target}.")
|
||||
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)
|
||||
list(FILTER _sources INCLUDE REGEX ".*\\.mm?")
|
||||
|
||||
|
||||
Vendored
+9
-7
@@ -15,7 +15,13 @@ if(WIN32)
|
||||
# See https://github.com/python/cpython/issues/153438
|
||||
# Patch from https://github.com/python/cpython/pull/153608
|
||||
# This patch has not been merged to 3.12 yet so we need to apply it manually
|
||||
set(_patch_cmd git init && ${PATCH_CMD} ${CMAKE_CURRENT_LIST_DIR}/01-windows-nuget.patch)
|
||||
#
|
||||
# Without core.autocrlf=false the patched find_python.bat comes out LF and
|
||||
# cmd.exe cannot find its goto labels.
|
||||
set(_patch_cmd git init
|
||||
&& ${GIT_EXECUTABLE} -c core.autocrlf=false apply --verbose
|
||||
--ignore-space-change --whitespace=fix
|
||||
${CMAKE_CURRENT_LIST_DIR}/01-windows-nuget.patch)
|
||||
|
||||
if(MSVC_VERSION EQUAL 1800)
|
||||
set(_python_platform_toolset v120)
|
||||
@@ -53,12 +59,9 @@ if(WIN32)
|
||||
set(_python_pcbuild_output_dir win32)
|
||||
endif()
|
||||
|
||||
# pybind11 undefines _DEBUG around Python.h so a debug build links the
|
||||
# release python3xx.lib; Py_DEBUG could not load release plugin modules.
|
||||
set(_python_pcbuild_config Release)
|
||||
set(_python_layout_debug OFF)
|
||||
if(DEFINED DEP_DEBUG AND DEP_DEBUG)
|
||||
set(_python_pcbuild_config Debug)
|
||||
set(_python_layout_debug ON)
|
||||
endif()
|
||||
|
||||
# CPython's PCbuild needs a 64-bit-hosted toolchain: find_msbuild.bat picks the
|
||||
# 32-bit Bin\MSBuild.exe, whose x86 cl.exe/link.exe run out of address space
|
||||
@@ -101,7 +104,6 @@ if(WIN32)
|
||||
-DPYTHON_BUILD_DIR=<SOURCE_DIR>/PCbuild/${_python_pcbuild_output_dir}
|
||||
-DPYTHON_DEST_DIR=${DESTDIR}/libpython
|
||||
-DPYTHON_LAYOUT_ARCH=${_python_layout_arch}
|
||||
-DPYTHON_DEBUG=${_python_layout_debug}
|
||||
-P ${CMAKE_CURRENT_LIST_DIR}/stage_windows.cmake
|
||||
)
|
||||
elseif(APPLE)
|
||||
|
||||
Vendored
+3
-17
@@ -9,9 +9,6 @@ foreach(_var PYTHON_SOURCE_DIR PYTHON_BUILD_DIR PYTHON_DEST_DIR PYTHON_LAYOUT_AR
|
||||
endforeach()
|
||||
|
||||
set(_python_exe "${PYTHON_BUILD_DIR}/python.exe")
|
||||
if(PYTHON_DEBUG)
|
||||
set(_python_exe "${PYTHON_BUILD_DIR}/python_d.exe")
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS "${_python_exe}")
|
||||
message(FATAL_ERROR "Built Python executable not found: ${_python_exe}")
|
||||
@@ -49,22 +46,11 @@ endif()
|
||||
set(_required_files
|
||||
"${PYTHON_DEST_DIR}/Lib/encodings/__init__.py"
|
||||
"${PYTHON_DEST_DIR}/include/Python.h"
|
||||
"${PYTHON_DEST_DIR}/python.exe"
|
||||
"${PYTHON_DEST_DIR}/python${_python_abi}.dll"
|
||||
"${PYTHON_DEST_DIR}/libs/python${_python_abi}.lib"
|
||||
)
|
||||
|
||||
if(PYTHON_DEBUG)
|
||||
list(APPEND _required_files
|
||||
"${PYTHON_DEST_DIR}/python_d.exe"
|
||||
"${PYTHON_DEST_DIR}/python${_python_abi}_d.dll"
|
||||
"${PYTHON_DEST_DIR}/libs/python${_python_abi}_d.lib"
|
||||
)
|
||||
else()
|
||||
list(APPEND _required_files
|
||||
"${PYTHON_DEST_DIR}/python.exe"
|
||||
"${PYTHON_DEST_DIR}/python${_python_abi}.dll"
|
||||
"${PYTHON_DEST_DIR}/libs/python${_python_abi}.lib"
|
||||
)
|
||||
endif()
|
||||
|
||||
foreach(_required_file IN LISTS _required_files)
|
||||
if(NOT EXISTS "${_required_file}")
|
||||
message(FATAL_ERROR "Staged Python file missing: ${_required_file}")
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Vendored
+10
@@ -21,12 +21,22 @@ else ()
|
||||
set(_wx_edge "-DwxUSE_WEBVIEW_EDGE=OFF")
|
||||
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(
|
||||
wxWidgets
|
||||
GIT_REPOSITORY "https://github.com/SoftFever/Orca-deps-wxWidgets"
|
||||
GIT_TAG v3.3.2
|
||||
GIT_SHALLOW ON
|
||||
GIT_SUBMODULES 3rdparty/catch 3rdparty/pcre 3rdparty/libwebp
|
||||
PATCH_COMMAND ${_wx_patch_command}
|
||||
DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG} ${JPEG_PKG}
|
||||
CMAKE_ARGS
|
||||
-DwxBUILD_PRECOMP=ON
|
||||
|
||||
@@ -162,7 +162,7 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first, Impor
|
||||
rewind(fp);
|
||||
try{
|
||||
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) {
|
||||
char* mw_position = strstr(solid_name, "MW");
|
||||
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 model_id_str[128];
|
||||
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 (strcmp(version_str, "1.0") == 0) {
|
||||
model_id = model_id_str;
|
||||
|
||||
@@ -1,148 +0,0 @@
|
||||
# Cloud print job: MQTT-native design (not yet implemented)
|
||||
|
||||
`OrcaPrinterAgent::start_print` currently finalizes a cloud print job over HTTP
|
||||
(`OrcaCloudServiceAgent::start_cloud_print_job`, `POST
|
||||
/api/v1/printers/<dev_id>/print-jobs/<job_id>/start`). This document records
|
||||
the MQTT-native alternative that was designed as the intended replacement, the
|
||||
gap that blocks it today, and why it should not be built by adding fields to
|
||||
`print.gcode_file`.
|
||||
|
||||
## Current (implemented) flow
|
||||
|
||||
1. `OrcaCloudServiceAgent::upload_gcode_via_cloud`
|
||||
- `POST print-jobs/uploads` -> `{job_id, upload_url, expires_at, max_bytes}`
|
||||
- `PUT upload_url` -> raw G-code straight to R2 (presigned, PUT-only, no
|
||||
bearer token; must not go through the `http_put` helper, which always
|
||||
prefixes `api_base_url` and attaches the cloud session's Authorization
|
||||
header).
|
||||
2. `OrcaCloudServiceAgent::start_cloud_print_job`
|
||||
- `POST print-jobs/<job_id>/start` with `{filename, start}`.
|
||||
- The gateway HEAD-verifies the R2 object landed, mints a short-lived
|
||||
signed *download* URL (`createPrintJobDownloadToken` in
|
||||
`apps/gateway/src/services/printer-print-jobs.ts`), and relays a
|
||||
`print.project_file` command carrying that URL to the printer -
|
||||
**over the gateway's own relay connection to OrcaSonar, not
|
||||
OrcaSlicer's MQTT session.** OrcaSonar's `executeProjectFile`
|
||||
(`internal/cloud/printfile.go`) downloads from that URL and starts the
|
||||
print.
|
||||
|
||||
This works today and requires no changes to OrcaCloud or OrcaSonar.
|
||||
|
||||
## Why an MQTT-native version is desirable
|
||||
|
||||
The HTTP finalize call means `start_print`'s cloud path depends on the
|
||||
client's REST session (auth token, network path to the gateway's HTTP API)
|
||||
in addition to its MQTT session. An MQTT-native version would let OrcaSlicer
|
||||
trigger the download-and-start entirely over the connection it already
|
||||
maintains for every other printer command.
|
||||
|
||||
## The key finding: OrcaSonar already supports this, transport-agnostically
|
||||
|
||||
`print.project_file` is not tied to the HTTP `/start` route. OrcaSonar's
|
||||
cloud MQTT message handler intercepts it purely by command name, before
|
||||
routing to the generic per-namespace dispatcher:
|
||||
|
||||
```go
|
||||
// internal/cloud/client.go, makeRequestHandler
|
||||
if cmd.Namespace == "print" && cmd.Name == "project_file" {
|
||||
go c.handleProjectFile(ctx, cmd) // downloads `url`, then starts if start=true
|
||||
return
|
||||
}
|
||||
```
|
||||
|
||||
This fires for **any** message that reaches OrcaSonar's own outbound cloud
|
||||
MQTT session on `device/<dev_id>/request` - regardless of whether it was
|
||||
published there by the gateway's internal relay (today's `/start` path) or
|
||||
by a client publishing directly. OrcaSlicer's cloud MQTT connection already
|
||||
publishes to that same topic for every other cloud command
|
||||
(`OrcaPrinterAgent::route_send(is_lan=false, ...)` - `set_bed_temp`,
|
||||
`ams_change_filament`, etc.), via the same relay-shard mechanism
|
||||
(`apps/gateway/src/lib/relay-router.ts`). So **OrcaSlicer publishing
|
||||
`print.project_file` itself, over its existing cloud MQTT connection, would
|
||||
already reach `handleProjectFile` and trigger the identical download-then-
|
||||
start behavior - with zero new code on OrcaSonar.**
|
||||
|
||||
(This only works over the cloud relay session. OrcaSonar's LAN-side/generic
|
||||
dispatcher, `internal/bridge/klipper/adapter.go`, treats `print.project_file`
|
||||
as an unmapped macro call - a no-op in practice. That's fine: R2 upload is a
|
||||
cloud-only feature to begin with.)
|
||||
|
||||
## The one real gap: no GET-signed download URL is exposed to the client
|
||||
|
||||
`handleProjectFile` needs a URL it can `GET`. The `upload_url` returned by
|
||||
`POST print-jobs/uploads` is presigned for `PUT` only - S3 SigV4 signatures
|
||||
are bound to the HTTP method, so it cannot be reused for a download.
|
||||
|
||||
Minting a download URL/token already exists as a function
|
||||
(`createPrintJobDownloadToken` in
|
||||
`apps/gateway/src/services/printer-print-jobs.ts`) and the exact URL
|
||||
template is already built in `dispatchPrintFileCommand`
|
||||
(`apps/gateway/src/routes/printer.ts`) - it is simply never returned to the
|
||||
API caller today, only used server-side when `/start` builds the relay
|
||||
payload itself.
|
||||
|
||||
**Required OrcaCloud change:** have `POST print-jobs/uploads` (or a small
|
||||
follow-up call) also mint and return a signed download URL alongside
|
||||
`upload_url`, reusing `createPrintJobDownloadToken` + the existing URL
|
||||
template. This is on the order of ~10 lines in an existing handler, not a new
|
||||
permission model - the caller is already an authenticated, authorized user of
|
||||
that printer, identically to who is authorized to call `/start` today.
|
||||
|
||||
No OrcaSonar change is required at all.
|
||||
|
||||
## Why this should NOT be built into `print.gcode_file` / `start_sdcard_print`
|
||||
|
||||
`print.gcode_file` (sent by `OrcaPrinterAgent::start_sdcard_print`) is the
|
||||
generic "start this file that is already on the printer" primitive. It is
|
||||
used by the LAN `start_local_print` path today, is meant to stay usable for
|
||||
starting any file already on the SD card by filename alone, and is expected
|
||||
to grow parameters unrelated to cloud upload (e.g. filament mapping) over
|
||||
time.
|
||||
|
||||
Making `gcode_file` download-aware would require either:
|
||||
- adding cloud-specific fields (`job_id`, a download `url`, ...) to a command
|
||||
that has nothing to do with cloud jobs in the LAN case, forcing all of them
|
||||
to be optional/unused most of the time, or
|
||||
- giving OrcaSonar a side-channel registry of "filenames currently being
|
||||
downloaded" that `gcode_file`'s handler consults - solvable, but an
|
||||
orthogonal change with its own design questions (see "decoupled two-step
|
||||
option" below).
|
||||
|
||||
Neither is necessary: `print.project_file` already exists as a fully
|
||||
separate, fully-working command for exactly the "not yet on the printer,
|
||||
fetch it first" case, so the cloud upload flow does not need to touch
|
||||
`gcode_file` at all.
|
||||
|
||||
## Intended MQTT-native design, once the gap above is closed
|
||||
|
||||
Replace the HTTP finalize step (`start_cloud_print_job`) with: build and
|
||||
publish, over the cloud MQTT connection (`route_send(is_lan=false, ...)`),
|
||||
|
||||
```json
|
||||
{"print": {"command": "project_file", "sequence_id": "...",
|
||||
"url": "<signed download URL from the uploads response>",
|
||||
"param": "<remote_gcode_name(params)>",
|
||||
"start": true}}
|
||||
```
|
||||
|
||||
`start_sdcard_print` / `print.gcode_file` remains untouched and fully
|
||||
decoupled.
|
||||
|
||||
### Decoupled two-step option
|
||||
|
||||
If a use case ever needs "download now, start later" as an explicit user
|
||||
action (rather than upload-and-immediately-print), the same
|
||||
`print.project_file` command already supports it via `start: false` (download
|
||||
and store only - see `executeProjectFile`'s `start` handling in
|
||||
`internal/cloud/printfile.go`). The later "start" action would then be a
|
||||
perfectly ordinary `print.gcode_file` with `param: <filename>`, going through
|
||||
the existing, generic `start_sdcard_print` unmodified. This still requires no
|
||||
protocol changes beyond the download-URL gap above.
|
||||
|
||||
## Summary of gaps
|
||||
|
||||
| Component | Change needed |
|
||||
|---|---|
|
||||
| OrcaCloud (gateway) | Return a signed download URL from `POST print-jobs/uploads` (or a small sibling endpoint), reusing existing `createPrintJobDownloadToken` logic. |
|
||||
| OrcaSonar | None. `print.project_file` handling already does exactly what's needed, transport-agnostically, on the cloud MQTT session. |
|
||||
| OrcaSlicer (this repo) | Once the above lands: replace `start_cloud_print_job`'s HTTP call with a `print.project_file` publish over the cloud MQTT connection. `start_sdcard_print` stays untouched either way. |
|
||||
@@ -0,0 +1,508 @@
|
||||
# Filament IDs (`filament_id`)
|
||||
|
||||
`filament_id` identifies one **filament product**: one named spool product = one id, shared by
|
||||
all of that product's per-printer / per-nozzle variants, in every profile bundle that ships it.
|
||||
Devices use it to match a physical spool or tray to a filament preset. It is never per-color,
|
||||
per-printer, per-nozzle, or per-preset (per-preset identity is `setting_id`), and it is never
|
||||
per-bundle either — PolyLite PLA carries the same id whether the preset lives in the
|
||||
OrcaFilamentLibrary (OFL), Qidi, or Snapmaker bundle. The granularity is the name on the spool,
|
||||
not the brand behind it: `AAA PLA Lite` and `AAA PLA Pro` are two filaments with two ids, not
|
||||
variants of one.
|
||||
|
||||
**How it is generated:** an id is computed, never invented. `scripts/orca_id_tool.py`
|
||||
mints it as a deterministic hash of the product's identity — the triple
|
||||
`(filament_vendor, filament_type, filament name)`, where the filament name is the preset name
|
||||
with its `@...` variant suffix stripped — producing an 8-character `OF*` code that is the
|
||||
same for that product in every bundle, in every PR, on every machine. For example, Polymaker's
|
||||
PolyLite PLA presets (`PolyLite PLA @base`, `PolyLite PLA@Q2-Series`, …) resolve
|
||||
`filament_vendor` `Polymaker`, `filament_type` `PLA`, and filament name `PolyLite PLA`; hashing
|
||||
`filament_product/Polymaker/PLA/PolyLite PLA` yields `OF5CgdDq`, and that is the id the
|
||||
OrcaFilamentLibrary, OrcaArena, Qidi, and Snapmaker bundles all arrive at independently
|
||||
(derivation details in the Minting section).
|
||||
|
||||
**How it is used:** at runtime the id is the join key between hardware and profiles.
|
||||
When a printer reports what a tray holds (Bambu AMS, Qidi box, Creality CFS,
|
||||
Klipper, Snapmaker), OrcaSlicer matches the reported id against the filament presets
|
||||
compatible with that printer to select the right profile; other features — tray display
|
||||
names, support-material detection, vitrification warnings, multi-nozzle filament grouping —
|
||||
look up material properties by id alone. An id that changes is not forwarded anywhere: a
|
||||
tray or record still holding the old value falls back to matching by material type until the
|
||||
user re-selects the filament, so identity changes are made deliberately and rarely.
|
||||
|
||||
This page is the rule for authoring `filament_id` in system profiles
|
||||
(`resources/profiles/**`). CI enforces everything below; the short version is:
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Never write a `filament_id` value by hand.** A new filament gets its id from
|
||||
> `python scripts/orca_id_tool.py --generate`; one already in the tree has one — inherit it.
|
||||
|
||||
## The design, in two pieces
|
||||
|
||||
Because several consumers match **globally by id alone, first hit wins** (see the next
|
||||
section), any two materials sharing one id feed wrong data somewhere — a wrong tray name, a
|
||||
wrong support-material flag, a wrong nozzle grouping — and inside one printer a duplicated id
|
||||
makes AMS spool matching a coin toss. Hand-written ids produce such collisions constantly, so
|
||||
the system is built to make them impossible:
|
||||
|
||||
1. **Deterministic minting.** An id is a pure hash of the product's identity — no registry to
|
||||
maintain, no next-free-number ceremony, no way for two concurrent PRs to race for the same
|
||||
number, and no way to get it wrong by hand, because you never write it by hand.
|
||||
2. **A sanctioned snapshot.** The complete id landscape derived from the tree must equal
|
||||
`scripts/filament_id_snapshot.json` exactly, so every change to ids, claims (which bundles
|
||||
ship which id, and for which filament), or product identity surfaces as a reviewable diff to
|
||||
one file — the maintainer gate.
|
||||
|
||||
## Who consumes the id
|
||||
|
||||
The canonical consumer is tray-to-preset matching: a device reports a tray material id
|
||||
(`tray_info_idx`), and the shared matching pipeline (`PresetBundle::sync_ams_list` and
|
||||
friends) resolves it to a preset. The matcher is printer-scoped and first-match-wins:
|
||||
scanning only compatible root presets — system roots plus user-made custom filaments, which
|
||||
are user roots carrying their own `P*` ids; a preset derived from another resolves through
|
||||
its root and never matches directly — it picks the first one whose `filament_id` equals the
|
||||
tray's. On a miss it falls back by filament type: a system `Generic <type>` preset
|
||||
(matched by name, then by type similarity), else the slot's previous selection, else any compatible system generic or,
|
||||
failing that, any compatible system preset, else the slot is skipped — every fallback
|
||||
selection surfaces a user-visible notice.
|
||||
|
||||
Today only the Bambu AMS integration follows this pattern end to end — the device itself
|
||||
reports the id, `BBLPrinterAgent` translates it out of Bambu's catalog into ours, and the
|
||||
pipeline does all the matching. The other device integrations still synthesize a preset id
|
||||
client-side in their agents (by type, brand, or color lookups against the loaded presets)
|
||||
before the pipeline runs; they are intended to converge on the same pattern, with the
|
||||
device-reported tray material id flowing through the shared matcher.
|
||||
|
||||
| Ecosystem | Where the tray id comes from today |
|
||||
| --- | --- |
|
||||
| Bambu AMS | the device itself (RFID / user tray setting), in Bambu's own `GF*` catalog; `BBLPrinterAgent` rewrites it into our id before the matcher sees it (see [The Bambu catalog map](#the-bambu-catalog-map)) |
|
||||
| Qidi box | composed at runtime as `QD_<series>_<vendor>_<typeidx>` — vendor and type indices from the device's per-slot saved variables, the series digit inferred client-side from the printer model/name. No preset carries a `QD_*` value, so the slot currently resolves by filament type; mapping the composed id onto the filament's minted id belongs in the agent |
|
||||
| Creality CFS | runtime brand/type scoring returns the winning preset's id |
|
||||
| Klipper (AFC / Happy Hare) | runtime lookup by filament type |
|
||||
| Snapmaker | runtime color/vendor/type match |
|
||||
|
||||
Tray-to-preset matching is printer-scoped, but **several consumers match globally by id alone,
|
||||
first hit wins**: tray display names, `filament_is_support`, vitrification warnings, and
|
||||
multi-nozzle filament grouping in the slicing pipeline (`FilamentGroup::try_merge_filaments`
|
||||
merges plate slots sharing one `(filament_id, color)` pair, with matching
|
||||
extruder-printability, onto one nozzle group; the engine is implemented but no grouping path
|
||||
calls it yet).
|
||||
Two *different* materials sharing one id
|
||||
feed wrong data to those consumers even when the presets live in different vendors — so
|
||||
cross-material id sharing is never safe. Within one printer, duplicate ids break AMS matching:
|
||||
the matcher picks whichever preset loads first (it now logs an "Ambiguous AMS filament match"
|
||||
warning, but the pick is still arbitrary) and the tray-edit dialog, which lists one entry per
|
||||
id, hides the second preset entirely. The profile validator's `-f` check
|
||||
(`check_filament_subtypes` → `PresetBundle::check_duplicate_filament_subtypes`) rejects this
|
||||
per printer, and CI runs it tree-wide.
|
||||
|
||||
Two more consumer-side facts worth knowing:
|
||||
|
||||
- The machine-facing dialogs (AMS tray edit, AMS dry control, calibration history, extrusion
|
||||
calibration) offer the filaments a connected printer can use by the same compatibility rule
|
||||
the plater uses (an empty `compatible_printers` means *every* printer). Alias shadowing
|
||||
still applies: a vendor's same-name profile supersedes the library generic. That is what
|
||||
puts Orca Filament Library materials in those lists — deduplicated to one entry per
|
||||
`filament_id` in the AMS and calibration-history dialogs, while extrusion calibration
|
||||
deliberately lists every matching preset by full name.
|
||||
- The id is load-bearing at startup: an instantiated system filament (one marked
|
||||
`"instantiation": "true"` — see the structure rules) that resolves **no**
|
||||
`filament_id` anywhere in its `inherits` chain is a hard load error in the C++ loader
|
||||
(`Can not find filament_id for <name>`) that discards the entire vendor bundle (for the
|
||||
OrcaFilamentLibrary itself the failure is messier: library presets loaded before the
|
||||
failing one survive, and every vendor bundle whose filaments inherit from the library is
|
||||
then discarded for want of a base). CI's structure check catches this before it ships.
|
||||
|
||||
## Do I need a new id? The one-question test
|
||||
|
||||
> **Would a user consider this a different spool product than anything already in the tree?**
|
||||
|
||||
Different polymer, different sub-brand (Basic / Matte / Silk / HF), fiber-filled sibling, or a
|
||||
second selectable diameter → **new filament, new id**. The same spool tuned for another printer
|
||||
or nozzle → **join the existing filament** (keep its base name and inherit it; no id
|
||||
key needed). Tuning a generic material → **join the OrcaFilamentLibrary filament** (inherit
|
||||
`Generic X @System` and keep the `Generic X` base name; no id key needed).
|
||||
|
||||
| Situation | id |
|
||||
| --- | --- |
|
||||
| Per-printer / per-nozzle variant of an existing material | same id (inherit it) |
|
||||
| Sub-brand or product line (PLA vs PLA Matte vs PLA Silk vs PLA HF) | new id each |
|
||||
| Color | never a new id |
|
||||
| Second diameter of the same product (1.75 + 2.85) | sibling filament, new id |
|
||||
| "High-speed" tuned for a *different printer model* | same id (it is a printer variant) |
|
||||
| "High-speed" selectable *alongside* the normal preset on one printer | new name, so a new id (it is a product line) |
|
||||
|
||||
## Structure rules
|
||||
|
||||
1. **Every preset carries the id of its own product, wherever it gets it from.** The id is a
|
||||
function of the preset's own triple (rule 5), and `inherits` carries settings, never
|
||||
identity. So a preset may declare the key itself or inherit it from any ancestor — a
|
||||
`<Filament> @base` root, a real (instantiated) preset of the same filament, an
|
||||
OrcaFilamentLibrary preset — and CI checks one thing: the id it ends up with equals the
|
||||
mint of *its* triple. The usual shape is one `@base` root (`"instantiation": "false"`)
|
||||
declaring the key and the per-printer variants inheriting it; a filament may have several
|
||||
roots — Qidi's PolyLite PLA has four per-series roots (`PolyLite PLA@Q2-Series`,
|
||||
`@Q2C-Series`, `@X-Max 4-Series`, `@X-Plus 5-Series`) — which then all declare the identical
|
||||
id. A branded filament that borrows a generic's settings (`Flashforge ABS Basic @FF C5`
|
||||
inherits `Generic ABS @System`) declares its own id, because its triple is its own.
|
||||
2. **The filament name is the base name**: the preset name with everything from the first
|
||||
(optionally space-preceded) `@` stripped. `MyBrand PLA @Orca 3D Fuse1` and `MyBrand PLA@HS`
|
||||
are both the filament `MyBrand PLA`.
|
||||
3. **Within one filament, variants' `compatible_printers` are pairwise disjoint** — per printer,
|
||||
at most one compatible instantiated preset per id, or AMS matching turns ambiguous. The
|
||||
C++ validator's `-f` check enforces this, tree-wide in CI. Since one product carries one id
|
||||
and cannot be split onto two, this rule is the *only* remedy for such an ambiguity: narrow
|
||||
the `compatible_printers`, or retire the preset that duplicates another.
|
||||
4. **Generics belong to OrcaFilamentLibrary.** A vendor tuning a generic material inherits
|
||||
`Generic X @System`, keeps the `Generic X` base name (that alias is what hides the library
|
||||
preset on your printers, and it is what makes its triple — and so its id — the library's)
|
||||
and sets a non-empty `compatible_printers` — e.g. `Generic PLA @Sovol SV08 MAX` inherits
|
||||
`Generic PLA @System` and lists three Sovol nozzles. Renaming such a preset makes it a
|
||||
different product by rule 5, so it then needs its own id.
|
||||
5. **Ids follow the product identity.** The id is a pure function of the product triple
|
||||
`(filament_vendor, filament_type, filament name)`, so correcting any of them re-mints the id
|
||||
**by design**, applied by `--generate` (preview with `--dry-run`, confine with `--vendor`) and
|
||||
gated by the `--update-snapshot` diff; the exact sequence is in the FAQ. Nothing forwards
|
||||
the old value, so anything outside the tree that stored it — a device tray, a calibration
|
||||
record, a saved project — falls back to matching by filament type until the user re-selects
|
||||
the filament. Re-mint deliberately, and only to fix a genuinely wrong identity.
|
||||
(`renamed_from` still gates preset-*name* compatibility, as before.)
|
||||
|
||||
## Minting — nobody invents ids
|
||||
|
||||
New ids are deterministic, computed exactly like the `setting_id` precedent
|
||||
(the `setting_id` half of `scripts/orca_id_tool.py`):
|
||||
|
||||
```text
|
||||
FILAMENT_ID_NAMESPACE = uuid5(setting-id NAMESPACE, "filament_id")
|
||||
= c4d3ff49-4c32-5534-a3e3-00894157ab97
|
||||
filament_id = "OF" + base62_6( uuid5(FILAMENT_ID_NAMESPACE,
|
||||
"filament_product/<filament_vendor>/<filament_type>/<filament_name>") )
|
||||
```
|
||||
|
||||
`base62_6` is the low 6 base62 digits (alphabet `0-9A-Za-z`) of the UUID taken as a big-endian
|
||||
integer, most-significant digit first; with the `OF` prefix the full id is 8 chars, within the
|
||||
AMS length limit. The triple comes from the root preset's *flattened* config:
|
||||
`<filament_vendor>` is the filament
|
||||
**manufacturer** (`"Polymaker"`, or `"Generic"` for generics — never the printer brand),
|
||||
`<filament_type>` the material type, `<filament_name>` the root's base name; the two config
|
||||
values are inheritable list options and the first element counts.
|
||||
|
||||
Content-addressing on that triple is what makes the whole system converge. The key contains no
|
||||
bundle name, so the same product mints the same id in every bundle — moving a filament into
|
||||
OrcaFilamentLibrary never changes its id, and two vendors independently shipping the same
|
||||
product arrive at the same id without coordinating. `Polymaker/PLA/PolyLite PLA` mints
|
||||
`OF5CgdDq`, and that one id is declared by the OrcaFilamentLibrary, OrcaArena, Qidi, and
|
||||
Snapmaker bundles alike; the OFL generic `Generic/PLA/Generic PLA` mints `OFDSrzZ8`, claimed
|
||||
by 35 bundles — most by independent declarations converging on the same mint, the rest
|
||||
purely through inheritance from the OFL preset.
|
||||
|
||||
Nothing but the triple feeds the mint — not the rest of the tree, not the snapshot, not what
|
||||
another preset of the product happens to carry. Determined triple, determined id: one product
|
||||
carries one id and there is no second acceptable value for it, so any other value on a preset
|
||||
is a mismatch `--check` reports and `--generate` pulls back. Two *different* products whose
|
||||
triples mint the same base62 value would be a collision (a roughly 36-bit id space against a
|
||||
few thousand products); nothing salts past it: `--check` reports it naming both products,
|
||||
`--generate` refuses to write it, and the remedy is a rename so their triples differ. Where
|
||||
two presets of one product would be AMS-ambiguous on a printer, the fix is likewise in the
|
||||
profiles — make their `compatible_printers` disjoint (structure rule 3), retire the redundant
|
||||
preset, or, if they really are different products, give them different names so their triples
|
||||
differ. Never a second id for one triple.
|
||||
|
||||
Workflow for a new filament:
|
||||
|
||||
```bash
|
||||
# 1. Author the filament with NO filament_id key anywhere.
|
||||
python scripts/orca_id_tool.py --dry-run # 2. preview the ids — writes nothing
|
||||
python scripts/orca_id_tool.py --generate # 3. apply them to the profile file(s)
|
||||
python scripts/orca_id_tool.py --update-snapshot # 4. record the new claims in the snapshot
|
||||
python scripts/orca_id_tool.py --check # 5. validate the filament_id state
|
||||
python scripts/orca_extra_profile_check.py # 6. ...and everything else CI checks
|
||||
# 7. Commit the profile edits together with scripts/filament_id_snapshot.json, for review.
|
||||
```
|
||||
|
||||
`--generate` makes every filament's id equal the mint of its own
|
||||
`(filament_vendor, filament_type, filament name)` triple: it inserts one where an instantiated
|
||||
filament resolves none, and re-derives one that does not match. A preset that *inherits* a
|
||||
mismatching id is the one case left to the author — check 3b names it, and the fix is to inherit
|
||||
a preset of the same filament or to give the preset its own key. A declaration is left alone
|
||||
exactly when it already equals the one id its triple mints, and a collision (check 3d) is
|
||||
reported and left unwritten. The same run assigns
|
||||
`generate_preset_setting_id(vendor, type, name)` to every instantiated filament, process
|
||||
and machine preset of every vendor except BBL, which keeps its authoritative `G*` ids, strips
|
||||
`setting_id` from base profiles, and fixes the misspelled `settings_id` key — dropped, or, for
|
||||
BBL, whose ids have no formula to fall back on, restored under the correct name. It is idempotent and
|
||||
byte-preserving (indentation, BOM, and line endings intact, every edited file re-parsed to fail
|
||||
loudly), and a no-op on a tree that already passes `scripts/orca_extra_profile_check.py` — the
|
||||
check CI runs over both id kinds, of which `--check` is the `filament_id` half.
|
||||
|
||||
- `--filament-id` limits the run to `filament_id`.
|
||||
- `--setting-id` limits the run to `setting_id`. The two exclude each other; pass neither to
|
||||
write both.
|
||||
- `--vendor VENDOR` confines the run to that bundle; repeatable. The id is a function of the
|
||||
triple alone, so a narrowed run writes exactly what a full one would; `--check` reports
|
||||
whatever it left outside.
|
||||
- `--dry-run` reports what `--generate` would do and writes nothing; with no mode of its own it
|
||||
implies `--generate`, so `--dry-run --vendor <Vendor>` previews just that bundle.
|
||||
- `--profiles DIR` points the tooling at a different profile tree (default
|
||||
`resources/profiles`). `--check` and `--update-snapshot` read and write the sanctioned state of
|
||||
the tree they are given, so pointing them elsewhere needs `--snapshot PATH` for that tree too —
|
||||
`scripts/filament_id_snapshot.json` describes `resources/profiles` and no other tree.
|
||||
|
||||
**Identity fixes need no separate mode.** `--generate` re-derives an id that no longer matches its
|
||||
triple exactly the way it fills in a missing one, so a rename or a `filament_vendor` /
|
||||
`filament_type` correction is just: fix the config, run `--generate` (confine it with `--vendor`,
|
||||
preview it with `--dry-run`), then `--update-snapshot` and review the diff.
|
||||
|
||||
If you skip the tooling, CI fails and prints the remedy: the expected id for your filament and
|
||||
the instruction to run `python scripts/orca_id_tool.py --generate`; once the id is minted, the
|
||||
snapshot checks likewise point at `--update-snapshot` and tell you to commit the resulting
|
||||
diff.
|
||||
|
||||
## Reserved namespaces — never mint or hand-write into
|
||||
|
||||
A **reserved namespace** is an id space no system profile may declare, because an external
|
||||
catalog or a device protocol owns the values. None of them has an owning vendor: there is no
|
||||
bundle — not even the one whose printers use the catalog — that may write one into a profile.
|
||||
|
||||
| Space | Status | Rule |
|
||||
| --- | --- | --- |
|
||||
| `GF*` | Bambu AMS/RFID catalog | declarable by **nobody**, BBL included: Bambu's own ids live in the generated catalog map, never in a profile |
|
||||
| `QD_*` | Qidi device protocol | declarable by **nobody**, Qidi included: the box composes these ids at runtime and they are not preset ids |
|
||||
| `P` + 7 hex chars (case-insensitive), `"null"` | user-created custom filaments (`CreatePresetsDialog.cpp`) | never appears in system profiles |
|
||||
|
||||
The two device namespaces, in detail:
|
||||
|
||||
- **Bambu (`GF*`).** Bambu's device/RFID/cloud catalog is external and opaque, which is a
|
||||
reason to keep it out of the profiles rather than to let one bundle own it. Every BBL filament
|
||||
mints an `OF` id from its triple like every other vendor's, and the correspondence to Bambu's
|
||||
catalog ids lives in one generated file the app applies at the printer boundary — the next
|
||||
section. Nothing under `resources/profiles/**` carries a `GF*` id today and nothing can be
|
||||
exempted, so a `GF*` id appearing anywhere in the tree is a mistake, whoever wrote it.
|
||||
- **Qidi (`QD_*`).** `QD_*` is a device-*protocol* namespace, not a preset id space: the
|
||||
Qidi box path composes `QD_<series>_<vendor>_<typeidx>` ids at runtime (slot vendor and
|
||||
type indices reported by the device, the series digit inferred client-side from the printer
|
||||
model/name). Qidi presets carry ordinary minted `OF*` ids (generics share the OFL ids), so
|
||||
a composed id matches no preset and the slot falls back to filament type; translating it to
|
||||
the filament's id belongs in `QidiPrinterAgent`. The alternative — treating per-series
|
||||
protocol ids as preset ids — would put one product under five ids (`QIDI PLA Rapido` would
|
||||
be `QD_0_1_1` through `QD_4_1_1`), exactly the fragmentation the mint rule removes.
|
||||
|
||||
## The Bambu catalog map
|
||||
|
||||
Bambu's printers, its AMS and its cloud know only Bambu's own catalog ids. Our profiles carry
|
||||
minted `OF` ids like every other vendor's, so one generated file records the correspondence and
|
||||
the app applies it **only where an id crosses to or from a Bambu printer**.
|
||||
|
||||
**The file** is `resources/printers/bambu_filament_ids.json` — a header plus one row per
|
||||
catalogued product, keyed by our id:
|
||||
|
||||
```json
|
||||
{
|
||||
"source": "https://github.com/bambulab/BambuStudio",
|
||||
"bambustudio_commit": "66e405477",
|
||||
"generated": "2026-09-04",
|
||||
"filaments": {
|
||||
"OFhuaUQB": { "bambu_id": "GFB00", "vendor": "Bambu Lab", "type": "ABS", "name": "Bambu ABS" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
It ships in `resources/printers/`, next to `filaments_blacklist.json` — deliberately not in
|
||||
`resources/profiles/`, where the loader reads every top-level `.json` as a vendor index. It
|
||||
holds 100 rows today, one per product BambuStudio ships, and the correspondence is
|
||||
one-to-one in both directions.
|
||||
|
||||
**It is generated, never hand-edited.** `python scripts/update_bambu_filament_ids.py` rebuilds
|
||||
it from **BambuStudio's own shipped BBL bundle** — a sparse shallow clone of upstream `master`,
|
||||
or `--bambustudio-dir <a BambuStudio resources/profiles checkout>`. Our BBL bundle is a fork of
|
||||
Bambu's, tuned and extended independently, so it is not the source of truth for Bambu's ids.
|
||||
A row's key is the id the product's `(filament_vendor, filament_type, filament name)` triple
|
||||
mints — the same id any bundle of ours carries for it, since the id is a function of the triple
|
||||
alone; the row of a product we do not ship sits inert until some bundle claims that triple —
|
||||
`OFdyfQvU` / `GFG03`, "Bambu PETG Matte", is such a row today.
|
||||
|
||||
**Regenerate it in the same commit as every BBL profile sync**, and read the drift report it
|
||||
prints. Two lines, both informational, neither blocking the write:
|
||||
|
||||
```text
|
||||
upstream ships 'Bambu PETG Matte' (Bambu Lab/PETG), we ship nothing with that identity
|
||||
Orca BBL filaments with no row: 135 Orca-only product(s)
|
||||
```
|
||||
|
||||
The first names each upstream product our BBL bundle has no same-identity filament for —
|
||||
sometimes a genuinely missing product, sometimes a name drift a follow-up rename would
|
||||
converge. The second counts our own BBL filaments that matched no row: 135 of 234 today, of
|
||||
which 109 send an `OF` id on the wire and 26 already rode `OF` ids inherited from the
|
||||
OrcaFilamentLibrary. **135 is the number to expect at every regeneration** — 109 was the
|
||||
one-off size of the transition and stopped being computable from the tree once the BBL bundle
|
||||
was re-minted, so do not "fix" the report to print it.
|
||||
|
||||
**Check 6** lives in `check_filament_ids`, so profile CI runs it alongside the other five. It
|
||||
holds the file to its contract: it parses, carries `source` / `bambustudio_commit` /
|
||||
`generated`, keys only `OF`-format ids, maps each Bambu id at most once, and — for every row
|
||||
whose key the tree actually claims — agrees with the tree on that id's `(vendor, type, name)`
|
||||
triple. A row for a product we do not ship is skipped, not an error. The remedy it prints is
|
||||
always the same: regenerate the map and commit the diff for review.
|
||||
|
||||
### The runtime rule: swap on hit
|
||||
|
||||
Outbound, our id with a row becomes Bambu's; inbound, Bambu's id with a row becomes ours.
|
||||
Everything else is forwarded untouched — an `OF` id with no row, a Bambu id for a product we do
|
||||
not ship, a `P`-hex user id, `"null"`, an empty string. Translation is confined to the
|
||||
boundary: nothing between the boundaries ever holds a Bambu id.
|
||||
|
||||
Translating one value is a capability of the printer agent: `IPrinterAgent` declares
|
||||
`to_orca_filament_id` and `from_orca_filament_id` returning their argument, and `BBLPrinterAgent`
|
||||
overrides them with Bambu's map, so an agent whose printers already speak our ids inherits the
|
||||
identity default and translates nothing. `NetworkAgent` forwards both to the live agent, so the
|
||||
comparison sites below reach them through `wxGetApp().getAgent()` and leave an id untranslated
|
||||
while no agent is live. Whole documents are Bambu's business alone:
|
||||
`BBLPrinterAgent::to_orca_payload` and `from_orca_payload` rewrite every string under
|
||||
`tray_info_idx`, `filament_id` or `filamentId` at any depth; text that does not parse, or carries
|
||||
none of those keys, comes back unchanged. The map is loaded once, lazily; a missing or malformed
|
||||
file degrades to identity with a log line rather than failing.
|
||||
|
||||
| Boundary | Where it translates |
|
||||
| --- | --- |
|
||||
| Everything the agent sends | `BBLPrinterAgent::send_message` and `send_message_to_printer`, plus `PrintParams::ams_mapping_info` in `dispatch_start` — the funnel all five `start_*` calls share |
|
||||
| Everything the agent receives | `set_on_message_fn` and `set_on_local_message_fn` wrap their callback, so `MachineObject::parse_json` and everything downstream see our ids only |
|
||||
| 3mf export | `Plater::export_3mf` writes Bambu's ids into `slice_info.config`, gated on `preset_bundle.is_bbl_vendor()` — the printer reads that file and knows only its own catalog, and no other vendor's export is affected. The CLI has its own writer in `OrcaSlicer.cpp`; it does the same, gated on the `printer_model` prefix that already decides `Print::is_BBL_printer()` for that run |
|
||||
| Project ingest | `Plater::priv::load_files` reverse-maps the project's `filament_ids` before the bundle ingests them, so a project saved by an older Orca or by BambuStudio still resolves the same presets |
|
||||
| Prints from the printer's SD card | `SelectMachineDialog::update_print_required_data` reverse-maps each plate's slice-info ids as it adopts the plates, so the AMS mapping dialog pairs them with trays |
|
||||
| Bambu-specific comparisons | `CalibUtils.cpp`, `DeviceManager.cpp`, `DeviceCore/DevFilaSystem.cpp`, `DeviceCore/DevFilaBlackList.cpp`, `SelectMachine.cpp`, `AMSDryControl.cpp`, `AMSMaterialsSetting.cpp`, `PresetComboBoxes.cpp`, `ColorDecomposeSupport.cpp` |
|
||||
|
||||
That last row is the rule to follow when a new Bambu-specific behaviour is added: **translate
|
||||
the value you are about to compare, never the table you compare it against.** The shipped data
|
||||
those sites read is Bambu's and stays verbatim — `white_fila_ids` in
|
||||
`resources/printers/filaments_blacklist.json`, the calibration id lists in
|
||||
`resources/printers/<model>.json`, `fila_id` in
|
||||
`resources/profiles/BBL/filament/filaments_color_codes.json`.
|
||||
|
||||
`tests/slic3rutils/test_bambu_filament_ids.cpp` covers the lookups, the payload rewrite and the
|
||||
Bambu-specific rules. `orcaslicer_discover_tests` registers a Catch2 tag as a CTest **label**,
|
||||
not as part of the test name, so `-R` matches nothing here and the filter is `-L`:
|
||||
|
||||
```bash
|
||||
ctest --test-dir <build dir>/tests/slic3rutils -L BambuFilamentIds
|
||||
```
|
||||
|
||||
### Three places the map deliberately does not reach
|
||||
|
||||
The map and its lookups live in the GUI library, which libslic3r cannot link against and which a
|
||||
GUI-less build does not link at all. Three consequences are known and documented; none is worth
|
||||
pulling the map down into libslic3r for.
|
||||
|
||||
- **The support display type in `PrintConfig.cpp`.** `DynamicPrintConfig::get_filament_type`
|
||||
picks `PLA-S` / `Sup.PLA` and `PA-S` / `Sup.PA` for a support filament by testing
|
||||
`filament_id` against `GFS00` and `GFS01`, and otherwise falls back on `filament_type` — a
|
||||
fallback that returns those same two pairs for `"PLA"` and `"PA"`. Bambu Support W inherits
|
||||
`fdm_filament_pla` and Bambu Support G inherits `fdm_filament_pa`, so with their `OF` ids the
|
||||
fallback produces exactly what the id branches produced. (The only config that ever carries a
|
||||
singular `filament_id` key is the AMS tray config built in `Plater.cpp`, and that one never
|
||||
reaches this function.) These two lines are the only mention of a Bambu id anywhere in
|
||||
libslic3r, and they need no change.
|
||||
- **Config imports.** `PresetBundle::import_presets` (File ▸ Import ▸ Import Configs, for
|
||||
`.json` / `.zip` / `.orca_filament` / `.orca_printer` / `.orca_bundle`) and
|
||||
`PresetBundle::load_config_file` (the CLI's `--load-settings` of a G-code file with an
|
||||
embedded config) both parse inside libslic3r, out of the GUI's reach, so a Bambu id carried
|
||||
in such a file lands on the imported preset untranslated. The effect is bounded: that preset
|
||||
does not auto-match an AMS tray while the stale id is live, and the id does not survive
|
||||
being saved — `Preset::save` writes a `filament_id` key only for a preset whose `inherits` is
|
||||
empty, and on the next load an inheriting preset takes its parent's id. A known gap, and not
|
||||
a regression: nothing forwarded a stale id before either.
|
||||
- **A build configured without the GUI.** `target_link_libraries(OrcaSlicer libslic3r_gui)` sits
|
||||
inside `if (SLIC3R_GUI)` in `src/CMakeLists.txt`, so the lookups are not linkable when the GUI
|
||||
is off. The CLI's 3mf writer in `src/OrcaSlicer.cpp` therefore guards its translation with
|
||||
`#ifdef SLIC3R_GUI`, and a 3mf that such a build slices for a Bambu printer carries our `OF`
|
||||
ids in `slice_info.config` rather than Bambu's. Every shipped build enables the GUI, so this
|
||||
reaches only a purpose-built GUI-less binary.
|
||||
|
||||
One more thing worth recording before it is rediscovered:
|
||||
`SyncAmsInfoDialog::update_print_required_data` is a structural twin of the SD-card function
|
||||
above and carries no translation. It has no callers today and its plate list is only ever read
|
||||
for `printer_model_id`, so it is not a live gap — but wiring it up without adding the reverse
|
||||
map would silently reproduce the bug.
|
||||
|
||||
## How CI enforces this
|
||||
|
||||
Profile CI (`check_profiles.yml`) runs `check_filament_ids()` tree-wide via
|
||||
`scripts/orca_extra_profile_check.py`. Its ground truth is
|
||||
**`scripts/filament_id_snapshot.json` — the sanctioned state**: the id state derived from the
|
||||
tree must equal the snapshot exactly, in both directions. Any change to the id landscape
|
||||
therefore surfaces as a diff to that file, and **that snapshot diff is what maintainers review
|
||||
and gate in a PR**. Never edit the snapshot by hand — `--update-snapshot` regenerates it
|
||||
deterministically (running it twice changes nothing). The snapshot holds one map, `ids`: each
|
||||
entry is the product the id is minted from (`filament_vendor`, `filament_type`, `name`) and the
|
||||
`filaments` claiming it (`Vendor/Filament`), and it sanctions *state*, never exceptions: no check
|
||||
consults it to excuse a preset from a rule, and there is no grandfather list of any kind.
|
||||
|
||||
The checks, in brief:
|
||||
|
||||
- **Format** — every id occurring in the tree is `OF` + 6 base62 chars. No exceptions: not a
|
||||
snapshot entry, not BBL.
|
||||
- **Snapshot equality** — tree claims == snapshot claims **and** each id's declared triple ==
|
||||
its snapshot entry, both directions: any `filament_vendor`/`filament_type`/name change
|
||||
surfaces as a snapshot diff.
|
||||
- **Identity** — the id is a function of the triple alone. A declared `OF*` id must equal the
|
||||
one id its declarer's own triple mints, with no second acceptable value; the id an
|
||||
instantiated preset *inherits* must equal the mint of *its* own triple, however it inherits
|
||||
it (a root, a real filament, a library preset — structure rule 1); and every instantiated
|
||||
system filament must resolve an effective id at all (recall: an id-less one is a hard load
|
||||
error in C++ that discards the whole vendor bundle); and no two products mint one id (a
|
||||
base62 collision, resolved by renaming one of them). The errors print the expected id.
|
||||
- **Reserved namespaces** — `GF*`, `QD_*`, `P<7-hex>` or `"null"` claimed by any vendor,
|
||||
BBL and Qidi included.
|
||||
- **Triple integrity** — every declarer must resolve a non-empty `filament_vendor` and
|
||||
`filament_type` (generics use `"Generic"`), and all declarers of one filament within a
|
||||
bundle must agree on the triple.
|
||||
- **Bambu catalog map** — `resources/printers/bambu_filament_ids.json` parses, carries its
|
||||
`source` / `bambustudio_commit` / `generated` header, keys only `OF`-format ids, maps each
|
||||
Bambu id at most once, and agrees with the tree on the triple of every row whose key the
|
||||
tree claims. See [The Bambu catalog map](#the-bambu-catalog-map); the remedy is always to
|
||||
regenerate, never to hand-edit.
|
||||
|
||||
A profile that declares a **reserved-namespace** id — `GF*`, `QD_*` or `P<7-hex>`, whatever
|
||||
its vendor — cannot pass the format check, so `--update-snapshot` refuses to sanction it
|
||||
rather than hide the mistake until CI. For a Bambu-cataloged product, the catalog map is where
|
||||
the correspondence belongs. Any other new sharing via a *declared* id is caught by the identity
|
||||
check; sharing through inheritance carries no declaration to check and surfaces only as a new
|
||||
claim in the snapshot diff — which is exactly why that diff is the gate.
|
||||
|
||||
`orca_extra_profile_check.py` separately holds every declared id to the AMS 8-character limit,
|
||||
tree-wide and for every vendor alike, scoped to the presets a vendor's index actually
|
||||
references (a file the index never loads cannot break AMS matching).
|
||||
|
||||
Complementing the Python checks, CI also runs the C++ profile validator with `-f`
|
||||
(`check_filament_subtypes`): it loads the bundle exactly as the app does and flags any printer
|
||||
for which two or more compatible filament presets share one `filament_id` — the runtime-shaped
|
||||
ambiguity check behind structure rule 3.
|
||||
|
||||
## FAQ
|
||||
|
||||
- **A new color of an existing product?** Never a new id — colors are not filaments.
|
||||
- **A second diameter (1.75 mm and 2.85 mm) of the same product?** A sibling filament with its
|
||||
own id: two diameters are separately selectable spool products.
|
||||
- **A high-speed tune of an existing material for another printer model?** Same filament:
|
||||
keep the base name and inherit its root; no id key needed.
|
||||
- **A tuned generic ("our profile for Generic PLA")?** Inherit `Generic PLA @System`, keep the
|
||||
`Generic PLA` base name, set `compatible_printers`; no id key needed.
|
||||
- **A branded filament that borrows a generic's settings?** Fine — inherit `Generic X @System`
|
||||
(or any real filament) for the settings and declare the id of your own filament; run
|
||||
`python scripts/orca_id_tool.py --generate` to mint it. Inheritance never changes the id.
|
||||
- **I need to fix a filament's `filament_vendor` or `filament_type`.** Fix the config, run
|
||||
`--generate --vendor <Vendor>` (preview with `--dry-run`), then `--update-snapshot`, and commit
|
||||
the profile and snapshot diffs together. The id re-derives from the corrected identity, and
|
||||
nothing forwards the old value, so a tray or record still holding it falls back to matching by
|
||||
filament type.
|
||||
- **I need to rename a filament.** Rename the presets (adding `renamed_from`, which keeps the
|
||||
preset *name* resolving), then `--generate --vendor <Vendor>` (preview with `--dry-run`), then
|
||||
`--update-snapshot`. The id follows the new filament name; as with any identity fix, the old id
|
||||
is not forwarded.
|
||||
- **Can I reuse a `QD_*` id for a Qidi profile?** No — nobody can. It is the device protocol's
|
||||
own id space: the box composes those values at runtime and no preset carries one. Author
|
||||
Qidi filaments like any other vendor's.
|
||||
- **CI says my filament needs an id.** Run `python scripts/orca_id_tool.py --generate`, then
|
||||
`--update-snapshot`, and commit both diffs. Do not type an id by hand.
|
||||
|
||||
For general profile authoring, see the profile development guide on the
|
||||
[OrcaSlicer wiki](https://www.orcaslicer.com/wiki).
|
||||
@@ -1,111 +0,0 @@
|
||||
# Move `wxInspectable` into `DPIAware` — Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Move `wxInspector::wxInspectable` from individual leaf classes into the common `DPIAware<P>` template so every DPIAware widget is automatically inspectable and gets the inspector keyboard shortcut.
|
||||
|
||||
**Architecture:** `DPIAware<P>` gains `wxInspector::wxInspectable` as a second base class and calls `SetupInspectorAccelerator(this)` in its constructor. `DPIDialog` and `MainFrame` drop their now-redundant `wxInspectable` inheritance and `SetupInspectorAccelerator` calls.
|
||||
|
||||
**Tech Stack:** C++17, wxWidgets, wxInspector
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Build with `D:\VisualStudio\2026\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe`
|
||||
- Use `--config RelWithDebInfo` for all builds
|
||||
- Cross-platform: must compile on Windows, macOS, and Linux
|
||||
- Match existing code style: PascalCase classes, `#pragma once`
|
||||
- Do NOT commit files under `.superpowers/`
|
||||
- Do NOT commit `task.md`
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Move `wxInspectable` and `SetupInspectorAccelerator` into `DPIAware<P>`
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/slic3r/GUI/GUI_Utils.hpp:92` (DPIAware template — add wxInspectable base + SetupInspectorAccelerator call)
|
||||
- Modify: `src/slic3r/GUI/GUI_Utils.hpp:276` (DPIDialog — drop wxInspectable + SetupInspectorAccelerator)
|
||||
- Modify: `src/slic3r/GUI/MainFrame.hpp:96` (MainFrame — drop wxInspectable)
|
||||
- Modify: `src/slic3r/GUI/MainFrame.cpp:304` (MainFrame constructor — drop SetupInspectorAccelerator)
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Nothing (standalone refactor)
|
||||
- Produces: All DPIAware widgets automatically inherit `wxInspector::wxInspectable` and get Ctrl+Shift+I accelerator
|
||||
|
||||
- [ ] **Step 1: Add `wxInspectable` to `DPIAware<P>` and call `SetupInspectorAccelerator`**
|
||||
|
||||
In `src/slic3r/GUI/GUI_Utils.hpp`, line 92, change the base class:
|
||||
|
||||
```cpp
|
||||
// Before:
|
||||
template<class P> class DPIAware : public P
|
||||
// After:
|
||||
template<class P> class DPIAware : public P, public wxInspector::wxInspectable
|
||||
```
|
||||
|
||||
In the constructor body of `DPIAware<P>`, after `this->CenterOnParent();` (currently line 110), add:
|
||||
|
||||
```cpp
|
||||
SetupInspectorAccelerator(this);
|
||||
```
|
||||
|
||||
(`<wx/inspector/inspector.h>` is already included at line 23.)
|
||||
|
||||
- [ ] **Step 2: Remove redundant `wxInspectable` and `SetupInspectorAccelerator` from `DPIDialog`**
|
||||
|
||||
In `src/slic3r/GUI/GUI_Utils.hpp`, line 276, change:
|
||||
|
||||
```cpp
|
||||
// Before:
|
||||
class DPIDialog : public DPIAware<wxDialog>, public wxInspector::wxInspectable
|
||||
// After:
|
||||
class DPIDialog : public DPIAware<wxDialog>
|
||||
```
|
||||
|
||||
In the `DPIDialog` constructor body, remove the `SetupInspectorAccelerator(this);` line (currently line 286). The rest of the constructor stays.
|
||||
|
||||
- [ ] **Step 3: Remove redundant `wxInspectable` from `MainFrame`**
|
||||
|
||||
In `src/slic3r/GUI/MainFrame.hpp`, line 96, change:
|
||||
|
||||
```cpp
|
||||
// Before:
|
||||
class MainFrame : public DPIFrame, public wxInspector::wxInspectable
|
||||
// After:
|
||||
class MainFrame : public DPIFrame
|
||||
```
|
||||
|
||||
`MainFrame` now gets `wxInspectable` through `DPIFrame` → `DPIAware<wxFrame>`.
|
||||
|
||||
- [ ] **Step 4: Remove redundant `SetupInspectorAccelerator` from `MainFrame` constructor**
|
||||
|
||||
In `src/slic3r/GUI/MainFrame.cpp`, line 304, remove the line:
|
||||
|
||||
```cpp
|
||||
SetupInspectorAccelerator(this);
|
||||
```
|
||||
|
||||
It is now called automatically by the `DPIAware<wxFrame>` constructor.
|
||||
|
||||
- [ ] **Step 5: Build to verify compilation**
|
||||
|
||||
```powershell
|
||||
$cmakePath = "D:\VisualStudio\2026\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe"
|
||||
& $cmakePath --build . --config RelWithDebInfo --target ALL_BUILD -- -m
|
||||
```
|
||||
|
||||
Expected: Build succeeds with zero new errors or warnings.
|
||||
|
||||
- [ ] **Step 6: Commit**
|
||||
|
||||
```bash
|
||||
git add src/slic3r/GUI/GUI_Utils.hpp src/slic3r/GUI/MainFrame.hpp src/slic3r/GUI/MainFrame.cpp
|
||||
git commit -m "refactor: move wxInspectable and SetupInspectorAccelerator into DPIAware
|
||||
|
||||
DPIAware<P> now inherits wxInspector::wxInspectable and calls
|
||||
SetupInspectorAccelerator in its constructor, making all DPIAware
|
||||
widgets automatically appear in the inspector tree with the
|
||||
Ctrl+Shift+I shortcut. Remove redundant wxInspectable inheritance
|
||||
and SetupInspectorAccelerator calls from DPIDialog and MainFrame.
|
||||
|
||||
Co-Authored-By: Claude <noreply@anthropic.com>"
|
||||
```
|
||||
@@ -1,753 +0,0 @@
|
||||
# wxInspector Plugins for OrcaSlicer — Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Build two wxInspector plugins (DPIAware + CustomWidgets) that expose OrcaSlicer custom control properties in the inspector's property grid.
|
||||
|
||||
**Architecture:** Two plugins in a shared folder under `src/slic3r/Utils/wxInspectorPlugins/`. DPIAwarePlugin uses `dynamic_cast<DPIFrame*>/<DPIDialog*>` for detection; CustomWidgetsPlugin uses per-type `dynamic_cast`. Both registered as static singletons via a single inline function in `Registration.hpp`, called from `MainFrame` constructor.
|
||||
|
||||
**Tech Stack:** C++17, wxWidgets, wxInspector plugin API (`wx/inspector/plugin.h`, `wx/inspector/inspector.h`), OrcaSlicer custom widget headers
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Plugins placed under `src/slic3r/Utils/wxInspectorPlugins/`
|
||||
- Build with `D:\VisualStudio\2026\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe`
|
||||
- Minimal source changes: only trivial (one-line) getters/setters added to existing classes
|
||||
- Cross-platform: must compile on Windows, macOS, and Linux
|
||||
- Match existing code style: PascalCase classes, snake_case functions, `#pragma once`
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Add getters/setters to existing Orca widget headers
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/slic3r/GUI/GUI_Utils.hpp` (DPIAware template — add 4 methods)
|
||||
- Modify: `src/slic3r/GUI/Widgets/Button.hpp` (add 3 getters)
|
||||
- Modify: `src/slic3r/GUI/Widgets/CheckBox.hpp` (add 1 getter)
|
||||
- Modify: `src/slic3r/GUI/Widgets/TextInput.hpp` (add 1 getter)
|
||||
- Modify: `src/slic3r/GUI/Widgets/LabeledStaticBox.hpp` (add 4 getter declarations)
|
||||
- Modify: `src/slic3r/GUI/Widgets/LabeledStaticBox.cpp` (add 4 getter implementations)
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Nothing (prerequisite for all other tasks)
|
||||
- Produces:
|
||||
- `DPIAware<P>::set_scale_factor(float)`, `DPIAware<P>::set_prev_scale_factor(float)`, `DPIAware<P>::set_em_unit(int)`, `DPIAware<P>::force_rescale() const`
|
||||
- `Button::GetStyle()`, `Button::GetType()`, `Button::IsSelected()`
|
||||
- `CheckBox::IsHalfChecked()`
|
||||
- `TextInput::GetCornerRadius()`
|
||||
- `LabeledStaticBox::GetCornerRadius()`, `LabeledStaticBox::GetBorderWidth()`, `LabeledStaticBox::GetBorderColor()`, `LabeledStaticBox::GetScale()`
|
||||
|
||||
- [ ] **Step 1: Add DPIAware setters/getter in GUI_Utils.hpp**
|
||||
|
||||
After line 184 (`float prev_scale_factor() const { return m_prev_scale_factor; }`), add:
|
||||
|
||||
```cpp
|
||||
void set_scale_factor(float v) { m_scale_factor = v; }
|
||||
void set_prev_scale_factor(float v) { m_prev_scale_factor = v; }
|
||||
void set_em_unit(int v) { m_em_unit = v; }
|
||||
bool force_rescale() const { return m_force_rescale; }
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Add Button getters in Button.hpp**
|
||||
|
||||
After line 79 (`void SetSelected(bool selected = true) { m_selected = selected; }`), add:
|
||||
|
||||
```cpp
|
||||
ButtonStyle GetStyle() const { return m_style; }
|
||||
ButtonType GetType() const { return m_type; }
|
||||
bool IsSelected() const { return m_selected; }
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Add CheckBox getter in CheckBox.hpp**
|
||||
|
||||
After line 16 (`void SetHalfChecked(bool value = true);`), add:
|
||||
|
||||
```cpp
|
||||
bool IsHalfChecked() const { return m_half_checked; }
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Add TextInput getter in TextInput.hpp**
|
||||
|
||||
After line 44 (`void SetCornerRadius(double radius);`), add:
|
||||
|
||||
```cpp
|
||||
int GetCornerRadius() const { return static_cast<int>(radius); }
|
||||
```
|
||||
|
||||
(Note: `radius` is inherited from `StaticBox` which has it as a protected `double` member.)
|
||||
|
||||
- [ ] **Step 5: Add LabeledStaticBox getter declarations in LabeledStaticBox.hpp**
|
||||
|
||||
After line 46 (`bool Enable(bool enable) override;`), add:
|
||||
|
||||
```cpp
|
||||
int GetCornerRadius() const { return m_radius; }
|
||||
int GetBorderWidth() const { return m_border_width; }
|
||||
StateColor GetBorderColor() const { return border_color; }
|
||||
float GetScale() const { return m_scale; }
|
||||
```
|
||||
|
||||
(Note: all of `m_radius`, `m_border_width`, `border_color`, `m_scale` are protected members, accessible to inline methods.)
|
||||
|
||||
- [ ] **Step 6: Commit**
|
||||
|
||||
```bash
|
||||
git add src/slic3r/GUI/GUI_Utils.hpp src/slic3r/GUI/Widgets/Button.hpp src/slic3r/GUI/Widgets/CheckBox.hpp src/slic3r/GUI/Widgets/TextInput.hpp src/slic3r/GUI/Widgets/LabeledStaticBox.hpp
|
||||
git commit -m "feat: add getters/setters for wxInspector plugin access
|
||||
|
||||
Add minimal public accessors to DPIAware (set_scale_factor,
|
||||
set_prev_scale_factor, set_em_unit, force_rescale), Button
|
||||
(GetStyle, GetType, IsSelected), CheckBox (IsHalfChecked),
|
||||
TextInput (GetCornerRadius), and LabeledStaticBox
|
||||
(GetCornerRadius, GetBorderWidth, GetBorderColor, GetScale)."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 2: Create Registration helper header
|
||||
|
||||
**Files:**
|
||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/Registration.hpp`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Nothing (forward-declares plugin classes)
|
||||
- Produces: `RegisterOrcaInspectorPlugins()`
|
||||
|
||||
- [ ] **Step 1: Create directory**
|
||||
|
||||
```bash
|
||||
mkdir -p src/slic3r/Utils/wxInspectorPlugins
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Write Registration.hpp**
|
||||
|
||||
```cpp
|
||||
#pragma once
|
||||
|
||||
namespace wxInspector {
|
||||
class wxInspectorPlugin;
|
||||
void RegisterPlugin(wxInspectorPlugin* plugin);
|
||||
}
|
||||
|
||||
// Forward declare our plugins
|
||||
class DPIAwarePlugin;
|
||||
class CustomWidgetsPlugin;
|
||||
|
||||
inline void RegisterOrcaInspectorPlugins()
|
||||
{
|
||||
static DPIAwarePlugin dpiaware;
|
||||
static CustomWidgetsPlugin customWidgets;
|
||||
wxInspector::RegisterPlugin(&dpiaware);
|
||||
wxInspector::RegisterPlugin(&customWidgets);
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add src/slic3r/Utils/wxInspectorPlugins/Registration.hpp
|
||||
git commit -m "feat: add wxInspector plugin registration helper
|
||||
|
||||
Add RegisterOrcaInspectorPlugins() inline function that creates
|
||||
and registers the DPIAwarePlugin and CustomWidgetsPlugin as
|
||||
static instances (matching wxInspector's built-in pattern)."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 3: Create DPIAwarePlugin
|
||||
|
||||
**Files:**
|
||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/DPIAwarePlugin.hpp`
|
||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/DPIAwarePlugin.cpp`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 1 (DPIAware getters/setters), Task 2 (registration pattern)
|
||||
- Produces: `class DPIAwarePlugin : public wxInspector::wxInspectorPlugin`
|
||||
|
||||
- [ ] **Step 1: Write DPIAwarePlugin.hpp**
|
||||
|
||||
```cpp
|
||||
#pragma once
|
||||
|
||||
#include <wx/inspector/plugin.h>
|
||||
|
||||
class DPIAwarePlugin : public wxInspector::wxInspectorPlugin
|
||||
{
|
||||
public:
|
||||
wxString GetName() const override;
|
||||
|
||||
bool CanProvideProperties(wxClassInfo* info) override;
|
||||
|
||||
wxVector<wxInspector::PropertyDef> GetProperties(
|
||||
wxInspector::InspectableObject& obj) override;
|
||||
};
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Write DPIAwarePlugin.cpp**
|
||||
|
||||
```cpp
|
||||
#include "DPIAwarePlugin.hpp"
|
||||
|
||||
#include "slic3r/GUI/GUI_Utils.hpp" // DPIFrame, DPIDialog, DPIAware<P>
|
||||
|
||||
#include <wx/window.h>
|
||||
|
||||
namespace {
|
||||
|
||||
template<typename T>
|
||||
void addDPIProps(T* dpi, wxVector<wxInspector::PropertyDef>& props)
|
||||
{
|
||||
using namespace wxInspector;
|
||||
|
||||
props.push_back({"Scale Factor", "DPI Scaling", PropertyType::String,
|
||||
wxString::Format("%.2f", dpi->scale_factor()), false, {},
|
||||
[dpi]() { return wxString::Format("%.2f", dpi->scale_factor()); },
|
||||
[dpi](const wxString& v) {
|
||||
double val;
|
||||
if (wxSscanf(v, "%lf", &val) != 1) return false;
|
||||
dpi->set_scale_factor((float) val);
|
||||
return true;
|
||||
}});
|
||||
|
||||
props.push_back({"Prev Scale Factor", "DPI Scaling", PropertyType::String,
|
||||
wxString::Format("%.2f", dpi->prev_scale_factor()), false, {},
|
||||
[dpi]() { return wxString::Format("%.2f", dpi->prev_scale_factor()); },
|
||||
[dpi](const wxString& v) {
|
||||
double val;
|
||||
if (wxSscanf(v, "%lf", &val) != 1) return false;
|
||||
dpi->set_prev_scale_factor((float) val);
|
||||
return true;
|
||||
}});
|
||||
|
||||
props.push_back({"EM Unit", "DPI Scaling", PropertyType::Integer,
|
||||
wxString::Format("%d", dpi->em_unit()), false, {},
|
||||
[dpi]() { return wxString::Format("%d", dpi->em_unit()); },
|
||||
[dpi](const wxString& v) {
|
||||
long val;
|
||||
if (!v.ToLong(&val)) return false;
|
||||
dpi->set_em_unit((int) val);
|
||||
return true;
|
||||
}});
|
||||
|
||||
props.push_back({"Normal Font", "DPI Scaling", PropertyType::ReadOnly,
|
||||
dpi->normal_font().GetNativeFontInfoDesc(), true, {},
|
||||
[dpi]() { return dpi->normal_font().GetNativeFontInfoDesc(); },
|
||||
nullptr});
|
||||
|
||||
props.push_back({"Force Rescale", "DPI Scaling", PropertyType::Boolean,
|
||||
dpi->force_rescale() ? "true" : "false", true, {},
|
||||
[dpi]() { return dpi->force_rescale() ? "true" : "false"; },
|
||||
nullptr});
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
wxString DPIAwarePlugin::GetName() const
|
||||
{
|
||||
return "OrcaDPIAware";
|
||||
}
|
||||
|
||||
bool DPIAwarePlugin::CanProvideProperties(wxClassInfo* info)
|
||||
{
|
||||
return info->IsKindOf(CLASSINFO(wxWindow));
|
||||
}
|
||||
|
||||
wxVector<wxInspector::PropertyDef> DPIAwarePlugin::GetProperties(
|
||||
wxInspector::InspectableObject& obj)
|
||||
{
|
||||
wxVector<wxInspector::PropertyDef> props;
|
||||
wxWindow* win = obj.AsWindow();
|
||||
if (!win) return props;
|
||||
|
||||
if (auto* frame = dynamic_cast<DPIFrame*>(win)) {
|
||||
addDPIProps(frame, props);
|
||||
} else if (auto* dlg = dynamic_cast<DPIDialog*>(win)) {
|
||||
addDPIProps(dlg, props);
|
||||
}
|
||||
|
||||
return props;
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Commit**
|
||||
|
||||
```bash
|
||||
git add src/slic3r/Utils/wxInspectorPlugins/DPIAwarePlugin.hpp src/slic3r/Utils/wxInspectorPlugins/DPIAwarePlugin.cpp
|
||||
git commit -m "feat: add DPIAware wxInspector plugin
|
||||
|
||||
Exposes DPI scaling properties (scale_factor, prev_scale_factor,
|
||||
em_unit, normal_font, force_rescale) on DPIFrame and DPIDialog
|
||||
widgets. Uses dynamic_cast for detection and a template helper
|
||||
to capture the correct static type for lambda accessors."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 4: Create CustomWidgetsPlugin
|
||||
|
||||
**Files:**
|
||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/CustomWidgetsPlugin.hpp`
|
||||
- Create: `src/slic3r/Utils/wxInspectorPlugins/CustomWidgetsPlugin.cpp`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 1 (all widget getters), Task 2 (registration pattern)
|
||||
- Produces: `class CustomWidgetsPlugin : public wxInspector::wxInspectorPlugin`
|
||||
|
||||
- [ ] **Step 1: Write CustomWidgetsPlugin.hpp**
|
||||
|
||||
```cpp
|
||||
#pragma once
|
||||
|
||||
#include <wx/inspector/plugin.h>
|
||||
|
||||
class CustomWidgetsPlugin : public wxInspector::wxInspectorPlugin
|
||||
{
|
||||
public:
|
||||
wxString GetName() const override;
|
||||
|
||||
bool CanProvideProperties(wxClassInfo* info) override;
|
||||
|
||||
wxVector<wxInspector::PropertyDef> GetProperties(
|
||||
wxInspector::InspectableObject& obj) override;
|
||||
|
||||
private:
|
||||
void addButtonProps(class Button* btn,
|
||||
wxVector<wxInspector::PropertyDef>& props);
|
||||
void addCheckBoxProps(class CheckBox* cb,
|
||||
wxVector<wxInspector::PropertyDef>& props);
|
||||
void addTextInputProps(class TextInput* ti,
|
||||
wxVector<wxInspector::PropertyDef>& props);
|
||||
void addSwitchButtonProps(class SwitchButton* sb,
|
||||
wxVector<wxInspector::PropertyDef>& props);
|
||||
void addProgressBarProps(class ProgressBar* pb,
|
||||
wxVector<wxInspector::PropertyDef>& props);
|
||||
void addLabelProps(class Label* lbl,
|
||||
wxVector<wxInspector::PropertyDef>& props);
|
||||
void addLabeledStaticBoxProps(class LabeledStaticBox* lsb,
|
||||
wxVector<wxInspector::PropertyDef>& props);
|
||||
};
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Write CustomWidgetsPlugin.cpp — includes and GetName/CanProvideProperties**
|
||||
|
||||
```cpp
|
||||
#include "CustomWidgetsPlugin.hpp"
|
||||
|
||||
#include "slic3r/GUI/Widgets/Button.hpp"
|
||||
#include "slic3r/GUI/Widgets/CheckBox.hpp"
|
||||
#include "slic3r/GUI/Widgets/TextInput.hpp"
|
||||
#include "slic3r/GUI/Widgets/SwitchButton.hpp"
|
||||
#include "slic3r/GUI/Widgets/ProgressBar.hpp"
|
||||
#include "slic3r/GUI/Widgets/Label.hpp"
|
||||
#include "slic3r/GUI/Widgets/LabeledStaticBox.hpp"
|
||||
|
||||
#include <wx/window.h>
|
||||
#include <wx/tglbtn.h>
|
||||
|
||||
wxString CustomWidgetsPlugin::GetName() const
|
||||
{
|
||||
return "OrcaCustomWidgets";
|
||||
}
|
||||
|
||||
bool CustomWidgetsPlugin::CanProvideProperties(wxClassInfo* info)
|
||||
{
|
||||
return info->IsKindOf(CLASSINFO(wxWindow));
|
||||
}
|
||||
|
||||
wxVector<wxInspector::PropertyDef> CustomWidgetsPlugin::GetProperties(
|
||||
wxInspector::InspectableObject& obj)
|
||||
{
|
||||
wxVector<wxInspector::PropertyDef> props;
|
||||
wxWindow* win = obj.AsWindow();
|
||||
if (!win) return props;
|
||||
|
||||
if (auto* btn = dynamic_cast<Button*>(win))
|
||||
addButtonProps(btn, props);
|
||||
if (auto* cb = dynamic_cast<CheckBox*>(win))
|
||||
addCheckBoxProps(cb, props);
|
||||
if (auto* ti = dynamic_cast<TextInput*>(win))
|
||||
addTextInputProps(ti, props);
|
||||
if (auto* sb = dynamic_cast<SwitchButton*>(win))
|
||||
addSwitchButtonProps(sb, props);
|
||||
if (auto* pb = dynamic_cast<ProgressBar*>(win))
|
||||
addProgressBarProps(pb, props);
|
||||
if (auto* lbl = dynamic_cast<Label*>(win))
|
||||
addLabelProps(lbl, props);
|
||||
if (auto* lsb = dynamic_cast<LabeledStaticBox*>(win))
|
||||
addLabeledStaticBoxProps(lsb, props);
|
||||
|
||||
return props;
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Write CustomWidgetsPlugin.cpp — addButtonProps**
|
||||
|
||||
```cpp
|
||||
void CustomWidgetsPlugin::addButtonProps(Button* btn,
|
||||
wxVector<wxInspector::PropertyDef>& props)
|
||||
{
|
||||
using namespace wxInspector;
|
||||
|
||||
wxVector<wxString> styleChoices;
|
||||
styleChoices.push_back("Regular");
|
||||
styleChoices.push_back("Confirm");
|
||||
styleChoices.push_back("Alert");
|
||||
styleChoices.push_back("Disabled");
|
||||
|
||||
auto styleToStr = [](ButtonStyle s) -> wxString {
|
||||
switch (s) {
|
||||
case ButtonStyle::Regular: return "Regular";
|
||||
case ButtonStyle::Confirm: return "Confirm";
|
||||
case ButtonStyle::Alert: return "Alert";
|
||||
case ButtonStyle::Disabled: return "Disabled";
|
||||
}
|
||||
return "Regular";
|
||||
};
|
||||
|
||||
props.push_back({"Button Style", "Orca Button", PropertyType::Choice,
|
||||
styleToStr(btn->GetStyle()), false, styleChoices,
|
||||
[btn, styleToStr]() { return styleToStr(btn->GetStyle()); },
|
||||
[btn](const wxString& v) {
|
||||
ButtonStyle s = ButtonStyle::Regular;
|
||||
if (v == "Confirm") s = ButtonStyle::Confirm;
|
||||
else if (v == "Alert") s = ButtonStyle::Alert;
|
||||
else if (v == "Disabled") s = ButtonStyle::Disabled;
|
||||
btn->SetStyle(s, btn->GetType());
|
||||
return true;
|
||||
}});
|
||||
|
||||
wxVector<wxString> typeChoices;
|
||||
typeChoices.push_back("Compact");
|
||||
typeChoices.push_back("Window");
|
||||
typeChoices.push_back("Choice");
|
||||
typeChoices.push_back("Parameter");
|
||||
typeChoices.push_back("Icon");
|
||||
typeChoices.push_back("Expanded");
|
||||
|
||||
auto typeToStr = [](ButtonType t) -> wxString {
|
||||
switch (t) {
|
||||
case ButtonType::Compact: return "Compact";
|
||||
case ButtonType::Window: return "Window";
|
||||
case ButtonType::Choice: return "Choice";
|
||||
case ButtonType::Parameter: return "Parameter";
|
||||
case ButtonType::Icon: return "Icon";
|
||||
case ButtonType::Expanded: return "Expanded";
|
||||
}
|
||||
return "Compact";
|
||||
};
|
||||
|
||||
props.push_back({"Button Type", "Orca Button", PropertyType::Choice,
|
||||
typeToStr(btn->GetType()), false, typeChoices,
|
||||
[btn, typeToStr]() { return typeToStr(btn->GetType()); },
|
||||
[btn](const wxString& v) {
|
||||
ButtonType t = ButtonType::Compact;
|
||||
if (v == "Window") t = ButtonType::Window;
|
||||
else if (v == "Choice") t = ButtonType::Choice;
|
||||
else if (v == "Parameter") t = ButtonType::Parameter;
|
||||
else if (v == "Icon") t = ButtonType::Icon;
|
||||
else if (v == "Expanded") t = ButtonType::Expanded;
|
||||
btn->SetStyle(btn->GetStyle(), t);
|
||||
return true;
|
||||
}});
|
||||
|
||||
props.push_back({"Selected", "Orca Button", PropertyType::Boolean,
|
||||
btn->IsSelected() ? "true" : "false", false, {},
|
||||
[btn]() { return btn->IsSelected() ? "true" : "false"; },
|
||||
[btn](const wxString& v) {
|
||||
btn->SetSelected(v == "true");
|
||||
btn->Refresh();
|
||||
return true;
|
||||
}});
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Write CustomWidgetsPlugin.cpp — addCheckBoxProps**
|
||||
|
||||
```cpp
|
||||
void CustomWidgetsPlugin::addCheckBoxProps(CheckBox* cb,
|
||||
wxVector<wxInspector::PropertyDef>& props)
|
||||
{
|
||||
using namespace wxInspector;
|
||||
|
||||
props.push_back({"Half Checked", "Orca CheckBox", PropertyType::Boolean,
|
||||
cb->IsHalfChecked() ? "true" : "false", false, {},
|
||||
[cb]() { return cb->IsHalfChecked() ? "true" : "false"; },
|
||||
[cb](const wxString& v) {
|
||||
cb->SetHalfChecked(v == "true");
|
||||
return true;
|
||||
}});
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 5: Write CustomWidgetsPlugin.cpp — addTextInputProps**
|
||||
|
||||
```cpp
|
||||
void CustomWidgetsPlugin::addTextInputProps(TextInput* ti,
|
||||
wxVector<wxInspector::PropertyDef>& props)
|
||||
{
|
||||
using namespace wxInspector;
|
||||
|
||||
props.push_back({"Label", "Orca TextInput", PropertyType::String,
|
||||
ti->GetLabel(), false, {},
|
||||
[ti]() { return ti->GetLabel(); },
|
||||
[ti](const wxString& v) { ti->SetLabel(v); return true; }});
|
||||
|
||||
props.push_back({"Text Value", "Orca TextInput", PropertyType::String,
|
||||
ti->GetTextCtrl()->GetValue(), false, {},
|
||||
[ti]() { return ti->GetTextCtrl()->GetValue(); },
|
||||
[ti](const wxString& v) { ti->GetTextCtrl()->SetValue(v); return true; }});
|
||||
|
||||
props.push_back({"Corner Radius", "Orca TextInput", PropertyType::Integer,
|
||||
wxString::Format("%d", ti->GetCornerRadius()), false, {},
|
||||
[ti]() { return wxString::Format("%d", ti->GetCornerRadius()); },
|
||||
[ti](const wxString& v) {
|
||||
long val;
|
||||
if (!v.ToLong(&val)) return false;
|
||||
ti->SetCornerRadius((double) val);
|
||||
ti->Refresh();
|
||||
return true;
|
||||
}});
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 6: Write CustomWidgetsPlugin.cpp — addSwitchButtonProps**
|
||||
|
||||
```cpp
|
||||
void CustomWidgetsPlugin::addSwitchButtonProps(SwitchButton* sb,
|
||||
wxVector<wxInspector::PropertyDef>& props)
|
||||
{
|
||||
using namespace wxInspector;
|
||||
|
||||
props.push_back({"Value", "Orca SwitchButton", PropertyType::Boolean,
|
||||
sb->GetValue() ? "true" : "false", false, {},
|
||||
[sb]() { return sb->GetValue() ? "true" : "false"; },
|
||||
[sb](const wxString& v) {
|
||||
sb->SetValue(v == "true");
|
||||
return true;
|
||||
}});
|
||||
}
|
||||
```
|
||||
|
||||
(Note: `GetValue()` and `SetValue()` are inherited from `wxBitmapToggleButton` → `wxToggleButton`.)
|
||||
|
||||
- [ ] **Step 7: Write CustomWidgetsPlugin.cpp — addProgressBarProps**
|
||||
|
||||
```cpp
|
||||
void CustomWidgetsPlugin::addProgressBarProps(ProgressBar* pb,
|
||||
wxVector<wxInspector::PropertyDef>& props)
|
||||
{
|
||||
using namespace wxInspector;
|
||||
|
||||
props.push_back({"Proportion", "Orca ProgressBar", PropertyType::String,
|
||||
wxString::Format("%.2f", pb->m_proportion), false, {},
|
||||
[pb]() { return wxString::Format("%.2f", pb->m_proportion); },
|
||||
[pb](const wxString& v) {
|
||||
double val;
|
||||
if (wxSscanf(v, "%lf", &val) != 1) return false;
|
||||
pb->m_proportion = val;
|
||||
pb->Refresh();
|
||||
return true;
|
||||
}});
|
||||
|
||||
props.push_back({"Show Number", "Orca ProgressBar", PropertyType::Boolean,
|
||||
pb->m_shownumber ? "true" : "false", false, {},
|
||||
[pb]() { return pb->m_shownumber ? "true" : "false"; },
|
||||
[pb](const wxString& v) {
|
||||
pb->m_shownumber = (v == "true");
|
||||
pb->Refresh();
|
||||
return true;
|
||||
}});
|
||||
}
|
||||
```
|
||||
|
||||
(Note: `m_proportion` and `m_shownumber` are public members on `ProgressBar`.)
|
||||
|
||||
- [ ] **Step 8: Write CustomWidgetsPlugin.cpp — addLabelProps**
|
||||
|
||||
```cpp
|
||||
void CustomWidgetsPlugin::addLabelProps(Label* lbl,
|
||||
wxVector<wxInspector::PropertyDef>& props)
|
||||
{
|
||||
using namespace wxInspector;
|
||||
|
||||
bool isHyperlink = (lbl->GetWindowStyleFlag() & 0x0020) != 0; // LB_HYPERLINK
|
||||
|
||||
props.push_back({"Is Hyperlink", "Orca Label", PropertyType::Boolean,
|
||||
isHyperlink ? "true" : "false", true, {},
|
||||
[lbl]() {
|
||||
return (lbl->GetWindowStyleFlag() & 0x0020) ? "true" : "false";
|
||||
},
|
||||
nullptr});
|
||||
|
||||
props.push_back({"Font Point Size", "Orca Label", PropertyType::ReadOnly,
|
||||
wxString::Format("%d", lbl->GetFont().GetPointSize()), true, {},
|
||||
[lbl]() {
|
||||
return wxString::Format("%d", lbl->GetFont().GetPointSize());
|
||||
},
|
||||
nullptr});
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 9: Write CustomWidgetsPlugin.cpp — addLabeledStaticBoxProps**
|
||||
|
||||
```cpp
|
||||
void CustomWidgetsPlugin::addLabeledStaticBoxProps(LabeledStaticBox* lsb,
|
||||
wxVector<wxInspector::PropertyDef>& props)
|
||||
{
|
||||
using namespace wxInspector;
|
||||
|
||||
props.push_back({"Corner Radius", "LabeledStaticBox", PropertyType::Integer,
|
||||
wxString::Format("%d", lsb->GetCornerRadius()), false, {},
|
||||
[lsb]() { return wxString::Format("%d", lsb->GetCornerRadius()); },
|
||||
[lsb](const wxString& v) {
|
||||
long val;
|
||||
if (!v.ToLong(&val)) return false;
|
||||
lsb->SetCornerRadius((int) val);
|
||||
return true;
|
||||
}});
|
||||
|
||||
props.push_back({"Border Width", "LabeledStaticBox", PropertyType::Integer,
|
||||
wxString::Format("%d", lsb->GetBorderWidth()), false, {},
|
||||
[lsb]() { return wxString::Format("%d", lsb->GetBorderWidth()); },
|
||||
[lsb](const wxString& v) {
|
||||
long val;
|
||||
if (!v.ToLong(&val)) return false;
|
||||
lsb->SetBorderWidth((int) val);
|
||||
return true;
|
||||
}});
|
||||
|
||||
// Border Color: display as hex string
|
||||
wxColour bc = lsb->GetBorderColor().colorForStates(0);
|
||||
props.push_back({"Border Color", "LabeledStaticBox", PropertyType::String,
|
||||
bc.GetAsString(wxC2S_HTML_SYNTAX), false, {},
|
||||
[lsb]() {
|
||||
return lsb->GetBorderColor()
|
||||
.colorForStates(0)
|
||||
.GetAsString(wxC2S_HTML_SYNTAX);
|
||||
},
|
||||
[lsb](const wxString& v) {
|
||||
wxColour c(v);
|
||||
if (!c.IsOk()) return false;
|
||||
lsb->SetBorderColor(StateColor(c));
|
||||
return true;
|
||||
}});
|
||||
|
||||
props.push_back({"Scale", "LabeledStaticBox", PropertyType::ReadOnly,
|
||||
wxString::Format("%.2f", lsb->GetScale()), true, {},
|
||||
[lsb]() { return wxString::Format("%.2f", lsb->GetScale()); },
|
||||
nullptr});
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] **Step 10: Commit**
|
||||
|
||||
```bash
|
||||
git add src/slic3r/Utils/wxInspectorPlugins/CustomWidgetsPlugin.hpp src/slic3r/Utils/wxInspectorPlugins/CustomWidgetsPlugin.cpp
|
||||
git commit -m "feat: add OrcaCustomWidgets wxInspector plugin
|
||||
|
||||
Exposes Orca-specific properties on 7 widget types:
|
||||
- Button: Style, Type, Selected
|
||||
- CheckBox: Half Checked
|
||||
- TextInput: Label, Text Value, Corner Radius
|
||||
- SwitchButton: Value
|
||||
- ProgressBar: Proportion, Show Number
|
||||
- Label: Is Hyperlink, Font Point Size
|
||||
- LabeledStaticBox: Corner Radius, Border Width, Border Color, Scale
|
||||
|
||||
Each widget type uses dynamic_cast for safe detection."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 5: Wire plugins into MainFrame and CMakeLists
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/slic3r/GUI/MainFrame.cpp` (add include + registration call)
|
||||
- Modify: `src/slic3r/CMakeLists.txt` (add 4 source files)
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Tasks 1-4 (all plugins and registration helper)
|
||||
- Produces: Registered plugins available at runtime, buildable project
|
||||
|
||||
- [ ] **Step 1: Add include in MainFrame.cpp**
|
||||
|
||||
After the existing includes (around line 30, near the other Utils includes), add:
|
||||
|
||||
```cpp
|
||||
#include "slic3r/Utils/wxInspectorPlugins/Registration.hpp"
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Add registration call in MainFrame constructor**
|
||||
|
||||
After `SetupInspectorAccelerator(this);` (currently line ~303), add:
|
||||
|
||||
```cpp
|
||||
RegisterOrcaInspectorPlugins();
|
||||
```
|
||||
|
||||
- [ ] **Step 3: Add source files to CMakeLists.txt**
|
||||
|
||||
Find the `SLIC3R_GUI_SOURCES` list in `src/slic3r/CMakeLists.txt`. After the existing `Utils/*.cpp` entries (around line 650-754), add:
|
||||
|
||||
```cmake
|
||||
Utils/wxInspectorPlugins/DPIAwarePlugin.hpp
|
||||
Utils/wxInspectorPlugins/DPIAwarePlugin.cpp
|
||||
Utils/wxInspectorPlugins/CustomWidgetsPlugin.hpp
|
||||
Utils/wxInspectorPlugins/CustomWidgetsPlugin.cpp
|
||||
Utils/wxInspectorPlugins/Registration.hpp
|
||||
```
|
||||
|
||||
(Note: Add all 5 files — 2 .hpp + 2 .cpp + 1 Registration.hpp. wxWidgets cmake needs headers listed too for the resource system.)
|
||||
|
||||
- [ ] **Step 4: Commit**
|
||||
|
||||
```bash
|
||||
git add src/slic3r/GUI/MainFrame.cpp src/slic3r/CMakeLists.txt
|
||||
git commit -m "feat: wire wxInspector plugins into MainFrame and build
|
||||
|
||||
- Call RegisterOrcaInspectorPlugins() after SetupInspectorAccelerator
|
||||
- Add all plugin source files to SLIC3R_GUI_SOURCES"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 6: Build and verify
|
||||
|
||||
**Files:**
|
||||
- None modified (verification only)
|
||||
|
||||
- [ ] **Step 1: Configure the build**
|
||||
|
||||
```powershell
|
||||
$cmakePath = "D:\VisualStudio\2026\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe"
|
||||
& $cmakePath --build . --config Debug --target ALL_BUILD -- -m
|
||||
```
|
||||
|
||||
Expected: Build succeeds with zero errors and zero warnings from our new files.
|
||||
|
||||
- [ ] **Step 2: Fix any compilation errors**
|
||||
|
||||
If the build fails:
|
||||
- Check that `#include` paths resolve (the `slic3r/GUI/…` relative paths use `src/` as the include root — verify this is set up in CMake via `include_directories`)
|
||||
- Check that `ButtonStyle` and `ButtonType` enums are visible (they're defined in `Button.hpp`)
|
||||
- Check that `StateColor` constructor from `wxColour` is valid (it has `StateColor(wxColour const&)`)
|
||||
- Check that `LabeledStaticBox::GetBorderColor()` returns by value (StateColor copy is fine)
|
||||
- On macOS: static box margin removal call needs `#ifdef __WXOSX__` guard
|
||||
|
||||
- [ ] **Step 3: Launch OrcaSlicer and verify inspector**
|
||||
|
||||
Launch the built OrcaSlicer, press Ctrl+Shift+I to open the inspector:
|
||||
1. Select the MainFrame in the tree — verify "DPI Scaling" category appears with Scale Factor, Prev Scale Factor, EM Unit, Normal Font, Force Rescale
|
||||
2. Select an Orca Button — verify "Orca Button" category appears
|
||||
3. Select an Orca CheckBox — verify "Orca CheckBox" category appears
|
||||
4. Edit a property value (e.g., Scale Factor) — verify the setter applies correctly
|
||||
5. Select a LabeledStaticBox — verify corner radius, border width, border color, scale appear
|
||||
|
||||
- [ ] **Step 5: Commit (if fixes were needed) or mark complete**
|
||||
|
||||
```bash
|
||||
git status
|
||||
```
|
||||
|
||||
If clean: verification complete. If changes were made: `git add` and commit with fix message.
|
||||
@@ -1,376 +0,0 @@
|
||||
# macOS FFmpeg Media Player Implementation Plan
|
||||
|
||||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||||
|
||||
**Goal:** Make macOS use the same FFmpeg-based media player (`wxMediaCtrl3` + `AVVideoDecoder`) as Windows/Linux, linking the static FFmpeg libraries from the deps build, and remove the old `wxMediaCtrl2.mm` BambuPlayer-based player.
|
||||
|
||||
**Architecture:** The new player is platform-neutral C++ already used on Linux/Windows. Enabling it on macOS is pure build wiring: compile `wxMediaCtrl3.cpp` + `AVVideoDecoder.cpp` on macOS, drop the `__WXMAC__` alias that redirects `wxMediaCtrl3` to the old `wxMediaCtrl2`, and link static FFmpeg (`libavcodec.a`/`libswscale.a`/`libavutil.a`) from the deps install. The Bambu stream API is dlsym'd at runtime from the network plugin (`libBambuSource.dylib`), which already exports it — no plugin changes needed. Rendering reuses the existing `wxImage` → `DrawBitmap` paint path (same as Linux).
|
||||
|
||||
**Tech Stack:** C++17, wxWidgets, CMake, FFmpeg 7.0.3 (libavcodec/libswscale/libavutil), macOS (Xcode generator), `deps/` ExternalProject build system.
|
||||
|
||||
## Global Constraints
|
||||
|
||||
- Branch: `dev/ffmpeg-player-macos`. Commit after every task.
|
||||
- **Linux and Windows builds must not change** — the FFmpeg deps flag change is guarded by `APPLE`; Linux keeps `--enable-shared`, Windows keeps its prebuilt DLL zips.
|
||||
- Static FFmpeg only on macOS: deps produce `libavcodec.a`/`libswscale.a`/`libavutil.a`; the app links those explicitly — the app binary must have **no** `libav*` dylib references (`otool -L` check).
|
||||
- Follow existing code style: PascalCase classes, snake_case functions, C++17.
|
||||
- No changes to `StatusPanel.cpp`, `MediaPlayCtrl.*`, or the BambuTunnel interface — the app already creates `wxMediaCtrl3` and uses only its public interface.
|
||||
- The player cannot be unit-tested (hardware/plugin-dependent GUI code); verification is build-level, link-level, and manual runtime on a Mac.
|
||||
- `localization/i18n/list.txt` references only `wxMediaCtrl2.cpp` (Win/Linux, stays) — no translation-list changes needed.
|
||||
- Build dirs on the dev machine: main app = `build_arm64/` (Xcode generator, multi-config), deps = `deps/build/arm64/` (Unix Makefiles). App target name: `OrcaSlicer`. Substitute your own configured build dirs where noted.
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Enable wxMediaCtrl3 on macOS and link static FFmpeg
|
||||
|
||||
**Files:**
|
||||
- Modify: `src/slic3r/GUI/wxMediaCtrl3.h` (lines 18–22: the `#ifdef __WXMAC__` alias branch)
|
||||
- Modify: `src/slic3r/GUI/wxMediaCtrl3.cpp:13` (uncomment the event define)
|
||||
- Modify: `src/slic3r/GUI/wxMediaCtrl2.cpp:101` (remove the event define)
|
||||
- Modify: `src/slic3r/CMakeLists.txt` (APPLE source list ~lines 779–792; FFmpeg link block ~lines 905–910)
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: nothing new (all classes already exist).
|
||||
- Produces: `wxMediaCtrl3` class compiled on macOS with the same interface as Linux/Windows — `Load(wxURI)`, `Play()`, `Stop()`, `SetIdleImage(wxString)`, `GetState()`, `GetLastError()`, `GetVideoSize()`, event `EVT_MEDIA_CTRL_STAT` defined once in the lib (from `wxMediaCtrl3.cpp`).
|
||||
|
||||
- [ ] **Step 1: Remove the macOS alias in wxMediaCtrl3.h**
|
||||
|
||||
Current (lines 16–23 of `src/slic3r/GUI/wxMediaCtrl3.h`):
|
||||
|
||||
```cpp
|
||||
void wxMediaCtrl_OnSize(wxWindow * ctrl, wxSize const & videoSize, int width, int height);
|
||||
|
||||
#ifdef __WXMAC__
|
||||
|
||||
#include "wxMediaCtrl2.h"
|
||||
#define wxMediaCtrl3 wxMediaCtrl2
|
||||
|
||||
#else
|
||||
|
||||
#define BAMBU_DYNAMIC
|
||||
```
|
||||
|
||||
New:
|
||||
|
||||
```cpp
|
||||
void wxMediaCtrl_OnSize(wxWindow * ctrl, wxSize const & videoSize, int width, int height);
|
||||
|
||||
#define BAMBU_DYNAMIC
|
||||
```
|
||||
|
||||
Also remove the matching `#endif` that closed the `#else` branch (the one before the final `#endif /* wxMediaCtrl3_h */`), so the file's `#ifndef`/`#endif` guard pair stays balanced.
|
||||
|
||||
- [ ] **Step 2: Move the EVT_MEDIA_CTRL_STAT definition into wxMediaCtrl3.cpp**
|
||||
|
||||
In `src/slic3r/GUI/wxMediaCtrl3.cpp:13`, uncomment:
|
||||
|
||||
```cpp
|
||||
//wxDEFINE_EVENT(EVT_MEDIA_CTRL_STAT, wxCommandEvent);
|
||||
```
|
||||
|
||||
becomes:
|
||||
|
||||
```cpp
|
||||
wxDEFINE_EVENT(EVT_MEDIA_CTRL_STAT, wxCommandEvent);
|
||||
```
|
||||
|
||||
In `src/slic3r/GUI/wxMediaCtrl2.cpp:101`, delete:
|
||||
|
||||
```cpp
|
||||
wxDEFINE_EVENT(EVT_MEDIA_CTRL_STAT, wxCommandEvent);
|
||||
```
|
||||
|
||||
(One definition total in the lib — `MediaPlayCtrl.cpp:59` binds this event on the media ctrl.)
|
||||
|
||||
- [ ] **Step 3: Update the APPLE source list in CMakeLists.txt**
|
||||
|
||||
In `src/slic3r/CMakeLists.txt`, the APPLE branch (currently compiles `wxMediaCtrl2.mm`, which becomes dead on macOS):
|
||||
|
||||
```cmake
|
||||
GUI/wxMediaCtrl2.mm
|
||||
GUI/wxMediaCtrl2.h
|
||||
GUI/wxMediaCtrl3.h
|
||||
)
|
||||
```
|
||||
|
||||
becomes:
|
||||
|
||||
```cmake
|
||||
GUI/AVVideoDecoder.cpp
|
||||
GUI/AVVideoDecoder.hpp
|
||||
GUI/wxMediaCtrl3.cpp
|
||||
GUI/wxMediaCtrl3.h
|
||||
)
|
||||
```
|
||||
|
||||
(The `else ()` branch — Win/Linux — stays exactly as it is.)
|
||||
|
||||
- [ ] **Step 4: Link static FFmpeg on macOS**
|
||||
|
||||
In `src/slic3r/CMakeLists.txt`, the FFmpeg block (currently `if (NOT APPLE)`):
|
||||
|
||||
```cmake
|
||||
if (NOT APPLE)
|
||||
pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET
|
||||
libavcodec
|
||||
libswscale
|
||||
libavutil
|
||||
)
|
||||
target_link_libraries(libslic3r_gui PkgConfig::LIBAV)
|
||||
endif()
|
||||
```
|
||||
|
||||
becomes:
|
||||
|
||||
```cmake
|
||||
if (APPLE)
|
||||
# Static FFmpeg from the deps install: nothing to bundle into the .app,
|
||||
# no rpath/install_name handling. Order matters: avcodec -> swscale -> avutil.
|
||||
find_library(LIBAVCODEC_LIBRARY NAMES libavcodec.a PATHS ${CMAKE_PREFIX_PATH}/lib NO_DEFAULT_PATH)
|
||||
find_library(LIBSWSCALE_LIBRARY NAMES libswscale.a PATHS ${CMAKE_PREFIX_PATH}/lib NO_DEFAULT_PATH)
|
||||
find_library(LIBAVUTIL_LIBRARY NAMES libavutil.a PATHS ${CMAKE_PREFIX_PATH}/lib NO_DEFAULT_PATH)
|
||||
target_link_libraries(libslic3r_gui ${LIBAVCODEC_LIBRARY} ${LIBSWSCALE_LIBRARY} ${LIBAVUTIL_LIBRARY})
|
||||
target_include_directories(libslic3r_gui SYSTEM PRIVATE ${CMAKE_PREFIX_PATH}/include)
|
||||
else ()
|
||||
pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET
|
||||
libavcodec
|
||||
libswscale
|
||||
libavutil
|
||||
)
|
||||
target_link_libraries(libslic3r_gui PkgConfig::LIBAV)
|
||||
endif()
|
||||
```
|
||||
|
||||
The deps install (`${CMAKE_PREFIX_PATH}/lib`) already contains the three `.a` files from the existing arm64 deps build — no deps rebuild needed for this task.
|
||||
|
||||
- [ ] **Step 5: Reconfigure and build the app**
|
||||
|
||||
Run (Xcode generator; `cmake` re-runs automatically on build):
|
||||
|
||||
```bash
|
||||
cmake --build build_arm64 --config RelWithDebInfo --target OrcaSlicer
|
||||
```
|
||||
|
||||
Expected: configure succeeds (no `pkg_check_modules` errors on macOS, `find_library` finds all three `.a` files), compile succeeds (`wxMediaCtrl3.cpp` and `AVVideoDecoder.cpp` compile on macOS without changes), link succeeds.
|
||||
|
||||
If CMake complains that `wxMediaCtrl3.h` is included but not in the source list or similar IDE-only warnings — ignore; headers in the list are cosmetic.
|
||||
|
||||
- [ ] **Step 6: Verify no dynamic FFmpeg dependency**
|
||||
|
||||
```bash
|
||||
otool -L build_arm64/src/RelWithDebInfo/OrcaSlicer.app/Contents/MacOS/OrcaSlicer | grep -i "libav" || echo "OK: no dynamic FFmpeg"
|
||||
```
|
||||
|
||||
Expected: prints `OK: no dynamic FFmpeg` (empty grep output). This is the whole point of static linking — nothing to bundle into the `.app`.
|
||||
|
||||
- [ ] **Step 7: Quick sanity — macOS unit tests still pass**
|
||||
|
||||
```bash
|
||||
ctest --test-dir build_arm64/tests/libslic3r --output-on-failure
|
||||
```
|
||||
|
||||
Expected: passes (add `-C RelWithDebInfo` if the multi-config generator requires it). If no tests were built in this build dir, build target `tests` first (`cmake --build build_arm64 --config RelWithDebInfo --target tests`).
|
||||
|
||||
- [ ] **Step 8: Commit**
|
||||
|
||||
```bash
|
||||
git add src/slic3r/CMakeLists.txt src/slic3r/GUI/wxMediaCtrl3.h src/slic3r/GUI/wxMediaCtrl3.cpp src/slic3r/GUI/wxMediaCtrl2.cpp
|
||||
git commit -m "feat: use FFmpeg media player on macOS with static FFmpeg"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 2: Static-only FFmpeg in the macOS deps build
|
||||
|
||||
**Files:**
|
||||
- Modify: `deps/FFMPEG/FFMPEG.cmake` (non-MSVC branch, APPLE section and CONFIGURE_COMMAND)
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: nothing.
|
||||
- Produces: a deps install on macOS containing only `libavcodec.a`, `libswscale.a`, `libavutil.a` (+ headers) — no `libav*` dylibs, so no bundling/rpath machinery is ever needed on macOS. Linux and Windows output are unchanged.
|
||||
|
||||
- [ ] **Step 1: Add the static flag variable**
|
||||
|
||||
In `deps/FFMPEG/FFMPEG.cmake`, inside the non-MSVC `else ()` branch, in the existing `if (APPLE)` block:
|
||||
|
||||
```cmake
|
||||
if (APPLE)
|
||||
set(_minos_cmd
|
||||
"CFLAGS=-mmacosx-version-min=${DEP_OSX_TARGET}"
|
||||
"LDFLAGS=-mmacosx-version-min=${DEP_OSX_TARGET}"
|
||||
)
|
||||
```
|
||||
|
||||
add after the `_minos_cmd` set:
|
||||
|
||||
```cmake
|
||||
# Static FFmpeg: nothing to bundle into the .app, no rpath handling.
|
||||
# Shared flags must come AFTER --enable-shared below so they win.
|
||||
set(_link_cmd --enable-static --disable-shared)
|
||||
```
|
||||
|
||||
and add a matching `else ()` after the `if (IS_CROSS_COMPILE) ... endif()` block inside that `if (APPLE)`, so non-Apple Unix keeps shared:
|
||||
|
||||
```cmake
|
||||
else ()
|
||||
set(_link_cmd --enable-shared)
|
||||
endif ()
|
||||
```
|
||||
|
||||
(If the existing `if (IS_CROSS_COMPILE)` block is the last thing inside `if (APPLE)`, the new `else ()` closes the `if (APPLE)` itself.)
|
||||
|
||||
- [ ] **Step 2: Use the variable in CONFIGURE_COMMAND**
|
||||
|
||||
In the `ExternalProject_Add(dep_FFMPEG ...)` configure command:
|
||||
|
||||
```cmake
|
||||
"--prefix=${DESTDIR}"
|
||||
--enable-shared
|
||||
```
|
||||
|
||||
becomes:
|
||||
|
||||
```cmake
|
||||
"--prefix=${DESTDIR}"
|
||||
--enable-shared
|
||||
${_link_cmd}
|
||||
```
|
||||
|
||||
Order matters: `--enable-shared` comes first, then `--enable-static --disable-shared` (APPLE) or `--enable-shared` (Linux) — the last flag wins in FFmpeg configure.
|
||||
|
||||
- [ ] **Step 3: Rebuild the FFmpeg dep (slow — several minutes, run in background)**
|
||||
|
||||
The changed CONFIGURE_COMMAND invalidates the ExternalProject stamp, so this re-configures and rebuilds FFmpeg:
|
||||
|
||||
```bash
|
||||
cmake --build deps/build/arm64 --target dep_FFMPEG
|
||||
```
|
||||
|
||||
For a fully clean static-only check (removes the previous shared build tree, which can leave stale `.dylib` files behind in the in-source build):
|
||||
|
||||
```bash
|
||||
rm -rf deps/build/arm64/dep_FFMPEG-prefix
|
||||
cmake --build deps/build/arm64 --target dep_FFMPEG
|
||||
```
|
||||
|
||||
- [ ] **Step 4: Verify the artifacts**
|
||||
|
||||
```bash
|
||||
ls deps/build/arm64/dep_FFMPEG-prefix/src/dep_FFMPEG/libavcodec/*.a
|
||||
ls deps/build/arm64/dep_FFMPEG-prefix/src/dep_FFMPEG/libavcodec/*.dylib 2>/dev/null || echo "OK: no dylibs"
|
||||
```
|
||||
|
||||
Expected: `libavcodec.a` present, second command prints `OK: no dylibs`. Check `libavutil` and `libswscale` the same way.
|
||||
|
||||
- [ ] **Step 5: Verify the app still links against the static libs**
|
||||
|
||||
```bash
|
||||
cmake --build build_arm64 --config RelWithDebInfo --target OrcaSlicer
|
||||
otool -L build_arm64/src/RelWithDebInfo/OrcaSlicer.app/Contents/MacOS/OrcaSlicer | grep -i "libav" || echo "OK: no dynamic FFmpeg"
|
||||
```
|
||||
|
||||
Expected: build succeeds, `OK: no dynamic FFmpeg`.
|
||||
|
||||
- [ ] **Step 6: Commit**
|
||||
|
||||
```bash
|
||||
git add deps/FFMPEG/FFMPEG.cmake
|
||||
git commit -m "build: build static-only FFmpeg for macOS deps"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 3: Remove the old macOS player
|
||||
|
||||
**Files:**
|
||||
- Delete: `src/slic3r/GUI/wxMediaCtrl2.mm`
|
||||
- Delete: `src/slic3r/GUI/BambuPlayer/BambuPlayer.h` (and the empty `BambuPlayer/` dir)
|
||||
- Modify: `src/slic3r/GUI/wxMediaCtrl2.h` (remove the `#ifdef __WXMAC__` section, lines 22–60)
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: Task 1 (macOS no longer references `wxMediaCtrl2` — nothing includes `wxMediaCtrl2.h` on macOS anymore; `wxMediaCtrl2` is never instantiated on any platform).
|
||||
- Produces: a clean tree where the old BambuPlayer-based player is gone from macOS. The `BambuPlayer` ObjC class itself remains inside the network plugin (external prebuilt binary) — only the GUI-side consumer is removed.
|
||||
|
||||
- [ ] **Step 1: Delete the old player files**
|
||||
|
||||
```bash
|
||||
git rm src/slic3r/GUI/wxMediaCtrl2.mm
|
||||
git rm src/slic3r/GUI/BambuPlayer/BambuPlayer.h
|
||||
rmdir src/slic3r/GUI/BambuPlayer 2>/dev/null || true
|
||||
```
|
||||
|
||||
- [ ] **Step 2: Strip the __WXMAC__ section from wxMediaCtrl2.h**
|
||||
|
||||
In `src/slic3r/GUI/wxMediaCtrl2.h`, remove the entire macOS branch of the `#ifdef __WXMAC__` guard — from `#ifdef __WXMAC__` (line 22) through the closing `};` of the mac class (line 60), and the `#else` marker — leaving only the non-mac `class wxMediaCtrl2 : public wxMediaCtrl { ... };` definition followed by the final `#endif /* wxMediaCtrl2_h */`. The resulting file keeps its `#ifndef`/`#endif` include guard pair balanced.
|
||||
|
||||
The file stays on disk because Win/Linux compile `wxMediaCtrl2.cpp`, which includes it.
|
||||
|
||||
- [ ] **Step 3: Grep for leftover references**
|
||||
|
||||
```bash
|
||||
grep -rn "wxMediaCtrl2.mm\|BambuPlayer/BambuPlayer.h\|BambuPlayer" src/slic3r --include="*.cpp" --include="*.h" --include="*.mm" --include="*.txt"
|
||||
```
|
||||
|
||||
Expected: no hits in `src/slic3r/GUI` (ignore `localization/i18n/list.txt:196`, which lists the Win/Linux `wxMediaCtrl2.cpp` and stays).
|
||||
|
||||
- [ ] **Step 4: Rebuild the app**
|
||||
|
||||
```bash
|
||||
cmake --build build_arm64 --config RelWithDebInfo --target OrcaSlicer
|
||||
```
|
||||
|
||||
Expected: configure + compile + link succeed with the deleted files gone.
|
||||
|
||||
- [ ] **Step 5: Commit**
|
||||
|
||||
```bash
|
||||
git add -A src/slic3r/GUI
|
||||
git commit -m "refactor: remove old BambuPlayer-based media player from macOS"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Task 4: Runtime verification on hardware
|
||||
|
||||
**Files:** none — manual verification.
|
||||
|
||||
**Interfaces:** consumes all prior tasks. Final gate: the new player must actually stream on a Mac.
|
||||
|
||||
- [ ] **Step 1: Launch the freshly built app**
|
||||
|
||||
```bash
|
||||
open build_arm64/src/RelWithDebInfo/OrcaSlicer.app
|
||||
```
|
||||
|
||||
Expected: app launches normally; no crash in the network/device subsystem.
|
||||
|
||||
- [ ] **Step 2: Load the network plugin and open the Device tab**
|
||||
|
||||
Log in / ensure the network plugin (`libBambuSource.dylib`) loads, select a printer, open the Device tab (camera monitoring panel).
|
||||
|
||||
Expected: the camera preview area shows the idle image initially (no crash — this exercises `wxMediaCtrl3::SetIdleImage` and the `wxImage` load path on macOS for the first time).
|
||||
|
||||
- [ ] **Step 3: Start the stream and watch it render**
|
||||
|
||||
Click play / wait for `MediaPlayCtrl` to start the stream.
|
||||
|
||||
Expected: live video renders in the panel. Check the console/log output (`BOOST_LOG` goes to the terminal if run from it, or check the log file):
|
||||
- `stat_log ...` lines appear (the `EVT_MEDIA_CTRL_STAT` path is live — proves the Bambu C API dlsym worked from `libBambuSource.dylib`);
|
||||
- no repeated decode/error messages like `AVVideoDecoder: ...` or `can not find function ...` (proves `StaticBambuLib::get` resolved all Bambu functions);
|
||||
- Stop/Play toggle works; idle image reappears on stop;
|
||||
- window resize keeps aspect ratio (exercises `DoSetSize`/`adjust_frame_size`/`paintEvent`).
|
||||
|
||||
- [ ] **Step 4: Confirm the old player is really gone**
|
||||
|
||||
Expected: nothing in the logs references `BambuPlayer` (the ObjC class is no longer dlsym'd); the video path is entirely `wxMediaCtrl3` + `AVVideoDecoder`.
|
||||
|
||||
If a printer is unavailable, at minimum verify Steps 1–2 (launch + idle image) and note in the PR that live-stream verification needs hardware.
|
||||
|
||||
- [ ] **Step 5: Final review pass**
|
||||
|
||||
```bash
|
||||
git log --oneline -6
|
||||
git show --stat HEAD # and each of the three task commits
|
||||
```
|
||||
|
||||
Expected: the last 4 commits are the design doc + the 3 implementation tasks (each task commit touches only its listed files). Review the diff for scope: no Linux/Windows changes beyond the two `EVT_MEDIA_CTRL_STAT` lines in Task 1, no `StatusPanel`/`MediaPlayCtrl` changes.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,102 +0,0 @@
|
||||
# Move `wxInspectable` into `DPIAware` — Design Spec
|
||||
|
||||
Date: 2026-07-23
|
||||
Branch: `dev/layout-inspector`
|
||||
|
||||
## Overview
|
||||
|
||||
Move the `wxInspector::wxInspectable` base class from individual leaf classes (`DPIDialog`, `MainFrame`) into the common `DPIAware<P>` template. This makes every DPIAware widget automatically visible in the inspector tree without requiring each subclass to opt in.
|
||||
|
||||
## Motivation
|
||||
|
||||
Currently, only `DPIDialog` and `MainFrame` explicitly inherit `wxInspectable`. `DPIFrame` (which `MainFrame` inherits from) does not — `MainFrame` adds it manually. This means:
|
||||
|
||||
- Any `DPIAware<T>` widget that isn't `DPIDialog` or `MainFrame` is invisible in the inspector tree
|
||||
- `DPIFrame` subclasses (`BaseTransparentDPIFrame`, `ImageDPIFrame`, `ModelMallDialog`, `MediaFileFrame`, `SecondaryCheckDialog`, `PrintErrorDialog`, etc.) don't appear
|
||||
- Adding a new DPIAware widget type requires remembering to also inherit `wxInspectable`
|
||||
|
||||
Moving `wxInspectable` to `DPIAware` fixes this for all current and future DPIAware widgets at once.
|
||||
|
||||
## Design
|
||||
|
||||
### Change 1: `GUI_Utils.hpp` — `DPIAware<P>`
|
||||
|
||||
Add `wxInspector::wxInspectable` as a second base class, and call `SetupInspectorAccelerator(this)` in the constructor (after `this->CenterOnParent()`):
|
||||
|
||||
```cpp
|
||||
// Before:
|
||||
template<class P> class DPIAware : public P
|
||||
|
||||
// After:
|
||||
template<class P> class DPIAware : public P, public wxInspector::wxInspectable
|
||||
```
|
||||
|
||||
Add in the constructor body (after `this->CenterOnParent()` at line 110):
|
||||
```cpp
|
||||
SetupInspectorAccelerator(this);
|
||||
```
|
||||
|
||||
This gives every `DPIAware<T>` widget both inspectability and the Ctrl+Shift+I keyboard shortcut automatically. `#include <wx/inspector/inspector.h>` is already present in the file.
|
||||
|
||||
### Change 2: `GUI_Utils.hpp` — `DPIDialog`
|
||||
|
||||
Remove the now-redundant `wxInspector::wxInspectable` and the `SetupInspectorAccelerator(this)` call:
|
||||
|
||||
```cpp
|
||||
// Before:
|
||||
class DPIDialog : public DPIAware<wxDialog>, public wxInspector::wxInspectable
|
||||
// ...
|
||||
SetupInspectorAccelerator(this);
|
||||
|
||||
// After:
|
||||
class DPIDialog : public DPIAware<wxDialog>
|
||||
// (SetupInspectorAccelerator call removed — now done in DPIAware constructor)
|
||||
```
|
||||
|
||||
`DPIDialog` gets `wxInspectable` and the accelerator through `DPIAware<wxDialog>` now.
|
||||
|
||||
### Change 3: `MainFrame.hpp` — `MainFrame`
|
||||
|
||||
Remove the now-redundant `wxInspector::wxInspectable`:
|
||||
|
||||
```cpp
|
||||
// Before:
|
||||
class MainFrame : public DPIFrame, public wxInspector::wxInspectable
|
||||
|
||||
// After:
|
||||
class MainFrame : public DPIFrame
|
||||
```
|
||||
|
||||
`MainFrame` gets `wxInspectable` through `DPIFrame` → `DPIAware<wxFrame>`.
|
||||
|
||||
### Change 4: `MainFrame.cpp` — `MainFrame` constructor
|
||||
|
||||
Remove the now-redundant `SetupInspectorAccelerator(this)` call (line 304). It will be called automatically by the `DPIAware` constructor.
|
||||
|
||||
## Impact
|
||||
|
||||
| Widget | Before | After |
|
||||
|--------|--------|-------|
|
||||
| `DPIDialog` subclasses (~80) | ✓ inspectable | ✓ inspectable (transitive) |
|
||||
| `MainFrame` | ✓ inspectable | ✓ inspectable (transitive) |
|
||||
| `DPIFrame` subclasses (8 others) | ✗ invisible | ✓ inspectable |
|
||||
| Future `DPIAware<T>` | ✗ invisible | ✓ inspectable |
|
||||
|
||||
## Files Modified
|
||||
|
||||
| File | Change |
|
||||
|------|--------|
|
||||
| `src/slic3r/GUI/GUI_Utils.hpp` | `DPIAware<P>` gains `wxInspector::wxInspectable` + `SetupInspectorAccelerator(this)` call; `DPIDialog` drops redundant `wxInspector::wxInspectable` and `SetupInspectorAccelerator(this)` |
|
||||
| `src/slic3r/GUI/MainFrame.hpp` | `MainFrame` drops redundant `wxInspector::wxInspectable` |
|
||||
| `src/slic3r/GUI/MainFrame.cpp` | Remove redundant `SetupInspectorAccelerator(this)` from MainFrame constructor |
|
||||
|
||||
## Non-Goals
|
||||
|
||||
- The `DPIAwarePlugin` detection logic (`dynamic_cast<DPIFrame*>` / `dynamic_cast<DPIDialog*>`) is unchanged
|
||||
- No new DPI properties — this is purely about tree visibility and accelerator setup
|
||||
|
||||
## Risk Assessment
|
||||
|
||||
- **Multiple inheritance**: `DPIAware<P>` already has a vtable (virtual destructor). Adding `wxInspectable` adds a second base but no additional data members. The `wxInspector::wxInspectable` class is expected to be a lightweight marker interface.
|
||||
- **Build**: No new includes needed; `<wx/inspector/inspector.h>` is already included in `GUI_Utils.hpp`.
|
||||
- **Cross-platform**: The change is standard C++ multiple inheritance — no platform-specific concerns.
|
||||
@@ -1,244 +0,0 @@
|
||||
# wxInspector Plugins for OrcaSlicer Custom Controls — Design Spec
|
||||
|
||||
Date: 2026-07-23
|
||||
Branch: `dev/layout-inspector`
|
||||
|
||||
## Overview
|
||||
|
||||
Create wxInspector plugins that expose OrcaSlicer's custom widget properties in the inspector's property grid. Without these plugins, the inspector shows only generic wxWidgets properties — missing all DPI-awareness data, custom styling, and Orca-specific control state.
|
||||
|
||||
## Goals
|
||||
|
||||
1. **DPIAware properties** — Inspect and update `scale_factor`, `prev_scale_factor`, `em_unit`, and `normal_font` on any DPIAware-derived widget
|
||||
2. **Custom widget properties** — Surface Orca-specific properties on `Button`, `CheckBox`, `TextInput`, `SwitchButton`, `ProgressBar`, `Label`, and `LabeledStaticBox`
|
||||
3. **Minimal source changes** — Only add trivial (one-line) getters/setters to existing classes; no architectural refactoring of Orca's widget hierarchy
|
||||
|
||||
## Non-Goals
|
||||
|
||||
- Custom inspector panels or AUI tabs (use the existing property grid and method invoker)
|
||||
- Python-plugin integration (this is C++ wxInspector, not Orca's Python plugin system)
|
||||
- Event logging customization (the built-in event logger already works)
|
||||
|
||||
## Architecture
|
||||
|
||||
### Two Plugins
|
||||
|
||||
| Plugin | Class | Files |
|
||||
|--------|-------|-------|
|
||||
| DPIAware plugin | `DPIAwarePlugin` | `DPIAwarePlugin.hpp`, `DPIAwarePlugin.cpp` |
|
||||
| Custom widgets plugin | `CustomWidgetsPlugin` | `CustomWidgetsPlugin.hpp`, `CustomWidgetsPlugin.cpp` |
|
||||
| Registration helper | inline function | `Registration.hpp` |
|
||||
|
||||
All files live under `src/slic3r/Utils/wxInspectorPlugins/`.
|
||||
|
||||
### Plugin Detection Strategy
|
||||
|
||||
**DPIAware plugin**: Uses `dynamic_cast<DPIFrame*>` and `dynamic_cast<DPIDialog*>` as detection gates. `DPIFrame` = `DPIAware<wxFrame>`, `DPIDialog` = `DPIAware<wxDialog>`. Since these are concrete typedefs, `dynamic_cast` works at runtime. This covers `MainFrame`, `SettingsDialog`, and all 8 calibration dialogs (which inherit `DPIDialog`).
|
||||
|
||||
**Custom widgets plugin**: Gates broadly on `CLASSINFO(wxWindow)`, then uses per-type `dynamic_cast` inside `GetProperties` to check each Orca-specific type. Only matching types append properties.
|
||||
|
||||
### Registration
|
||||
|
||||
A single `RegisterOrcaInspectorPlugins()` inline function in `Registration.hpp` creates both plugins as function-local statics (matching the wxInspector built-in provider pattern) and registers them via `wxInspector::RegisterPlugin()`.
|
||||
|
||||
Called once from `MainFrame::MainFrame()` after `SetupInspectorAccelerator(this)`.
|
||||
|
||||
### Why Separate Plugins?
|
||||
|
||||
- DPIAware is a C++ template concept (not a wxClassInfo-isKindOf check), so it needs its own detection logic
|
||||
- Custom widgets use standard wxClassInfo-based detection, matching the built-in provider pattern
|
||||
- Two focused files are easier to review and maintain than one monolithic plugin
|
||||
- Compile-time failure isolation: if a widget header changes, only one plugin breaks
|
||||
|
||||
## DPIAware Plugin — Property Specification
|
||||
|
||||
### Source Changes (GUI_Utils.hpp)
|
||||
|
||||
Four one-liner methods added to the `DPIAware<P>` template class (public section):
|
||||
|
||||
```cpp
|
||||
float scale_factor() const { return m_scale_factor; } // already exists
|
||||
float prev_scale_factor() const { return m_prev_scale_factor; } // already exists
|
||||
int em_unit() const { return m_em_unit; } // already exists
|
||||
void set_scale_factor(float v) { m_scale_factor = v; } // NEW
|
||||
void set_prev_scale_factor(float v) { m_prev_scale_factor = v; } // NEW
|
||||
void set_em_unit(int v) { m_em_unit = v; } // NEW
|
||||
bool force_rescale() const { return m_force_rescale; } // NEW
|
||||
// m_normal_font getter already exists: normal_font()
|
||||
```
|
||||
|
||||
### Detection
|
||||
|
||||
```cpp
|
||||
bool CanProvideProperties(wxClassInfo* info) override {
|
||||
// Gated in GetProperties via dynamic_cast on the window itself
|
||||
return info->IsKindOf(CLASSINFO(wxWindow));
|
||||
}
|
||||
```
|
||||
|
||||
In `GetProperties`:
|
||||
```cpp
|
||||
auto* win = obj.AsWindow();
|
||||
bool isDPI = dynamic_cast<DPIFrame*>(win) || dynamic_cast<DPIDialog*>(win);
|
||||
if (!isDPI) return props;
|
||||
```
|
||||
|
||||
### Property Table (category: "DPI Scaling")
|
||||
|
||||
| Name | Type | Editable | Getter | Setter |
|
||||
|------|------|----------|--------|--------|
|
||||
| Scale Factor | String (float) | Yes | `dpi->scale_factor()` | `dpi->set_scale_factor(v)` |
|
||||
| Prev Scale Factor | String (float) | Yes | `dpi->prev_scale_factor()` | `dpi->set_prev_scale_factor(v)` |
|
||||
| EM Unit | Integer | Yes | `dpi->em_unit()` | `dpi->set_em_unit(v)` |
|
||||
| Normal Font | ReadOnly | No | `dpi->normal_font().GetNativeFontInfoDesc()` | — |
|
||||
| Force Rescale | Boolean (ReadOnly) | No | `dpi->force_rescale()` | — |
|
||||
|
||||
**Note on setters**: The setters simply store values. They do NOT trigger a widget rescale/layout. To see the effect of a changed scale factor, use the inspector's Methods panel to call `Layout()` or resize the window — which triggers the DPI_CHANGED event path naturally.
|
||||
|
||||
## Custom Widgets Plugin — Property Specification
|
||||
|
||||
All properties are appended to the built-in wxWindow properties. Each widget type is independently detected via `dynamic_cast`.
|
||||
|
||||
### Detection gates (in `GetProperties`)
|
||||
|
||||
```cpp
|
||||
auto* win = obj.AsWindow();
|
||||
if (auto* btn = dynamic_cast<Button*>(win)) { addButtonProperties(btn, props); }
|
||||
if (auto* cb = dynamic_cast<CheckBox*>(win)) { addCheckBoxProperties(cb, props); }
|
||||
if (auto* ti = dynamic_cast<TextInput*>(win)) { addTextInputProperties(ti, props); }
|
||||
if (auto* sb = dynamic_cast<SwitchButton*>(win)) { addSwitchButtonProperties(sb, props); }
|
||||
if (auto* pb = dynamic_cast<ProgressBar*>(win)) { addProgressBarProperties(pb, props); }
|
||||
if (auto* lbl = dynamic_cast<Label*>(win)) { addLabelProperties(lbl, props); }
|
||||
if (auto* lsb = dynamic_cast<LabeledStaticBox*>(win)) { addLabeledStaticBoxProperties(lsb, props); }
|
||||
```
|
||||
|
||||
### Orca Button (`Button`) — category: "Orca Button"
|
||||
|
||||
| Name | Type | Editable | Getter | Setter |
|
||||
|------|------|----------|--------|--------|
|
||||
| Button Style | Choice | Yes | enum→string | string→enum |
|
||||
| Button Type | Choice | Yes | enum→string | string→enum |
|
||||
| Selected | Boolean | Yes | `m_selected` (needs getter) | `SetSelected(v)` |
|
||||
| Active Icon | ReadOnly | No | icon name string | — |
|
||||
| Inactive Icon | ReadOnly | No | icon name string | — |
|
||||
|
||||
Choices for Button Style: `Regular`, `Confirm`, `Alert`, `Disabled`
|
||||
Choices for Button Type: `Compact`, `Window`, `Choice`, `Parameter`, `Icon`, `Expanded`
|
||||
|
||||
**Source changes needed**: Button's `m_selected` is private. Add one-liner getter:
|
||||
```cpp
|
||||
bool IsSelected() const { return m_selected; }
|
||||
```
|
||||
|
||||
### Orca CheckBox (`CheckBox`) — category: "Orca CheckBox"
|
||||
|
||||
| Name | Type | Editable | Getter | Setter |
|
||||
|------|------|----------|--------|--------|
|
||||
| Half Checked | Boolean | Yes | `m_half_checked` (needs getter) | `SetHalfChecked(v)` |
|
||||
|
||||
**Source changes needed**: `m_half_checked` is private. Add one-liner getter:
|
||||
```cpp
|
||||
bool IsHalfChecked() const { return m_half_checked; }
|
||||
```
|
||||
|
||||
### Orca TextInput (`TextInput`) — category: "Orca TextInput"
|
||||
|
||||
| Name | Type | Editable | Getter | Setter |
|
||||
|------|------|----------|--------|--------|
|
||||
| Label | String | Yes | `GetLabel()` (inherited from wxWindow) | `SetLabel(v)` (exists) |
|
||||
| Text Value | String | Yes | `GetTextCtrl()->GetValue()` (GetTextCtrl is public) | `GetTextCtrl()->SetValue(v)` |
|
||||
| Corner Radius | Integer | Yes | `GetCornerRadius()` (NEW) | `SetCornerRadius(v)` (exists) |
|
||||
|
||||
**Source changes needed**: Add one getter to `TextInput`:
|
||||
```cpp
|
||||
int GetCornerRadius() const { return static_cast<int>(radius); }
|
||||
```
|
||||
(`radius` is inherited from StaticBox. `SetCornerRadius(double)` already exists. `GetTextCtrl()` is already public.)
|
||||
|
||||
### Orca SwitchButton (`SwitchButton`) — category: "Orca SwitchButton"
|
||||
|
||||
| Name | Type | Editable | Getter | Setter |
|
||||
|------|------|----------|--------|--------|
|
||||
| Value | Boolean | Yes | existing getter | existing setter |
|
||||
|
||||
### Orca ProgressBar (`ProgressBar`) — category: "Orca ProgressBar"
|
||||
|
||||
| Name | Type | Editable | Getter | Setter |
|
||||
|------|------|----------|--------|--------|
|
||||
| Proportion | Float (0-1) | Yes | `pb->m_proportion` (public member) | `pb->m_proportion = v` |
|
||||
| Show Number | Boolean | Yes | `pb->m_shownumber` (public member) | `pb->m_shownumber = v` |
|
||||
|
||||
**No source changes needed**: `m_proportion` and `m_shownumber` are already public members. `SetValue(int)` and `SetProgress(int)` already exist as public methods.
|
||||
|
||||
### Orca Label (`Label`) — category: "Orca Label"
|
||||
|
||||
| Name | Type | Editable | Getter | Setter |
|
||||
|------|------|----------|--------|--------|
|
||||
| Is Hyperlink | Boolean | No | existing flag check | — |
|
||||
| Font Size | ReadOnly | No | `GetFont().GetPointSize()` | — |
|
||||
|
||||
### LabeledStaticBox — category: "LabeledStaticBox"
|
||||
|
||||
| Name | Type | Editable | Getter | Setter |
|
||||
|------|------|----------|--------|--------|
|
||||
| Corner Radius | Integer | Yes | `GetCornerRadius()` (NEW) | `SetCornerRadius(v)` (exists) |
|
||||
| Border Width | Integer | Yes | `GetBorderWidth()` (NEW) | `SetBorderWidth(v)` (exists) |
|
||||
| Border Color | String (hex) | Yes | `GetBorderColor()` (NEW) | `SetBorderColor(v)` (exists) |
|
||||
| Scale | Float (ReadOnly) | No | `m_scale` (protected, needs getter) | — |
|
||||
|
||||
**Source changes needed**: Four one-liner getters added to `LabeledStaticBox`:
|
||||
```cpp
|
||||
int GetCornerRadius() const { return m_radius; }
|
||||
int GetBorderWidth() const { return m_border_width; }
|
||||
StateColor GetBorderColor() const { return border_color; }
|
||||
float GetScale() const { return m_scale; }
|
||||
```
|
||||
|
||||
## Files Modified (Existing Code)
|
||||
|
||||
| File | Changes |
|
||||
|------|---------|
|
||||
| `src/slic3r/GUI/GUI_Utils.hpp` | +4 methods in `DPIAware<P>`: `set_scale_factor()`, `set_prev_scale_factor()`, `set_em_unit()`, `force_rescale()` |
|
||||
| `src/slic3r/GUI/Widgets/LabeledStaticBox.hpp` | +4 getter declarations: `GetCornerRadius()`, `GetBorderWidth()`, `GetBorderColor()`, `GetScale()` |
|
||||
| `src/slic3r/GUI/Widgets/LabeledStaticBox.cpp` | +4 getter implementations |
|
||||
| `src/slic3r/GUI/Widgets/Button.hpp` | +1 getter: `IsSelected()` |
|
||||
| `src/slic3r/GUI/Widgets/CheckBox.hpp` | +1 getter: `IsHalfChecked()` |
|
||||
| `src/slic3r/GUI/Widgets/TextInput.hpp` | +1 getter: `GetCornerRadius()` |
|
||||
| `src/slic3r/GUI/Widgets/ProgressBar.hpp` | None (public members are used directly) |
|
||||
| `src/slic3r/GUI/MainFrame.cpp` | +1 `#include`, +1 call to `RegisterOrcaInspectorPlugins()` |
|
||||
| `src/slic3r/CMakeLists.txt` | +4 entries in `SLIC3R_GUI_SOURCES` (the .cpp plugin files) |
|
||||
|
||||
## Files Created
|
||||
|
||||
```
|
||||
src/slic3r/Utils/wxInspectorPlugins/
|
||||
├── DPIAwarePlugin.hpp
|
||||
├── DPIAwarePlugin.cpp
|
||||
├── CustomWidgetsPlugin.hpp
|
||||
├── CustomWidgetsPlugin.cpp
|
||||
└── Registration.hpp
|
||||
```
|
||||
|
||||
## Build & Linking
|
||||
|
||||
The `wxInspector` dependency is already wired:
|
||||
- `deps/wxInspector/wxInspector.cmake` fetches and builds wxInspector
|
||||
- `src/CMakeLists.txt` lines 92-93 link `wxInspector::wxInspector` into `wxWidgets_LIBRARIES`
|
||||
- The plugin files only need `#include <wx/inspector/plugin.h>` and `#include <wx/inspector/inspector.h>` — both available from the installed dependency
|
||||
|
||||
No new CMake dependencies needed. Only the new source files need listing in `SLIC3R_GUI_SOURCES`.
|
||||
|
||||
## Error Handling & Edge Cases
|
||||
|
||||
- **Stale pointers**: Plugin lambdas capture raw pointers, regenerated on every `GetProperties` call (matching wxInspector's built-in provider pattern). Pointers live only until the next tree selection.
|
||||
- **Widget destruction**: If a widget is destroyed while the inspector is showing its properties, `InspectableObject::IsValid()` returns false and properties are not displayed. The inspector won't show stale data.
|
||||
- **Invalid property values**: Setters use `sscanf` / `ToLong` with validation (matching built-in patterns). Bogus input is rejected — setter returns `false`, property grid shows error state.
|
||||
- **DPI drift**: Setting `scale_factor` without triggering rescale means displayed sizes don't match the new factor. This is acceptable — the inspector is a developer tool; operators know to call `Layout()` after making changes.
|
||||
- **Missing widget type**: If a `dynamic_cast` fails for all types, only built-in wxWindow properties are shown. No crash, no error — just reduced info.
|
||||
|
||||
## Future Work (Out of Scope)
|
||||
|
||||
- **StateColor visualization**: `StateColor` is a multi-value type (maps bitmask states to colors). A full solution would need a custom property editor (e.g., a table showing each state→color pair). Keep it simple for now.
|
||||
- **ScalableBitmap display**: Could show the bitmap as an inline thumbnail. Complex property editor work — deferred.
|
||||
- **More widget types**: `SwitchBoard`, `MultiSwitchButton`, `StepCtrl`, `FanControl`, `DropDown`, `ComboBox`, `AMS*` widgets could all benefit. Add as needed.
|
||||
- **Property refresh on tree selection**: Currently properties are static snapshots. A "refresh" button or auto-poll could keep values current for rapidly-changing widgets (progress bars, etc.). The built-in wxInspector already provides a tree-refresh button.
|
||||
@@ -1,110 +0,0 @@
|
||||
# FFmpeg Media Player for macOS — Design
|
||||
|
||||
Date: 2026-08-14
|
||||
Branch: `dev/ffmpeg-player-macos`
|
||||
|
||||
## Problem
|
||||
|
||||
The branch's new FFmpeg-based media player (`wxMediaCtrl3` + `AVVideoDecoder`) is used on
|
||||
Windows and Linux, but macOS still runs the old player: `wxMediaCtrl2.mm`, an ObjC
|
||||
`BambuPlayer` class dlsym'd from the Bambu network plugin that renders via CALayer.
|
||||
On macOS, `wxMediaCtrl3` is currently aliased to `wxMediaCtrl2` and FFmpeg is not linked
|
||||
into the app at all.
|
||||
|
||||
Goal: make macOS use the same FFmpeg player as Windows/Linux, linking the **static**
|
||||
FFmpeg libraries from the deps build instead of dynamic ones.
|
||||
|
||||
## Current state (verified)
|
||||
|
||||
- New player (Win/Linux): `GUI/wxMediaCtrl3.cpp` + `GUI/AVVideoDecoder.cpp`. Decodes with
|
||||
FFmpeg (libavcodec/libswscale/libavutil), renders frames into `wxImage` (non-Windows) /
|
||||
`wxBitmap` (Windows) drawn in a `paintEvent`, feeds via the `Bambu_*` C API
|
||||
(`BambuTunnel.h`, `BAMBU_DYNAMIC`) dlsym'd from the network plugin through
|
||||
`StaticBambuLib::get()` (`GUI/Printer/PrinterFileSystem.cpp`, compiled on all platforms).
|
||||
- Old player (macOS): `GUI/wxMediaCtrl2.mm` uses the ObjC `BambuPlayer` class found via
|
||||
`dlsym(module, "OBJC_CLASS_$_BambuPlayer")` in `libBambuSource.dylib`.
|
||||
- The macOS network plugin `libBambuSource.dylib` already exports the full Bambu C API
|
||||
(verified with `nm`), so the new player needs zero plugin changes.
|
||||
- FFmpeg linking in `src/slic3r/CMakeLists.txt` is guarded by `if (NOT APPLE)` —
|
||||
macOS currently does not link FFmpeg.
|
||||
- `deps/FFMPEG/FFMPEG.cmake`: non-MSVC branch builds FFmpeg from source with
|
||||
`--enable-shared`. The existing arm64 deps build on the dev machine happened to be
|
||||
configured with both static and shared enabled, so `libavcodec.a` / `libswscale.a` /
|
||||
`libavutil.a` are already present at
|
||||
`deps/build/arm64/OrcaSlicer_dep/usr/local/lib/`.
|
||||
- `EVT_MEDIA_CTRL_STAT` is `wxDEFINE_EVENT`'d in `wxMediaCtrl2.cpp` (Win/Linux) and
|
||||
`wxMediaCtrl2.mm` (macOS); the define in `wxMediaCtrl3.cpp` is commented out.
|
||||
- `wxMediaCtrl2` is never instantiated anywhere on any platform — dead code.
|
||||
- `StatusPanel` already creates `wxMediaCtrl3`; `MediaPlayCtrl` only uses the
|
||||
`wxMediaCtrl3` interface (`Load/Play/Stop/GetState/GetVideoSize/GetLastError/SetIdleImage`),
|
||||
so no UI-side changes are needed.
|
||||
|
||||
## Approach (approved)
|
||||
|
||||
**Reuse the shared player on macOS.** Compile the existing `wxMediaCtrl3.cpp` +
|
||||
`AVVideoDecoder.cpp` on macOS so all three platforms run one implementation.
|
||||
Rendering uses the existing `wxImage` → `DrawBitmap` paint path, identical to Linux.
|
||||
Known trade-off: frames are scaled to the widget's logical (1x) size, so Retina is
|
||||
slightly soft compared to the old CALayer player. Accepted for now; a Retina-aware
|
||||
scaling follow-up is possible later.
|
||||
|
||||
Rejected alternative: a native CGImage/CALayer renderer for macOS — faster and
|
||||
Retina-crisp, but adds a second render implementation to maintain.
|
||||
|
||||
## Changes
|
||||
|
||||
### 1. Enable the FFmpeg player on macOS (source)
|
||||
|
||||
- `GUI/wxMediaCtrl3.h`: remove the `#ifdef __WXMAC__` branch (lines 18–22) that aliases
|
||||
`wxMediaCtrl3` → `wxMediaCtrl2`. macOS then compiles the real `wxMediaCtrl3` class,
|
||||
including the `BAMBU_DYNAMIC` BambuTunnel path used on Linux.
|
||||
- Event symbol fix: move `wxDEFINE_EVENT(EVT_MEDIA_CTRL_STAT, wxCommandEvent)` into
|
||||
`wxMediaCtrl3.cpp` (uncomment the existing line) and remove it from
|
||||
`wxMediaCtrl2.cpp`. One definition total in the lib; all three platforms resolve it.
|
||||
|
||||
### 2. Static FFmpeg linking (deps + app)
|
||||
|
||||
- `deps/FFMPEG/FFMPEG.cmake`: in the non-MSVC branch, pass
|
||||
`--disable-shared --enable-static` when `APPLE`. Linux keeps `--enable-shared`;
|
||||
Windows keeps its prebuilt shared DLL zips. Fresh macOS deps builds install only
|
||||
`libavcodec.a` / `libswscale.a` / `libavutil.a` — no dylibs to bundle, no
|
||||
rpath/install_name handling. (The existing local arm64 deps build already contains
|
||||
the `.a` files, so no deps rebuild is strictly needed to try the change locally,
|
||||
but a fresh CI deps build must produce them.)
|
||||
- `src/slic3r/CMakeLists.txt`:
|
||||
- APPLE branch of `SLIC3R_GUI_SOURCES`: add `GUI/wxMediaCtrl3.cpp`,
|
||||
`GUI/wxMediaCtrl3.h`, `GUI/AVVideoDecoder.cpp`, `GUI/AVVideoDecoder.hpp`;
|
||||
remove `GUI/wxMediaCtrl2.mm` and `GUI/wxMediaCtrl2.h` (the `.h` stays on
|
||||
disk for the Win/Linux build of `wxMediaCtrl2.cpp`, but nothing on macOS
|
||||
includes it after this change).
|
||||
- Add an APPLE mirror of the `NOT APPLE` FFmpeg block: `find_library` for
|
||||
`libavcodec.a`, `libswscale.a`, `libavutil.a` under `${CMAKE_PREFIX_PATH}/lib`
|
||||
with `NO_DEFAULT_PATH`, link them (order avcodec → swscale → avutil), and add
|
||||
`${CMAKE_PREFIX_PATH}/include` as a SYSTEM include directory. Deps are built with
|
||||
`--disable-zlib` and no external codecs, so the three static libs link cleanly.
|
||||
|
||||
### 3. Remove the old player
|
||||
|
||||
- Delete `GUI/wxMediaCtrl2.mm` and `GUI/BambuPlayer/BambuPlayer.h` (header used only
|
||||
by the `.mm`; the real `BambuPlayer` lives inside the network plugin).
|
||||
- Remove the now-dead `__WXMAC__` section of `GUI/wxMediaCtrl2.h`.
|
||||
- `wxMediaCtrl2.cpp` (Win/Linux) stays in the build as-is (dead but harmless; out of
|
||||
scope to remove on this branch).
|
||||
|
||||
### 4. Verification
|
||||
|
||||
- Build on macOS: `cmake --build build_arm64` (or `build/arm64`).
|
||||
- Confirm no dynamic FFmpeg dependency: `otool -L` on the app binary shows no `libav*`
|
||||
dylib references.
|
||||
- Runtime: with the network plugin loaded, the Device tab camera preview streams via
|
||||
the FFmpeg player (check the device page / `MediaPlayCtrl`).
|
||||
- macOS `ctest` still passes — static linking means no test-executable `.so` copying
|
||||
hacks (unlike the Linux shared-lib setup).
|
||||
|
||||
## Out of scope
|
||||
|
||||
- Linux (shared libs, AppImage/flatpak bundling) and Windows (prebuilt DLL zips)
|
||||
keep their current FFmpeg setup.
|
||||
- Retina-aware frame scaling / native CGImage rendering (follow-up if visual quality
|
||||
is judged insufficient).
|
||||
- Audio streaming (neither player plays audio in this UI path).
|
||||
@@ -1,388 +0,0 @@
|
||||
# OrcaCloud / OrcaSonar MQTT contract consolidation — design
|
||||
|
||||
**Date:** 2026-09-03
|
||||
**Status:** Approved design, pre-implementation
|
||||
**Repos touched by this task:** OrcaSlicer (implementation), plus a written conformance
|
||||
checklist handed off to OrcaCloud and OrcaSonar (not edited here).
|
||||
|
||||
---
|
||||
|
||||
## 1. Context & problem
|
||||
|
||||
`OrcaPrinterAgent` talks to two backends that are meant to expose the *same*
|
||||
printer API:
|
||||
|
||||
- **OrcaCloud** — cloud relay. Cloudflare Durable Object "broker-lite" with a
|
||||
hand-rolled MQTT 3.1.1 codec (`apps/gateway/src/lib/mqtt-codec.ts`,
|
||||
`apps/gateway/src/durable-objects/printer-shard.ts`).
|
||||
- **OrcaSonar** — LAN hub. Real mochi MQTT broker fronted by a `/mqtt`
|
||||
WebSocket→TCP proxy (`internal/broker/broker.go`, `internal/httpws/server.go`).
|
||||
|
||||
A survey of all three codebases found the *payload and topic layer already ~90 %
|
||||
identical* (Bambu-dialect JSON, `device/<id>/request` + `device/<id>/report`,
|
||||
shared command set, numeric-string `sequence_id`), but the *transport mechanics
|
||||
diverge*:
|
||||
|
||||
| Dimension | OrcaSonar LAN | OrcaCloud |
|
||||
|---|---|---|
|
||||
| Command send | client **PUBLISHes** `device/<id>/request` | viewers **receive-only**; commands via `POST /api/v1/printers/:id/commands` |
|
||||
| Auth | MQTT CONNECT username/password | Bearer token on the HTTP upgrade |
|
||||
| Endpoint | `ws://<host>:8280/mqtt` | `wss://<api>/api/v1/printers/{id}/mqtt` (and an aggregate `/printers/mqtt`) |
|
||||
| Socket cardinality | 1 printer : 1 socket | aggregate socket, N printers, dynamic grant |
|
||||
| Status stream | always on | demand-gated (`pushing.start` / `pushing.stop`) |
|
||||
| Capability | retained `device/<id>/capability` | `info.get_capabilities` command, no retained |
|
||||
| `sequence_id` bands | unenforced | enforced (OrcaSlicer must use 20000–29999) |
|
||||
| Spec of record | `spec/protocol/orca_printer_comm_spec.md` (OPCP v1.1.0 + JSON schemas) | `doc/gateway/printer_mqtt_facade_2026-08-07.md` + dialect code |
|
||||
|
||||
Both sides already track the drift: OrcaSonar `API.md:244-301` diffs itself against
|
||||
OrcaCloud's dialect code; OrcaCloud's facade doc has an explicit "OrcaSonar
|
||||
adoption" section.
|
||||
|
||||
The client today mirrors the divergence — `send_message` (cloud) has historically
|
||||
gone via REST while `send_message_to_printer` (LAN) publishes over MQTT — so the
|
||||
`IPrinterAgent` split is a transport split, not just a routing switch.
|
||||
|
||||
**Goal:** one contract (OPCP v1.2.0) that both backends conform to, and an
|
||||
OrcaSlicer client where LAN and cloud run *identical code* differing only by a
|
||||
`Config` value.
|
||||
|
||||
---
|
||||
|
||||
## 2. Decisions
|
||||
|
||||
| # | Decision |
|
||||
|---|---|
|
||||
| D1 | **Contract merge + thin client shim.** Merge to a canonical spec; fix payload-level divergences server-side; the client keeps only a `Config`-sized shim for endpoint/auth/keepalive. |
|
||||
| D2 | **This task ships:** the OPCP v1.2.0 spec text (authored here), the OrcaSlicer client implementation, and an enumerated conformance checklist for OrcaCloud & OrcaSonar. The other two repos are **not** edited in this task. |
|
||||
| D3 | **Command transport is MQTT PUBLISH `device/<id>/request` on both cloud and LAN.** OrcaCloud gains client PUBLISH via change CH-1. |
|
||||
| D4 | **Client structure: one `OrcaMqttConnection` class, two `Config`-only instances, routed by `OrcaPrinterAgent`.** The cloud instance uses the **1:1 per-printer** endpoint `/api/v1/printers/{id}/mqtt`, exactly like LAN. |
|
||||
| D5 | **One socket per transport, selected printer only.** The pre-existing aggregate cloud MQTT socket is removed; unselected printers show announce/REST status on both transports (see §4.3). |
|
||||
| D6 | **No back-compat.** OPCP v1.2.0 replaces v1.1.0 outright. REST `/commands` is not a required alias. No `/tunnel` bridge concerns. |
|
||||
| D7 | **OrcaSonar's OPCP is the source of truth.** The contract is OrcaSonar's spec (with the additions in §5.1, most of which absorb behaviours OrcaCloud already ships); OrcaCloud conforms to it. |
|
||||
|
||||
---
|
||||
|
||||
## 3. OPCP v1.2.0 — the unified contract
|
||||
|
||||
### 3.1 Canonical core (already aligned; ratified here)
|
||||
|
||||
- **Transport:** MQTT 3.1.1 over WebSocket, binary frames, subprotocol `mqtt`,
|
||||
`cleanSession = 1`.
|
||||
- **Topics:** `device/<dev_id>/request` (client → device),
|
||||
`device/<dev_id>/report` (device → client). `<dev_id>` is the identifier the
|
||||
client is already provisioned with — the cloud printer UUID on the cloud
|
||||
binding; the mDNS-advertised `device_id` (TXT `device_id=`, SSDP UDN
|
||||
`uuid:<device_id>`) on the LAN binding. The client never learns the id from
|
||||
message traffic.
|
||||
- **Envelope:** exactly one top-level namespace key ∈
|
||||
`{pushing, info, print, system, camera, xcam, upgrade, files, event}`, plus
|
||||
`command` and `sequence_id` (decimal string, `^[0-9]+$`).
|
||||
- **Result echo (single-phase):** same namespace + command + `sequence_id`, plus
|
||||
`result ∈ {success, fail}`, `reason` on `fail`, optional `errno`. No separate
|
||||
dialect-layer transport ack.
|
||||
- **Status:** `<ns>.push_status` on the report topic; `msg` 0 = full, 1 = diff.
|
||||
- **`info.get_version` reply:** `module[]` entries with `name / sw_ver / hw_ver / sn`.
|
||||
- **Optional extended header** (adopt OrcaSonar spec §3.1 verbatim):
|
||||
`protocol_version`, `schema_version`, `sent_at_utc_ms`,
|
||||
`source{role, agent_id, transport}`. Receivers ignore unknown top-level keys.
|
||||
|
||||
### 3.2 Divergence resolutions
|
||||
|
||||
| Divergence | Resolution | Owner |
|
||||
|---|---|---|
|
||||
| Command send: REST vs PUBLISH | Client PUBLISHes `device/<id>/request` on both transports. | OrcaCloud CH-1 |
|
||||
| `sequence_id` bands | Normative registry: OrcaSlicer **20000–29999**, dashboard 50000–59999, gateway-minted 70000–79999, status-mirror 90000+. Correlation is producer-scoped (match echoes against your own outstanding ids). | OPCP SPEC-2; client |
|
||||
| Capability discovery | `info.get_capabilities` command is the REQUIRED path (returns the capability manifest). Retained `device/<id>/capability` is an OPTIONAL LAN optimization; clients MUST NOT depend on it. | client; OrcaSonar SN-2 |
|
||||
| Status gating | Client issues `pushing.start` immediately after SUBSCRIBE and `pushing.stop` on deselect, on both transports. Always-streaming implementations accept both as `result:"success"` no-ops. | client; OrcaSonar SN-1; OrcaCloud CH-4 |
|
||||
| Topic `<id>` | LAN topic id == advertised `device_id`, so the client subscribes the exact topic — **no `device/+/report` wildcard**. | OrcaSonar SN-3 |
|
||||
| `system.set_settings` | Schema defined in OPCP (SPEC-5): curated toggles — camera, discovery, moonraker_compat. Unknown setting → `result:"fail"`, `errno = UNSUPPORTED_SETTING`. Not client-driven in this task. | OPCP SPEC-5; OrcaSonar SN-4 |
|
||||
| Auth | Two mechanisms, both normative: (a) bearer token in the `Authorization` header of the WS upgrade (cloud); (b) MQTT CONNECT username/password (LAN local broker). The client `Config` carries whichever applies. | documented only |
|
||||
| QoS | Client requests SUBSCRIBE QoS 1 and PUBLISH QoS 0–1; MUST tolerate a SUBACK that grants QoS 0. | client |
|
||||
| Keepalive | `Config.keepalive_seconds` (default 60 LAN / 300 cloud). Binary PINGREQ. | client |
|
||||
| Endpoint | LAN `ws://<host>:8280/mqtt`; cloud `wss://<api>/api/v1/printers/{id}/mqtt`. | `Config` |
|
||||
|
||||
Net effect: everything payload- and topic-level is identical on both transports;
|
||||
the only per-transport variation is `Config` (URL + auth + keepalive) plus one
|
||||
connect-time `pushing.start`.
|
||||
|
||||
---
|
||||
|
||||
## 4. OrcaSlicer client architecture
|
||||
|
||||
### 4.1 `OrcaMqttConnection` — the single transport class
|
||||
|
||||
Lives in its own translation unit (extracted from `OrcaCloudServiceAgent.cpp`,
|
||||
where an earlier `OrcaCloudMqttConnection` / renamed `OrcaMqttConnection` still
|
||||
sits). No LAN/cloud conditionals in the body.
|
||||
|
||||
```cpp
|
||||
struct Config {
|
||||
std::string url; // ws://host:8280/mqtt | wss://api/.../printers/{id}/mqtt
|
||||
bool use_tls = false; // derived from the URL scheme
|
||||
TokenProvider bearer_provider; // cloud: Authorization: Bearer <jwt> on the WS upgrade
|
||||
std::string username, password; // LAN: MQTT CONNECT credentials
|
||||
// Precedence: if bearer_provider is set it is used for the WS upgrade and the
|
||||
// CONNECT username/password are omitted; otherwise CONNECT carries the creds.
|
||||
std::string client_id; // stable for the process run, unique per instance
|
||||
int keepalive_seconds = 60;
|
||||
};
|
||||
```
|
||||
|
||||
API (used identically by both instances):
|
||||
|
||||
| Method | Behaviour |
|
||||
|---|---|
|
||||
| `bool start(Config, MessageHandler on_message, StateHandler on_state, CancellationHandler = {})` | spawns the worker thread; blocks (bounded, ~10 s) for the first CONNACK; returns the initial result |
|
||||
| `void stop()` | idempotent; joins the worker |
|
||||
| `bool send_request(const std::string& dev_id, const std::string& payload)` | PUBLISH `device/<dev_id>/request` (QoS 0/1); thread-safe via the write mutex; false when there is no CONNACKed session. **The uniform outbound seam.** |
|
||||
| `bool subscribe(const std::string& dev_id)` / `unsubscribe(...)` | SUBSCRIBE / UNSUBSCRIBE `device/<dev_id>/report`; persistent set re-sent after every CONNACK |
|
||||
| `bool is_connected() const` / `int last_connack_rc() const` | CONNACK state; rc 0 = accepted, 1..5 = MQTT refusal, -1 = no CONNACK this attempt |
|
||||
| `MessageHandler(dev_id, payload)` | inbound: strips the `device/<id>/report` topic, hands up raw JSON, on the worker thread |
|
||||
|
||||
All protocol logic (topic construction, MQTT framing, reconnect/backoff, write
|
||||
serialization, QoS-downgrade tolerance, PINGREQ) is internal. The only internal
|
||||
branches are `use_tls` (TLS handshake + SNI) and bearer-vs-CONNECT-creds during
|
||||
the handshake.
|
||||
|
||||
Reusable pieces from `salvage/orcasonar-lan-agent-2026-09-03` (the generalized
|
||||
`Config`, `ws://` support in `parse_endpoint`, `last_connack_rc`, auth-reject
|
||||
handling, static frame builders + their tests) are lifted in rather than
|
||||
re-derived.
|
||||
|
||||
### 4.2 `OrcaPrinterAgent` — routing + lifecycle
|
||||
|
||||
- `std::unique_ptr<OrcaMqttConnection> lan_mqtt_connection` — owned here;
|
||||
lifecycle = LAN printer selection.
|
||||
- Cloud per-printer `OrcaMqttConnection` — owned by `OrcaCloudServiceAgent`,
|
||||
reached via `get_orca_cloud_agent()->get_mqtt_connection()`.
|
||||
- `OrcaMqttConnection* get_appropriate_mqtt_connection(bool is_lan)` — the one
|
||||
place that encodes the ownership split. Kept even though callers know their
|
||||
`is_lan` bit; it is the seam and it is tiny. Where a caller has only a
|
||||
`dev_id`, resolve via `DeviceManager::get_my_machine(dev_id)->is_lan_mode_printer()`.
|
||||
- `enum CurrentConn { NONE, CLOUD, LAN } m_current_connection` — a label/gate,
|
||||
**not** a socket selector.
|
||||
|
||||
**Outbound collapse.** Both methods reduce to the same body:
|
||||
|
||||
```cpp
|
||||
int OrcaPrinterAgent::send_message(dev_id, json, qos, flag) // is_lan = false
|
||||
int OrcaPrinterAgent::send_message_to_printer(dev_id, json, qos, flag) // is_lan = true
|
||||
// ->
|
||||
auto* conn = get_appropriate_mqtt_connection(is_lan);
|
||||
if (!conn || dev_id.empty()) return BAMBU_NETWORK_ERR_INVALID_HANDLE;
|
||||
return conn->send_request(dev_id, json) ? BAMBU_NETWORK_SUCCESS
|
||||
: BAMBU_NETWORK_ERR_CONNECTION_TO_SERVER_FAILED;
|
||||
```
|
||||
|
||||
The `command_*` helpers keep branching only to build the payload, then call one
|
||||
or the other.
|
||||
|
||||
**Inbound: remove `read_loop()`.** Each `OrcaMqttConnection` already delivers on
|
||||
its worker thread via `MessageHandler`. The agent registers one handler per
|
||||
connection that funnels to `on_message_fn`, marshalled onto the UI thread via
|
||||
`queue_on_main_fn`. This is already the pattern `set_cloud_agent()` wires for the
|
||||
cloud side (`set_printer_status_callback`); the LAN side gets the symmetric
|
||||
wiring when `lan_mqtt_connection` is created. A single reader that "picks the
|
||||
current connection" reintroduces a one-transport-at-a-time asymmetry and a
|
||||
busy-spin; the per-connection callback is already uniform.
|
||||
|
||||
**Lifecycle — the post-connect sequence is byte-identical on both transports:**
|
||||
|
||||
| Trigger | LAN | Cloud |
|
||||
|---|---|---|
|
||||
| select | `connect_printer(dev_id, dev_ip, user, code, ssl)` | `set_user_selected_machine(dev_id)` |
|
||||
| agent builds `Config` | `ws://<dev_ip>:8280/mqtt` + username/password | `wss://<api>/api/v1/printers/{dev_id}/mqtt` + `bearer_provider` |
|
||||
| then — shared `on_connected(dev_id, conn)` | `subscribe(dev_id)` → `send_request(dev_id, pushing.start)` → `send_request(dev_id, pushall)` → `send_request(dev_id, info.get_version)` → `send_request(dev_id, info.get_capabilities)` | *the same five calls* |
|
||||
| deselect / change | `disconnect_printer()` → `stop()` + reset | `send_request(prev, pushing.stop)` → `unsubscribe(prev)` → `stop()` / retarget |
|
||||
|
||||
**Threading & lifetime:**
|
||||
|
||||
- The blocking `start()` runs on a short-lived thread so the UI is never blocked
|
||||
(mirrors the salvaged WIP).
|
||||
- A generation counter (atomic, captured by value into every handler lambda)
|
||||
makes a superseded connection's late `MessageHandler` / `StateHandler` calls
|
||||
no-ops.
|
||||
- `~OrcaPrinterAgent` calls `stop()` on both connections (joining their workers)
|
||||
before any member is destroyed. No detached threads may touch `*this`.
|
||||
- CONNACK rc 4/5 (bad credentials / not authorised) is terminal: report
|
||||
`ConnectStatusFailed`, do not retry (a retry storm would flap
|
||||
`ConnectStatusLost` → `set_selected_machine("")`).
|
||||
|
||||
### 4.3 One socket per transport — the selected printer only
|
||||
|
||||
The client opens exactly one MQTT socket at a time, for the **selected** printer,
|
||||
identically on both transports:
|
||||
|
||||
- LAN: `ws://<dev_ip>:8280/mqtt` — opened on `connect_printer`, closed on
|
||||
`disconnect_printer`.
|
||||
- Cloud: `wss://<api>/api/v1/printers/{dev_id}/mqtt` (the 1:1 per-printer
|
||||
binding, D4) — opened on `set_user_selected_machine(dev_id)`, closed on
|
||||
deselect. `OrcaCloudServiceAgent` owns the instance; `OrcaPrinterAgent`
|
||||
drives it via `get_mqtt_connection()`.
|
||||
|
||||
Unselected printers are never connected on either transport. They populate the
|
||||
Device list from announce data alone — mDNS/SSDP `on_machine_alive` for LAN
|
||||
hubs, the account REST list for cloud printers — exactly as unselected LAN hubs
|
||||
already behave.
|
||||
|
||||
**This removes the pre-existing aggregate cloud MQTT socket**
|
||||
(`wss://<api>/api/v1/printers/mqtt`, started today by
|
||||
`OrcaCloudServiceAgent::connect_server()`). `is_server_connected()` falls back to
|
||||
the REST health probe `connect_server()` already performs on the same 5 s
|
||||
`refresh_connection()` tick.
|
||||
|
||||
**Behaviour change (needs product sign-off, tracked as O2):** unselected cloud
|
||||
printers in the Device list lose their live status feed and show last-known /
|
||||
REST status. This is the price of LAN/cloud symmetry and matches how unselected
|
||||
LAN hubs already appear. If live multi-printer status is later required it is an
|
||||
`OrcaCloudServiceAgent` concern (its own aggregate consumer), and it must not add
|
||||
a second `device/<id>/report` stream for the already-connected selected printer.
|
||||
|
||||
---
|
||||
|
||||
## 5. Conformance checklist (hand-off)
|
||||
|
||||
**Framing (D7):** the target state is "cloud and LAN expose an identical API",
|
||||
and **OrcaSonar's OPCP spec is the source of truth**. Read this section as:
|
||||
|
||||
- §5.1 — additions the OPCP spec (and therefore OrcaSonar's implementation)
|
||||
needs. Small, and mostly formalising behaviours OrcaCloud already ships
|
||||
(`pushing.start/stop`, `system.set_settings`, the `sequence_id` registry).
|
||||
- §5.2 — OrcaCloud is the participant furthest from the contract (commands over
|
||||
REST, viewer PUBLISH forbidden, aggregate-only socket). These changes make it
|
||||
conform.
|
||||
- §5.3 — OrcaSonar's own work: implement the §5.1 additions, plus one or two
|
||||
guarantees to make explicit.
|
||||
|
||||
### 5.1 OPCP spec additions → v1.2.0 (`OrcaSonar spec/protocol/orca_printer_comm_spec.md`)
|
||||
|
||||
| ID | Change |
|
||||
|---|---|
|
||||
| SPEC-1 | Add a normative **Transports** section: the two bindings from §3.1 (LAN local broker; cloud gateway). Both MUST accept client PUBLISH to `device/<id>/request`. |
|
||||
| SPEC-2 | Normative `sequence_id` band registry (§3.2); correlation is producer-scoped. |
|
||||
| SPEC-3 | `pushing.start` / `pushing.stop` are normative commands — "begin / stop streaming `push_status` to this subscriber". Always-streaming implementations MUST still return `result:"success"` (no-op). |
|
||||
| SPEC-4 | `info.get_capabilities` is the REQUIRED capability path; retained `device/<id>/capability` is OPTIONAL and non-load-bearing. |
|
||||
| SPEC-5 | Define the `system.set_settings` schema (curated toggles: camera, discovery, moonraker_compat); unknown setting → `result:"fail"`, `errno = UNSUPPORTED_SETTING`. |
|
||||
| SPEC-6 | Errno registry: enumerate values already in use plus `UNSUPPORTED_COMMAND`, `UNSUPPORTED_SETTING`, `NOT_AUTHORIZED`. Align semantics (not numeric values) with the client's `ORCA_NETWORK_ERR_CMD_NOT_SUPPORTED` / `ORCA_NETWORK_ERR_CAP_NOT_AVAILABLE`. |
|
||||
| SPEC-7 | Promote the extended envelope header (§3.1 of the OrcaSonar spec) to OPTIONAL on every message; receivers ignore unknown top-level keys. |
|
||||
| SPEC-8 | Topic `<id>` MUST equal the id the client is provisioned with; no id discovery from traffic. |
|
||||
|
||||
### 5.2 OrcaCloud — conform to OPCP (`~/repos/OrcaCloud/apps/gateway`)
|
||||
|
||||
Assuming the OPCP contract (client PUBLISHes commands over a 1:1 MQTT-over-WS
|
||||
socket, exactly as against OrcaSonar LAN), OrcaCloud must add:
|
||||
|
||||
| ID | Change | Acceptance |
|
||||
|---|---|---|
|
||||
| **CH-1** | `mqtt-viewer` sessions MAY `PUBLISH` to `device/{id}/request` (today → close 4403 in `printer-shard.ts::handleMqttPublish`). Relay viewer → connector via the existing `awaitConnectorReply` / `deliverToConnector` path. `/report` stays connector-only (anti-forgery preserved). | e2e: a viewer publishes `print.pause` `sequence_id` 20001 → connector receives it on `device/{id}/request` → the result echo fans back to that viewer. |
|
||||
| CH-2 | Move operator-role authorization from the REST `/commands` route (`routes/printer.ts`) into the shard publish handler. READ set — `pushing.pushall`, `info.get_version`, `info.get_capabilities`, `files.list`, `files.metadata` — allowed for viewer / live-token; every other command requires an operator+ session. | live-token viewer publishing `print.stop` → 4403; JWT operator → success. |
|
||||
| CH-3 | Provide a **1:1 per-printer** WS binding `GET /api/v1/printers/{id}/mqtt` that behaves like OrcaSonar's `/mqtt` (one printer per socket; subscribe the exact `device/{id}/report`; no `X-Orca-Printer-Ids`). If #948 ("shard-only routing") removed this facade path, re-adding it is the change — the client does not use the aggregate `/printers/mqtt`. | client connects, subscribes, publishes a command, receives the echo, with no aggregate-grant header. |
|
||||
| CH-4 | `pushing.start` / `pushing.stop` over the viewer publish path arm / disarm the demand-mirror for that printer (today armed only by dashboard page polls, #984). Behaviour matches OPCP SPEC-3: on always-streaming backends it is a success no-op; OrcaCloud's mirror is genuinely demand-gated so it acts. | after a viewer `pushing.start`, `push_status` frames arrive on that viewer's `report` subscription; after `pushing.stop` (last viewer gone) they cease. |
|
||||
| CH-5 | `info.get_capabilities` returns an OPCP capability manifest matching OrcaSonar's `orca_capability_manifest` schema (`protocol_version` ≥ 1.2.0), whether the connector is Bambu- or Klipper-backed. | manifest validates against the OPCP schema. |
|
||||
|
||||
### 5.3 OrcaSonar — implement the spec additions (`~/repos/OrcaSonar/internal`)
|
||||
|
||||
OrcaSonar owns the contract, so its work is small: land the §5.1 spec text, make
|
||||
the LAN dispatcher match it, and turn two already-true facts into guarantees.
|
||||
|
||||
| ID | Change | Acceptance |
|
||||
|---|---|---|
|
||||
| **SN-1** | The LAN dispatcher accepts `pushing.start` / `pushing.stop` as `result:"success"` no-ops — the LAN broker always streams `push_status`, so these commands only need to be *recognised*, not fall through to "unsupported command". (Today they are handled only on the OrcaSonar→cloud connector path, not the LAN dispatcher.) `internal/protocol/dispatcher.go` specials + `internal/protocol/types.go` `SupportedCommands`. See O4: this is the "always-on, nothing to gate" reading, not a per-subscriber mirror. | golden: `{"pushing":{"command":"start","sequence_id":"20005"}}` → `{"pushing":{"command":"start","sequence_id":"20005","result":"success","errno":0}}`. |
|
||||
| SN-2 | `info.get_capabilities` returns the manifest identically whether requested via command or read from the retained topic, and works before any `pushall`. | fresh connect → command → manifest with `protocol_version ≥ 1.2.0`. |
|
||||
| SN-3 | Documented guarantee, plus a test, that topic `<id>` == advertised `device_id` (mDNS TXT `device_id=`, SSDP UDN). Lets the client drop the `device/+/report` wildcard. Likely already true (`internal/discovery/discovery.go`, `internal/config/config.go`). | client subscribing `device/<advertised-id>/report` receives reports. |
|
||||
| SN-4 | `system.set_settings` → implement per SPEC-5, or return `result:"fail"`, `errno = UNSUPPORTED_SETTING` (not a bare "unsupported command", not a parse error / close). | unknown setting key → structured errno, session stays open. |
|
||||
| SN-5 | Capability manifest `protocol_version` / `schema_version` → `1.2.0`. | manifest validates against the v1.2.0 schema. |
|
||||
| SN-6 | Conformance test only (no code change expected): broker accepts client-id `orcaslicer-lan-<dev_id>-<hex>` and a QoS 1 SUBSCRIBE. | test passes. |
|
||||
|
||||
### 5.4 OrcaSlicer client (this repo — implemented, not enumerated)
|
||||
|
||||
Everything in §4, plus: uses `info.get_capabilities` (never the retained topic),
|
||||
always issues `pushing.start` / `pushing.stop`, stays in `sequence_id` band
|
||||
20000–29999, subscribes the exact report topic, tolerates a SUBACK that grants
|
||||
QoS 0.
|
||||
|
||||
---
|
||||
|
||||
## 6. Testing & verification
|
||||
|
||||
### 6.1 Client unit tests (`tests/slic3rutils/`, Catch2)
|
||||
|
||||
- `OrcaMqttConnection` static frame builders — CONNECT (bearer and
|
||||
CONNECT-creds forms), SUBSCRIBE / UNSUBSCRIBE, PUBLISH, PINGREQ,
|
||||
remaining-length codec, `parse_endpoint` for `ws://` and `wss://`. Byte-level
|
||||
assertions.
|
||||
- `send_request` produces topic `device/<id>/request` with a verbatim payload;
|
||||
inbound strips `device/<id>/report` → `(id, payload)`.
|
||||
- `Config` selects the handshake path (auth mode; `use_tls` from scheme).
|
||||
- `command_*` payload builders match OPCP shapes (string `sequence_id`, band
|
||||
20000–29999, single namespace key).
|
||||
- The post-connect sequence emits exactly
|
||||
`subscribe → pushing.start → pushall → info.get_version → info.get_capabilities`,
|
||||
in that order.
|
||||
- Generation guard: a superseded connection's late handler calls are no-ops.
|
||||
- SUBACK granting QoS 0 when 1 was requested → still connected, messages still
|
||||
delivered.
|
||||
|
||||
### 6.2 Client integration (in-process MQTT-over-WS mock)
|
||||
|
||||
- **One parametrized test, two fixtures (LAN `Config` / cloud `Config`):**
|
||||
connect → CONNACK → subscribe → publish command → mock emits the result echo →
|
||||
assert `on_message_fn` fires with it. Identical assertions for both fixtures —
|
||||
this is the "exactly the same" proof.
|
||||
- Reconnect: mock drops the socket → worker backs off → reconnects →
|
||||
subscriptions re-sent → `pushing.start` re-issued.
|
||||
- Auth reject: CONNACK rc 4/5 → terminal `ConnectStatusFailed`, no retry storm.
|
||||
|
||||
### 6.3 Cross-repo conformance (run in those repos' CI, from §5 acceptance rows)
|
||||
|
||||
- OrcaCloud: extend `tests/e2e/lane-b-printers/printer_mqtt.e2e.test.ts` for
|
||||
CH-1 / CH-2 / CH-3 / CH-4 / CH-5 (each row's acceptance criterion in §5.2).
|
||||
- OrcaSonar: golden JSONL fixtures for SN-1 / SN-2 / SN-4.
|
||||
|
||||
### 6.4 Manual smoke (record a log / screenshot for each)
|
||||
|
||||
RelWithDebInfo build →
|
||||
|
||||
- (a) real OrcaSonar hub on the LAN: discover, connect, Device tab populates,
|
||||
set nozzle temperature, observe the result echo;
|
||||
- (b) OrcaCloud staging with a paired printer: select, same checks.
|
||||
|
||||
Both exercised through the *same* `OrcaMqttConnection` code path.
|
||||
|
||||
### 6.5 Gates before "done"
|
||||
|
||||
- New unit + integration tests green (ctest output as evidence).
|
||||
- No regression in the existing `tests/slic3rutils` suites (printer-agent,
|
||||
plugin, qidi).
|
||||
- LAN and cloud smoke each confirmed with a log/screenshot.
|
||||
- One `cmake --build build` at the end.
|
||||
|
||||
---
|
||||
|
||||
## 7. Out of scope
|
||||
|
||||
- Editing OrcaCloud or OrcaSonar in this task (the checklist in §5 is the
|
||||
hand-off; those land as separate PRs in their own repos).
|
||||
- A live multi-printer status feed for the Device list on cloud (would be its
|
||||
own `OrcaCloudServiceAgent` aggregate consumer — see §4.3 / O2). The printer
|
||||
agent connects the selected printer only.
|
||||
- Reusing OrcaCloud's aggregate `/printers/mqtt` for the client (option B from
|
||||
brainstorming — rejected; it forces aggregate-grant semantics into
|
||||
`OrcaMqttConnection` that the LAN 1:1 case never needs).
|
||||
- An `IPrinterTransport` abstraction above MQTT (option C — YAGNI while MQTT is
|
||||
the only transport).
|
||||
- Camera streaming, filesystem / file transfer, filament sync, AMS mapping.
|
||||
- Back-compat: the legacy `/tunnel` envelope plane, retaining REST `/commands`
|
||||
as a required alias, dual-schema acceptance on OrcaSonar.
|
||||
|
||||
---
|
||||
|
||||
## 8. Open items, risks & resolved questions
|
||||
|
||||
| # | Item |
|
||||
|---|---|
|
||||
| O1 | **Does OrcaCloud's 1:1 `/api/v1/printers/{id}/mqtt` still exist post-#948?** ("shard-only routing" made routing shard-backed.) Not a client fork any more — per CH-3 the client uses only the 1:1 endpoint, so if the facade path was removed, re-adding it *is* the OrcaCloud change. Just needs confirmation with the OrcaCloud team of whether CH-3 is "keep" or "re-add". |
|
||||
| O2 | **Behaviour change: unselected cloud printers lose live status** (§4.3 — consequence of dropping the aggregate socket for LAN/cloud symmetry). They show last-known / REST status, matching unselected LAN hubs. Needs product sign-off before implementation. |
|
||||
| O3 | **CONNECT-creds vs bearer through a fronting proxy.** If a deployment puts `wss://` in front of OrcaSonar, both auth inputs could be present. Precedence is fixed in §4.1 (`bearer_provider` set ⇒ bearer, CONNECT creds omitted); flagged only so the plan makes it a tested branch. |
|
||||
| O4 | **Resolved.** `pushing.start` / `pushing.stop` mean "begin / stop streaming `push_status` to me". On OrcaCloud the mirror is genuinely demand-gated so the commands act; on OrcaSonar LAN the broker always streams, so they are recognised-and-succeed no-ops (SN-1). Not the "MQTT subscription granularity" reading — the client still SUBSCRIBEs `device/<id>/report` explicitly on both. |
|
||||
| O5 | **`sequence_id` band collisions.** The client must never emit outside 20000–29999, including for any gateway-minted flow it triggers (print jobs). Audit every `sequence_id` source in `OrcaPrinterAgent`. |
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\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"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -2293,8 +2293,6 @@ msgstr ""
|
||||
msgid "%s has been removed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr ""
|
||||
@@ -4571,6 +4569,9 @@ msgid ""
|
||||
"No - Cancel enabling spiral mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printing"
|
||||
msgstr ""
|
||||
|
||||
@@ -4994,9 +4995,7 @@ msgstr ""
|
||||
|
||||
#, possible-c-format, possible-boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
|
||||
#, possible-boost-format
|
||||
@@ -5019,9 +5018,6 @@ msgstr ""
|
||||
msgid "Invalid format. Expected vector format: \"%1%\""
|
||||
msgstr ""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr ""
|
||||
|
||||
msgid "System agents"
|
||||
msgstr ""
|
||||
|
||||
@@ -5951,6 +5947,12 @@ msgstr ""
|
||||
msgid "Save current project as"
|
||||
msgstr ""
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr ""
|
||||
|
||||
@@ -7696,6 +7698,12 @@ msgstr ""
|
||||
msgid "Customized Preset"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
@@ -8271,8 +8290,6 @@ msgstr ""
|
||||
msgid "Language selection"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr ""
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr ""
|
||||
@@ -9124,9 +9141,6 @@ msgstr ""
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr ""
|
||||
|
||||
msgid "Publish"
|
||||
msgstr ""
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr ""
|
||||
|
||||
@@ -9142,6 +9156,64 @@ msgstr ""
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr ""
|
||||
@@ -19337,6 +19409,15 @@ msgstr ""
|
||||
msgid "Skipping objects."
|
||||
msgstr ""
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \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"
|
||||
"Last-Translator: \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."
|
||||
msgstr "%s s'ha eliminat."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Canvi d'idioma de l'aplicació"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Seleccioneu l'idioma"
|
||||
@@ -4995,6 +4993,9 @@ msgstr ""
|
||||
"Sí: canviar aquesta configuració i activar el mode d'espiral automàticament\n"
|
||||
"No - Renunciar a utilitzar el mode espiral aquesta vegada"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/D"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"És %s%% or %s %s?\n"
|
||||
"SÍ per %s%%.\n"
|
||||
"NO per %s %s."
|
||||
"És %s%% or %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Format no vàlid. Format vectorial esperat: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/D"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Agents del sistema"
|
||||
@@ -6421,6 +6415,12 @@ msgstr "Desa el projecte com a"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
msgstr "Perfil personalitzat"
|
||||
|
||||
msgid "Some published settings could not be applied:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Some filament slots were changed:"
|
||||
msgstr ""
|
||||
|
||||
# AI Translated
|
||||
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!"
|
||||
@@ -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."
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
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."
|
||||
msgstr "Nota: La preparació pot trigar uns quants minuts. Si us plau, sigui pacient."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Publicar"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "La publicació ha estat cancel·lada"
|
||||
|
||||
@@ -9898,6 +9910,64 @@ msgstr "Carregant dades"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Desar %s com a"
|
||||
@@ -21387,6 +21457,15 @@ msgstr "Aquesta acció no es pot desfer. Continuar?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Ometent objectes."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Seleccioneu filament"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: Jakub Hencl\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."
|
||||
msgstr "%s bylo odstraněno."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Přepnutí jazyka aplikace"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Zvolte jazyk"
|
||||
@@ -4953,6 +4951,10 @@ msgstr ""
|
||||
"Ano – změnit tato nastavení a automaticky povolit spirálový režim\n"
|
||||
"Ne – tentokrát nepoužít spirálový režim"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "Tisk"
|
||||
|
||||
@@ -5384,13 +5386,9 @@ msgstr "Hodnota %s je mimo rozsah. Platný rozsah je od %d do %d."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Je to %s%% nebo %s %s?\n"
|
||||
"ANO pro %s%%,\n"
|
||||
"NE pro %s %s."
|
||||
"Je to %s%% nebo %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Neplatný formát. Očekávaný vektorový formát: \"%1%\""
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Systémoví agenti"
|
||||
@@ -6382,6 +6376,12 @@ msgstr "Uložit projekt jako"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "Typ trysky není nastaven. Nastavte prosím trysku a zkuste to znovu."
|
||||
|
||||
@@ -8859,8 +8876,6 @@ msgstr "Chcete pokračovat?"
|
||||
msgid "Language selection"
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
msgstr "Publikování bylo zrušeno"
|
||||
|
||||
@@ -9846,6 +9858,64 @@ msgstr "Nahrávání dat"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Uložit %s jako"
|
||||
@@ -21331,6 +21401,15 @@ msgstr "Tuto akci nelze vrátit zpět. Pokračovat?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Přeskakování objektů."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
# AI Translated
|
||||
msgid "Select Filament"
|
||||
msgstr "Vybrat filament"
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: Heiko Liebscher <hliebschergmail.com>\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."
|
||||
msgstr "%s wurde entfernt."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Wechsel der Sprache"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Sprache wählen"
|
||||
@@ -4859,6 +4857,9 @@ msgstr ""
|
||||
"Ja - Diese Einstellungen ändern und den Spiralmodus automatisch aktivieren\n"
|
||||
"Nein - Spiralmodus nicht aktivieren"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "Nicht verfügbar"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "Drucken"
|
||||
|
||||
@@ -5290,13 +5291,9 @@ msgstr "Wert %s ist außerhalb des Bereichs. Der gültige Bereich liegt zwischen
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Heißt es %s%% oder %s %s?\n"
|
||||
"Ja für %s%%, \n"
|
||||
"Nein für %s %s."
|
||||
"Heißt es %s%% oder %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Ungültiges Format. Erwartetes Vektorformat: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "Nicht verfügbar"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Systemagenten"
|
||||
@@ -6274,6 +6268,12 @@ msgstr "Projekt speichern als"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
msgstr "Asien-Pazifik"
|
||||
@@ -9662,9 +9677,6 @@ msgstr "Zur Modellveröffentlichungs-Webseite springen"
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "Hinweis: Die Vorbereitung kann einige Minuten dauern. Bitte haben Sie Geduld."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Veröffentlichen"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Veröffentlichung wurde abgebrochen"
|
||||
|
||||
@@ -9680,6 +9692,64 @@ msgstr "Daten werden hochgeladen"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "%s speichern als"
|
||||
@@ -20816,6 +20886,15 @@ msgstr "Diese Aktion kann nicht rückgängig gemacht werden. Fortsetzen?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Objekte werden übersprungen."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Filament auswählen"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: Alexandre Folle de Menezes\n"
|
||||
"Language-Team: \n"
|
||||
@@ -2289,8 +2289,6 @@ msgstr ""
|
||||
msgid "%s has been removed."
|
||||
msgstr ""
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr ""
|
||||
@@ -4567,6 +4565,9 @@ msgid ""
|
||||
"No - Cancel enabling spiral mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr ""
|
||||
|
||||
msgid "Printing"
|
||||
msgstr ""
|
||||
|
||||
@@ -4990,9 +4991,7 @@ msgstr ""
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
|
||||
#, boost-format
|
||||
@@ -5015,9 +5014,6 @@ msgstr ""
|
||||
msgid "Invalid format. Expected vector format: \"%1%\""
|
||||
msgstr ""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr ""
|
||||
|
||||
msgid "System agents"
|
||||
msgstr ""
|
||||
|
||||
@@ -5947,6 +5943,12 @@ msgstr ""
|
||||
msgid "Save current project as"
|
||||
msgstr ""
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr ""
|
||||
|
||||
@@ -7692,6 +7694,12 @@ msgstr ""
|
||||
msgid "Customized Preset"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr ""
|
||||
|
||||
@@ -8267,8 +8286,6 @@ msgstr ""
|
||||
msgid "Language selection"
|
||||
msgstr ""
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr ""
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr ""
|
||||
@@ -9120,9 +9137,6 @@ msgstr ""
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr ""
|
||||
|
||||
msgid "Publish"
|
||||
msgstr ""
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr ""
|
||||
|
||||
@@ -9138,6 +9152,64 @@ msgstr ""
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr ""
|
||||
@@ -19333,6 +19405,15 @@ msgstr ""
|
||||
msgid "Skipping objects."
|
||||
msgstr ""
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: Ian A. Bassi <>\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."
|
||||
msgstr "Se ha eliminado %s."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Cambiando el idioma de la aplicación"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Seleccionar el idioma"
|
||||
@@ -4729,6 +4727,9 @@ msgstr ""
|
||||
"Sí - Cambiar estos ajustes y activar el modo espiral automáticamente\n"
|
||||
"No - Dejar de usar el modo espiral esta vez"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"¿Es %s%% o %s %s?\n"
|
||||
"SÍ para %s%%, \n"
|
||||
"NO para %s %s."
|
||||
"¿Es %s%% o %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Formato inválido. Formato de vector esperado: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "System agents"
|
||||
msgstr "Agentes del sistema"
|
||||
|
||||
@@ -6129,6 +6123,12 @@ msgstr "Guardar proyecto como"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
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."
|
||||
msgstr "Nota: La preparación puede llevar varios minutos. Por favor, sea paciente."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Publicar"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "La publicación fue cancelada"
|
||||
|
||||
@@ -9437,6 +9449,64 @@ msgstr "Cargando datos"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Guardar %s como"
|
||||
@@ -20409,6 +20479,15 @@ msgstr "Esta acción no se puede deshacer. ¿Continuar?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Omitiendo objetos."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Seleccionar Filamento"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \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"
|
||||
"Last-Translator: Manu Goiogana <mgoiogana@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -2390,8 +2390,6 @@ msgstr "Eguneratze bat dago erabilgarri. Ireki aurrezarpen-paketeen elkarrizketa
|
||||
msgid "%s has been removed."
|
||||
msgstr "%s kendu da."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Aplikazioaren hizkuntza aldatzen"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Hautatu hizkuntza"
|
||||
@@ -4771,6 +4769,9 @@ msgstr ""
|
||||
"Bai - Aldatu ezarpen hauek eta gaitu espiral/loreontzi modua automatikoki\n"
|
||||
"Ez - Utzi bertan behera espiral modua gaitzea"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "Inprimatzen"
|
||||
|
||||
@@ -5202,13 +5203,9 @@ msgstr "%s balioa tartetik kanpo dago. Baliozko tartea %d eta %d artekoa da."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"%s%% edo %s %s da?\n"
|
||||
"BAI %s%%-(r)entzat,\n"
|
||||
"EZ %s %s-(r)entzat."
|
||||
"%s%% edo %s %s da?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Formatuak ez du balio. Espero den formatu bektoriala: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "System agents"
|
||||
msgstr "Sistema-agenteak"
|
||||
|
||||
@@ -6175,6 +6169,12 @@ msgstr "Gorde proiektua honela"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "Pita mota ez dago ezarrita. Ezarri pita eta saiatu berriro."
|
||||
|
||||
@@ -8587,8 +8604,6 @@ msgstr "Jarraitu nahi duzu?"
|
||||
msgid "Language selection"
|
||||
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"
|
||||
msgstr "Asia-Pazifikoa"
|
||||
@@ -9505,9 +9520,6 @@ msgstr "Joan modeloa argitaratzeko web-orrira"
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "Oharra: prestaketak minutu batzuk iraun ditzake. Izan pazientzia."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Argitaratu"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Argitaratzea bertan behera utzi da"
|
||||
|
||||
@@ -9523,6 +9535,64 @@ msgstr "Datuak igotzen"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Gorde %s honela"
|
||||
@@ -20596,6 +20666,15 @@ msgstr "Ekintza hau ezin da desegin. Jarraitu?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Objektuak saltatzen."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Hautatu filamentua"
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: \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."
|
||||
msgstr "%s a été supprimé."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Changer la langue de l'application"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Sélectionner la langue"
|
||||
@@ -4809,6 +4807,9 @@ msgstr ""
|
||||
"Oui - Modifiez ces paramètres et activez automatiquement le mode spirale/vase\n"
|
||||
"Non - Annuler l'activation du mode spirale"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Est-ce %s%% ou %s %s ?\n"
|
||||
"OUI pour %s%%, \n"
|
||||
"NON pour %s %s."
|
||||
"Est-ce %s%% ou %s %s ?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Format invalide. Format vectoriel attendu : \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Agents système"
|
||||
@@ -6223,6 +6217,12 @@ msgstr "Enregistrer le projet sous"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
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"
|
||||
msgstr "Sélection de la langue"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "Changement de langue de l’application alors que certains préréglages sont modifiés."
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
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."
|
||||
msgstr "Remarque : La préparation peut prendre plusieurs minutes. Veuillez patienter."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Publier"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "La publication a été annulée"
|
||||
|
||||
@@ -9594,6 +9606,64 @@ msgstr "Téléversement des données"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Enregistrer %s sous"
|
||||
@@ -20708,6 +20778,15 @@ msgstr "Cette action ne peut pas être annulée. Continuer ?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Ignorer des objets."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Sélectionner le filament"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"MIME-Version: 1.0\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."
|
||||
msgstr "%s eltávolítva."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Alkalmazás nyelvének váltása"
|
||||
|
||||
msgid "Select the language"
|
||||
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"
|
||||
"Nem - Most ne kapcsold be a spirál módot"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"%s%% vagy %s %s?\n"
|
||||
"IGEN %s%%, \n"
|
||||
"NEM %s %s."
|
||||
"%s%% vagy %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Érvénytelen formátum. Elvárt vektor formátum: \"%1%\""
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Rendszerügynökök"
|
||||
@@ -6325,6 +6319,12 @@ msgstr "Projekt mentése másként"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
msgstr "A közzététel törlésre került"
|
||||
|
||||
@@ -9754,6 +9766,64 @@ msgstr "Adatok feltöltése"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "%s mentése"
|
||||
@@ -21110,6 +21180,15 @@ msgstr "Ez a művelet nem vonható vissza. Folytatod?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Objektumok kihagyása."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Filament kiválasztása"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
@@ -2466,8 +2466,6 @@ msgstr "È disponibile un aggiornamento. Apri la finestra di dialogo del bundle
|
||||
msgid "%s has been removed."
|
||||
msgstr "%s è stato rimosso."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Cambio lingua applicazione"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Seleziona la lingua"
|
||||
@@ -4907,6 +4905,9 @@ msgstr ""
|
||||
"Sì - Modifica queste impostazioni ed abilita la modalità spirale automaticamente\n"
|
||||
"No - Annulla l'attivazione della modalità a spirale"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/D"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "Stampa"
|
||||
|
||||
@@ -5338,13 +5339,9 @@ msgstr "Il valore %s è fuori intervallo. L'intervallo valido è da %d a %d."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"È %s%% o %s %s?\n"
|
||||
"Sì per %s%%, \n"
|
||||
"NO per %s %s."
|
||||
"È %s%% o %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Formato non valido. Formato vettoriale previsto: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/D"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Agenti di sistema"
|
||||
@@ -6327,6 +6321,12 @@ msgstr "Salva progetto con nome"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "Il tipo di ugello non è impostato. Impostare l'ugello e riprovare."
|
||||
|
||||
@@ -8784,8 +8801,6 @@ msgstr "Vuoi continuare?"
|
||||
msgid "Language selection"
|
||||
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"
|
||||
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."
|
||||
msgstr "Nota: la preparazione può richiedere alcuni minuti. Si prega di avere pazienza."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Pubblica"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "La pubblicazione è stata annullata"
|
||||
|
||||
@@ -9772,6 +9784,64 @@ msgstr "Caricamento dati"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Salva %s con nome"
|
||||
@@ -21134,6 +21204,15 @@ msgstr "Questa azione non può essere annullata. Continuare?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Salto degli oggetti."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Seleziona filamento"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
@@ -2473,8 +2473,6 @@ msgstr "アップデートが利用可能です。プリセットバンドルの
|
||||
msgid "%s has been removed."
|
||||
msgstr "%sを削除しました。"
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "アプリケーション言語の切り替え"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "言語を選択"
|
||||
@@ -4920,6 +4918,10 @@ msgstr ""
|
||||
"はい - 変更して、スパイラルモードを有効にします\n"
|
||||
"いいえ - 変更せず、スパイラルモードを有効しません"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "造形中"
|
||||
|
||||
@@ -5351,12 +5353,9 @@ msgstr "値%sは範囲外です。有効な範囲は%dから%dです。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"%s%% か、それとも %s %sですか?\n"
|
||||
"%s%% の場合ははい、 %s %s はいいえ。"
|
||||
"%s%% か、それとも %s %sですか?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "無効なフォーマット、%1%であるはずです。"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "システムエージェント"
|
||||
@@ -6336,6 +6331,12 @@ msgstr "プロジェクトを名前を付けて保存"
|
||||
msgid "Save current project as"
|
||||
msgstr "プロジェクトを名前を付けて保存"
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr "3MF/STL/STEP/SVG/OBJ/AMFをインポート"
|
||||
|
||||
@@ -8177,6 +8178,12 @@ msgstr "これらのプリセット内のG-codeがマシンに損傷を与えな
|
||||
msgid "Customized Preset"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "ノズルタイプが設定されていません。ノズルを設定して再試行してください。"
|
||||
|
||||
@@ -8802,8 +8820,6 @@ msgstr "続行しますか?"
|
||||
msgid "Language selection"
|
||||
msgstr "言語選択"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "アプリケーション言語を切り替える時に、プリセットの変更があります"
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr "アジア太平洋地域"
|
||||
@@ -9776,9 +9792,6 @@ msgstr "モデル公開ページに移動"
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "注意: 準備するには数分かかる場合があります、暫くお待ち下さい。"
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "公開する"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "公開は取り消しました"
|
||||
|
||||
@@ -9794,6 +9807,64 @@ msgstr "データをアップロード中"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "%sを名前つけて保存"
|
||||
@@ -21678,6 +21749,15 @@ msgstr "この操作は元に戻せません。続行しますか?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "オブジェクトをスキップ中。"
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "フィラメントを選択"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: crwusiz <crwusiz@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -2481,8 +2481,6 @@ msgstr "사용 가능한 업데이트가 있습니다. 사전 설정 번들 대
|
||||
msgid "%s has been removed."
|
||||
msgstr "%s이(가) 제거되었습니다."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "응용 프로그램 언어 전환"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "언어 선택"
|
||||
@@ -4931,6 +4929,10 @@ msgstr ""
|
||||
"예 - 이 설정을 변경하고 나선 모드를 자동으로 활성화합니다\n"
|
||||
"아니오 - 이번에는 나선 모드 사용을 포기합니다"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "해당 없음"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "출력 중"
|
||||
|
||||
@@ -5362,13 +5364,9 @@ msgstr "값 %s이 범위를 벗어났습니다. 유효한 범위는 %d에서 %d
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"%s%% 또는 %s %s입니까?\n"
|
||||
"%s%%에 대해 예,\n"
|
||||
"%s %s에 대해 아니요."
|
||||
"%s%% 또는 %s %s입니까?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "잘못된 형식입니다. 필요한 벡터 형식: \"%1%\""
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "해당 없음"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "시스템 에이전트"
|
||||
@@ -6350,6 +6344,12 @@ msgstr "프로젝트 다른 이름으로 저장"
|
||||
msgid "Save current project as"
|
||||
msgstr "현재 프로젝트 다른 이름으로 저장"
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr "3MF/STL/STEP/SVG/OBJ/AMF 가져오기"
|
||||
|
||||
@@ -8195,6 +8195,12 @@ msgstr "이러한 사전 설정 내의 Gcode가 기계 손상을 방지할 수
|
||||
msgid "Customized Preset"
|
||||
msgstr "사용자 정의 프리셋"
|
||||
|
||||
msgid "Some published settings could not be applied:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Some filament slots were changed:"
|
||||
msgstr ""
|
||||
|
||||
# AI Translated
|
||||
msgid "Component name(s) inside step file not in UTF-8 format!"
|
||||
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."
|
||||
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."
|
||||
msgstr "노즐 유형이 설정되지 않았습니다. 노즐을 설정하고 다시 시도하세요."
|
||||
|
||||
@@ -8837,8 +8854,6 @@ msgstr "계속하시겠습니까?"
|
||||
msgid "Language selection"
|
||||
msgstr "언어 선택"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "일부 사전 설정이 수정되는 동안 응용 프로그램 언어를 전환합니다."
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr "아시아 태평양"
|
||||
@@ -9865,9 +9880,6 @@ msgstr "모델 게시 웹 페이지로 이동"
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "참고: 준비하는 데 몇 분 정도 걸릴 수 있습니다. 조금만 기다려 주십시오."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "게시"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "게시가 취소되었습니다"
|
||||
|
||||
@@ -9884,6 +9896,64 @@ msgstr "데이터 업로드 중"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "%s을(를) 다음으로 저장"
|
||||
@@ -21536,6 +21606,15 @@ msgstr "이 작업은 취소할 수 없습니다. 계속하시겠습니까?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "물체 건너뛰기"
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "필라멘트 선택"
|
||||
|
||||
|
||||
@@ -136,6 +136,7 @@ src/slic3r/GUI/BackgroundSlicingProcess.cpp
|
||||
src/slic3r/GUI/BedShapeDialog.cpp
|
||||
src/slic3r/GUI/BedShapeDialog.hpp
|
||||
src/slic3r/GUI/ConfigManipulation.cpp
|
||||
src/slic3r/GUI/ConfigValueFormatter.cpp
|
||||
src/slic3r/GUI/DeviceManager.cpp
|
||||
src/slic3r/GUI/DeviceErrorDialog.cpp
|
||||
src/slic3r/GUI/ExtraRenderers.cpp
|
||||
@@ -175,6 +176,7 @@ src/slic3r/GUI/ProgressStatusBar.cpp
|
||||
src/slic3r/GUI/PlateSettingsDialog.cpp
|
||||
src/slic3r/GUI/PrivacyUpdateDialog.cpp
|
||||
src/slic3r/GUI/PublishDialog.cpp
|
||||
src/slic3r/GUI/PublishSettingsDialog.cpp
|
||||
src/slic3r/GUI/SavePresetDialog.cpp
|
||||
src/slic3r/GUI/Search.cpp
|
||||
src/slic3r/GUI/Selection.cpp
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \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"
|
||||
"Last-Translator: Gintaras Kučinskas <sharanchius@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -2449,8 +2449,6 @@ msgstr "Yra prieinamas atnaujinimas. Atidarykite profilių paketo dialogo langą
|
||||
msgid "%s has been removed."
|
||||
msgstr "%s buvo pašalintas."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Perjungiama programos kalba"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Pasirinkite kalbą"
|
||||
@@ -4893,6 +4891,9 @@ msgstr ""
|
||||
"Taip – pakeisti šiuos nustatymus ir automatiškai įjungti spiralinį režimą\n"
|
||||
"Ne – nenaudoti spiralinio režimo"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "Spausdinimas"
|
||||
|
||||
@@ -5324,13 +5325,9 @@ msgstr "Reikšmė %s yra už ribų. Galimas diapazonas yra nuo %d iki %d."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Ar tai %s%% ar %s %s?\n"
|
||||
"TAIP %s%%, \n"
|
||||
"NE %s %s."
|
||||
"Ar tai %s%% ar %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Netinkamas formatas. Tinkamas vektorinis formatas: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Sisteminiai agentai"
|
||||
@@ -6312,6 +6306,12 @@ msgstr "Įrašyti projektą kaip"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "Purkštuko tipas nenustatytas. Nustatykite purkštuką ir bandykite dar kartą."
|
||||
|
||||
@@ -8774,8 +8791,6 @@ msgstr "Ar norite tęsti?"
|
||||
msgid "Language selection"
|
||||
msgstr "Kalbos pasirinkimas"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "Keičiama programos kalba, kai yra pakeistų profilių."
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
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."
|
||||
msgstr "Pastaba: paruošimas gali užtrukti kelias minutes. Būkite kantrūs."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Talpinti"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Publikavimas buvo atšauktas"
|
||||
|
||||
@@ -9711,6 +9723,64 @@ msgstr "Įkeliami duomenys"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Išsaugoti %s kaip"
|
||||
@@ -20865,6 +20935,15 @@ msgstr "Šio veiksmo atšaukti nebus galima. Tęsti?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Praleidžiami objektai."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Pasirinkti giją"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: \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."
|
||||
msgstr "%s is verwijderd."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "De taal van de applicatie wordt aangepast"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Kies de taal"
|
||||
@@ -5325,6 +5323,9 @@ msgstr ""
|
||||
"Ja - Pas de instellingen aan en zet de vaas modus automatisch aan\n"
|
||||
"Nee - Pas de vaas modus deze keer niet toe"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/B"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Is het %s%% or %s %s?\n"
|
||||
"JA voor %s%%, \n"
|
||||
"NEE voor %s %s."
|
||||
"Is het %s%% or %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Onjuist formaat. Het Vector formaat wordt verwacht: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/B"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Systeemagenten"
|
||||
@@ -6888,6 +6882,12 @@ msgstr "Bewaar project als"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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
|
||||
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."
|
||||
@@ -9579,8 +9596,6 @@ msgstr "Wilt u doorgaan?"
|
||||
msgid "Language selection"
|
||||
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"
|
||||
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."
|
||||
msgstr "Notitie: het voorbereiden kan enkele minuten duren. Even geduld alstublieft."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Publiceren"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Het publiceren is geannuleerd"
|
||||
|
||||
@@ -10645,6 +10657,64 @@ msgstr "Gegevens uploaden"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Bewaar %s als"
|
||||
@@ -23245,6 +23315,15 @@ msgstr "Deze actie kan niet ongedaan worden gemaakt. Doorgaan?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Objecten worden overgeslagen."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Selecteer filament"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OrcaSlicer 2.3.0-rc\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"
|
||||
"Last-Translator: Krzysztof Morga <<tlumaczeniebs@gmail.com>>\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."
|
||||
msgstr "%s został usunięty."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Zmiana języka aplikacji"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Wybierz język"
|
||||
@@ -5013,6 +5011,10 @@ msgstr ""
|
||||
"Tak - Zmień te ustawienia automatycznie i włącz tryb Wazy\n"
|
||||
"Nie - Zrezygnuj tym razem z używania trybu Wazy"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "Nie dotyczy"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "Drukowanie"
|
||||
|
||||
@@ -5450,13 +5452,9 @@ msgstr "Wartość %s jest spoza zakresu. Poprawny zakres wynosi od %d do %d."
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Czy to %s%% czy %s %s?\n"
|
||||
"TAK dla %s%%,\n"
|
||||
"NIE dla %s %s."
|
||||
"Czy to %s%% czy %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Nieprawidłowy format. Oczekiwano formatu wektorowego: „%1%”"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "Nie dotyczy"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Agenci systemowi"
|
||||
@@ -6469,6 +6463,12 @@ msgstr "Zapisz projekt jako"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "Nie ustawiono typu dyszy Wprowadź ustawienia dyszy i spróbuj ponownie."
|
||||
|
||||
@@ -8993,8 +9010,6 @@ msgstr "Czy kontynuować?"
|
||||
msgid "Language selection"
|
||||
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"
|
||||
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."
|
||||
msgstr "Uwaga: Przygotowanie może zająć kilka minut. Proszę o cierpliwość."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Opublikuj"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Publikacja została anulowana"
|
||||
|
||||
@@ -10040,6 +10052,64 @@ msgstr "Przesyłanie danych"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Zapisz %s jako"
|
||||
@@ -21723,6 +21793,15 @@ msgstr "Tego działania nie będzie można cofnąć. Kontynuować?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Pomijanie obiektów."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select 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℃."
|
||||
#~ 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"
|
||||
#~ msgstr "Pozwól na kilka filamentów na tej samej płycie"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: Alexandre Folle de Menezes\n"
|
||||
"Language-Team: Portuguese, Brazilian\n"
|
||||
@@ -2128,7 +2128,7 @@ msgid ""
|
||||
"OrcaSlicer has attempted to recreate the configuration file.\n"
|
||||
"Please note, application settings will be lost, but printer profiles will not be affected."
|
||||
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"
|
||||
"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."
|
||||
msgstr "%s foi removido."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Alternando o idioma do aplicativo"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Selecione o idioma"
|
||||
@@ -4743,6 +4741,9 @@ msgstr ""
|
||||
"Sim - Alterar essas configurações e ativar o modo espiral/vaso automaticamente\n"
|
||||
"Não - Cancelar ativação do modo espiral"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/D"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"É %s%% ou %s %s?\n"
|
||||
"SIM para %s%%, \n"
|
||||
"NÃO para %s %s."
|
||||
"É %s%% ou %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Formato inválido. Formato de vetor esperado: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "N/D"
|
||||
|
||||
msgid "System agents"
|
||||
msgstr "Agentes do sistema"
|
||||
|
||||
@@ -6145,6 +6139,12 @@ msgstr "Salvar projeto como"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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."
|
||||
|
||||
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."
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
msgstr "Ásia-Pacífico"
|
||||
@@ -8618,7 +8633,7 @@ msgstr ""
|
||||
"\n"
|
||||
"Deseja baixar e instalar esta versão agora?\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"
|
||||
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."
|
||||
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"
|
||||
"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"
|
||||
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."
|
||||
msgstr "Nota: A preparação pode levar vários minutos. Por favor, seja paciente."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Publicar"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Publicação cancelada"
|
||||
|
||||
@@ -9496,6 +9508,64 @@ msgstr "Enviando dados"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
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."
|
||||
msgstr "O mapeamento de bicos atual pode gerar um desperdício adicional de %0.2f g."
|
||||
|
||||
# AI Translated
|
||||
#, c-format, boost-format
|
||||
msgid "Recommended filament arrangement saves %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"
|
||||
msgstr "Interno"
|
||||
|
||||
# AI Translated
|
||||
#, c-format, boost-format
|
||||
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"
|
||||
@@ -9768,15 +9836,12 @@ msgstr "%s com espaço inferior a 20MB. O timelapse pode não ser salvo corretam
|
||||
msgid "Clean up files"
|
||||
msgstr "Limpar arquivos"
|
||||
|
||||
# AI Translated
|
||||
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."
|
||||
|
||||
# AI Translated
|
||||
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."
|
||||
|
||||
# AI Translated
|
||||
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."
|
||||
|
||||
@@ -9812,7 +9877,6 @@ msgstr "Atualizando informações dos hotends (%d/%d)."
|
||||
msgid "There are not enough available hotends currently."
|
||||
msgstr "Não há hotends disponíveis em quantidade suficiente no momento."
|
||||
|
||||
# AI Translated
|
||||
msgid "Please complete the hotend rack setup and try again."
|
||||
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)."
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
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
|
||||
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."
|
||||
|
||||
# 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."
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
msgstr "Esta impressora não suporta a imprimir todas as placas."
|
||||
|
||||
# AI Translated
|
||||
#, 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."
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
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"
|
||||
|
||||
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"
|
||||
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"
|
||||
msgstr "Pesquisar nas predefinições"
|
||||
|
||||
# AI Translated
|
||||
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."
|
||||
|
||||
# AI Translated
|
||||
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."
|
||||
|
||||
@@ -10242,7 +10294,7 @@ msgid "Are you sure you want to enable this option?"
|
||||
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?"
|
||||
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."
|
||||
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"
|
||||
msgstr "Scripts de pós-processamento"
|
||||
|
||||
# AI Translated
|
||||
msgid "Slicing Pipeline Plugin"
|
||||
msgstr "Plugin de Pipeline de Fatiamento"
|
||||
|
||||
@@ -10459,9 +10510,8 @@ msgstr "Temperatura da câmara de impressão"
|
||||
msgid "Chamber temperature"
|
||||
msgstr "Temperatura da câmara"
|
||||
|
||||
# AI Translated
|
||||
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"
|
||||
msgstr "Alvo"
|
||||
@@ -10699,7 +10749,6 @@ msgstr "Limites de altura da camada"
|
||||
msgid "Z-Hop"
|
||||
msgstr "Z-Hop"
|
||||
|
||||
# AI Translated
|
||||
msgid ""
|
||||
"The Retract before wipe option could be only 100% when using the Firmware Retraction mode.\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"
|
||||
msgstr "Uma das predefinições não existe"
|
||||
|
||||
# AI Translated
|
||||
msgid "Compared presets has different printer technology"
|
||||
msgstr "As predefinições comparadas têm tecnologia de impressora diferente"
|
||||
|
||||
@@ -11342,9 +11390,8 @@ msgstr "Entrar"
|
||||
msgid "Login failed. Please try again."
|
||||
msgstr "Falha no login. Tente novamente."
|
||||
|
||||
# AI Translated
|
||||
msgid "parse json failed"
|
||||
msgstr "falha ao analisar o json"
|
||||
msgstr "falha ao processar o json"
|
||||
|
||||
msgid "[Action Required] "
|
||||
msgstr "[Ação Necessária] "
|
||||
@@ -11535,7 +11582,6 @@ msgctxt "Keyboard Shortcut"
|
||||
msgid "Space"
|
||||
msgstr "Espaço"
|
||||
|
||||
# AI Translated
|
||||
msgid "Open actions speed dial"
|
||||
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"
|
||||
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."
|
||||
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?"
|
||||
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?"
|
||||
msgstr "Onde encontrar o IP e o Código de Acesso da sua impressora?"
|
||||
|
||||
# AI Translated
|
||||
msgid "How to trouble shooting"
|
||||
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."
|
||||
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"
|
||||
msgstr "G-code de mudança de tipo de extrusão do processo"
|
||||
|
||||
# AI Translated
|
||||
msgid "Filament change extrusion role G-code"
|
||||
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"
|
||||
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"
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
msgstr "O filamento da torre de purga não pode ser um filamento misto."
|
||||
|
||||
@@ -12701,7 +12739,6 @@ msgstr ""
|
||||
msgid "Internal bridge flow ratio"
|
||||
msgstr "Taxa de fluxo em ponte interna"
|
||||
|
||||
# AI Translated
|
||||
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"
|
||||
"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"
|
||||
"0 para desativar."
|
||||
|
||||
# AI Translated
|
||||
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."
|
||||
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"
|
||||
msgstr "Ordem intra-camada"
|
||||
|
||||
# AI Translated
|
||||
msgid ""
|
||||
"Order in which object instances are visited within a single layer, which controls how much travel is spent moving between them.\n"
|
||||
"\n"
|
||||
@@ -13181,7 +13215,7 @@ msgid "mm/s² or %"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
msgid "s"
|
||||
msgstr "s"
|
||||
@@ -14068,61 +14101,47 @@ msgstr "Material de suporte"
|
||||
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."
|
||||
|
||||
# AI Translated
|
||||
msgid "Is mixed filament"
|
||||
msgstr "É filamento misto"
|
||||
|
||||
# AI Translated
|
||||
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"
|
||||
|
||||
# AI Translated
|
||||
msgid "Mixed filament components"
|
||||
msgstr "Componentes do filamento misto"
|
||||
|
||||
# AI Translated
|
||||
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\""
|
||||
|
||||
# AI Translated
|
||||
msgid "Mixed filament sublayer ratios"
|
||||
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\""
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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%."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
msgstr "Filamento imprimível"
|
||||
@@ -14213,7 +14232,7 @@ msgid "Insert solid layers"
|
||||
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."
|
||||
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"
|
||||
msgstr "Multilinhas de Preenchimento"
|
||||
@@ -14291,11 +14310,9 @@ msgstr "TPMS-FK"
|
||||
msgid "Gyroid"
|
||||
msgstr "Giroide"
|
||||
|
||||
# AI Translated
|
||||
msgid "Sparse infill smooth factor"
|
||||
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."
|
||||
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."
|
||||
|
||||
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."
|
||||
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."
|
||||
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"
|
||||
"Set to -1 to disable it."
|
||||
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"
|
||||
"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"
|
||||
@@ -14787,7 +14804,7 @@ msgid ""
|
||||
"Set to 0 to deactivate."
|
||||
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"
|
||||
"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."
|
||||
|
||||
msgid "Time cost"
|
||||
@@ -14834,13 +14851,11 @@ msgstr "Com que tipo de G-code a impressora é compatível."
|
||||
msgid "Klipper"
|
||||
msgstr "Klipper"
|
||||
|
||||
# AI Translated
|
||||
msgid "Skip G-code config block"
|
||||
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."
|
||||
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"
|
||||
msgstr "Impressora Modificada para Pellets"
|
||||
@@ -14888,13 +14903,13 @@ msgid "Sparse infill rotation template"
|
||||
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."
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
msgstr "A força máxima de saída permitida do eixo Y"
|
||||
|
||||
# AI Translated
|
||||
msgctxt "Newton"
|
||||
msgid "N"
|
||||
msgstr "N"
|
||||
@@ -15371,7 +15385,6 @@ msgstr "Massa da mesa do eixo Y"
|
||||
msgid "The machine bed mass load of Y axis"
|
||||
msgstr "A carga de massa da mesa do equipamento no eixo Y"
|
||||
|
||||
# AI Translated
|
||||
msgctxt "gram"
|
||||
msgid "g"
|
||||
msgstr "g"
|
||||
@@ -15896,7 +15909,7 @@ msgid "Z-hop height"
|
||||
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."
|
||||
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"
|
||||
msgstr "Limite inferior do Z-hop"
|
||||
@@ -15977,7 +15990,7 @@ msgid "Has filament switcher"
|
||||
msgstr "Tem trocador de filamentos"
|
||||
|
||||
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"
|
||||
msgstr "Comprimento extra na retração"
|
||||
@@ -16094,7 +16107,7 @@ msgid "Scarf joint speed"
|
||||
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%."
|
||||
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"
|
||||
msgstr "Taxa de fluxo da costura em bisel"
|
||||
@@ -16164,7 +16177,7 @@ msgid "Wipe speed"
|
||||
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%."
|
||||
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"
|
||||
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"
|
||||
"\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"
|
||||
msgstr "Ativado"
|
||||
@@ -16343,10 +16356,10 @@ msgid "Preheat steps"
|
||||
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."
|
||||
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}."
|
||||
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"
|
||||
msgstr "G-code Inicial"
|
||||
@@ -16367,7 +16380,7 @@ msgid "Manual Filament Change"
|
||||
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."
|
||||
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"
|
||||
msgstr "Tipo de torre de purga"
|
||||
@@ -16923,11 +16936,9 @@ msgstr ""
|
||||
"\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."
|
||||
|
||||
# AI Translated
|
||||
msgid "Mixed color sublayer"
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
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."
|
||||
|
||||
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"
|
||||
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."
|
||||
msgstr "O arquivo contém polígonos com mais de 4 vértices."
|
||||
@@ -19115,7 +19125,7 @@ msgid "Serial"
|
||||
msgstr "Série"
|
||||
|
||||
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"
|
||||
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"
|
||||
|
||||
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"
|
||||
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
|
||||
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."
|
||||
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"
|
||||
msgstr "Ativar atribuição inteligente de filamento: Atribui um filamento a vários bicos para maximizar a economia"
|
||||
|
||||
# AI Translated
|
||||
msgid "File Saving"
|
||||
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."
|
||||
|
||||
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."
|
||||
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."
|
||||
msgstr "Ignorando objetos."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
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?)"
|
||||
#~ 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 ""
|
||||
#~ "Layer height is too small.\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"
|
||||
#~ "\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 ""
|
||||
#~ "Controls the density (spacing) of internal bridge lines. 100% means solid bridge. Default is 100%.\n"
|
||||
@@ -21580,7 +21589,7 @@ msgstr ""
|
||||
#~ "\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"
|
||||
#~ "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."
|
||||
#~ 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"
|
||||
|
||||
#~ 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"
|
||||
#~ msgstr "Definir Posição"
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: OrcaSlicer V2.5.0\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"
|
||||
"Last-Translator: Felix14_v2\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."
|
||||
msgstr "%s был удалён."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Изменение языка приложения"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Выбор языка"
|
||||
@@ -4891,6 +4889,11 @@ msgid ""
|
||||
"No - Cancel enabling spiral mode"
|
||||
msgstr "Использовать эти настройки и режим вазы?"
|
||||
|
||||
# Не знаю, как и почему, но это, похоже, исправляет "вопросики" вместо
|
||||
# символов
|
||||
msgid "N/A"
|
||||
msgstr "–"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "Печать"
|
||||
|
||||
@@ -5332,13 +5335,9 @@ msgstr "Значение %s выходит за пределы допустим
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Имелось ввиду %s%%? (введено %s %s)\n"
|
||||
"Да – изменить на %s%%\n"
|
||||
"Нет – оставить %s %s."
|
||||
"Имелось ввиду %s%% или %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Недопустимый формат. Ожидаемый векторный формат: \"%1%\""
|
||||
|
||||
# Не знаю, как и почему, но это, похоже, исправляет "вопросики" вместо
|
||||
# символов
|
||||
msgid "N/A"
|
||||
msgstr "–"
|
||||
|
||||
msgid "System agents"
|
||||
msgstr "Системные агенты"
|
||||
|
||||
@@ -6378,6 +6372,12 @@ msgstr "Сохранить проект как"
|
||||
msgid "Save current project as"
|
||||
msgstr "Сохранить текущий проект как"
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr "Импорт 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
|
||||
@@ -8212,6 +8212,12 @@ msgstr "Во избежание повреждения принтера убед
|
||||
msgid "Customized Preset"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "Не указан тип сопла. Укажите его и попробуйте ещё раз."
|
||||
|
||||
@@ -8829,8 +8846,6 @@ msgstr "Хотите продолжить?"
|
||||
msgid "Language selection"
|
||||
msgstr "Выбор языка"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "Смена языка приложения при изменении некоторых профилей."
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr "Азиатско-Тихоокеанский"
|
||||
@@ -9770,9 +9785,6 @@ msgstr "Перейти на веб-страницу публикации мод
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "Примечание: подготовка может занять несколько минут. Пожалуйста, наберитесь терпения."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Опубликовать"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Публикация была отменена"
|
||||
|
||||
@@ -9788,6 +9800,64 @@ msgstr "Отправка данных"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Сохранить %s как"
|
||||
@@ -21541,6 +21611,15 @@ msgstr "Это действие необратимо. Продолжить?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Исключение объектов."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Выбрать материал"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"MIME-Version: 1.0\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."
|
||||
msgstr "%s har tagits bort."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Byt applikationsspråk"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Välj språk"
|
||||
@@ -5387,6 +5385,10 @@ msgstr ""
|
||||
"JA -Ändra dessa inställningar och möjliggör Spiral läge automatiskt\n"
|
||||
"NEJ -Avbryt Spiral läge denna gång"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "Ej tillämpligt"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Det är %s%% eller %s %s?\n"
|
||||
"JA för %s%%, \n"
|
||||
"NEJ för %s %s."
|
||||
"Det är %s%% eller %s %s?"
|
||||
|
||||
# AI Translated
|
||||
#, 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%\""
|
||||
msgstr "Ogiltligt format. Förväntat vector format: \"%1%\""
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "Ej tillämpligt"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Systemagenter"
|
||||
@@ -6972,6 +6966,12 @@ msgstr "Spara Projekt som"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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
|
||||
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."
|
||||
@@ -9671,8 +9688,6 @@ msgstr "Fortsätta?"
|
||||
msgid "Language selection"
|
||||
msgstr "Språkval"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "Byter språk medans inställningarna ändras."
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
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."
|
||||
msgstr "Notera: Förberedelserna kan ta flera minuter. Vänligen vänta."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Publicera"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Publiceringen avbröts"
|
||||
|
||||
@@ -10759,6 +10771,64 @@ msgstr "Laddar upp data"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Spara %s som"
|
||||
@@ -23513,6 +23583,15 @@ msgstr "Åtgärden kan inte ångras. Vill du fortsätta?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Hoppar över objekt."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Välj filament"
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: Icezaza\n"
|
||||
"Language-Team: Thai\n"
|
||||
@@ -2456,8 +2456,6 @@ msgstr "มีอัปเดตพร้อมใช้งาน เปิด
|
||||
msgid "%s has been removed."
|
||||
msgstr "ลบ %s แล้ว"
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "การเปลี่ยนภาษาของแอปพลิเคชัน"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "เลือกภาษา"
|
||||
@@ -4887,6 +4885,9 @@ msgstr ""
|
||||
"ใช่ - เปลี่ยนการตั้งค่าเหล่านี้และเปิดใช้งานโหมดเกลียวโดยอัตโนมัติ\n"
|
||||
"ไม่ - เลิกใช้โหมดเกลียวในครั้งนี้"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "ไม่มี"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "กำลังพิมพ์"
|
||||
|
||||
@@ -5318,13 +5319,9 @@ msgstr "ค่า %s อยู่นอกช่วง ช่วงที่ถ
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"มันคือ %s%% หรือ %s %s?\n"
|
||||
"ใช่สำหรับ %s%% \n"
|
||||
"ไม่ สำหรับ %s %s"
|
||||
"มันคือ %s%% หรือ %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "รูปแบบไม่ถูกต้อง รูปแบบเวกเตอร์ที่ต้องการ: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "ไม่มี"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "เอเจนต์ระบบ"
|
||||
@@ -6304,6 +6298,12 @@ msgstr "บันทึกโปรเจกต์เป็น"
|
||||
msgid "Save current project as"
|
||||
msgstr "บันทึกโครงการปัจจุบันเป็น"
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr "นำเข้า 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
|
||||
@@ -8118,6 +8118,12 @@ msgstr "โปรดยืนยันว่ารหัส G ภายในค
|
||||
msgid "Customized Preset"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "ไม่ได้ตั้งค่าประเภทหัวฉีด โปรดตั้งหัวฉีดแล้วลองอีกครั้ง"
|
||||
|
||||
@@ -8735,8 +8752,6 @@ msgstr "ต้องการดำเนินการต่อหรือไ
|
||||
msgid "Language selection"
|
||||
msgstr "การเลือกภาษา"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "การสลับภาษาของแอปพลิเคชันในขณะที่มีการแก้ไขค่าที่ตั้งไว้บางส่วน"
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr "เอเชียแปซิฟิก"
|
||||
@@ -9667,9 +9682,6 @@ msgstr "ข้ามไปที่โมเดลเผยแพร่หน้
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "หมายเหตุ: การเตรียมการอาจใช้เวลาหลายนาที กรุณาอดทน."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "เผยแพร่"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "การเผยแพร่ถูกยกเลิก"
|
||||
|
||||
@@ -9685,6 +9697,64 @@ msgstr "กำลังอัพโหลดข้อมูล"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "บันทึก %s เป็น"
|
||||
@@ -20891,6 +20961,15 @@ msgstr "การทำงานนี้ไม่สามารถย้อน
|
||||
msgid "Skipping objects."
|
||||
msgstr "ข้ามวัตถุ"
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "เลือกเส้นพลาสติก"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: GlauTech\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."
|
||||
msgstr "%s kaldırıldı."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Uygulama dilini değiştirme"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Dili seçin"
|
||||
@@ -4949,6 +4947,10 @@ msgstr ""
|
||||
"Evet - Bu ayarları değiştirin ve spiral modunu otomatik olarak etkinleştirin\n"
|
||||
"Hayır - Bu sefer spiral modunu kullanmaktan vazgeçin"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "Yok"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"%s%% mi yoksa %s %s mi?\n"
|
||||
"%s%% için EVET,\n"
|
||||
"%s %s için HAYIR."
|
||||
"%s%% mi yoksa %s %s mi?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Geçersiz format. Beklenen vektör formatı: \"%1%\""
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "Yok"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Sistem aracıları"
|
||||
@@ -6372,6 +6366,12 @@ msgstr "Projeyi farklı kaydet"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "Nozul tipi ayarlanmamış. Lütfen nozulu ayarlayın ve tekrar deneyin."
|
||||
|
||||
@@ -8837,8 +8854,6 @@ msgstr "Devam etmek istiyor musun?"
|
||||
msgid "Language selection"
|
||||
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"
|
||||
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."
|
||||
msgstr "Not: Hazırlık birkaç dakika sürebilir. Lütfen sabırlı olun."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Yayınla"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Yayınlama iptal edildi"
|
||||
|
||||
@@ -9829,6 +9841,64 @@ msgstr "Veriler yükleniyor"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "%s'yi farklı kaydet"
|
||||
@@ -21318,6 +21388,15 @@ msgstr "Bu eylem geri alınamaz. Devam etmek?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Nesneleri atlama."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Filament Seçin"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: orcaslicerua\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"
|
||||
"Last-Translator: Andrij Mizyk <andm1zyk@proton.me>\n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
@@ -2424,8 +2424,6 @@ msgstr "Доступне оновлення. Відкрийте вікно на
|
||||
msgid "%s has been removed."
|
||||
msgstr "%s вилучено."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Зміна мови програми"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "Вибрати мову"
|
||||
@@ -4887,6 +4885,9 @@ msgstr ""
|
||||
"Так – змінити ці налаштування та автоматично включити режим спіральна ваза\n"
|
||||
"Ні - цього разу відмовитися від використання режиму спіральна ваза"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "Н/Д"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "Друк"
|
||||
|
||||
@@ -5329,13 +5330,9 @@ msgstr "Значення %s знаходиться за межами діапа
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Це %s%% або %s %s?\n"
|
||||
"ТАК для %s%%, \n"
|
||||
"НІ для %s %s."
|
||||
"Це %s%% або %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "Невірний формат. Очікуваний векторний формат: \"%1%\""
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "Н/Д"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "Системні агенти"
|
||||
@@ -6341,6 +6335,12 @@ msgstr "Зберегти проєкт як"
|
||||
msgid "Save current project as"
|
||||
msgstr "Зберегти поточний проєкт як"
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr "Імпорт 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
|
||||
@@ -8223,6 +8223,12 @@ msgstr "Будь ласка, підтвердьте, що G-коди в цих
|
||||
msgid "Customized Preset"
|
||||
msgstr "Пристосований пресет"
|
||||
|
||||
msgid "Some published settings could not be applied:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Some filament slots were changed:"
|
||||
msgstr ""
|
||||
|
||||
# AI Translated
|
||||
msgid "Component name(s) inside step file not in UTF-8 format!"
|
||||
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."
|
||||
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."
|
||||
msgstr "Тип сопла не встановлений. Будь ласка, оберіть сопло та спробуйте ще раз."
|
||||
|
||||
@@ -8851,8 +8868,6 @@ msgstr "Ви хочете продовжувати?"
|
||||
msgid "Language selection"
|
||||
msgstr "Вибір мови"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "Зміна мови програми при зміні деяких профілів."
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr "Азіатсько-Тихоокеанський регіон"
|
||||
@@ -9814,9 +9829,6 @@ msgstr "Перейти на веб-сторінку публікації мод
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "Примітка. Підготовка може тривати кілька хвилин. Будь ласка, будьте терплячі."
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "Публікувати"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "Публікація скасована"
|
||||
|
||||
@@ -9832,6 +9844,64 @@ msgstr "Відвантаження даних"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "Зберегти %s як"
|
||||
@@ -21495,6 +21565,15 @@ msgstr "Дію не можливо завершити. Продовжити?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "Пропускання обʼєктів."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "Вибрати філамент"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: \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."
|
||||
msgstr "%s đã bị xóa."
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "Đang chuyển ngôn ngữ ứng dụng"
|
||||
|
||||
msgid "Select the language"
|
||||
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"
|
||||
"No - Từ bỏ dùng chế độ spiral lần này"
|
||||
|
||||
# AI Translated
|
||||
msgid "N/A"
|
||||
msgstr "N/A"
|
||||
|
||||
msgid "Printing"
|
||||
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
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"Là %s%% hay %s %s?\n"
|
||||
"YES cho %s%%, \n"
|
||||
"NO cho %s %s."
|
||||
"Là %s%% hay %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
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
|
||||
msgid "System agents"
|
||||
msgstr "Tác nhân hệ thống"
|
||||
@@ -6689,6 +6683,12 @@ msgstr "Lưu dự án thành"
|
||||
msgid "Save current project as"
|
||||
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"
|
||||
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"
|
||||
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!"
|
||||
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."
|
||||
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
|
||||
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."
|
||||
@@ -9286,8 +9303,6 @@ msgstr "Bạn có muốn tiếp tục?"
|
||||
msgid "Language selection"
|
||||
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"
|
||||
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."
|
||||
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"
|
||||
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"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
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."
|
||||
msgstr "Đang bỏ qua các vật thể."
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
# AI Translated
|
||||
msgid "Select Filament"
|
||||
msgstr "Chọn filament"
|
||||
|
||||
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Slic3rPE\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"
|
||||
"Last-Translator: Handle <mail@bysb.net>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -2361,8 +2361,6 @@ msgstr "有更新可用。打开预设包对话框进行更新。"
|
||||
msgid "%s has been removed."
|
||||
msgstr "%s 已被移除。"
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "切换应用程序语言"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "选择语言"
|
||||
@@ -4743,6 +4741,9 @@ msgstr ""
|
||||
"是 - 自动调整这些设置并开启旋转模式\n"
|
||||
"否 - 暂不使用旋转模式"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "不适用"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "打印中"
|
||||
|
||||
@@ -5174,13 +5175,9 @@ msgstr "值 %s 超出了范围,有效的范围是从 %d 到 %d 。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"%s%%还是%s %s?\n"
|
||||
"是:%s%%\n"
|
||||
"否:%s %s"
|
||||
"%s%%还是%s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "无效格式,应该是\"%1%\"这种数组格式"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "不适用"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "系统代理"
|
||||
@@ -6159,6 +6153,12 @@ msgstr "项目另存为"
|
||||
msgid "Save current project as"
|
||||
msgstr "项目另存为"
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr "导入 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
|
||||
@@ -7949,6 +7949,12 @@ msgstr "请确认这些预设中的G-codes是否安全,以防止对机器造
|
||||
msgid "Customized Preset"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "未设置喷嘴类型。请设置喷嘴并重试。"
|
||||
|
||||
@@ -8564,8 +8581,6 @@ msgstr "是否继续?"
|
||||
msgid "Language selection"
|
||||
msgstr "语言选择"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "在切换应用语言之前发现某些参数预设有更改。"
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr "亚太"
|
||||
@@ -9489,9 +9504,6 @@ msgstr "跳转到发布页面"
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "提示:发布前需要一些准备时间,请耐心等待。"
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "发布"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "发布已取消"
|
||||
|
||||
@@ -9507,6 +9519,64 @@ msgstr "正在上传数据"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "另存%s为"
|
||||
@@ -20639,6 +20709,15 @@ msgstr "此操作无法撤消。继续?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "跳过对象。"
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "选择耗材"
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Orca Slicer\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"
|
||||
"Last-Translator: tntchn <15895303+tntchn@users.noreply.github.com>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -2425,8 +2425,6 @@ msgstr "有可用的更新。請開啟預設組合對話框進行更新。"
|
||||
msgid "%s has been removed."
|
||||
msgstr "%s 已移除。"
|
||||
|
||||
msgid "Switching application language"
|
||||
msgstr "切換應用程式語言"
|
||||
|
||||
msgid "Select the language"
|
||||
msgstr "選擇語言"
|
||||
@@ -4872,6 +4870,9 @@ msgstr ""
|
||||
"是 - 自動調整這些設定並啟用花瓶模式\n"
|
||||
"否 - 不使用花瓶模式"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "不適用"
|
||||
|
||||
msgid "Printing"
|
||||
msgstr "列印中"
|
||||
|
||||
@@ -5303,13 +5304,9 @@ msgstr "數值 %s 超出範圍。有效範圍是從 %d 到 %d。"
|
||||
|
||||
#, c-format, boost-format
|
||||
msgid ""
|
||||
"Is it %s%% or %s %s?\n"
|
||||
"YES for %s%%, \n"
|
||||
"NO for %s %s."
|
||||
"Is it %s%% or %s %s?"
|
||||
msgstr ""
|
||||
"是 %s%% 還是 %s %s?\n"
|
||||
"選『是』代表 %s%%,\n"
|
||||
"選『否』代表 %s %s。"
|
||||
"是 %s%% 還是 %s %s?"
|
||||
|
||||
#, boost-format
|
||||
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%\""
|
||||
msgstr "無效格式,應該是「%1%」這種格式"
|
||||
|
||||
msgid "N/A"
|
||||
msgstr "不適用"
|
||||
|
||||
# AI Translated
|
||||
msgid "System agents"
|
||||
msgstr "系統代理程式"
|
||||
@@ -6289,6 +6283,12 @@ msgstr "另存專案為"
|
||||
msgid "Save current project as"
|
||||
msgstr "將目前專案另存為"
|
||||
|
||||
msgid "Publish 3MF"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export a 3MF file with the selected settings embedded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
msgstr "匯入 3MF/STL/STEP/SVG/OBJ/AMF"
|
||||
|
||||
@@ -8110,6 +8110,12 @@ msgstr "請確認這些預設中的 G-code 是安全的,以防止對列印裝
|
||||
msgid "Customized Preset"
|
||||
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!"
|
||||
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."
|
||||
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."
|
||||
msgstr "噴嘴類型尚未設定。請設定噴嘴後再試一次。"
|
||||
|
||||
@@ -8730,8 +8747,6 @@ msgstr "是否繼續?"
|
||||
msgid "Language selection"
|
||||
msgstr "語言選擇"
|
||||
|
||||
msgid "Switching application language while some presets are modified."
|
||||
msgstr "在切換應用程式語言之前發現某些參數預設有更改。"
|
||||
|
||||
msgid "Asia-Pacific"
|
||||
msgstr "亞太"
|
||||
@@ -9662,9 +9677,6 @@ msgstr "發布頁面"
|
||||
msgid "Note: The preparation may take several minutes. Please be patient."
|
||||
msgstr "提示:發布前需要一些準備時間,請耐心等待。"
|
||||
|
||||
msgid "Publish"
|
||||
msgstr "發布"
|
||||
|
||||
msgid "Publish was canceled"
|
||||
msgstr "發布已取消"
|
||||
|
||||
@@ -9680,6 +9692,64 @@ msgstr "正在上傳資料"
|
||||
msgid "Jump to webpage"
|
||||
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
|
||||
msgid "Save %s as"
|
||||
msgstr "另存 %s 為"
|
||||
@@ -20832,6 +20902,15 @@ msgstr "此操作無法撤消。繼續?"
|
||||
msgid "Skipping objects."
|
||||
msgstr "跳過物件。"
|
||||
|
||||
msgid "Material Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Model Height"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ratio"
|
||||
msgstr ""
|
||||
|
||||
msgid "Select Filament"
|
||||
msgstr "選擇線材"
|
||||
|
||||
|
||||
@@ -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 |
@@ -1,8 +1,4 @@
|
||||
<svg width="25" height="25" xmlns="http://www.w3.org/2000/svg" fill="none">
|
||||
|
||||
<g>
|
||||
<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 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"/>
|
||||
<line x1="7.5" y1="0.5" x2="7.5" y2="14.5" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 312 B After Width: | Height: | Size: 332 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M12.00,12.00 L12.00,11.96 L12.01,11.92 L12.03,11.89 L12.05,11.85 L12.08,11.82 L12.12,11.80 L12.16,11.78 L12.20,11.76 L12.25,11.75 L12.30,11.75 L12.35,11.75 L12.40,11.77 L12.46,11.79 L12.51,11.81 L12.56,11.85 L12.61,11.89 L12.66,11.94 L12.70,12.00 L12.74,12.06 L12.77,12.14 L12.79,12.21 L12.80,12.29 L12.81,12.38 L12.81,12.47 L12.80,12.56 L12.77,12.65 L12.74,12.74 L12.70,12.83 L12.65,12.92 L12.58,13.01 L12.51,13.09 L12.43,13.17 L12.33,13.24 L12.23,13.30 L12.12,13.36 L12.00,13.40 L11.87,13.43 L11.74,13.46 L11.61,13.46 L11.47,13.46 L11.33,13.45 L11.18,13.41 L11.04,13.37 L10.90,13.31 L10.76,13.24 L10.63,13.15 L10.50,13.05 L10.38,12.93 L10.27,12.81 L10.17,12.67 L10.08,12.51 L10.01,12.35 L9.95,12.18 L9.90,12.00 L9.87,11.81 L9.86,11.62 L9.86,11.43 L9.88,11.23 L9.92,11.03 L9.98,10.83 L10.06,10.64 L10.15,10.45 L10.27,10.27 L10.40,10.09 L10.55,9.93 L10.72,9.78 L10.90,9.64 L11.10,9.52 L11.31,9.41 L11.53,9.32 L11.76,9.25 L12.00,9.20 L12.25,9.17 L12.50,9.17 L12.75,9.18 L13.01,9.22 L13.27,9.29 L13.52,9.37 L13.76,9.48 L14.00,9.62 L14.23,9.77 L14.44,9.95 L14.64,10.15 L14.83,10.37 L15.00,10.60 L15.14,10.86 L15.27,11.12 L15.37,11.41 L15.45,11.70 L15.50,12.00 L15.53,12.31 L15.52,12.62 L15.49,12.94 L15.44,13.25 L15.35,13.56 L15.23,13.87 L15.09,14.16 L14.92,14.45 L14.72,14.72 L14.50,14.98 L14.25,15.22 L13.98,15.44 L13.69,15.63 L13.38,15.80 L13.06,15.94 L12.72,16.06 L12.36,16.15 L12.00,16.20 L11.63,16.22 L11.26,16.21 L10.88,16.17 L10.51,16.09 L10.14,15.98 L9.78,15.84 L9.43,15.66 L9.10,15.46 L8.78,15.22 L8.48,14.95 L8.21,14.65 L7.96,14.33 L7.74,13.99 L7.54,13.62 L7.38,13.24 L7.25,12.84 L7.16,12.42 L7.10,12.00 L7.08,11.57 L7.10,11.14 L7.15,10.70 L7.25,10.27 L7.38,9.85 L7.55,9.43 L7.76,9.03 L8.01,8.65 L8.29,8.29 L8.60,7.95 L8.94,7.64 L9.32,7.35 L9.72,7.10 L10.14,6.88 L10.58,6.70 L11.04,6.56 L11.52,6.46 L12.00,6.40 L12.49,6.38 L12.99,6.41 L13.48,6.48 L13.97,6.59 L14.45,6.75 L14.92,6.95 L15.37,7.19 L15.80,7.47 L16.21,7.79 L16.59,8.15 L16.94,8.54 L17.25,8.97 L17.53,9.42 L17.77,9.90 L17.97,10.40 L18.13,10.92 L18.24,11.45 L18.30,12.00 L18.31,12.55 L18.28,13.11 L18.20,13.66 L18.07,14.21 L17.89,14.74 L17.66,15.27 L17.38,15.77 L17.06,16.25 L16.70,16.70 L16.30,17.12 L15.86,17.51 L15.38,17.86 L14.88,18.17 L14.34,18.43 L13.78,18.65 L13.20,18.82 L12.61,18.93 L12.00,19.00 L11.39,19.01 L10.77,18.97 L10.16,18.87 L9.55,18.72 L8.96,18.52 L8.38,18.26 L7.83,17.96 L7.30,17.60 L6.80,17.20 L6.34,16.75 L5.92,16.26 L5.53,15.73 L5.20,15.17 L4.91,14.58 L4.68,13.96 L4.49,13.32 L4.37,12.67 L4.30,12.00 L4.29,11.33 L4.34,10.65 L4.45,9.98 L4.62,9.31 L4.85,8.66 L5.13,8.03 L5.47,7.43 L5.86,6.85 L6.31,6.31 L6.80,5.80 L7.34,5.34 L7.92,4.93 L8.53,4.56 L9.18,4.25 L9.86,4.00 L10.55,3.80 L11.27,3.67 L12.00,3.60" style="fill:none;stroke:#009688;stroke-linecap:round;stroke-linejoin:round"/><rect x="1.5" y="1.5" width="21" height="21" rx="2" style="fill:none;stroke:#949494;stroke-linecap:round;stroke-linejoin:round"/></svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
@@ -0,0 +1,607 @@
|
||||
{
|
||||
"bambustudio_commit": "66e405477",
|
||||
"filaments": {
|
||||
"OF0UJcb6": {
|
||||
"bambu_id": "GFG60",
|
||||
"name": "PolyLite PETG",
|
||||
"type": "PETG",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OF0wBGNx": {
|
||||
"bambu_id": "GFB51",
|
||||
"name": "Bambu ASA-CF",
|
||||
"type": "ASA-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OF1UNk9P": {
|
||||
"bambu_id": "GFP97",
|
||||
"name": "Generic PP",
|
||||
"type": "PP",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OF2GCW1l": {
|
||||
"bambu_id": "GFSNL08",
|
||||
"name": "SUNLU PETG",
|
||||
"type": "PETG",
|
||||
"vendor": "SUNLU"
|
||||
},
|
||||
"OF2VFe4J": {
|
||||
"bambu_id": "GFN04",
|
||||
"name": "Bambu PAHT-CF",
|
||||
"type": "PA-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OF342jVN": {
|
||||
"bambu_id": "GFA10",
|
||||
"name": "Bambu PLA Tough+",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OF4RvVuU": {
|
||||
"bambu_id": "GFT02",
|
||||
"name": "Bambu PPS-CF",
|
||||
"type": "PPS-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OF54B0S0": {
|
||||
"bambu_id": "GFN06",
|
||||
"name": "Bambu PPA-CF",
|
||||
"type": "PPA-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OF5CgdDq": {
|
||||
"bambu_id": "GFL00",
|
||||
"name": "PolyLite PLA",
|
||||
"type": "PLA",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OF6rdQ6M": {
|
||||
"bambu_id": "GFT98",
|
||||
"name": "Generic PPS-CF",
|
||||
"type": "PPS-CF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OF74KeQR": {
|
||||
"bambu_id": "GFR98",
|
||||
"name": "Generic PHA",
|
||||
"type": "PHA",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OF7lOgYF": {
|
||||
"bambu_id": "GFG96",
|
||||
"name": "Generic PETG HF",
|
||||
"type": "PETG",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OF8Tlg47": {
|
||||
"bambu_id": "GFN96",
|
||||
"name": "Generic PPA-GF",
|
||||
"type": "PPA-GF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OF8tPByX": {
|
||||
"bambu_id": "GFN97",
|
||||
"name": "Generic PPA-CF",
|
||||
"type": "PPA-CF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OF9OlTWH": {
|
||||
"bambu_id": "GFA07",
|
||||
"name": "Bambu PLA Marble",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFAnyRUI": {
|
||||
"bambu_id": "GFS02",
|
||||
"name": "Bambu Support For PLA",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFBSW57R": {
|
||||
"bambu_id": "GFA11",
|
||||
"name": "Bambu PLA Aero",
|
||||
"type": "PLA-AERO",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFBw6eEG": {
|
||||
"bambu_id": "GFL05",
|
||||
"name": "Overture Matte PLA",
|
||||
"type": "PLA",
|
||||
"vendor": "Overture"
|
||||
},
|
||||
"OFCD8qiU": {
|
||||
"bambu_id": "GFR99",
|
||||
"name": "Generic EVA",
|
||||
"type": "EVA",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFDGigEI": {
|
||||
"bambu_id": "GFA13",
|
||||
"name": "Bambu PLA Dynamic",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFDSrzZ8": {
|
||||
"bambu_id": "GFL99",
|
||||
"name": "Generic PLA",
|
||||
"type": "PLA",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFDvXujf": {
|
||||
"bambu_id": "GFS99",
|
||||
"name": "Generic PVA",
|
||||
"type": "PVA",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFDxfPgH": {
|
||||
"bambu_id": "GFA08",
|
||||
"name": "Bambu PLA Sparkle",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFEGNJD4": {
|
||||
"bambu_id": "GFA05",
|
||||
"name": "Bambu PLA Silk",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFEkPBwx": {
|
||||
"bambu_id": "GFA12",
|
||||
"name": "Bambu PLA Glow",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFEswT5W": {
|
||||
"bambu_id": "GFA50",
|
||||
"name": "Bambu PLA-CF",
|
||||
"type": "PLA-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFFNYwWR": {
|
||||
"bambu_id": "GFN03",
|
||||
"name": "Bambu PA-CF",
|
||||
"type": "PA-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFFbSnCD": {
|
||||
"bambu_id": "GFA17",
|
||||
"name": "Bambu PLA Translucent",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFFvzqcd": {
|
||||
"bambu_id": "GFG00",
|
||||
"name": "Bambu PETG Basic",
|
||||
"type": "PETG",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFHWSM21": {
|
||||
"bambu_id": "GFL54",
|
||||
"name": "Fiberon PET-CF",
|
||||
"type": "PET-CF",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFHa48An": {
|
||||
"bambu_id": "GFT01",
|
||||
"name": "Bambu PET-CF",
|
||||
"type": "PET-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFHmPYRy": {
|
||||
"bambu_id": "GFSNL04",
|
||||
"name": "SUNLU PLA+ 2.0",
|
||||
"type": "PLA",
|
||||
"vendor": "SUNLU"
|
||||
},
|
||||
"OFIBbYO5": {
|
||||
"bambu_id": "GFU02",
|
||||
"name": "Bambu TPU for AMS",
|
||||
"type": "TPU-AMS",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFIfnzxC": {
|
||||
"bambu_id": "GFS05",
|
||||
"name": "Bambu Support For PLA/PETG",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFKhMPeX": {
|
||||
"bambu_id": "GFC00",
|
||||
"name": "Bambu PC",
|
||||
"type": "PC",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFLJ8S6I": {
|
||||
"bambu_id": "GFSNL07",
|
||||
"name": "SUNLU Wood PLA",
|
||||
"type": "PLA",
|
||||
"vendor": "SUNLU"
|
||||
},
|
||||
"OFLPAxz3": {
|
||||
"bambu_id": "GFB98",
|
||||
"name": "Generic ASA",
|
||||
"type": "ASA",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFLakOUI": {
|
||||
"bambu_id": "GFC99",
|
||||
"name": "Generic PC",
|
||||
"type": "PC",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFMTK0UC": {
|
||||
"bambu_id": "GFS03",
|
||||
"name": "Bambu Support For PA/PET",
|
||||
"type": "PA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFMUWNkp": {
|
||||
"bambu_id": "GFSNL03",
|
||||
"name": "SUNLU PLA+",
|
||||
"type": "PLA",
|
||||
"vendor": "SUNLU"
|
||||
},
|
||||
"OFMjtqTC": {
|
||||
"bambu_id": "GFA16",
|
||||
"name": "Bambu PLA Wood",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFNk8bxk": {
|
||||
"bambu_id": "GFN08",
|
||||
"name": "Bambu PA6-GF",
|
||||
"type": "PA-GF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFOvv91M": {
|
||||
"bambu_id": "GFB60",
|
||||
"name": "PolyLite ABS",
|
||||
"type": "ABS",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFPklMI1": {
|
||||
"bambu_id": "GFP99",
|
||||
"name": "Generic PE",
|
||||
"type": "PE",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFQ3e56w": {
|
||||
"bambu_id": "GFA15",
|
||||
"name": "Bambu PLA Galaxy",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFQHiNJs": {
|
||||
"bambu_id": "GFS01",
|
||||
"name": "Bambu Support G",
|
||||
"type": "PA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFQLcbps": {
|
||||
"bambu_id": "GFN98",
|
||||
"name": "Generic PA-CF",
|
||||
"type": "PA-CF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFS2tn6G": {
|
||||
"bambu_id": "GFL53",
|
||||
"name": "Fiberon PA612-CF",
|
||||
"type": "PA",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFTHDCqA": {
|
||||
"bambu_id": "GFA19",
|
||||
"name": "Bambu PLA Pure",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFTRZ8Y4": {
|
||||
"bambu_id": "GFG50",
|
||||
"name": "Bambu PETG-CF",
|
||||
"type": "PETG-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFUanySo": {
|
||||
"bambu_id": "GFA06",
|
||||
"name": "Bambu PLA Silk+",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFVCkX5w": {
|
||||
"bambu_id": "GFU01",
|
||||
"name": "Bambu TPU 95A",
|
||||
"type": "TPU",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFW29a9R": {
|
||||
"bambu_id": "GFL01",
|
||||
"name": "PolyTerra PLA",
|
||||
"type": "PLA",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFWbdGsC": {
|
||||
"bambu_id": "GFL98",
|
||||
"name": "Generic PLA-CF",
|
||||
"type": "PLA-CF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFX0ycRQ": {
|
||||
"bambu_id": "GFL52",
|
||||
"name": "Fiberon PA12-CF",
|
||||
"type": "PA-CF",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFXIbw5D": {
|
||||
"bambu_id": "GFA01",
|
||||
"name": "Bambu PLA Matte",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFXkm8q1": {
|
||||
"bambu_id": "GFP96",
|
||||
"name": "Generic PP-CF",
|
||||
"type": "PP-CF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFXzQ4yL": {
|
||||
"bambu_id": "GFB02",
|
||||
"name": "Bambu ASA-Aero",
|
||||
"type": "ASA-AERO",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFY9muEs": {
|
||||
"bambu_id": "GFB99",
|
||||
"name": "Generic ABS",
|
||||
"type": "ABS",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFYPdQJh": {
|
||||
"bambu_id": "GFG99",
|
||||
"name": "Generic PETG",
|
||||
"type": "PETG",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFaQMgRH": {
|
||||
"bambu_id": "GFA09",
|
||||
"name": "Bambu PLA Tough",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFc3xdm9": {
|
||||
"bambu_id": "GFL04",
|
||||
"name": "Overture PLA",
|
||||
"type": "PLA",
|
||||
"vendor": "Overture"
|
||||
},
|
||||
"OFcytyoA": {
|
||||
"bambu_id": "GFL06",
|
||||
"name": "Fiberon PETG-ESD",
|
||||
"type": "PETG",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFd0Fv0k": {
|
||||
"bambu_id": "GFP98",
|
||||
"name": "Generic PE-CF",
|
||||
"type": "PE-CF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFdyfQvU": {
|
||||
"bambu_id": "GFG03",
|
||||
"name": "Bambu PETG Matte",
|
||||
"type": "PETG",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFesA6rF": {
|
||||
"bambu_id": "GFL96",
|
||||
"name": "Generic PLA Silk",
|
||||
"type": "PLA",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFf6mfQO": {
|
||||
"bambu_id": "GFS06",
|
||||
"name": "Bambu Support for ABS",
|
||||
"type": "ABS",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFfBpSRI": {
|
||||
"bambu_id": "GFB01",
|
||||
"name": "Bambu ASA",
|
||||
"type": "ASA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFg57Nmc": {
|
||||
"bambu_id": "GFC01",
|
||||
"name": "Bambu PC FR",
|
||||
"type": "PC",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFg8ndtj": {
|
||||
"bambu_id": "GFN99",
|
||||
"name": "Generic PA",
|
||||
"type": "PA",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFgbpcy9": {
|
||||
"bambu_id": "GFU99",
|
||||
"name": "Generic TPU",
|
||||
"type": "TPU",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFhuaUQB": {
|
||||
"bambu_id": "GFB00",
|
||||
"name": "Bambu ABS",
|
||||
"type": "ABS",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFk8t9mz": {
|
||||
"bambu_id": "GFL55",
|
||||
"name": "Fiberon PETG-rCF",
|
||||
"type": "PETG-CF",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFkOviHk": {
|
||||
"bambu_id": "GFL50",
|
||||
"name": "Fiberon PA6-CF",
|
||||
"type": "PA6-CF",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFknl9Iz": {
|
||||
"bambu_id": "GFB50",
|
||||
"name": "Bambu ABS-GF",
|
||||
"type": "ABS-GF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFlfuj2k": {
|
||||
"bambu_id": "GFU04",
|
||||
"name": "Bambu TPU 85A",
|
||||
"type": "TPU",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFmN2lvw": {
|
||||
"bambu_id": "GFU98",
|
||||
"name": "Generic TPU for AMS",
|
||||
"type": "TPU-AMS",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFmpMwxS": {
|
||||
"bambu_id": "GFL95",
|
||||
"name": "Generic PLA High Speed",
|
||||
"type": "PLA",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFnfxTvi": {
|
||||
"bambu_id": "GFA18",
|
||||
"name": "Bambu PLA Lite",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFniMuTN": {
|
||||
"bambu_id": "GFN05",
|
||||
"name": "Bambu PA6-CF",
|
||||
"type": "PA6-CF",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFo2UF2C": {
|
||||
"bambu_id": "GFS97",
|
||||
"name": "Generic BVOH",
|
||||
"type": "BVOH",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFoYSJKi": {
|
||||
"bambu_id": "GFG98",
|
||||
"name": "Generic PETG-CF",
|
||||
"type": "PETG-CF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFoiVqVM": {
|
||||
"bambu_id": "GFA00",
|
||||
"name": "Bambu PLA Basic",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFovEIbw": {
|
||||
"bambu_id": "GFG02",
|
||||
"name": "Bambu PETG HF",
|
||||
"type": "PETG",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFpPGSKG": {
|
||||
"bambu_id": "GFSNL05",
|
||||
"name": "SUNLU Silk PLA+",
|
||||
"type": "PLA",
|
||||
"vendor": "SUNLU"
|
||||
},
|
||||
"OFpW4gdi": {
|
||||
"bambu_id": "GFSNL02",
|
||||
"name": "SUNLU PLA Matte",
|
||||
"type": "PLA",
|
||||
"vendor": "SUNLU"
|
||||
},
|
||||
"OFq9svOz": {
|
||||
"bambu_id": "GFT97",
|
||||
"name": "Generic PPS",
|
||||
"type": "PPS",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFqINlYj": {
|
||||
"bambu_id": "GFL03",
|
||||
"name": "eSUN PLA+",
|
||||
"type": "PLA",
|
||||
"vendor": "eSUN"
|
||||
},
|
||||
"OFrKLeE3": {
|
||||
"bambu_id": "GFA02",
|
||||
"name": "Bambu PLA Metal",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFsFon5l": {
|
||||
"bambu_id": "GFS98",
|
||||
"name": "Generic HIPS",
|
||||
"type": "HIPS",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFsHSVZc": {
|
||||
"bambu_id": "GFS00",
|
||||
"name": "Bambu Support W",
|
||||
"type": "PLA",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFsijjtH": {
|
||||
"bambu_id": "GFP95",
|
||||
"name": "Generic PP-GF",
|
||||
"type": "PP-GF",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFtkLO6q": {
|
||||
"bambu_id": "GFU03",
|
||||
"name": "Bambu TPU 90A",
|
||||
"type": "TPU",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFu1evlr": {
|
||||
"bambu_id": "GFG97",
|
||||
"name": "Generic PCTG",
|
||||
"type": "PCTG",
|
||||
"vendor": "Generic"
|
||||
},
|
||||
"OFvKUnLh": {
|
||||
"bambu_id": "GFU00",
|
||||
"name": "Bambu TPU 95A HF",
|
||||
"type": "TPU",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFvrXuV7": {
|
||||
"bambu_id": "GFB61",
|
||||
"name": "PolyLite ASA",
|
||||
"type": "ASA",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFwPrlCM": {
|
||||
"bambu_id": "GFG01",
|
||||
"name": "Bambu PETG Translucent",
|
||||
"type": "PETG",
|
||||
"vendor": "Bambu Lab"
|
||||
},
|
||||
"OFwaYjL6": {
|
||||
"bambu_id": "GFL51",
|
||||
"name": "Fiberon PA6-GF",
|
||||
"type": "PA-GF",
|
||||
"vendor": "Polymaker"
|
||||
},
|
||||
"OFxUwUeW": {
|
||||
"bambu_id": "GFSNL06",
|
||||
"name": "SUNLU PLA Marble",
|
||||
"type": "PLA",
|
||||
"vendor": "SUNLU"
|
||||
},
|
||||
"OFzyIxba": {
|
||||
"bambu_id": "GFS04",
|
||||
"name": "Bambu PVA",
|
||||
"type": "PVA",
|
||||
"vendor": "Bambu Lab"
|
||||
}
|
||||
},
|
||||
"generated": "2026-09-04",
|
||||
"source": "https://github.com/bambulab/BambuStudio"
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Afinia",
|
||||
"version": "02.04.00.02",
|
||||
"version": "02.04.00.03",
|
||||
"force_update": "0",
|
||||
"description": "Afinia configurations",
|
||||
"machine_model_list": [
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00_01",
|
||||
"filament_id": "OFLfywkp",
|
||||
"setting_id": "wAJTMxtCY7EoavRi",
|
||||
"name": "Afinia ABS+@HS",
|
||||
"from": "system",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00_01",
|
||||
"filament_id": "OFV5wEMe",
|
||||
"setting_id": "qCDnb2iBaz4hd4vX",
|
||||
"name": "Afinia ABS@HS",
|
||||
"from": "system",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFA00_01",
|
||||
"filament_id": "OF9HCdyQ",
|
||||
"setting_id": "N3sCgjdjvp6FTtw9",
|
||||
"name": "Afinia PLA@HS",
|
||||
"from": "system",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"inherits": "fdm_filament_tpu",
|
||||
"from": "system",
|
||||
"setting_id": "zUqTgAEbqTN1EdRl",
|
||||
"filament_id": "GFU01_01",
|
||||
"filament_id": "OFDJU6R3",
|
||||
"instantiation": "true",
|
||||
"filament_vendor": [
|
||||
"Afinia"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFB00_01",
|
||||
"filament_id": "OFXi59OX",
|
||||
"setting_id": "OxIiEYjbhEvSykaQ",
|
||||
"name": "Afinia Value ABS@HS",
|
||||
"from": "system",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"filament_id": "GFA00_01",
|
||||
"filament_id": "OFgHh8ly",
|
||||
"setting_id": "BASsUdyvElEVJ9AA",
|
||||
"name": "Afinia Value PLA@HS",
|
||||
"from": "system",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Anker",
|
||||
"version": "02.04.00.01",
|
||||
"version": "02.04.00.02",
|
||||
"force_update": "0",
|
||||
"description": "Anker configurations",
|
||||
"machine_model_list": [
|
||||
@@ -161,172 +161,172 @@
|
||||
"sub_path": "filament/fdm_filament_tpu.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ABS @base",
|
||||
"sub_path": "filament/Anker Generic ABS @base.json"
|
||||
"name": "Generic ABS @Anker base",
|
||||
"sub_path": "filament/Generic ABS @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ASA @base",
|
||||
"sub_path": "filament/Anker Generic ASA @base.json"
|
||||
"name": "Generic ASA @Anker base",
|
||||
"sub_path": "filament/Generic ASA @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA @base",
|
||||
"sub_path": "filament/Anker Generic PA @base.json"
|
||||
"name": "Generic PA @Anker base",
|
||||
"sub_path": "filament/Generic PA @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA-CF @base",
|
||||
"sub_path": "filament/Anker Generic PA-CF @base.json"
|
||||
"name": "Generic PA-CF @Anker base",
|
||||
"sub_path": "filament/Generic PA-CF @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PC @base",
|
||||
"sub_path": "filament/Anker Generic PC @base.json"
|
||||
"name": "Generic PC @Anker base",
|
||||
"sub_path": "filament/Generic PC @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG @base",
|
||||
"sub_path": "filament/Anker Generic PETG @base.json"
|
||||
"name": "Generic PETG @Anker base",
|
||||
"sub_path": "filament/Generic PETG @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG-CF @base",
|
||||
"sub_path": "filament/Anker Generic PETG-CF @base.json"
|
||||
"name": "Generic PETG-CF @Anker base",
|
||||
"sub_path": "filament/Generic PETG-CF @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA @base",
|
||||
"sub_path": "filament/Anker Generic PLA @base.json"
|
||||
"name": "Generic PLA @Anker base",
|
||||
"sub_path": "filament/Generic PLA @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA Silk @base",
|
||||
"sub_path": "filament/Anker Generic PLA Silk @base.json"
|
||||
"name": "Generic PLA Silk @Anker base",
|
||||
"sub_path": "filament/Generic PLA Silk @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA+ @base",
|
||||
"sub_path": "filament/Anker Generic PLA+ @base.json"
|
||||
"name": "Generic PLA+ @Anker base",
|
||||
"sub_path": "filament/Generic PLA+ @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA-CF @base",
|
||||
"sub_path": "filament/Anker Generic PLA-CF @base.json"
|
||||
"name": "Generic PLA-CF @Anker base",
|
||||
"sub_path": "filament/Generic PLA-CF @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PVA @base",
|
||||
"sub_path": "filament/Anker Generic PVA @base.json"
|
||||
"name": "Generic PVA @Anker base",
|
||||
"sub_path": "filament/Generic PVA @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic TPU @base",
|
||||
"sub_path": "filament/Anker Generic TPU @base.json"
|
||||
"name": "Generic TPU @Anker base",
|
||||
"sub_path": "filament/Generic TPU @Anker base.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ABS",
|
||||
"sub_path": "filament/Anker Generic ABS.json"
|
||||
"name": "Generic ABS @Anker",
|
||||
"sub_path": "filament/Generic ABS @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ABS 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic ABS 0.2 nozzle.json"
|
||||
"name": "Generic ABS @Anker 0.2 nozzle",
|
||||
"sub_path": "filament/Generic ABS @Anker 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ABS 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic ABS 0.25 nozzle.json"
|
||||
"name": "Generic ABS @Anker 0.25 nozzle",
|
||||
"sub_path": "filament/Generic ABS @Anker 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ASA",
|
||||
"sub_path": "filament/Anker Generic ASA.json"
|
||||
"name": "Generic ASA @Anker",
|
||||
"sub_path": "filament/Generic ASA @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ASA 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic ASA 0.2 nozzle.json"
|
||||
"name": "Generic ASA @Anker 0.2 nozzle",
|
||||
"sub_path": "filament/Generic ASA @Anker 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic ASA 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic ASA 0.25 nozzle.json"
|
||||
"name": "Generic ASA @Anker 0.25 nozzle",
|
||||
"sub_path": "filament/Generic ASA @Anker 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA",
|
||||
"sub_path": "filament/Anker Generic PA.json"
|
||||
"name": "Generic PA @Anker",
|
||||
"sub_path": "filament/Generic PA @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PA 0.2 nozzle.json"
|
||||
"name": "Generic PA @Anker 0.2 nozzle",
|
||||
"sub_path": "filament/Generic PA @Anker 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PA 0.25 nozzle.json"
|
||||
"name": "Generic PA @Anker 0.25 nozzle",
|
||||
"sub_path": "filament/Generic PA @Anker 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PA-CF",
|
||||
"sub_path": "filament/Anker Generic PA-CF.json"
|
||||
"name": "Generic PA-CF @Anker",
|
||||
"sub_path": "filament/Generic PA-CF @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PC",
|
||||
"sub_path": "filament/Anker Generic PC.json"
|
||||
"name": "Generic PC @Anker",
|
||||
"sub_path": "filament/Generic PC @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PC 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PC 0.2 nozzle.json"
|
||||
"name": "Generic PC @Anker 0.2 nozzle",
|
||||
"sub_path": "filament/Generic PC @Anker 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PC 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PC 0.25 nozzle.json"
|
||||
"name": "Generic PC @Anker 0.25 nozzle",
|
||||
"sub_path": "filament/Generic PC @Anker 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG",
|
||||
"sub_path": "filament/Anker Generic PETG.json"
|
||||
"name": "Generic PETG @Anker",
|
||||
"sub_path": "filament/Generic PETG @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PETG 0.2 nozzle.json"
|
||||
"name": "Generic PETG @Anker 0.2 nozzle",
|
||||
"sub_path": "filament/Generic PETG @Anker 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PETG 0.25 nozzle.json"
|
||||
"name": "Generic PETG @Anker 0.25 nozzle",
|
||||
"sub_path": "filament/Generic PETG @Anker 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PETG-CF",
|
||||
"sub_path": "filament/Anker Generic PETG-CF.json"
|
||||
"name": "Generic PETG-CF @Anker",
|
||||
"sub_path": "filament/Generic PETG-CF @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA",
|
||||
"sub_path": "filament/Anker Generic PLA.json"
|
||||
"name": "Generic PLA @Anker",
|
||||
"sub_path": "filament/Generic PLA @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA 0.2 nozzle.json"
|
||||
"name": "Generic PLA @Anker 0.2 nozzle",
|
||||
"sub_path": "filament/Generic PLA @Anker 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA 0.25 nozzle.json"
|
||||
"name": "Generic PLA @Anker 0.25 nozzle",
|
||||
"sub_path": "filament/Generic PLA @Anker 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA Silk",
|
||||
"sub_path": "filament/Anker Generic PLA Silk.json"
|
||||
"name": "Generic PLA Silk @Anker",
|
||||
"sub_path": "filament/Generic PLA Silk @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA Silk 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA Silk 0.2 nozzle.json"
|
||||
"name": "Generic PLA Silk @Anker 0.2 nozzle",
|
||||
"sub_path": "filament/Generic PLA Silk @Anker 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA Silk 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA Silk 0.25 nozzle.json"
|
||||
"name": "Generic PLA Silk @Anker 0.25 nozzle",
|
||||
"sub_path": "filament/Generic PLA Silk @Anker 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA+",
|
||||
"sub_path": "filament/Anker Generic PLA+.json"
|
||||
"name": "Generic PLA+ @Anker",
|
||||
"sub_path": "filament/Generic PLA+ @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA+ 0.2 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA+ 0.2 nozzle.json"
|
||||
"name": "Generic PLA+ @Anker 0.2 nozzle",
|
||||
"sub_path": "filament/Generic PLA+ @Anker 0.2 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA+ 0.25 nozzle",
|
||||
"sub_path": "filament/Anker Generic PLA+ 0.25 nozzle.json"
|
||||
"name": "Generic PLA+ @Anker 0.25 nozzle",
|
||||
"sub_path": "filament/Generic PLA+ @Anker 0.25 nozzle.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PLA-CF",
|
||||
"sub_path": "filament/Anker Generic PLA-CF.json"
|
||||
"name": "Generic PLA-CF @Anker",
|
||||
"sub_path": "filament/Generic PLA-CF @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic PVA",
|
||||
"sub_path": "filament/Anker Generic PVA.json"
|
||||
"name": "Generic PVA @Anker",
|
||||
"sub_path": "filament/Generic PVA @Anker.json"
|
||||
},
|
||||
{
|
||||
"name": "Anker Generic TPU",
|
||||
"sub_path": "filament/Anker Generic TPU.json"
|
||||
"name": "Generic TPU @Anker",
|
||||
"sub_path": "filament/Generic TPU @Anker.json"
|
||||
}
|
||||
],
|
||||
"machine_list": [
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA Silk 0.2 nozzle",
|
||||
"inherits": "Anker Generic PLA Silk @base",
|
||||
"from": "system",
|
||||
"setting_id": "A1l6NiwRrasdV556",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.2 nozzle",
|
||||
"Anker M5 All-Metal 0.2 nozzle",
|
||||
"Anker M5C 0.2 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA Silk 0.25 nozzle",
|
||||
"inherits": "Anker Generic PLA Silk @base",
|
||||
"from": "system",
|
||||
"setting_id": "yzHmKTOtA9JamlNf",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.25 nozzle",
|
||||
"Anker M5 All-Metal 0.25 nozzle",
|
||||
"Anker M5C 0.25 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA Silk",
|
||||
"inherits": "Anker Generic PLA Silk @base",
|
||||
"from": "system",
|
||||
"setting_id": "BGttYO9m2rGcnrEG",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA+ 0.2 nozzle",
|
||||
"inherits": "Anker Generic PLA+ @base",
|
||||
"from": "system",
|
||||
"setting_id": "6IcMSjyxt0szdUuY",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.2 nozzle",
|
||||
"Anker M5 All-Metal 0.2 nozzle",
|
||||
"Anker M5C 0.2 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA+ 0.25 nozzle",
|
||||
"inherits": "Anker Generic PLA+ @base",
|
||||
"from": "system",
|
||||
"setting_id": "a2Rf07ZUhpTPONN1",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
],
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.25 nozzle",
|
||||
"Anker M5 All-Metal 0.25 nozzle",
|
||||
"Anker M5C 0.25 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA+",
|
||||
"inherits": "Anker Generic PLA+ @base",
|
||||
"from": "system",
|
||||
"setting_id": "0yQN44WNvLVjQu2b",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA-CF",
|
||||
"inherits": "Anker Generic PLA-CF @base",
|
||||
"from": "system",
|
||||
"setting_id": "diNUVM7UcHLnOr9J",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA",
|
||||
"inherits": "Anker Generic PLA @base",
|
||||
"from": "system",
|
||||
"setting_id": "qfKC91VAAFZSExhm",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PVA",
|
||||
"inherits": "Anker Generic PVA @base",
|
||||
"from": "system",
|
||||
"setting_id": "GRtdOKUkQfZ5eDH4",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic TPU",
|
||||
"inherits": "Anker Generic TPU @base",
|
||||
"from": "system",
|
||||
"setting_id": "YyTaPGGiEyAzmh9A",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ABS 0.2 nozzle",
|
||||
"inherits": "Anker Generic ABS @base",
|
||||
"name": "Generic ABS @Anker 0.2 nozzle",
|
||||
"inherits": "Generic ABS @Anker base",
|
||||
"renamed_from": "Anker Generic ABS 0.2 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "BD5ODYVM90Ig44C5",
|
||||
"setting_id": "iOCt7x95XbWYMe5q",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PETG 0.25 nozzle",
|
||||
"inherits": "Anker Generic PETG @base",
|
||||
"name": "Generic ABS @Anker 0.25 nozzle",
|
||||
"inherits": "Generic ABS @Anker base",
|
||||
"renamed_from": "Anker Generic ABS 0.25 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "UgKfPuleh1xnoJLT",
|
||||
"setting_id": "7Q2pr70SpSjK7v7Y",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ABS @base",
|
||||
"name": "Generic ABS @Anker base",
|
||||
"inherits": "fdm_filament_abs",
|
||||
"from": "system",
|
||||
"filament_id": "GFB99",
|
||||
"filament_id": "OFY9muEs",
|
||||
"instantiation": "false"
|
||||
}
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ASA",
|
||||
"inherits": "Anker Generic ASA @base",
|
||||
"name": "Generic ABS @Anker",
|
||||
"inherits": "Generic ABS @Anker base",
|
||||
"renamed_from": "Anker Generic ABS",
|
||||
"from": "system",
|
||||
"setting_id": "QiFoBW5WuDUJGmFZ",
|
||||
"setting_id": "x3IBYtgKBx6Mszzk",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PETG 0.2 nozzle",
|
||||
"inherits": "Anker Generic PETG @base",
|
||||
"name": "Generic ASA @Anker 0.2 nozzle",
|
||||
"inherits": "Generic ASA @Anker base",
|
||||
"renamed_from": "Anker Generic ASA 0.2 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "VItvDP6zmenWXwPO",
|
||||
"setting_id": "lTR8QLbuttyVs5UW",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ABS 0.25 nozzle",
|
||||
"inherits": "Anker Generic ABS @base",
|
||||
"name": "Generic ASA @Anker 0.25 nozzle",
|
||||
"inherits": "Generic ASA @Anker base",
|
||||
"renamed_from": "Anker Generic ASA 0.25 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "WS5wXckNuiQqSVwO",
|
||||
"setting_id": "FU4BiMydEyo7zxq5",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ASA @base",
|
||||
"name": "Generic ASA @Anker base",
|
||||
"inherits": "fdm_filament_asa",
|
||||
"from": "system",
|
||||
"filament_id": "GFB98",
|
||||
"filament_id": "OFLPAxz3",
|
||||
"instantiation": "false"
|
||||
}
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PETG-CF",
|
||||
"inherits": "Anker Generic PETG-CF @base",
|
||||
"name": "Generic ASA @Anker",
|
||||
"inherits": "Generic ASA @Anker base",
|
||||
"renamed_from": "Anker Generic ASA",
|
||||
"from": "system",
|
||||
"setting_id": "j8PLF6AZD0R0oVs8",
|
||||
"setting_id": "aDADuxiEKt2dVKOJ",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA 0.2 nozzle",
|
||||
"inherits": "Anker Generic PA @base",
|
||||
"name": "Generic PA @Anker 0.2 nozzle",
|
||||
"inherits": "Generic PA @Anker base",
|
||||
"renamed_from": "Anker Generic PA 0.2 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "NZB26MSD9WbOeY2S",
|
||||
"setting_id": "tYAT7xnNFD6gY84A",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA 0.25 nozzle",
|
||||
"inherits": "Anker Generic PA @base",
|
||||
"name": "Generic PA @Anker 0.25 nozzle",
|
||||
"inherits": "Generic PA @Anker base",
|
||||
"renamed_from": "Anker Generic PA 0.25 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "Wj7oXTGUxo8lie1B",
|
||||
"setting_id": "Zlv65wLA94PbevRG",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA @base",
|
||||
"name": "Generic PA @Anker base",
|
||||
"inherits": "fdm_filament_pa",
|
||||
"from": "system",
|
||||
"filament_id": "GFN99",
|
||||
"filament_id": "OFg8ndtj",
|
||||
"instantiation": "false"
|
||||
}
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PC",
|
||||
"inherits": "Anker Generic PC @base",
|
||||
"name": "Generic PA @Anker",
|
||||
"inherits": "Generic PA @Anker base",
|
||||
"renamed_from": "Anker Generic PA",
|
||||
"from": "system",
|
||||
"setting_id": "xY25QcIsR9pWai3n",
|
||||
"setting_id": "sLWVtBxpAC53eUwo",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA-CF @base",
|
||||
"name": "Generic PA-CF @Anker base",
|
||||
"inherits": "fdm_filament_pa",
|
||||
"from": "system",
|
||||
"filament_id": "GFN98",
|
||||
"filament_id": "OFQLcbps",
|
||||
"instantiation": "false",
|
||||
"filament_type": [
|
||||
"PA-CF"
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA",
|
||||
"inherits": "Anker Generic PA @base",
|
||||
"name": "Generic PA-CF @Anker",
|
||||
"inherits": "Generic PA-CF @Anker base",
|
||||
"renamed_from": "Anker Generic PA-CF",
|
||||
"from": "system",
|
||||
"setting_id": "QbIiX554Yee6vb32",
|
||||
"setting_id": "K4LcpR0zBp5klSpb",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PC 0.2 nozzle",
|
||||
"inherits": "Anker Generic PC @base",
|
||||
"name": "Generic PC @Anker 0.2 nozzle",
|
||||
"inherits": "Generic PC @Anker base",
|
||||
"renamed_from": "Anker Generic PC 0.2 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "GhIOAidtgDkzh9Aj",
|
||||
"setting_id": "2sSOgctcnVh9bGbQ",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PC 0.25 nozzle",
|
||||
"inherits": "Anker Generic PC @base",
|
||||
"name": "Generic PC @Anker 0.25 nozzle",
|
||||
"inherits": "Generic PC @Anker base",
|
||||
"renamed_from": "Anker Generic PC 0.25 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "TQm9EPdenyGJMvgP",
|
||||
"setting_id": "h7IRuq5uekjNw4vg",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PC @base",
|
||||
"name": "Generic PC @Anker base",
|
||||
"inherits": "fdm_filament_pc",
|
||||
"from": "system",
|
||||
"filament_id": "GFC99",
|
||||
"filament_id": "OFLakOUI",
|
||||
"instantiation": "false"
|
||||
}
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PA-CF",
|
||||
"inherits": "Anker Generic PA-CF @base",
|
||||
"name": "Generic PC @Anker",
|
||||
"inherits": "Generic PC @Anker base",
|
||||
"renamed_from": "Anker Generic PC",
|
||||
"from": "system",
|
||||
"setting_id": "qdsEps11ugFHJkn7",
|
||||
"setting_id": "ffufXVvW95sunH1B",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ASA 0.2 nozzle",
|
||||
"inherits": "Anker Generic ASA @base",
|
||||
"name": "Generic PETG @Anker 0.2 nozzle",
|
||||
"inherits": "Generic PETG @Anker base",
|
||||
"renamed_from": "Anker Generic PETG 0.2 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "G7pzEyyhPFDnae3R",
|
||||
"setting_id": "67ZHuiXPyCP6Tdtr",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA 0.25 nozzle",
|
||||
"inherits": "Anker Generic PLA @base",
|
||||
"name": "Generic PETG @Anker 0.25 nozzle",
|
||||
"inherits": "Generic PETG @Anker base",
|
||||
"renamed_from": "Anker Generic PETG 0.25 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "uKfcnPWdXxAGB5Ls",
|
||||
"setting_id": "aLuRALDt0Otbd2So",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PETG @base",
|
||||
"name": "Generic PETG @Anker base",
|
||||
"inherits": "fdm_filament_pet",
|
||||
"from": "system",
|
||||
"filament_id": "GFG99",
|
||||
"filament_id": "OFYPdQJh",
|
||||
"instantiation": "false",
|
||||
"filament_type": [
|
||||
"PETG"
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Generic PETG @Anker",
|
||||
"inherits": "Generic PETG @Anker base",
|
||||
"renamed_from": "Anker Generic PETG",
|
||||
"from": "system",
|
||||
"setting_id": "hvV0rmnzRHJk9sMz",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PETG-CF @base",
|
||||
"name": "Generic PETG-CF @Anker base",
|
||||
"inherits": "fdm_filament_pet",
|
||||
"from": "system",
|
||||
"filament_id": "GFG98",
|
||||
"filament_id": "OFoYSJKi",
|
||||
"instantiation": "false",
|
||||
"filament_type": [
|
||||
"PETG-CF"
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Generic PETG-CF @Anker",
|
||||
"inherits": "Generic PETG-CF @Anker base",
|
||||
"renamed_from": "Anker Generic PETG-CF",
|
||||
"from": "system",
|
||||
"setting_id": "vCAuQeQLoXUk28ph",
|
||||
"instantiation": "true",
|
||||
"compatible_printers": [
|
||||
"Anker M5 0.4 nozzle",
|
||||
"Anker M5 0.6 nozzle",
|
||||
"Anker M5 All-Metal 0.4 nozzle",
|
||||
"Anker M5 All-Metal 0.6 nozzle",
|
||||
"Anker M5C 0.4 nozzle",
|
||||
"Anker M5C 0.6 nozzle"
|
||||
]
|
||||
}
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA 0.2 nozzle",
|
||||
"inherits": "Anker Generic PLA @base",
|
||||
"name": "Generic PLA @Anker 0.2 nozzle",
|
||||
"inherits": "Generic PLA @Anker base",
|
||||
"renamed_from": "Anker Generic PLA 0.2 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "j6QmCITPJoP7bWHq",
|
||||
"setting_id": "rCvmCzPgi4KA6nmI",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"2"
|
||||
+4
-3
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic ASA 0.25 nozzle",
|
||||
"inherits": "Anker Generic ASA @base",
|
||||
"name": "Generic PLA @Anker 0.25 nozzle",
|
||||
"inherits": "Generic PLA @Anker base",
|
||||
"renamed_from": "Anker Generic PLA 0.25 nozzle",
|
||||
"from": "system",
|
||||
"setting_id": "ErUUDTQ7h1wNHAKT",
|
||||
"setting_id": "C0hNEbEueKrcYojS",
|
||||
"instantiation": "true",
|
||||
"filament_max_volumetric_speed": [
|
||||
"3"
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"type": "filament",
|
||||
"name": "Anker Generic PLA @base",
|
||||
"name": "Generic PLA @Anker base",
|
||||
"inherits": "fdm_filament_pla",
|
||||
"from": "system",
|
||||
"filament_id": "GFL99",
|
||||
"filament_id": "OFDSrzZ8",
|
||||
"instantiation": "false"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user