* Linux compositing - retain old code and make switchable via #if statement
* Make option settable via env variable/.desktop file
* undo accidental empty row delete
OrcaSlicer currently ships an "Octo/Klipper" host type that maps to the
OctoPrint REST endpoints (api/version, api/files/local). It works for
Klipper setups that run Moonraker with the OctoPrint-emulation plugin,
but native Moonraker — and Moonraker-compatible firmwares like the
Prusa-Firmware-Buddy buddy-klipper fork — speak a different shape:
distinct paths, JSON body for /printer/print/start, {"result":...}
envelope. There's no host type for that today.
Add a new Moonraker class deriving from PrintHost. Endpoints used,
matching the Moonraker spec:
- GET /server/info — connection test, reads
result.klippy_state
- GET /server/files/roots — storage-picker dropdown
(returns roots with 'w'
permission); gracefully
degrades if absent
- POST /server/files/upload (multipart) — upload (form fields:
file, root)
- POST /printer/print/start (json) — {"filename":"<path>"}; the
filename is whatever the
upload response returned
in result.item.path, so any
server-side rename
(collision suffix etc.) is
respected. JSON body is
built via property_tree
write_json so exotic
characters in the path are
properly escaped.
Auth: X-Api-Key header, only when printhost_apikey is non-empty
(Moonraker can be configured to require it but doesn't by default).
HTTP Basic / Digest are not part of the Moonraker spec and are not
sent.
Storage root is read from upload_data.storage with "gcodes" as the
fallback default, so the existing storage-picker plumbing in
PrintHostDialogs lights up automatically once enumerable roots are
returned.
UI: registers as the "Moonraker (Klipper)" entry under host_type;
selectable via the existing Physical Printer dialog (sidebar's
connection button on the printer card).
Verified against a Prusa-Firmware-Buddy buddy-klipper fork (firmware
identifies as moonraker_version "0.8.0-prusalink-shim"): /server/info
test, multipart upload to /server/files/upload, and JSON
/printer/print/start all work end-to-end. The existing "Octo/Klipper"
entry is left untouched so users currently relying on Moonraker's
OctoPrint-emulation plugin keep working.
* feat: double-click object list row to frame object in 3D view
Resolves#13800.
Extends the existing wxEVT_DATAVIEW_ITEM_ACTIVATED handler in
ObjectList::create_objects_ctrl() so that double-clicking an
object / part / instance row calls GLCanvas3D::zoom_to_selection().
This mirrors the existing "Fit camera to scene or selected object"
canvas button, exposed via a natural mouse trigger from the list.
The current view angle is preserved (Blender-style "Frame Selected").
Scope kept intentionally small:
- Object / Part / Instance rows -> zoom_to_selection().
- Filament-color column -> unchanged (still opens color editor).
- Plate rows -> unchanged (no-op).
- Inert in slice-preview mode via get_current_canvas3D(true).
Authored with assistance from Claude (Anthropic).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* fix: no-op object-list double-click in slice-preview mode
Following up on #13800 / #13804. The original guard used
get_current_canvas3D(true)'s `exclude_preview` flag, expecting that to
return nullptr when the preview canvas is active. In fact the flag
falls through to the editor canvas as a default, so the handler was
still calling zoom_to_selection() on the editor canvas — and since the
camera is shared between the editor and preview canvases, the move
was visible in the preview view as the camera jumping to empty world
positions (sliced or excluded, sliced or not).
Replace the misnamed flag with an explicit is_preview_shown() guard
that returns early before any canvas lookup. Manually verified:
preview mode now ignores object-list double-clicks; prepare-mode
behavior unchanged.
Authored with assistance from Claude (Anthropic).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Don't show unsupported presets in drop down list, since it's not useful
* Add option to show unsupported presets
* Explicitly set the default value to `false`
* update filament list without restart on preference change
---------
Co-authored-by: yw4z <ywsyildiz@gmail.com>
Since the wxWidgets 3.3 upgrade the Slice/Print split-button's transient
popup was dismissed the moment the cursor entered the gap between the
button and the menu, making "Print -> Export" impossible to select.
Anchor the menu flush against the button (with a 2 px overlap) instead of
6 px below it, removing the dead-zone the cursor had to cross.
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Preserve support base outline/fill order
Honor no_sort when emitting support toolpaths to keep outline-first order.
Group tree support base paths (including lightning) into per-area no_sort collections to prevent interleaving across islands.
Keep lightning layer lookup side-effect free.
* Tag Orca specific changes
Tag Orca specific changes vs. Bambu using the comment //ORCA: . This helps when reviewing merge commits from upstream Bambu so we don't end up causing regressions when pulling in commits from upstream
* Make preview slider labels draggable
Add label hit testing and delta-based dragging for the vertical preview slider labels. Keep label drags tied to the selected handle, prevent slider hover/timeline/menu handling from stealing label interactions, and keep value setters from changing the active selection implicitly.
* Refresh preview slider visuals
Update preview slider rails, handles, and labels for the refreshed light and dark theme appearance. Apply the same visual language to the horizontal slider, align single-layer and multi-layer labels, and remove obsolete triangle label geometry.
* Update the stealth mode description to reflect the current code changes in 2.4.
* disable HMS if bambu network plugin is not installed or in stealth mode
* fix build err
* add hide_login_side_panel to control whether to show login panel in home page
* fix: 409 conflicts resolution in notifications
* fix: silently log other http errors
* fix: pass force push flag to start_sync_user_preset
* remove formatting churn
* fix: propagate force push down put_setting
* refactor render_hyperlink_action to PopNotification for reuse
* fix an issue that hold status should be cleared before force pushing.
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Fix air filtration gcode emitted even if not not supported
- do not emit air filtration gcode if not supported by the printer
- removed redundant "add_eol" parameter from "set_exhaust_fan()" function
* Support 'Default' filament option (index 0)
Treat filament index 0 as the new "Default" (use active object/part filament) instead of using 1. Update config defaults and tooltips for wall/sparse/solid infill filament options (min/default -> 0, tooltip explains "Default"). Adjust normalization and propagation logic to respect explicit feature overrides and only apply base extruder when feature values are zero; only copy sparse->solid infill when sparse > 0. Introduce FeatureFilamentOverrideMask and clamp_feature_filament_to_valid to resolve and clamp feature filaments. Update UI lists and selection behavior to expose a "Default" entry and handle zero-based indices in PartPlate and Plater.
* enable_filament_for_features option
Co-Authored-By: LixNix <105106115+lixnix@users.noreply.github.com>
* \n
* Allow wipe_tower_filament to equal nozzle count
Relax the assertion in Print::extruders to permit wipe_tower_filament == config().nozzle_diameter.size(). The configuration value is 1-based and the code subtracts 1 when pushing the extruder index, so equality should be valid and selecting the last nozzle should not trigger an assertion.
* Revert "Allow wipe_tower_filament to equal nozzle count"
This reverts commit 2c97657432.
* Revert "enable_filament_for_features option"
This reverts commit 01c13baedd.
* Migrate legacy feature filament defaults
Add migration logic to convert legacy feature filament selections from 1 to 0 for older 3mf files. Introduces a local migrate_legacy_feature_filament_defaults lambda in src/OrcaSlicer.cpp and src/slic3r/GUI/Plater.cpp that scans keys (wall_filament, sparse_infill_filament, solid_infill_filament, support_filament, support_interface_filament) on configs/objects/volumes, updates values, counts conversions and logs the result. Also adds a Semver check for "2.4.0-dev" in OrcaSlicer to trigger the migration for files older than that version. This preserves expected default filament selections when loading older project files.
* Update OrcaSlicer.cpp
* Extract migration helper to ConfigMigrations
Centralize legacy feature-filament default migration by moving the duplicated lambda into ConfigMigrations::migrate_legacy_feature_filament_defaults (src/libslic3r/Config.cpp) and declaring it in Config.hpp. Update OrcaSlicer.cpp and slic3r/GUI/Plater.cpp to call the new function instead of inline lambdas. The helper converts specific feature filament keys (wall_filament, sparse_infill_filament, solid_infill_filament, support_filament, support_interface_filament) from int 1 to 0 and returns the count of conversions to avoid duplicated migration logic.
* Remove DynamicFilamentList1Based and consolidate lists
Delete the specialized DynamicFilamentList1Based struct and its global instance. Update Choice registrations to use the single dynamic_filament_list for wall, sparse_infill and solid_infill filaments, and remove the extra update call for the removed instance. This consolidates filament choice handling and removes duplicated logic in Plater.cpp.
* move it
* fix objects
* Update Config.hpp
* Update profiles
* fix: restore version placeholder in custom G-code
PlaceholderParser sets "version" in its constructor, but Print::apply() calls clear_config() which wipes it. Unlike timestamp/user (restored during G-code export), version was never restored, so [version]/{version} threw "Variable does not exist" in custom G-code while working in output filenames.
Re-set version after both clear_config() calls so it resolves everywhere.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix: resolve timestamp and user placeholders in File header G-code
file_start_gcode is processed via print.placeholder_parser() directly, before the G-code parser integration copy that restores timestamp/user. As a result {timestamp}, {year}..{second} and {user} threw "Variable does not exist" in the File header G-code field while working in Machine start/end G-code.
Inject fresh timestamp and user into the file_start_gcode config so they resolve, matching the other custom G-code fields.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix: expose initial_extruder and extruded_*_total placeholders in output filenames
PrintStatistics exposed initial_tool (not its documented alias initial_extruder) and total_weight/extruded_volume (not the documented extruded_weight_total/extruded_volume_total). Filename formats using the missing names failed with "not a variable name".
Add the missing aliases to PrintStatistics::config() and placeholders().
Fixes#12436Fixes#10708
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix: populate total_toolchanges without a wipe tower
total_toolchanges is documented as available while change_filament_gcode (and the wipe-tower toolchange flow) is evaluated, but it was sourced only from WipeTowerData::number_of_toolchanges, which stays -1 (clamped to 0) when no wipe tower is generated. Manual filament swaps and toolchanger/IDEX setups without a wipe tower therefore always saw total_toolchanges = 0 in custom G-code and output filenames, despite real tool changes occurring -- breaking the placeholder's documented contract.
Add a tool-ordering fallback: when number_of_toolchanges < 0, count tool changes from the print's tool ordering (the transitions in the per-layer extruder sequence). Wipe-tower prints are untouched -- number_of_toolchanges >= 0 still wins -- so their reported count does not change.
Limitation: sequential (by-object) prints without a wipe tower leave Print::tool_ordering() empty, so total_toolchanges stays 0 there (unchanged from before).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(ElegooLink): pass printer SN to CC2 device panel URL
The CC2 panel subscribes to MQTT topics keyed by the printer serial number.
Without sn= in the URL it uses a wrong hardcoded fallback SN, subscribes to
the wrong topics, and shows Offline permanently even though the printer is
reachable.
- Cache the SN in elegoo_cc2_test() (already fetches it, was discarding it)
- Look up cache in get_print_host_webui(); fall back to a short LAN HTTP
call on first use before the test has run
- Append sn= to the panel URL
- Clear the wrong hardcoded fallback SN/IP from the panel bundle
- Add a small synchronous boot script to the panel that fetches the SN
from the printer before the bundle reads URLSearchParams, as a fallback
for unpatched binaries
* fix(ElegooLink): persist CC2 serial number in AppConfig dev_sn section
Store the printer SN under [dev_sn] keyed by normalized print_host after
a successful connection test or system/info fetch. Reuse it on later
sessions before hitting the network, matching how access_code is keyed by
dev_id for other LAN printers.
* fix(ElegooLink): answer get_sn IPC instantly from dev_sn cache
The CC2 panel always calls get_sn with a 10s timeout. Remove the HTTP
fallback from get_sn() and resolve IPC from dev_sn/memory only so Device
tab load is not blocked after sn= is already in the URL.
* fix(ElegooLink): skip get_sn IPC when URL already has sn
The CC2 device panel calls get_sn with a 10s timeout on every MQTT
connect even when Orca passes sn= in the query string. Use the URL
serial immediately and only fall back to IPC when it is missing.
* refactor(ElegooLink): resolve CC2 SN via PrintHost::get_sn in GUI
Drop the ElegooLink.hpp include from PrinterWebViewHandler; the webview
IPC handler uses the existing PrintHost virtual instead. Keep CC2 serial
lookup helpers file-local in ElegooLink.cpp and share them between
get_sn() and get_print_host_webui().
* chore: drop redundant <memory> include in PrinterWebViewHandler
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>