load_local_machines_from_config() iterated a reference to the live
m_local_machines map while erase_local_machine() erased from it for
printers without access rights, invalidating the range-for iterator
(use-after-free on ++it). Iterate a copy instead, as the code did
before commit 5028a5000e.
When the network plugin is not yet installed at startup, on_init_network builds
the DeviceManager without an agent, so its constructor skips loading the persisted
LAN printers. After the plugin is installed and the network stack hot-reloads, the
manager is reused via set_agent(), which never loaded them - so previously paired
printers stayed missing from the device list until an app restart. Load them once a
real agent first arrives.
- Allow mapping to EMPTY trays only from the multi-machine send page and keep
both panels pickable in the LEFT_AND_RIGHT view
- Guard the error-dialog cloud snapshot against stale callbacks and fall back
to the local illustration on timeout
- Parse the ipcam storage-check ack and axis/chamber pushes defensively
- Strip fan-control telemetry, initialize the upgrade error code, restore the
.json filter in the model-id scan
- Fix best-position popup tray lookup, gradient placement, and colour-list
ownership
- Cover switch binding sets and invalid-track transients in DevMapping tests
Resolve five conflicts, all of which needed both sides rather than a pick:
- BackgroundSlicingProcess: ours was a pure tabs->spaces reformat of base, so
keep main's per-filament volume/nozzle map read-back (its only change here).
- GUI_App: main's #12506 else-if attached to an `if` this branch deleted;
re-expressed onto the same-agent early-return path (the agent factory caches
per id, so pointer equality is the same predicate).
- MainFrame: both sides relocated Sync Presets independently; keep main's
push_notification plus the branch's Plugins menu items.
- Tab: the "TODO: Orca: Support hybrid" blocks were unchanged base, not a branch
decision; take main's enabled Hybrid to match the already auto-merged siblings.
- test_config: union of both sides' cases (6 plugin + 9 multi-nozzle).
A print sliced for a nozzle that sits in the hotend rack (but is not
mounted) was blocked by the send dialog's mounted-nozzle diameter check,
even though the printer fetches the required nozzle itself (#14685).
Consolidate the three mounted-nozzle gates (_is_nozzle_data_valid,
is_nozzle_type_match, _is_same_nozzle_diameters) into a single
CheckErrorExtruderNozzleWithSlicing fed by s_get_slicing_extuder_nozzles,
which collects the plate's per-extruder nozzle requirements (hybrid
extruders contribute one entry per used sub-nozzle flow). The rack
extruder validates against its whole inventory (mounted + rack) with
guidance to calibrate the rack, refresh nozzle info, or re-slice, and
blocks when toolhead + rack are full (no free slot to stow a nozzle).
Other extruders keep the validity/flow/diameter checks against the
mounted nozzle.
Also add CheckErrorRackStatus, which holds Send while the printer is
still reading the rack hotend information, and judge material hardness
for the rack extruder per dispatch-mapped nozzle as a non-blocking
caution (mounted nozzles keep the blocking gate).
The Filament Track Switch (H2-series accessory, product code O2L-FTS) feeds
every AMS to both extruders through a two-track switch. Port full support
across the device layer, project config, and GUI.
Device / config:
- Model the switch-aware AMS binding (the set of extruders an AMS can feed
and which input track A/B feeds it), switch readiness, the O2L-FTS firmware
module, and the fun2 capability bit for checking a slice against installed
hardware.
- Register has_filament_switcher and enable_filament_dynamic_map as project
config that persists with the project and restores from a saved 3mf, and
force both back to false on every project/printer/CLI load path. Live
device sync is the only thing that sets them true.
GUI:
- Sidebar sync activates the switch from live device state, attributes each
AMS to the extruder its input track feeds, shows a floating status icon
(ready / not-calibrated), and surfaces a one-time tip / not-calibrated
warning.
- Send dialog gains a non-blocking slice-vs-hardware mismatch warning and a
blocking error when a slice needs dynamic nozzle mapping but the switch is
missing or not set up.
- AMS load/unload guards, AMS-view routing glyph + un-calibrated banner +
hidden external-spool road, and mapping-popup external-spool lockout.
- Filament pickers collapse the per-extruder split into a single deduplicated
"AMS filaments" group with a smart-assign toggle when the switch is ready.
- Firmware-upgrade panel lists the O2L-FTS accessory and its version.
- Device-provided filament-change steps (ams.cfs) drive the change-step
display when firmware sends them, including the three switch steps.
- "Load current filament" asks which extruder to feed via a
FeedDirectionDialog when the switch is calibrated.
Inert without the accessory: every path is gated on the switch being
installed (MQTT aux bit 29, default off) or ready, both project flags default
false, and the per-extruder AMS attribution is byte-identical, so AMS state,
the send/load UI, and sliced g-code are unchanged for every printer that does
not report a Filament Track Switch.
Nozzle rack data model and device-tab panel, multi-nozzle sync, per-nozzle filament blacklist, and print-dispatch nozzle mapping (DevNozzleMappingCtrl V0/V1).
* Remove unused `get_printer_preset` calls.
* `Plater::check_printer_initialized` should skip nozzle flow type checks if nozzle is unknown.
Also remove unnecessary `is_multi_extruders` check.
* Remove unused `CalibUtils::is_same_nozzle_diameters()` fn.
* Simplify `CalibUtils::check_printable_status_before_cali`.
The single-arity can delegate to the vectorized arity.
* Add `DevExtruderSystem::NozzleDiameterMatchesOrUnknown` to simply checks.
* Update `CalibrationPresetPage::update_sync_button_status()` to use `NozzleDiameterMatchesOrUnknown`.
Simplify logic by iterating over each extruder and checking for diameter and volume type match.
The previous code had several mistakes (from what I could tell):
- `curr_obj->is_multi_extruders()` doesn't imply exactly 2 extruders
- the single/multi branch served no purpose
- the single branch failed to check the volume type
* Specify `std::fabs` and add explicit import.
Ref: https://github.com/OrcaSlicer/OrcaSlicer/pull/13330#discussion_r3133613736
Not sure how idiomatic this is in C++ / OrcaSlicer codebase, but CoPilot suggested it and it seems reasonable.
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Clean up code
* Filament mapping select ext slot automatically when no AMS filament inserted (OrcaSlicer/OrcaSlicer#13103)
* Show warning if external filament type does not match the one in sliced file
* Add OrcaCloud sync platform and preset bundle sharing system
Introduce OrcaCloud, a cloud sync platform for user presets, alongside
a preset bundle system that enables sharing printer/filament/process
profiles as local exportable bundles or subscribed cloud bundles.
OrcaCloud platform:
- Auth to Orca Cloud
- Encrypted token storage (file-based or system keychain)
- User preset sync with
- Profile migration from default/bambu folders on first login
- Homepage integration with entrance to cloud.orcaslicer.com
Preset bundles:
- Local bundle import/export with bundle_structure.json metadata
- Subscribed cloud bundles with version-based update checking
- Thread-safe concurrent bundle access with read-write mutex
- Canonical bundle preset naming (_local/<id>/... and _subscribed/<id>/...)
- Bundle presets are read-only; grouped under subheaders in combo boxes
- PresetBundleDialog with auto-sync toggle, refresh, update notifications
- Hyperlinked bundle names to cloud bundle pages
Co-authored-by: Sabriel Koh <sabrielkcr@gmail.com>
Co-authored-by: Derrick <derrick992110@gmail.com>
Co-authored-by: Mykola Nahirnyi <mnahirnyi@amcbridge.com>
Co-authored-by: Ian Chua <iancrb00@gmail.com>
Co-authored-by: Draginraptor <draginraptor@gmail.com>
Co-authored-by: ExPikaPaka <112851715+ExPikaPaka@users.noreply.github.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
Co-authored-by: Ocraftyone <Ocraftyone@users.noreply.github.com>
Co-authored-by: yw4z <ywsyildiz@gmail.com>
Co-authored-by: peterm-m <101202951+peterm-m@users.noreply.github.com>
* Fixed an issue on Windows it failed to login Orca Cloud with Google account
* Don't assume 0.4mm nozzle; format as "unknown" if not defined.
* Skip nozzle diameter and hardness checks if nozzle info unknown.
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
/run/build/BambuStudio/src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h:16:10: error: ‘optional’ in namespace ‘std’ does not name a template type
16 | std::optional<bool> IsDetectOnInsertEnabled() const { return m_enable_detect_on_insert; };
| ^~~~~~~~
/run/build/BambuStudio/src/slic3r/GUI/DeviceCore/DevFilaAmsSetting.h:4:1: note: ‘std::optional’ is defined in header ‘<optional>’; this is probably fixable by adding ‘#include <optional>’
3 | #include "DevCtrl.h"
+++ |+#include <optional>
4 |
/run/build/BambuStudio/src/slic3r/GUI/DeviceCore/DevFilaSystem.h:174:10: error: ‘optional’ in namespace ‘std’ does not name a template type
174 | std::optional<bool> IsDetectOnInsertEnabled() const { return m_ams_system_setting.IsDetectOnInsertEnabled(); };
| ^~~~~~~~
/run/build/BambuStudio/src/slic3r/GUI/DeviceCore/DevFilaSystem.h:13:1: note: ‘std::optional’ is defined in header ‘<optional>’; this is probably fixable by adding ‘#include <optional>’
12 | #include <wx/colour.h>
+++ |+#include <optional>
13 |
(cherry picked from commit fa482b1c0dc7faa2ad87c37eb7f1ea2ce87a5084)