Commit Graph
13291 Commits
Author SHA1 Message Date
SoftFever 844c374798 update colors 2026-07-09 19:42:21 +08:00
SoftFever 0d31325df0 feat: Filament Track Switch (H2-series O2L-FTS) support
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.
2026-07-09 18:57:05 +08:00
Andrew 3ebb4b274d Own the speed dial ActionRegistry in GUI_App and keep it fresh from loader callbacks 2026-07-09 16:21:54 +08:00
Andrew 6463b3d976 Add ActionRegistry as the speed dial's action source of truth 2026-07-09 16:21:54 +08:00
Andrew bcd98ea791 Add stable hashed identity for speed dial actions 2026-07-09 16:21:53 +08:00
Andrew 6daef171c1 Add actions speed dial 2026-07-09 16:21:53 +08:00
bc6ffcfb31 Anisotropic surfaces + Separated Infills (remake) (#11682)
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-07-08 15:40:19 -03:00
Ian Bassi 378843a4da Remove unused variable (#14670) 2026-07-08 15:15:50 -03:00
Ian BassiandRodrigo Faselli 20a66fa99b Top Surface Expansion (#14296)
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
2026-07-08 14:20:40 -03:00
Ian Bassi da149ee75a Add toolchange ordering option (Standard/Cyclic). (#13582) 2026-07-08 14:18:41 -03:00
SoftFever 28b7127150 feat(gui): multi-nozzle UI for H2C/A2L
Multi-nozzle sync widget, AMS rack-nozzle mapping popup, calibration rework, send-dialog nozzle mapping and extruder-count UI. Includes the fix to persist the AMS sync badge on filament cards (H2C/A2L and direct-sync printers).
2026-07-09 01:16:26 +08:00
SoftFever a098b483f6 feat(device): H2C/A2L device layer
Nozzle rack data model and device-tab panel, multi-nozzle sync, per-nozzle filament blacklist, and print-dispatch nozzle mapping (DevNozzleMappingCtrl V0/V1).
2026-07-09 01:16:25 +08:00
Kris Austin b58025575d fix: isolate calibration temp paths per user (#14619)
* fix: isolate calibration temp paths per user

The calibration temp files under <temp>/calib were file-scope statics
initialized before set_temporary_dir() runs at startup, so they kept
using the shared system temp root and missed the per-user isolation
added in #14607. On Linux every account shares /tmp, so the first user
to calibrate owns /tmp/calib and later users fail to write there, the
same cross-user collision #14607 fixed for model backups, STEP import,
and part skip.

Build the paths lazily from temporary_dir() instead, through a
calib_temp_dir() accessor and a calib_temp_file() join helper. The base
becomes <temp>/orcaslicer_<uid>/calib on Linux and is unchanged on
Windows, where the temp dir is already per user.

Also make StoreParams::path a std::string rather than a non-owning
const char*. The calibration code had to keep a std::string alive
solely to feed that pointer, and the field was uninitialized by
default; owning the string removes the lifetime hazard for all three
callers and makes the entry guard a reliable empty() check. Confined to
the 3mf project exporter (three callers, two internal reads); no
on-disk, format, or ABI impact.

Follows up on #14607 per @Noisyfox's review suggestion.
2026-07-08 21:14:05 +08:00
anjis cab62070b5 Fix garbled Chinese filenames when importing ZIP files. (#14633)
* Fix garbled Chinese filenames when importing ZIP files.

* fix: avoid repeated ZIP path CRC calculation
2026-07-08 20:24:55 +08:00
Ian Bassi 12b63ebe36 Localization context (verb noun adjective adverb) (#14646)
* Torre de purga capitalization

* Russian navigation back

* Inches

* verb noun adjective adverb

* Posterior

* Fix atras for camera view

* Camera view
2026-07-08 09:16:00 -03:00
SoftFever 11dd078f64 feat(plugin)!: faithful mutable geometry bindings; edit slices via the class API
Replaces the plugin-only set_slices/set_fill_surfaces/set_lslices mutators with a
faithful, mutable binding of the core geometry types, so a plugin edits the slicing
graph through the same object model the C++ code uses.

- Point, Polygon, ExPolygon, Surface and SurfaceCollection gain constructors,
  writable accessors (contour/holes, set/append/clear, filter_by_type), transforms
  (rotate/scale/translate), boolean ops and offset. Polygon exposes a zero-copy
  writable numpy view via a make_writable_rows helper.
- LayerRegion.slices/fill_surfaces stay read-only refs but are now live,
  in-place-editable SurfaceCollections; Layer.make_slices() re-derives the islands
  and refreshes lslice bounding boxes.
- Rewrites the Inset and Twistify samples on the new API (in-place ExPolygon
  transforms, ExPolygon.offset, SurfaceCollection.set), dropping their numpy
  dependency; each touched layer calls make_slices() so downstream steps see the
  edited footprint. Adds tests covering in-place edits through a live collection.

BREAKING CHANGE: set_slices/set_fill_surfaces/set_lslices and the internal
parse_expolygon(_list)/surfaces_from_py helpers are removed. Plugins mutate through
the class API (SurfaceCollection.set/append/clear, Polygon.set_points/append,
ExPolygon.set_holes) instead.
2026-07-08 15:04:40 +08:00
1d61962ea7 Add Vertical/Horizontal axis-lock checkboxes to Support Painting (#14262)
* Support Painting: add Vertical/Horizontal axis-lock checkboxes

Adds the Vertical and Horizontal axis-lock checkboxes to the Support
Painting gizmo, matching the UI in the MMU Segmentation and Seam
Painter gizmos. The underlying constraint logic has lived in
GLGizmoPainterBase since #2424 and already applies to any
ToolType::BRUSH action — the Support gizmo was the only painter
without the UI to enable it.

The Circle and Sphere brush arms are consolidated into a single
"if (Circle || Sphere)" block matching the structure of
GLGizmoMmuSegmentation::on_render_input_window, eliminating
duplicate cursor-radius and axis-lock UI code.

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

* Support Painting: keep Circle/Sphere as separate tool arms per review

Reviewer requested keeping a separate condition per tool for future
extensibility rather than merging Circle and Sphere into one branch.
This restores the upstream Circle/Sphere arm structure and adds the
Vertical/Horizontal axis-lock options to each arm, making the change
purely additive over upstream.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-07-08 04:11:47 +03:00
SoftFever fd2a489980 Merge branch 'feat/plugin-feature' into feature/plugin-slicing
Brings in the Plugins dialog as-you-type search with fuzzy match highlighting
and clickable column-header sorting (name, version, source, status) — PRs
#14610 and #14611.
2026-07-08 01:03:34 +08:00
SoftFever f81a24abfb feat(plugin): expose the slicing print-graph as raw orca.host classes + Twistify sample
Adds PluginHostSlicing, which registers the print-graph data model (Print,
PrintObject, Layer, LayerRegion, Surface, ExPolygon, extrusions, ...) into the
orca.host submodule in the same raw-class style as PluginHostApi's Model/Preset
graph, with shared helpers in PluginBindingUtils. SlicingPipelinePluginCapability
is trimmed to the capability surface (the standalone SlicingNumpy helper is folded
away). Adds the Twistify example plugin next to Inset and broadens the binding,
hook, and plugin-install tests.
2026-07-08 00:05:28 +08:00
Ian BassiandAlexandre Folle de Menezes bec1ce706c Fix localization context (#14642)
Co-authored-by: Alexandre Folle de Menezes <afmenez@terra.com.br>
2026-07-07 12:15:37 -03:00
Noisyfox 696a94a1a6 Update color 2026-07-07 22:29:28 +08:00
yw4z b2adfb5c13 Fix minimize & wrapped text issue on shared profiles notification (#14604)
Update NotificationManager.cpp
2026-07-07 14:24:55 +03:00
changyu.chen c2f5a87e24 FIX: print warning when ams is drying
jira: [STUDIO-16558]

Change-Id: I6313c4c02dce6853d48fd4b175a161bf116865a9
(cherry picked from commit 49609394cd92b7043f4f65debf585cbc37f382bd)
2026-07-07 17:54:17 +08:00
changyu.chen 1b93f35565 FIX: print warning when ams drying
jira: [STUDIO-16505]

Change-Id: I47b98643a7d941c594eb4d90c08f48a7880c947e
(cherry picked from commit bdc833d49440c73a56cf10b723fb02d33d1c3a98)
2026-07-07 17:51:51 +08:00
Noisyfox f58a1f350a feat: add drying-while-printing warning in SelectMachine dialog
Port from BambuStudio commit c8f70c6ca. Shows a warning when AMS
is actively drying during print job preparation, alerting users that
the drying temperature will be lowered during printing.
2026-07-07 17:50:20 +08:00
Noisyfox 922af972c7 refactor: convert m_fila_system from raw pointer to shared_ptr
Matches BambuStudio commit c8f70c6ca. DevFilaSystem* m_fila_system
becomes std::shared_ptr<DevFilaSystem>, enabling proper shared ownership
for the AMS drying control feature without no-op deleter hacks.

- DeviceManager.hpp: m_fila_system and GetFilaSystem() use shared_ptr
- DeviceManager.cpp: std::make_shared allocation, remove manual delete,
  add .get() to ParseV1_0 calls
- MoonrakerPrinterAgent.cpp: add .get() to GetFilaSystem() in ParseV1_0
2026-07-07 17:29:10 +08:00
Noisyfox f713c7ae49 Make sure codes uses same structure/naming/position as BambuStudio
for easier code comparasion & porting in the future
2026-07-07 17:07:40 +08:00
Noisyfox 668654da5f fix: use dark humidity icons in dark mode 2026-07-07 14:58:51 +08:00
Noisyfox 2524669139 Revert "feat: update error dialog stop-drying to use CtrlAmsStopDrying"
This reverts commit 044a113d54.
2026-07-07 14:47:52 +08:00
Noisyfox 044a113d54 feat: update error dialog stop-drying to use CtrlAmsStopDrying
Keeps command_ams_drying_stop() fallback for backward compatibility.
2026-07-07 14:47:33 +08:00
Noisyfox b2827cb9fa feat: wire AMS humidity click to open AMSDryControl dialog
For N3F and N3S AMS types, clicking the humidity indicator
now opens the full drying control dialog instead of the popup.
2026-07-07 14:36:52 +08:00
Noisyfox 08b08e09fc fix: use OrcaSlicerTitle.ico instead of BambuStudioTitle.ico 2026-07-07 14:23:05 +08:00
NoisyfoxandClaude 62e5cfed36 feat: add AMSDryControl dialog for AMS filament drying
Three-page wizard: main status/control page, guide page with
filament tray status, and progress page. Supports N3F and N3S AMS types.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-07 14:16:04 +08:00
Noisyfox ec913eaf30 feat: add is_support_remote_dry flag parsing from firmware
Parses fun2 bit 5 from printer firmware to enable remote drying support.
2026-07-07 13:27:39 +08:00
NoisyfoxandClaude 22d9765348 feat: add CtrlAmsStartDryingHour and CtrlAmsStopDrying commands
Publish 'ams_filament_drying' JSON commands via MQTT for
starting and stopping AMS filament drying.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-07 13:19:11 +08:00
NoisyfoxandClaude dd5b755f60 feat: add drying status JSON parsing and DevAms helper methods
Parse dry_status, dry_sub_status, dry_fan statuses,
dry_settings, and dry_cannot_reasons from printer JSON.
Implement IsSupportRemoteDry, AmsIsDrying, get_ams_drying_preset.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-07 13:09:32 +08:00
Noisyfox 9ee7e9aba4 feat: add DevUtilBackend with GetFilamentDryingPreset
Reads filament_dev_ams_drying_* config keys from filament presets
and returns structured DevFilamentDryingPreset data.
2026-07-07 12:51:12 +08:00
Noisyfox 1adfb5f242 feat: add DevFilamentDryingPreset, ctrl method declarations, tray preset getter 2026-07-07 12:13:26 +08:00
Noisyfox c88535ce9e feat: add drying enums, structs, getters to DevAms
Adds DryCtrlMode, DryStatus, DrySubStatus, DryFanStatus,
CannotDryReason enums and DrySettings struct for AMS drying control.
2026-07-07 12:00:53 +08:00
Noisyfox 272e88a337 refactor: promote DevAmsType to global enum, rename DUMMY to EXT_SPOOL
Matches BambuStudio's DevAmsType naming convention.
2026-07-07 11:49:55 +08:00
SoftFever a1ff45284c Fix version was not properly updated on non windows OS (#14617)
Fixed an issue where on non-Windows systems, the version was not properly written to the appconfig.
2026-07-06 22:16:28 +08:00
yw4z cc89416055 Improve layout of transform gizmos (#14410)
* init

* add tooltips
2026-07-06 14:34:36 +03:00
Andrew cfe3673b22 Refine plugin sorting to use name-first base order
Ensure plugins are sorted alphabetically by name
when no other column is sorted, and resolve ties
by source, status, type, and plugin_key.
2026-07-06 18:14:26 +08:00
Andrew ee7339b64b Refine plugin sorting to use name-first base order
Ensure plugins are sorted alphabetically by name
when no other column is sorted, and resolve ties
by source, status, type, and plugin_key.
2026-07-06 16:25:07 +08:00
Andrew a11e442f1d Add version sorting for plugins
Enhance plugin dialog with semver-aware sorting
by version, enabling users to sort plugins based
on version comparisons.
2026-07-06 15:25:09 +08:00
Andrew 714fe54f77 Move plugin sort from dropdown to clickable column headers
Replace the toolbar sort dropdown with sortable Name/Source/Status column
headers that cycle ascending, descending, then clear. Add a Source column
and a PluginSortKey::None baseline for the cleared state. The whole header
cell is the click target and the sort triangle snaps in without a fade.
2026-07-06 15:03:14 +08:00
Andrew b724cb6631 Implement plugin sorting functionality
Add support for sorting plugins by status, name,
or source in both ascending and descending order.
2026-07-06 12:31:34 +08:00
Gabriel Monteiro fd80ded5a8 fix(gui): startup crash in clang/LLVM builds, null pointer UB in create_scaled_bitmap (#14521)
fix(gui): avoid null-pointer UB in create_scaled_bitmap with win == nullptr

create_scaled_bitmap() documents that win may be nullptr, but called
win->FromDIP() on it. Calling a member function through a null pointer
is undefined behavior: clang assumes `this` is non-null and deletes the
subsequent `win ?` null check added in #13117, turning the fallback
branch into an unconditional virtual call through a null vtable.
This crashed LLVM/clang-cl builds at startup (access violation reading
0x0 in BBLTopbar creation); MSVC builds were unaffected by luck.

Use the static, null-safe wxWindow::FromDIP(x, win) overload instead,
which falls back to the primary display DPI. Behavior is unchanged for
non-null windows.
2026-07-06 11:28:03 +08:00
SoftFever aafcccc83c Merge branch 'feat/plugin-feature' into feature/plugin-slicing 2026-07-06 01:12:05 +08:00
SoftFever ee1f4ef1d6 Show preset name in cloud sync conflict and error messages (#14592)
The 409 conflict notification, the force-push confirmation dialog, and the payload-too-large (413) dialog now name the affected preset. The name was already parsed from the conflict body but never surfaced. The account-level preset-limit message stays generic since it isn't about one specific preset.
2026-07-05 17:05:41 +08:00