* Fix junction deviation and jerk settings behavior
Process settings now follow the selected printer's junction deviation
configuration. When machine_max_junction_deviation is enabled,
default_junction_deviation is shown and jerk settings are hidden. When
junction deviation is disabled, jerk settings are restored and
default_junction_deviation is hidden.
Fix a validation issue where junction deviation mismatch warnings could
be reported even when machine_max_junction_deviation was set to 0.
Warnings now apply only when junction deviation is active and point
directly to default_junction_deviation.
Also simplify Motion ability page visibility checks by reusing local
firmware-flavor booleans.
* GUI tweak
- separate Junction Deviation segment
- JD and Jerk stay visible
Switching to a printer with fewer filaments (e.g. H2D -> X2D) threw
std::out_of_range in check_filament_printable. Clear stale per-volume
extruder config on count shrink and bound-check filament indices at the
read sites.
* Fix SeeMeCNC Multicolor change
* Fixes for Support
Support fixes for .7 and 1.0 nozzles
* Fix Retractions
* FIX
* bump version
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
## Summary
Adds end-to-end Creality K-series (K2 / K2 Plus / K2 Pro) host support
to OrcaSlicer in a single bundle, per [@SoftFever's request to
consolidate](https://github.com/OrcaSlicer/OrcaSlicer/pull/13752#issuecomment-4560837450)
the previously stacked PRs. Three logically separable features, all
gated on `host_type=crealityprint`:
1. **LAN auto-discovery** — `Browse...` in the Physical Printer dialog
now finds K-series printers on the local network via a DNS-SD
meta-browser (per-device-unique service names
`_Creality-<MAC>._udp.local.`). Other host types unchanged.
2. **CFS filament sync** — `CrealityPrintAgent` (inheriting
`MoonrakerPrinterAgent`) queries the K-series WebSocket on `:9999` for
`boxsInfo`, maps loaded CFS slots to Orca filament presets, and
populates the Sidebar via the standard `fetch_filament_info` →
`build_ams_payload` path. Matches the shape of `MoonrakerPrinterAgent` /
`QidiPrinterAgent` / `SnapmakerPrinterAgent` per [the earlier review
feedback](https://github.com/OrcaSlicer/OrcaSlicer/pull/13752#discussion_r3278574545).
3. **K-series filament profiles** — system profiles for CR-PLA / CR-PETG
/ CR-ABS / CR-Silk / CR-TPU / CR-Nylon / CR-Wood / Hyper PLA / etc. on
K2 / K2 Plus / K2 Pro nozzle sizes (imported from CrealityPrint v7.1.0+,
normalised to OrcaSlicer profile conventions).
The previous stack base (#13291, *CrealityPrint as host type*, by
@imammedo) is **also bundled into this PR** since it's currently
conflicting with main and not moving. Happy to extract it back out if
@imammedo's PR is preferred to land first for attribution — let me know.
## What this PR is *not*
- **No new UI surfaces.** All three features hook into existing UI
(Browse button, Sidebar sync icon, filament dropdowns).
- **No phone-home / telemetry.** No Hark Tech endpoints, no licence
checks, no opt-in dialogs. Pure upstream feature work.
- **No K-series-specific Device tab.** Embedded WebView falls back to
Fluidd/Mainsail on `:4408`, same shape as the existing Moonraker
integration.
## Screenshots
Captured against a K2 Combo (F021, firmware v1.1.260206) on the v4 test
build:
| | |
|---|---|
| 
| **Discovery dialog** — `Browse...` flow on a `host_type=crealityprint`
printer. Click → ~5–10 s LAN scan → K2 found with model + hostname + IP.
|
| 
| **CFS filament sync** — Sidebar after clicking the sync icon: 4 slots
populate with the real loaded CFS spools (3× Hyper PLA + 1× CR-Silk). |
| 
| **Device tab** — Mainsail loaded into the embedded WebView for
`host_type=crealityprint`, mid-print state visible. |
## What's added
### LAN discovery
- **`deps_src/mdns/`** — vendors
[mjansson/mdns](https://github.com/mjansson/mdns) (public domain) plus
Creality's `cxmdns` C++ wrapper from CrealityPrint v7.1.1 (AGPL-3.0,
compatible with OrcaSlicer's AGPL-3.0). Attribution in
`deps_src/mdns/NOTICE.md`.
- **`Utils/CrealityHostDiscovery.{hpp,cpp}`** — synchronous DNS-SD scan
+ per-host `GET /info` probe. Maps model codes `F008` / `F012` / `F021`
→ K2 Plus / K2 Pro / K2.
- **`GUI/CrealityDiscoveryDialog.{hpp,cpp}`** — modal `wxDialog` showing
Model / Hostname / IP for each discovered host.
- **`src/slic3r/CMakeLists.txt`** — adds `Iphlpapi.lib` and `Ws2_32.lib`
to `libslic3r_gui`'s MSVC link line (needed by `GetAdaptersAddresses` +
Winsock2 calls in vendored `mdns.c`).
### CFS filament sync
- **`Utils/CrealityPrintAgent.{hpp,cpp}`** — inherits
`MoonrakerPrinterAgent`, overrides `fetch_filament_info()` to query the
K-series WS protocol on `:9999`, build `AmsTrayData`, and call inherited
`build_ams_payload()`. No printer-specific code lives outside the agent.
- K2 Plus slot-state parser handles the three documented slot states
(`0` empty / `1` manually entered / `2` RFID-tagged) per [DaviBe92's
reverse-engineering docs](https://github.com/DaviBe92/k2-websocket-re).
### K-series filament profiles
- ~110 profile JSONs under `resources/profiles/Creality/filament/`
covering K2 / K2 Plus / K2 Pro × 0.2 / 0.4 / 0.6 / 0.8 nozzle combos ×
CR-PLA / CR-PETG / CR-ABS / CR-Silk / CR-TPU / CR-Nylon / CR-Wood /
Hyper PLA / Hyper PETG-GF / Hyper PLA-CF / etc.
- Imported from CrealityPrint v7.1.0; normalised to OrcaSlicer profile
conventions (tabs not spaces, no `{if !multicolor_method}` wrappers,
`filament_vendor: ["Creality"]` on Creality Generic profiles).
## Tester confirmations on the v4 test build
| Printer | Firmware | Result | Reporter |
|---|---|---|---|
| K2 Pro | v1.1.5.5 / CFS v1.4.2 | ✅ LAN discovery on #13752 test build
|
[@Requiem-MH](https://github.com/OrcaSlicer/OrcaSlicer/pull/13752#issuecomment-4495235225)
|
| K2 Pro | v1.1.5.5 / CFS v1.4.2 | ✅ CFS sync across 1-CFS, 2-CFS,
partial, full configurations |
[@Requiem-MH](https://github.com/OrcaSlicer/OrcaSlicer/pull/13744#issuecomment-4495230061)
|
| K2 Plus | v1.1.5.2 / CFS v1.2.2 | ✅ Slot-state fix resolves the
partial-sync regression |
[@DaviBe92](https://github.com/OrcaSlicer/OrcaSlicer/pull/13744#issuecomment-4499425852)
|
| K2 Plus | v1.1.5.5 / CFS v1.4.2 | ✅ All slots syncing correctly after
fix |
[@swilsonnc](https://github.com/OrcaSlicer/OrcaSlicer/pull/13744#issuecomment-4503273127)
|
| K2 Plus | (Reddit u/TrainAss) | ✅ Both PLA + PETG slots populated
correctly |
[@TrainAss](https://github.com/OrcaSlicer/OrcaSlicer/pull/13744#issuecomment-4503401664)
|
| K1C | (latest stock) | ✅ `boxsInfo` payload format compatible (4 slots
of generic PETG) |
[@JoveYu](https://github.com/OrcaSlicer/OrcaSlicer/pull/13744#issuecomment-4519036448)
|
## Known follow-ups (out of scope)
- **Snapmaker U1 regression**
([@TrainAss](https://github.com/OrcaSlicer/OrcaSlicer/pull/13744#issuecomment-4529350262)):
the v3 build also happened to sync filament from his U1; v4 regressed
this. The refactor only touches `htCrealityPrint`-gated code so this is
likely incidental — needs his config + logs to diagnose. Will follow up
in a separate issue once this lands.
- **Native Device tab for K-series**: deferred. Current Mainsail WebView
shim covers the common case.
- **#13581 (@hamham999) profile overlap**: confirmed minimal code
conflict (zero), profile-file overlap of ~204 files. Whichever PR lands
second rebases off the other.
## Test plan
- [x] Linux build clean on commit `<UPDATED AFTER BUILD>` (LXC 104, GCC
12, cmake)
- [x] MSVC link clean (manual VS 2026 / MSVC 14.51 build)
- [x] End-to-end on real hardware: K2 Combo, K2 Pro, K2 Plus, K1C
- [x] `host_type ≠ htCrealityPrint` paths unchanged — Bonjour fires for
OctoPrint, Flashforge picker fires for Flashforge, Moonraker / Qidi /
Snapmaker agents unchanged
- [x] Profile-validation CI green (was a separate Elegoo test-fixture
failure on main, not introduced by this PR)
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Co-authored-by: Igor Mammedov <niallain@gmail.com>
Co-authored-by: grant0013 <grant@harktech.co.uk>
Co-authored-by: SoftFever <softfeverever@gmail.com>
Co-authored-by: hamham999 <hamham999@users.noreply.github.com>
Co-authored-by: Alys Andreollo <3528187+alysandreollo@users.noreply.github.com>
The SPARKX i7 machine presets shipped (via #13947) with a contributor's
LAN IP (http://10.10.1.39) hardcoded in print_host. Remove it to match
the K2/K2 Pro/K2 Plus presets, which carry no print_host key — LAN
discovery + the crealityprint agent populate the host at add-printer time.
This updates the SPARKX i7 from a "regular" klipper printer to use the
new CrealityPrinter agent, that talks to it's "supervisor" webserver
instead, and can use the native Creality features: CFS, filament
querying, filament remapping, etc...
* init
* update translations
* clarify warning for rebuild
* auto fill issue field on github with gathered system information
* add detection for linux package type
* fix build errors
* update
* update
* improve reading windows version
* add multi file support for zip and use timestamp on exported zip name
* fix errors
* fix errorz
* fix URL encoding
* fix CPU info
* use home or desktop as default location
* fix distro name on flatpak
* improve detecting local build on linux
* check package type on all platforms
* optimize margins
* improve monitor detection
* add support for adding text file to zip and add system info on export
* exclude user related info from config
* improve exporting profile info
* fix linux monitor info
* update
* update detecting monitor info
* Update TroubleshootDialog.cpp
* Update TroubleshootDialog.cpp
* Update TroubleshootDialog.cpp
* revert scaling and resolution detection for linux
* include project file to zip and notify after saving zip successfully saved
* improve monitor info on mac
* update
* improve packing selection menu
* update
* Update TroubleshootDialog.cpp
* Update TroubleshootDialog.cpp
* Update TroubleshootDialog.cpp
* Update TroubleshootDialog.cpp
* update
* update
* make hash clickable
* fix compatible process counting
* export profiles overview instead copying to clipboard
* auto restart app after cleaning system folder
---------
Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
ws2_32 (Winsock2) and wsock32 (Winsock) are not supposed to be used in the same application.
boost::asio requires ws2_32, but wxWidgets uses wsock32.
Which gets used depends on the order they appear in the link command, as they both define the same symbols, but with different behaviour.
ws2_32 is backwards-compatible with wsock32, so wxWidgets won't be negatively affected by linking with the newer version, and prior to c228ab2da1, that's what happened.
That commit reordered how some libraries were passed to the linker, so swapped the order of these two, breaking mDNS and causing https://github.com/OrcaSlicer/OrcaSlicer/issues/13969
The CFS-aware filament sync resolves its agent via switch_printer_agent(),
which reads the preset's `printer_agent` field and falls back to "orca" when
unset -- so the K-series presets need printer_agent="crealityprint" (the id
registered by CrealityPrintAgent) in addition to host_type="crealityprint"
(classic PrintHost/LAN-discovery). Without printer_agent the Device-tab sync
defaults to the Orca agent and CFS sync doesn't engage. Set both on the
F008/F012/F021 models that supports_multi_color_print() covers (not K2 SE).
Both keys are in s_PhysicalPrinter_opts, so a new Physical Printer inherits
them from the preset.
* Add test for Arachne duplicate wall segment detection
Add test cases that reproduce an issue where Arachne generates
duplicate/coinciding extrusion segments at certain min_bead_width settings.
Test configuration:
- Profile: 0.28mm Extra Draft @BBL X1C (0.4mm nozzle, 0.28mm layer)
- outer_wall_line_width: 0.42mm, inner_wall_line_width: 0.45mm
- wall_loops: 2, precise_outer_wall: enabled
- Test polygon: outer rectangle (0,0)-(20,20) with inner cutout (0.5,0.5)-(19.5,19.5)
This creates a 0.5mm wide frame around the perimeter.
Results:
- 50% min_bead_width (0.20mm): FAILS - detects 4 duplicate segments (all 4 sides)
- 60% min_bead_width (0.24mm): PASSES - no duplicates
At 50%, Arachne generates two separate closed loops that share all 4 edges
of the inner square. At 60%, Arachne generates a single closed loop.
SVG output is exported to /tmp/opencode/ for visual debugging.
* Fix Arachne duplicate extrusion caused by bead count mismatch
WideningBeadingStrategy::compute() used optimal_width (inner wall width)
to determine if a thin wall should produce a single bead. However,
getOptimalBeadCount() uses optimal_width_outer (outer wall width) via
RedistributeBeadingStrategy to decide the bead count.
This inconsistency caused situations where getOptimalBeadCount() returned
2 beads, but compute() produced only 1 bead at full thickness. The single
bead was then generated for both inner and outer contours, resulting in
duplicate extrusion paths.
Fix: Use getTransitionThickness(1) instead of optimal_width. This method
returns the exact threshold for the 1-to-2 bead transition, ensuring
consistency between bead count calculation and bead generation.
Reproduces with: 50% min_bead_width, 0.42mm outer wall, 0.45mm inner wall,
0.5mm polygon inset creating ~0.38mm wall thickness.
Fixes#13917
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Linux compositing - retain old code and make switchable via #if statement
* Make option settable via env variable/.desktop file
* undo accidental empty row delete
Made small performance, safety, and readability improvements.
Now the logic is only called to move the build plate lower than the tallest object if the print_sequence is, "by object".
More precise checks to not move the plate beyond the maximum build volume.
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>
* Bump Elegoo profile version to refresh installed bundle
Bumps the Elegoo vendor profile version so installed profile bundles are refreshed from bundled resources after the recent Elegoo profile sync.\n\nThe previous version stayed at 02.04.00.00 after the profile layout changed, so existing installs could keep loading stale system/Elegoo files. That stale bundle can abort during profile loading and cause user presets inheriting from Elegoo machines, such as OrangeStorm Giga and Neptune 3 Max, to report missing parents.\n\nValidation:\n- jq parsed resources/profiles/Elegoo.json\n- verified all Elegoo.json sub_path entries exist\n- git diff --check
* Fix Elegoo process profile manifest
* 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
* Fix: Disable redundant toolchange retraction for Elegoo Centauri Carbon
Sets `retract_length_toolchange` to 0 in the Elegoo Centauri Carbon (ECC) machine profile.
This resolves an issue where a massive filament blob would form on the prime tower immediately after resuming a manual filament change (M600). The blob was caused by a conflict between OrcaSlicer's default toolchange logic and Elegoo's hardcoded firmware behavior:
- Elegoo's firmware (specifically the `cmd_PAUSE` and `cmd_RESUME` sequences) completely takes over pressure management during an M600. It performs its own initial 2mm retraction, a 120mm purge, and a silicone brush wipe, returning the print head to the prime tower perfectly primed.
- Previously, Slicer was unaware of the firmware's priming and would issue a redundant 2mm un-retract (`G1 E2`) upon resume. Forcing 2mm of filament out of an already-full nozzle created the blob.
By disabling the toolchange retraction (`0`), Slicer correctly hands off filament pressure management during an M600 entirely to the Elegoo firmware, preventing double-retractions and eliminating the blob.
* fix errors after merging main
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* 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>
Wire the existing disassociate_url path into the Associate-tab
checkbox so users can revert prusaslicer/bambustudio/cura
registrations they previously enabled.
The 8dfd480c52 merge stripped <<<<<<<, =======, >>>>>>> markers
from three files. Two of the resolutions ended up syntactically
broken:
* PrintHostDialogs.hpp: both sides of the conflict added a new class
declaration in the same spot. The common closing }; lived after
the >>>>>>> marker, so concatenating without re-adding a closing
brace between the two classes left CrealityPrintHostSendDialog
unclosed. Compiler caught it via "storage class specified for
EVT_PRINTHOST_PROGRESS" at the wxDECLARE_EVENT lines (the events
were being parsed inside the still-open class body).
* PhysicalPrinterDialog.cpp: upstream's BonjourDialog fallback was
inside an `else { }` block whose closing brace remained after I
replaced the else with explicit early-return branches. Result was
one extra `}` after the Bonjour block.
No public commits affected -- the broken merge commit is still
local-only on LXC 104. Catching this before the force-push.
Consolidates #13744 (CFS filament sync) into this PR per maintainer
request and resyncs with main. Conflicts resolved:
* src/slic3r/GUI/Plater.cpp -- parallel else-if added by both sides
(htCrealityPrint + flashforge_local_api branches); kept both.
* src/slic3r/GUI/PhysicalPrinterDialog.cpp -- both sides added a
host-specific Browse dialog (Creality DNS-SD + Flashforge); kept
both as early-return branches, fall through to BonjourDialog.
* src/slic3r/GUI/PrintHostDialogs.hpp -- parallel class declarations
(CrealityPrintHostSendDialog + FlashforgePrintHostSendDialog);
kept both.
When the OrcaSlicer window is on an inactive Hyprland (or any Wayland
compositor that keeps surfaces mapped while hidden) workspace, GTK
keeps delivering synthetic leave-notify events to the printer-preset
row. The wxEVT_LEAVE_WINDOW handler at Plater.cpp:1855 calls
wxFindWindowAtPoint(), which walks the entire wxWidgets window tree
calling IsShown() / gtk_widget_get_child_visible() on each widget,
then Hide()s the edit button and triggers a Layout() of the parent
panel. The Hide()+Layout() re-fires more leave events, creating a
feedback loop that pegs a CPU core at 100% indefinitely.
GDB attached to a frozen process confirmed the main thread stuck in:
wxFindWindowAtPoint (recursing through widget tree)
-> wxWindow::IsShown
-> gtk_widget_get_child_visible
...
Sidebar::Sidebar(Plater*)::$_14 <- the leave handler lambda
wxEvtHandler::SafelyProcessEvent
wxGTKImpl::WindowLeaveCallback
gtk_main_do_event
...
IsShownOnScreen() can't be used as a guard here because GTK on Wayland
reports widgets as visible even when the toplevel surface is on an
inactive workspace (see existing comment at Plater.cpp:9304).
Fix: state-based short-circuit. If btn_edit_printer is already hidden,
the handler has no transition to perform - skip the expensive tree walk
and the Hide()+Layout() that would re-trigger the feedback loop. After
the first leave event, every subsequent leave event is O(1).
Refs:
- #12387 (open issue with matching setup: Arch + Hyprland + RTX 3060 + Bambu A1)
- #11196 (introduced the hover-edit-button feature in Nov 2025)
* Update/add re:3D profiles.
* Fix encoding issue with UTF-8 BOM
* Change spaces to tabs.
* Fix alignment-based space indentation issues.
* Test: rename_from property
* Test 2: rename_from property
* Test 3: use 'renamed' instead of 'rename'
* Add renamed property for each conflicting profile.
* Revert to optimized assets improved on [#13149](https://github.com/OrcaSlicer/OrcaSlicer/pull/13149)
# Description
Resolves https://github.com/OrcaSlicer/OrcaSlicer/issues/13830
The issue was that when OrcaSlicer was open with a 3mf file, the project
is first loaded, then when the sync finishes, it overrides the project
settings. This occurs when are working on a 3mf file and you click the
sync presets button as well.
The fix was to snapshot the current state of the settings, and then
restore whatever was marked as dirty to it's original state, preserving
the 3mf project settings.
[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
* Add Flashforge AD5X local send dialog, IFS mapping, and LAN discovery
* Refine Flashforge AD5X IFS dialog behavior
* Refine Flashforge IFS slot selection dialog
* Fix Flashforge printer selection and print mapping
* Use 3MF for Flashforge local uploads
* Generalize Flashforge local API handling
* Handle Flashforge local API IFS support more robustly
* Use selected plate filament info for Flashforge IFS mapping
* Fix Flashforge current-plate mapping and widget sizing
* Improve Flashforge IFS contrast and color matching
* Fix Flashforge legacy plate export and upload naming
Resolve PLATE_CURRENT_IDX before the legacy send-to-printhost path calls send_gcode so single-plate Flashforge 3MF exports target the selected plate instead of leaking the sentinel into export_3mf.
Sanitize Flashforge upload names in one shared utility reused by both the dialog and the backend client. This keeps the UI-visible filename and the actual uploaded filename consistent and replaces printer-problematic characters such as '=' without scattering Flashforge-specific logic through the generic Plater flow.
* Keep Flashforge upload filename sanitization in the backend only
Drop the PrintHostSendDialog API changes and keep filename sanitization inside the Flashforge backend paths that actually talk to the printer. This keeps the generic send dialog flow untouched while still normalizing problematic upload names for both serial and local API uploads.
* Only use the Flashforge IFS dialog for local API uploads
* Use reported Flashforge IFS support without model fallback
* Remove unused Flashforge slot uniqueness tracking
* Include <array> for Flashforge discovery message
* Sync Elegoo profiles from ElegooSlicer
Update vendor Elegoo.json, filament/machine/process trees, and OrcaFilamentLibrary
Elegoo entries. Align machine default material names with existing filament preset names.
* feat: expose filament_name for G-code export filename format
Derive from filament_settings_id for the first active extruder and strip the suffix after @, matching ElegooSlicer so filename_format can use {filament_name}.
* chore: reorder Elegoo entries in OrcaFilamentLibrary
Group Elegoo @base profiles and bump library version to 02.03.02.62.
* sync OrcaFilamentLibrary.json with Elegoo filament profiles
* fix: clean up Elegoo process renamed_from for profile validation
Add single renamed_from only where preset names changed from legacy Orca
names; remove duplicate Rapid @System library entries that conflicted with
ECC2 vendor presets.
* fix(profiles): add missing Elegoo renamed_from for profile validation
CI custom-preset tests still inherit legacy Orca preset names that no
longer exist after the Elegoo bundle update. Add renamed_from on process,
Neptune 4 machines, OrcaFilamentLibrary filaments, and Giga profiles so
inherits resolve again, without changing print parameters.
Update Snapmaker U1 (0.4 nozzle).json
Updated Snapmaker U1 0.4 nozzle "change_filament_gcode" and "machine_end_gcode" to fix the issue of collisions when using "Print by Object"
Fix compile error in Debug mode. Adds getters for Point3 types in ExtrusionEntity
ZAA changed ExtrusionPath::polyline from Polyline to Polyline3, preserving the existing interfaces by converting first_point and last_point to return a Point copy constructed from the underlying Point3 type.
ExtrusionLoop::validate function was not updated and is broken in debug configurations as it's currently comparing Point to Point3
This change promotes ExtrusionPath::first_point3/last_point3 to the ExtrusionEntity base class as a pure virtual function, implements them on derived classes, and fixes ExtrusionLoop::validate
Fix nozzle diameter guards for printers that don't report nozzle info (#13236)
PR #12814 changed DevNozzle::m_diameter default from 0.4f to 0.0f to
mean "unknown" when firmware doesn't push nozzle info, and guarded two
call sites in SelectMachine.cpp. PR #13330 introduced
DevExtderSystem::NozzleDiameterMatchesOrUnknown() and adopted it in
get_printer_preset / CalibUtils / CalibrationWizardPresetPage. A few
reachable sites were still left out and now report "mismatch" / fail
silently for every non-BBL printer (Klipper/Moonraker, RRF, Marlin,
etc.) that doesn't push BBL nozzle data.
The most visible symptom: the "Sync filament colors from AMS" button on
Moonraker printers with AMS/AFC silently does nothing, because
get_printer_preset() couldn't find a matching system preset (fixed in
#13330, but the lookup-string sites below kept the bug visible
elsewhere).
Apply NozzleDiameterMatchesOrUnknown at the two remaining comparison
sites:
src/slic3r/GUI/Plater.cpp
- file-load printer-mismatch dialog — don't prompt on every load
- on_select_preset sync_extruder_list gate — skip 0.0 extruders
For the three filament-lookup string-builder sites, fall back to the
currently-selected printer preset's nozzle diameter so the dropdown
isn't empty when firmware hasn't reported a diameter:
src/slic3r/GUI/AMSMaterialsSetting.cpp (Popup + on_select_filament)
src/slic3r/GUI/CaliHistoryDialog.cpp (get_all_filaments)
Also remove the dead SyncAmsInfoDialog::is_same_nozzle_diameters method
surfaced while auditing the affected sites — it was introduced
2024-12-30 in commit ad79ed6d93 ("ENH:add SyncAmsInfoDialog",
cherry-picked from Bambu's internal branch) but a caller was never
wired up on the OrcaSlicer side. Dead since introduction.
Fixes#13236
Refs #12814#13330
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Fix data race in extra bridge layer generation causing spurious bridges on top surfaces
* Guard second bridge layer against top most surfaces
* CoPilot review comments & lighting infill threading fix.
* Fix overhang preview not using fallbacks when angle is 0
The overhang visualization in Preview ("show overhangs based on support settings")
used the raw `support_threshold_angle` value from the configuration.
When `support_threshold_angle` was set to 0, Orca internally falls back to:
- 30° for tree supports
- an angle derived from `support_threshold_overlap` for normal supports
However, the preview logic ignored these fallbacks and used the raw value (0°),
leading to incorrect overhang highlighting that did not match the actual
support generation behavior.
This patch computes the effective overhang threshold used for preview:
• If `support_threshold_angle > 0`, use it directly
• If `support_threshold_angle == 0` and tree supports are used, fall back to 30°
• If `support_threshold_angle == 0` and normal supports are used, derive the
equivalent angle from `support_threshold_overlap`, `layer_height`, and the
external perimeter width.
The function now returns `normal_z` directly so the preview uses the same
effective slope threshold as the support generator.
As a result, the overhang highlight in Preview now correctly matches the
supports that will actually be generated.
* Apply Copilot suggestions
Address SoftFever review item 1 on #13752: CFS sync now lives in
CrealityPrintAgent::fetch_filament_info, matching the MoonrakerPrinterAgent
/ QidiPrinterAgent / SnapmakerPrinterAgent shape. The standard
Sidebar::sync_ams_list
-> DeviceManager::get_selected_machine()
-> Sidebar::load_ams_list(obj)
-> Sidebar::build_filament_ams_list(obj)
-> agent->fetch_filament_info(dev_id)
-> build_ams_payload(box_count, max_lane_index, trays)
path now applies to CrealityPrint hosts identically to the other
Klipper-flavoured agents. CrealityPrintAgent inherits
MoonrakerPrinterAgent, so the inherited connect_printer() ->
announce_printhost_device() -> SSDP callback already triggers
MachineObject creation in DeviceManager's localMachineList for
K-series LAN hosts; the Plater-side special case was simply bypassing
get_selected_machine() before it could fire.
Removed:
* The if (host_type == htCrealityPrint) block in
Sidebar::sync_ams_list (and the CrealityPrintAgent.hpp include it
required).
* The static CrealityPrintAgent::sync_filaments_into_ams_list()
helper that wrote directly to PresetBundle::filament_ams_list,
plus the CFSAmsListResult status struct that surfaced dialog text
back to the Sidebar.
CrealityPrintAgent::fetch_filament_info itself is unchanged - it was
already calling the inherited build_ams_payload() correctly.
Net diff: 227 deletions / 4 insertions across 3 files. No behaviour
change. Discovery + WS protocol parsing unchanged.
PR #13388 added resources/printers/N6.json for X2D support but did not
bump resources/printers/version.txt. PresetUpdater only copies files
from the install's resources/printers/ to the user's data_dir/printers/
when the resources version is newer than the user's stored version, so
every existing install stays at 02.00.00.29 and never receives N6.json.
At runtime, json_diff::load_compatible_settings("N6", "") reads from
data_dir/printers/N6.json; the silent file-missing failure leaves
is_support_bed_leveling, is_support_pa_calibration, and
SupportCalibrationNozzleOffset at their defaults, hiding the Bed
Leveling and Nozzle Offset Calibration checkboxes in the Send Print
Job dialog for the X2D.
Bumping the patch version triggers the existing propagation logic on
next startup.
Fixes#13780Fixes#13794
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Ignore SIGPIPE at startup to prevent crash on dropped printer connection
Writing to a closed printer network socket raised SIGPIPE, whose default
action terminated the whole process (exit 141, no crash report). Set
SIGPIPE to SIG_IGN once at main() entry (POSIX only) so such writes return
EPIPE to the existing networking error handling instead of killing the app.
Fixes#13787
- Added missing translations for various UI elements and messages.
- Improved existing translations for clarity and accuracy.
- Ensured consistency in terminology across the localization file.
The fdm_filament_petg base template added in 7f46c652 (cherry-picked
from hamham999's PR 13581) had two bugs:
- filament_type: ["PLA"] (should be PETG)
- inherits: null (should chain to fdm_filament_common)
so OrcaSlicer still rejected our CR-PETG profiles even after the
base was installed.
The existing fdm_filament_pet base already declares filament_type:
["PETG"] and inherits fdm_filament_common, so it correctly serves as
the PETG base. Repoint all 10 K2-family CR-PETG profiles at it and
remove the buggy fdm_filament_petg.json + its Creality.json entry.
This effectively reverts the resource addition from 7f46c652 while
keeping the CR-PETG filament profile additions from 5612e120 (now
with a working inherits chain).
Verified locally: OrcaSlicer parses all 10 profiles without error and
the K2 family populates the Add Printer dialog.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The 10 CR-PETG profiles added in 5612e120 (also from hamham999s PR
13581) inherit from fdm_filament_petg, but that base template did
not exist in the Creality profile set - only fdm_filament_pet. Result:
OrcaSlicer logged
can not find inherits fdm_filament_petg for CR-PETG @Creality K2...
and aborted the rest of the Creality filament load, leaving the
filament dropdown empty for K2 users.
Adds the base template (originally added in hamham999s PR 13581) and
registers it in Creality.json filament_list after fdm_filament_pet.
Reported-by: local testing on Hark Tech 2026-05-21 test build.
Co-Authored-By: hamham999 <hamham999@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two follow-ups from #13744 review:
1. K2 firmware payloads reference "CR-PETG" by name (per DaviBe92's
reverse-engineering work in k2-websocket-re, and a real Creality spool
seen by @swilsonnc), but the profile was missing from the Creality
filament set. Adds 10 K2-family variants:
- K2: 0.4, 0.6, 0.8 nozzles
- K2 Plus: 0.2, 0.4, 0.6, 0.8 nozzles
- K2 Pro: 0.4, 0.6, 0.8 nozzles
Profile values come from CrealityPrint v7.1.0 via @hamham999's
parallel work in OrcaSlicer/OrcaSlicer#13581. Files re-indented with
tabs and BOM stripped to match repo convention.
2. Creality HF Generic PLA and Creality HF Generic Speed PLA were missing
filament_vendor: ["Creality"] so they appeared under "General" rather
than "Creality" in the filament selector.
Reported-by: swilsonnc, DaviBe92 (CR-PETG missing)
Co-Authored-By: hamham999 <hamham999@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
After pulling the latest presets from the cloud, changed values such as Layer height kept showing the old value until the user switched tabs. Refresh the active settings tab on sync so updates appear immediately.
The Emboss text-cut workflow can crash with SIGBUS at a stack-guard page
on macOS (and equivalent on Linux) when CGAL's
Polygon_mesh_processing::corefine falls back from filtered interval
arithmetic (Epick) to exact rational arithmetic (Epeck / mpq_class).
On near-degenerate inputs -- coplanar triangles in the projection
footprint, very thin font stems, sharp edges or seams under the text --
CGAL's Filtered_predicate_with_state cascade ends up inside
Triangulation_2<Projection_traits_3<Epeck>>::march_locate_2D, whose
recursive walk plus mpq_class arithmetic frames overflows the worker's
4MB default stack. The fault address sits exactly inside the next
thread's guard page, which is the textbook macOS signature.
Crash trace (BambuStudio v02.07.00.55, macOS 26.4.1 arm64, embossing
text into a model):
__gmpn_mul_1
__gmpz_mul / __gmpq_mul
CGAL::determinant<mpq_class>
Projected_orientation_with_normal_3
Filtered_predicate_with_state::operator()
Triangulation_2<...>::orientation
Triangulation_2<...>::march_locate_2D
Surface_intersection_visitor::triangulate_intersected_faces
Polygon_mesh_processing::corefine
Slic3r::cut_surface
Emboss::cut_surface_to_its
Emboss::GenerateTextJob::get_text_mesh
PlaterWorker::PlaterJob::process
The thread's stack region in the report was exactly 4128K -- the
default 4MB plus a small TLS overhead -- and the faulting address hit
the adjacent guard page. We have one observed reproducer; the 16 MB
value is chosen as 4x defensive headroom over that, not as a measured
upper bound. Future heavier emboss inputs may need more.
Cumulative cost on a 64-bit target. Slic3r::create_thread has 22
callsites across the codebase. Realistic peak concurrent live count is
on the order of 10-15 workers (Plater UI worker, slicing process, FDM-
support gizmo, STEP loader, network sync helpers, per-task sender
threads in TaskManager up to MaxSendingAtSameTime, per-machine info
threads in device-list dialogs, long-lived sync helpers in GUI_App).
At 16 MB reserve x ~15 = ~240 MB of address-space commitment in the
worst case, which is bounded on any 64-bit target.
Resident memory remains proportional to actual stack depth on all three
platforms: macOS / Linux mmap the thread stack and defer-commit pages on
touch, and Boost.Thread on Win32 passes STACK_SIZE_PARAM_IS_A_RESERVATION
to _beginthreadex (verified at libs/thread/src/win32/thread.cpp), so on
Windows the bumped value is the reserve, not the initial commit.
The 32-bit branch of the previous (sizeof(void*) == 4) ternary is
removed: BambuStudio doesn't ship a 32-bit build today, and the literal
makes the value easier to read at the callsite.
(cherry picked from commit e150b502b3d2afc98b83dcc9e5720e998f9eb79a)
Co-authored-by: Abdel Gomez-Perez <nabdel07@icloud.com>
* feat(viewer): Display travel distance and move count in G-code summary
This commit introduces a new feature that enhances the G-code viewer by displaying the total travel distance and the total number of travel moves in the 'Line Type' summary.
This provides users with more detailed statistics about their prints, helping them to better understand the printer's behavior and identify opportunities to optimize travel moves for faster print times.
This commit also fixes a critical bug in the G-code processor where the travel distance was being calculated incorrectly. The distance variable was not being updated for non-extruding travel moves, leading to inaccurate statistics. The calculation has been corrected to ensure it is performed for all relevant move types, resulting in accurate travel distance reporting.
* Subfix segments
kilo mega giga tera peta exa
* Add missing values
* Grams to Kilos and tons
* add distance
* Fix tool view
* Record and display seam distances
Track seam-related distances in print statistics and show them in the GCode viewer. Added total_seam_gap_distance and total_seam_scarf_distance to PrintEstimatedStatistics (with initialization). In GCode::extrude_loop the code now computes seam gap and scarf distances and accumulates them for external perimeters. GCodeViewer uses the summed seam distance when the Seams option is selected in the legend.
* Fix travel / wipe distances
* Update GCode.cpp
* Filament changes estimated time
---------
Co-authored-by: Steve Scargall <37674041+sscargal@users.noreply.github.com>
Handle user_ticket_login
Legacy Bambu network plugins completed embedded login with
user_login, which the WebView dialog already handled.
Newer Bambu login flows can complete with user_ticket_login and
return only a short-lived ticket. The external browser path already
worked because the local HTTP callback server exchanges that ticket
for tokens, fetches the user profile, and passes the resulting session
payload to change_user.
Mirror that ticket exchange path for embedded WebView login so the
dialog can handle user_ticket_login instead of silently ignoring it
after verification-code submission.
2026-05-21 13:44:17 +08:00
Aleksandr Dobkinimg src=404 onerror=alert(document.domain)
fix: OK/Cancel buttons clipped in Flushing Volume dialog (#13511)
The WipingDialog renders its UI inside a wxWebView. When the dialog
was clamped to screen size (many filaments, small displays, high DPI),
the HTML content exceeded the WebView bounds and the OK/Cancel buttons
fell below the visible area.
HTML fix:
- Convert .container to flexbox column with overflow-y: auto
- Pin .button-container with flex-shrink: 0 so it stays visible
- Allow .scroll-container to flex-grow for the table area
C++ fix:
- Replace heuristic extra_size with accurate fixed_overhead estimate
- Use correct cell height (25 DIP) matching HTML table row height
- Add screen margin for window decorations
- Enforce minimum dialog size when clamped
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Add Optimized Gyroid infill (auto-tuned wavelength + amplitude)
New infill geometry derived from FillGyroid. Two parameters are
auto-computed per-region from density, line spacing, and layer height
(no user inputs):
omega = sqrt(density_adj) / sqrt(1 + layer_height/spacing)
clamped to [0.5, 2.0]
-- Euler-Bernoulli buckling: critical load ~ 1/L^2,
so shorter wavelength under higher load (denser infill)
raises buckling resistance.
amplitude = 0.55 / omega^2, clamped to [0.20, 0.65]
-- Curved-beam bending stress: peak stress ~ A * omega^2,
so amplitude is reduced as omega rises to keep peak
fiber stress bounded while preserving stiffness.
Files:
- src/libslic3r/Fill/FillOptimizedGyroid.{hpp,cpp} (new)
- src/libslic3r/Fill/FillBase.cpp (factory case)
- src/libslic3r/Fill/Fill.cpp (switch case)
- src/libslic3r/Layer.cpp (switch case)
- src/libslic3r/PrintConfig.{hpp,cpp} (enum + label)
- src/libslic3r/CMakeLists.txt (build sources)
User-facing: appears as "Optimized Gyroid" in the Fill Pattern dropdown.
Density still chosen by user; omega/amplitude are internal.
* Fix build: layer_height is in FillParams, not Fill base
* Add ipOptimizedGyroid to multiline infill list in ConfigManipulation
* Refactor: replace ipOptimizedGyroid enum with gyroid_optimized boolean
Per @RF47's review feedback, fold the optimized wave math into FillGyroid
itself behind a per-region boolean instead of a separate infill enum.
What changes:
- New ConfigOptionBool "gyroid_optimized" on PrintRegionConfig (default
false). When unchecked, gyroid behavior is byte-identical to before.
- Optimized wave math (compute_omega_factor, compute_amplitude_factor,
f_opt, make_*_opt, make_optimized_gyroid_waves) lives inside
FillGyroid.cpp. _fill_surface_single branches on params.gyroid_optimized.
- FillParams gains a bool gyroid_optimized field, populated in Fill.cpp
from region_config alongside fill_multiline.
- UI checkbox added under Strength > Infill in Tab.cpp, label
"Optimize gyroid wave (experimental)". Toggle is hidden by
ConfigManipulation when sparse_infill_pattern != ipGyroid.
- "gyroid_optimized" added to s_Preset_print_options for preset I/O.
What goes away:
- ipOptimizedGyroid enum value, factory case, switch cases, dropdown
label, string key.
- FillOptimizedGyroid.cpp / FillOptimizedGyroid.hpp (math moved into
FillGyroid.cpp).
- Net diff drops by ~250 lines.
Existing profiles using gyroid are unaffected.
* Wire gyroid_optimized through SurfaceFillParams to FillParams
Linux build failed because line 921 in Fill.cpp populates a
SurfaceFillParams (the dedup struct), not FillParams directly.
Add the field there, in operator< / operator==, and copy it to
FillParams at both conversion sites.
* Use toggle_line for gyroid_optimized: hide row when pattern != gyroid
* Account for multiline wall thickness in omega correction (per @RF47)
When fill_multiline = N, each gyroid wall is N lines thick, so the
geometric scale fed into the buckling correction term should be
spacing * N rather than spacing. Increases omega (tighter wavelength)
when multiline is enabled, consistent with the thicker wall being
more buckling-resistant.
* Optimized gyroid via marching squares on the implicit scalar field
Per @RF47 review: replace the analytical f_opt / make_one_period_opt
wave generator (which had visible kinks at vertical-horizontal
transitions) with a marching-squares iso-extraction on the gyroid
scalar field, modeled on FillTpmsFK.cpp.
- New marchsq::GyroidField in FillGyroid.cpp evaluates
F(x,y,z) = sin(fx*x)cos(fy*y) + sin(fy*y)cos(fz*z) + sin(fz*z)cos(fx*x)
where fx = omega * baseline (anisotropic in x), fy = fz = baseline.
- get_gyroid_polylines() runs marching squares at iso=0 and converts
rings to polylines.
- _fill_surface_single() optimized branch now builds GyroidField,
runs marching squares, and skips the bb.min translate (field
output is already in absolute coords).
- Dropped: f_opt, make_one_period_opt, make_wave_opt,
make_optimized_gyroid_waves, compute_amplitude_factor. Amplitude
has no clean analog in iso-zero extraction.
- Standard (non-optimized) gyroid path unchanged.
* Mass calibration: compensate period by cbrt(omega) for x-anisotropic field
Per @RF47: optimized vs standard gyroid had different masses at the
same sparse_infill_density setting. Cause: scaling fx by omega while
leaving fy=fz at the baseline raised the surface-area-to-volume ratio
by approximately omega^(1/3) (the geometric mean of the three
frequencies).
Fix: multiply the base period by cbrt(omega) so the geometric mean of
(fx, fy, fz) returns to the standard baseline. Net effect:
fx = omega^(2/3) * baseline_orig
fy = fz = omega^(-1/3) * baseline_orig
which preserves total mass at the same density setting while
preserving the load-direction anisotropy this PR introduces.
* Switch optimized gyroid anisotropy from X to Z (per @RF47)
Z is the typical compression-load axis for FFF parts and is not at
delamination risk under compression — so the dominant failure mode
is column buckling of the vertical strands themselves. Tightening
fz directly shortens the effective vertical strand length, which
improves Z-axis buckling resistance.
Mass calibration via cbrt(omega) period compensation still applies
(scaling exactly one of three frequencies by omega; the geometric-
mean preservation argument is symmetric across axes).
* Update src/slic3r/GUI/Tab.cpp
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
* Address review feedback (Copilot + @RF47)
- Fill.cpp: gate params.gyroid_optimized on (params.pattern == ipGyroid)
so non-gyroid surfaces don't differ in SurfaceFillParams by an
irrelevant flag (would unnecessarily split fill batching).
[Copilot suggestion, RF47 confirmed correct]
- PrintConfig.cpp: drop "amplitude" from the tooltip; only wavelength
is parameterized (the marching-squares iso=0 extraction is invariant
to a uniform field scale, so amplitude has no effect).
- FillBase.hpp: shorten gyroid_optimized comment to match the actual
carried state (no amplitude term).
- FillGyroid.cpp: shorten the marchsq namespace comment block; the
ODR concern was overstated (FillTpmsFK uses the same pattern fine).
* Drop redundant marchsq bb expansion (Copilot)
bb is already offset by 10 * scale_(spacing) above for edge-artifact
margin; the second offset on bb_field doubled the raster area for no
geometric benefit and hurt CPU time on large parts.
* Update src/slic3r/GUI/Tab.cpp
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
* Fix density mismatch + rename to Z-buckling bias optimization
Issue (per @ianalexis): at the same sparse_infill_density setting,
the optimized branch produced denser fill than standard. Verified via
Python sim (sim_gyroid_compare.py) using marching squares on the
implicit field across multiple z slices.
Root cause: the omega formula was inverted from the buckling-physics
intent. The naive sqrt(density_adj) factor produced omega < 1 at
typical print densities (10-30%), which LENGTHENED the Z wavelength
instead of shortening it -- net loss in both mass and strength.
Fix:
- compute_omega_factor: invert to sqrt(1 / density_adj), clamp to
[1.0, 2.0]. Now omega = 2.0 at low density (long strands need
most help) and clamps to 1.0 above ~30% density (no-op, since
standard gyroid is already short enough).
- Remove the cbrt(omega) period compensation. Empirically (sim
table embedded in FillGyroid.cpp comment) the inverted formula
keeps line length per area at ~1.000 of standard across all
densities with no period scaling needed.
Predicted gains (sim, Z-axis Euler buckling proxy):
density line/std strength/std
10% 1.000 2.84x
15% 1.000 1.89x
20% 1.000 1.42x
30%+ 1.000 1.00x (no-op)
Rename per @ianalexis: "Optimize gyroid wave" oversells (now no-op
above 30% density and Z-only). Renamed user-facing label to
"Z-buckling bias optimization (experimental)" with updated tooltip
that scopes to vertical compression and discloses the density cutoff.
Internal config key (gyroid_optimized) unchanged for diff size.
Real-world Instron compression tests at Brown's Prince Lab to follow.
---------
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
Root-cause + fix for the K2 Plus sparse-slot / wrong-slot-mapping bug
reported by multiple testers on Reddit and PR #13744 (DaviBe92, Psych0SW,
swilsonnc, TrainAss, Gullible-Price-4257).
DaviBe92 supplied a raw /box/getRealBoxesInfo payload from a K2 Plus
running printer FW 1.1.5.2 / CFS 1.2.2 that shows the K2 Plus uses
THREE state values for slots:
state: 0 → empty
state: 1 → loaded AND currently selected as the active spool
state: 2 → loaded but not currently selected
K2 (base) and K2 Pro firmwares — confirmed against the maintainer's
test printer — only use 0/1. Our parser had assumed the 0/1 form and
filtered with `if (state != 1) continue`, dropping every state=2 slot.
Symptoms this explains:
* DaviBe92: 3 spools loaded, only 1 displayed (the state=1 slot).
* Psych0SW / swilsonnc: 2 of 4 slots returned, "2nd shows 3rd's data"
— the parser dropped slots with state=2, leaving a sparse map that
PresetBundle::sync_ams_list then packs into consecutive UI trays.
* TrainAss / Gullible-Price-4257: "No loaded slots detected" — likely
the same root cause when zero slots happen to be state=1.
Fix: treat any non-zero state as loaded. Belt-and-braces: also skip
entries that are blanked-out (vendor and type both empty) regardless of
state, in case a future firmware uses yet another encoding for empty.
No change required for K2 / K2 Pro behaviour — they already only emit
state=0 (empty) or state=1 (loaded), and the new filter accepts both.
CI flagged ~150 K2 profile files for using space indentation; repo convention
is tab indentation. Ran the upstream-provided fixer:
python3 scripts/orca_filament_lib.py -v Creality -p filament -f --force
Mechanical normalization:
- Spaces → tabs (1 tab per indent level)
- Field ordering normalized (name + type first)
- Single-value scalar fields converted to single-element arrays where the
schema expects arrays (filament_cost, filament_density,
temperature_vitrification, filament_max_volumetric_speed)
No semantic content changes. Pre-existing issue from the original K2
profile import; touching these files in the multicolor_method strip
brought them into the validator's PR-diff scope.
Per @SoftFever review on #13752, printer-specific filament sync logic
belongs in the agent rather than in Sidebar. This consolidates the
previously-duplicated code so all CFS-specific work lives in
CrealityPrintAgent.
Changes:
- New: CrealityPrintAgent::sync_filaments_into_ams_list() — static method
that builds a CrealityPrint host from a printer_cfg, queries CFS slots,
populates PresetBundle::filament_ams_list, and triggers sync_ams_list().
GUI-free; returns a result struct (Status + counts + detail) so the
caller decides what dialog to show.
- New: nested CFSAmsListResult struct describing the five possible
outcomes (Success / NotCfsCapable / QueryFailed / EmptySlots / NoMatches).
- Removed: Sidebar::sync_filaments_from_creality_cfs() entirely (its body
is now the agent method).
- Plater.hpp loses the declaration; Plater.cpp dispatches to the agent
inline within sync_ams_list() and owns only the dialog + post-sync UI
refresh (combo updates, layout, preset selection, persistence).
Two CFS-related entry points on the agent now coexist:
- fetch_filament_info() — agent-driven path; publishes via AmsTrayData
and build_ams_payload(). Active when a MachineObject is bound (BBL
concept, not currently created for Creality LAN hosts).
- sync_filaments_into_ams_list() — explicit-pull path used today by the
Sidebar's "Sync filaments" button until the K-series MachineObject
work catches up.
No user-visible behaviour change — same end-to-end flow, the data work
just lives in the agent now.
Per @SoftFever review on #13752, third-party vendored libraries belong in
deps_src/ alongside expat, imgui, hidapi, etc.
- All 5 files (mdns.{h,c}, cxmdns.{h,cpp}, NOTICE.md) move from
src/slic3r/Utils/mdns/ to deps_src/mdns/.
- deps_src/mdns/CMakeLists.txt builds mdns as a STATIC library and scopes
the MSVC Iphlpapi/Ws2_32 link requirement to that target instead of
libslic3r_gui's global MSVC block.
- deps_src/CMakeLists.txt gains add_subdirectory(mdns).
- src/slic3r/CMakeLists.txt drops the inline source listings and links
libslic3r_gui against the new mdns target; MSVC block keeps only
Setupapi.lib.
- src/slic3r/Utils/CrealityHostDiscovery.cpp #include updated to use the
include dir exposed by the new mdns target.
Verified by a clean Linux build (orca-slicer links successfully).
Two data-only fixes:
#1 Strip undefined {if !multicolor_method} wrapper from filament_start_gcode on 110 K2-Plus profiles. The placeholder is a CrealityPrint-ism that survived the profile port; Orca has no such variable, so slicing failed with a hard parser error (reported on Hyper PLA by u/Gullible-Price-4257). Inner per-layer temp logic now runs unconditionally, which is the correct default.
#4 Add filament_vendor: [Creality] to 50 Creality Generic profiles missing the field. Without it the UI grouped them under Generic instead of Creality (reported by u/mharrop94).
* Added UI force-sync button and fixed bug that didn't sync in one case and caused orange highlight
* Fix sync preset race: join old thread before starting new one
---------
Co-authored-by: Mykola Nahirnyi <mnahirnyi@amcbridge.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
When a user adds a Creality K-series printer (host_type=crealityprint)
and clicks the existing "Browse" button in the Physical Printer dialog,
dispatch to a new CrealityDiscoveryDialog that finds K2 / K2 Plus /
K2 Pro printers on the LAN automatically. For other host types the
button keeps its existing BonjourDialog behaviour.
CrealityHostDiscovery (src/slic3r/Utils/CrealityHostDiscovery.{hpp,cpp})
Wraps the vendored cxmdns wrapper from the previous commit:
static std::vector<CrealityHost> scan(bool probe_info = true);
Calls cxnet::syncDiscoveryService({"Creality", "creality"}) to find
K-series printers via DNS-SD, dedupes by IP, then optionally HTTP
GETs http://<ip>/info on each match to fetch the model code
(F008 = K2 Plus, F012 = K2 Pro, F021 = K2) and MAC. Returns enriched
{ip, hostname, model_code, model_name, mac, cfs_capable} entries.
CrealityDiscoveryDialog (src/slic3r/GUI/CrealityDiscoveryDialog.{hpp,cpp})
Modal dialog with a wxListView showing Model / Hostname / IP per
discovered host. Runs CrealityHostDiscovery::scan() synchronously
with wxBusyCursor + wxWindowDisabler (5-10s total wait). User picks
one, dialog returns the IP via selected_ip().
PhysicalPrinterDialog (src/slic3r/GUI/PhysicalPrinterDialog.cpp)
The "Browse" button's click handler now reads host_type from the
edited config. If htCrealityPrint, opens CrealityDiscoveryDialog
and writes "http://<ip>" into the print_host field. Otherwise the
existing BonjourDialog path runs unchanged -- no behaviour change
for OctoPrint / Moonraker / Klipper users.
No new UI surface: one existing button now does the right thing per
host_type, mirroring how Creality Print discovers its own printers.
Drop a public-domain mDNS / DNS-SD lookup library into the tree at
src/slic3r/Utils/mdns/. Two pieces:
mdns.{h,c} -- public-domain library by Mattias Jansson from
https://github.com/mjansson/mdns
cxmdns.{h,cpp} -- C++ wrapper from CrealityOfficial/CrealityPrint
v7.1.1 (AGPL-3.0, compatible with OrcaSlicer's
AGPL-3.0)
cxmdns exposes one function:
std::vector<machine_info> cxnet::syncDiscoveryService(
const std::vector<std::string>& prefix);
It sends a DNS-SD meta-discovery query (_services._dns-sd._udp.local.),
listens ~5 seconds, and returns {ip, service_name} for every service
announcement whose name contains any of the given prefixes.
Motivation: Creality K-series firmware announces each printer under a
per-device-unique service type _Creality-<MAC-derived-hex>._udp.local.,
so OrcaSlicer's existing Bonjour code (which queries fixed service
names like _octoprint._tcp) cannot find them. The DNS-SD meta-browser
approach implemented here is the standard way to discover services
when you do not know their exact names in advance.
mdns.c calls GetAdaptersAddresses (iphlpapi) and Winsock2 functions,
neither of which were on libslic3r_gui's MSVC link line; both are
added here so the vendored sources compile and link standalone.
Attribution captured in src/slic3r/Utils/mdns/NOTICE.md. No callers
yet; the K-series discovery class + UI lands in the next commit.
The matcher tiebreaker previously preferred user-edited filament
presets over system bases on a tied score. For a K2 owner who has
a custom copy of Creality Generic PLA @K2-all called eg
Creality Hyper PLA @K2 (mine), the matcher scored both that copy
and the shipped brand-specific Hyper PLA @Creality K2 0.4 nozzle
at 30, then tiebreak picked the user copy. User copies inherit
filament_id from their parent -- in this case the generic PLA
GFL99 -- so the returned id pointed at Generic PLA, not at
Hyper PLA brand-specific id (01001). PresetBundle::sync_ams_list
then resolved by id back to Creality Generic PLA @K2-all, visibly
losing the brand on every sync.
Flip the tiebreaker to prefer system over user. The shipped
brand-specific preset always wins now and sync_ams_list lands on
the right slot label.
Drop the post-sync user-override step from the sidebar path that
was layered on to compensate -- silently substituting the user
local tuning is the wrong default for an upstream-shipped
feature; users who want their local tuning on a synced slot still
get to it via the existing combo dropdown.
Import 191 brand-specific filament presets for the K2 family of
printers (K2, K2 Plus, K2 Pro), lifted from
CrealityOfficial/CrealityPrint v7.1.1 under AGPL-3.0 (compatible
with OrcaSlicer AGPL-3.0).
Brand coverage:
CR-series: CR-PLA, CR-PLA Matte, CR-PLA Fluo, CR-Silk,
CR-TPU, CR-ABS, CR-Nylon
Hyper-series: Hyper PLA, Hyper PLA-CF, Hyper ABS, Hyper PA-CF,
Hyper PA6-CF, Hyper PAHT-CF, Hyper PA612-CF,
Hyper PC, Hyper Marble, Hyper Stardust,
Hyper L-W PLA, Hyper PPA-CF
Third-party: eSUN PLA+ / PLA-HS / PLA-Matte / PLA-Silk /
PLA-CF / PLA-LW / PLA-Lite, PolySonic PLA /
PLA Pro, Panchroma PLA Matte / Satin, Soleyin
Ultra PLA, HP Ultra PLA, HP-ASA, HP-TPU
Ender PLA variants and CrealityPrint per-K2 Generic versions of
PLA, ABS, ASA, PA, PA-CF, PAHT-CF, PET, etc.
This closes the matching gap exposed by the CFS filament-sync
work. When the K2 reports spool brand Hyper PLA or CR-PLA, the
existing Creality vendor only had a generic Creality Generic PLA
@K2-all preset to fall back to, so per-brand temps / PA / cooling
tuning was lost on every sync.
Schema and naming are drop-in compatible -- CrealityPrint
references the K2/K2 Plus/K2 Pro machine names already present in
OrcaSlicer Creality vendor (Creality K2 0.4 nozzle, etc), so no
machine-side changes or compatible_printers rewrites are required.
K2 SE filaments and the PETG/PP/PPS/HIPS family are deferred. K2
SE machine profile is not yet in OrcaSlicer Creality vendor, and
the PETG/PP/PPS/HIPS family relies on fdm_filament_* base
templates that do not exist in Orca Creality vendor -- importing
those bases from CrealityPrint did not make them register as valid
parents at preset-load time. Coverage for the missing families
will land in a follow-up once the loader requirements for new
bases are understood.
Vendor version bumped to 02.03.02.75 to trigger the per-user
profile refresh on next launch. Source attribution captured in
resources/profiles/Creality/NOTICE.md.
The agent fetch_filament_info() path does not fire for Creality
K-series hosts because Sidebar::build_filament_ams_list()
short-circuits when no MachineObject is bound. MachineObject is a
BBL cloud-connected-printer concept that does not apply to LAN
Moonraker-style hosts like the K2 -- the AMS-sync icon click was a
no-op for them.
Mirror what Creality Print own slicer does (explicit Auto Mapping
button bypassing the BBL plumbing): when the user clicks the
existing AMS-sync icon and host_type=crealityprint, dispatch to a
new Sidebar::sync_filaments_from_creality_cfs() that reads the
active printer host config, confirms the printer is a CFS-capable
K-series board, queries boxsInfo over the printer WS on port 9999,
scores each loaded slot against the user filament presets and
builds a filament_ams_list entry with the matched filament_id,
colour and slot indices, then routes through
PresetBundle::sync_ams_list so the filament combo widgets get the
same rebuild as BBL printers and runs the BBL post-sync refresh
sequence (on_filament_count_change + combo update + select_preset
+ export_selections + update_dynamic_filament_list).
No new UI surface -- the existing AMS-sync icon does the right
thing per host_type. Match-and-resolve logic is hoisted out of the
agent anonymous namespace into public statics so the sidebar can
call it without duplicating scoring rules.
K-series printers (K2, K2 Plus, K2 Pro) ship with Mainsail on port
4408. Port 80 hosts only the Creality control/upload API, which
returns 404 for unknown paths and renders as a blank/404 page in
Orca Device tab.
Override CrealityPrint::get_print_host_webui() to default to
http://<host>:4408/ when the user has not explicitly set
print_host_webui, giving K-series owners a complete printer
dashboard in the Device tab out of the box.
Score visible compatible filament presets against the CFS spool
(vendor, brand_name, type) tuple to pick the right preset:
+20 preset name contains the brand_name as a substring
(eg Hyper PLA in Hyper PLA @Creality K2 0.4 nozzle)
+10 preset name contains the vendor substring (eg Creality)
Requires preset.filament_type to equal the spool base type so a
PETG preset is never auto-picked for a PLA spool. Falls back to
filaments.filament_id_by_type(base_type) when nothing scores.
Considers both base/system presets and user-derived copies -- K2
owners frequently keep tweaked copies of system presets (per-spool
PA, temps), so filtering to bases-only would skip exactly the
presets users care about most.
Subclass of MoonrakerPrinterAgent for K-series Creality printers
(K2, K2 Plus, K2 Pro) with CFS support. Registers in
NetworkAgentFactory under host_type=crealityprint. Overrides
fetch_filament_info() to defer to base when the host is not a
CFS-capable K-series board, otherwise query the boxsInfo WebSocket
on port 9999, parse the box hierarchy into CFSSlot[], and publish
each loaded slot as an AmsTrayData entry via build_ams_payload()
so they surface in Orca filament UI.
boxsInfo schema reference (verified against K2 Combo F021 firmware
v1.1.260206):
materialBoxs[].materials[] fields: id, state, vendor, type, name,
color, pressure, rfid, percent. state=1 means loaded; box.type=0
is a CFS unit, type=1 is the external spool holder (handled by
the upload dialog).
Accepted CFS boxes are renumbered sequentially since the K2 raw
box.id has gaps for the external spool holder. Model detection is
delegated to CrealityPrint::supports_multi_color_print() added in
PR #13291.
* feat: add UI feedback on http error and some logs
* spelling fix
* show error dialog only once per session
* show errors with plater notification when on developer mode
* remove return
* remove irrelevant logs
GridCellSupportEditor::DoActivate dereferenced
grid->GetSelectedBlocks().begin() without checking against end(). In
wxWidgets 3.1.5 that range always contained at least one block; in 3.3.2
it is empty after the user deselects, and the dereference crashes inside
wxGridBlockCoords::GetLeftCol().
Fall back to the (row, col) that triggered activation when the selection
is empty, so the existing single-cell branch handles it. While here,
drop a dead local_table cast that was never read.
Fix macOS orcaslicer:// deep links after wxWidgets 3.3.2 upgrade
Install an OrcaSlicer-owned kAEGetURL Apple Event handler from
on_init_inner(). The wxWidgets 3.3.2 handler registered in
applicationWillFinishLaunching: stopped delivering URL events to
GUI_App::MacOpenURL on macOS (#13119), so links from Printables /
Thingiverse opened a blank project instead of importing the model.
Registering our own handler late in startup is last-writer-wins on
NSAppleEventManager and routes back to the existing MacOpenURL ->
start_download path, restoring the pre-upgrade behavior without
touching wxWidgets.
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Use glBlendFuncSeparate in GLTexture::render_sub_texture so destination
alpha stays at 1.0. The Wayland compositor honors framebuffer alpha for window compositing; the previous straight-alpha blend reduced dst alpha
at anti-aliased icon edges, making them semi-transparent against the
desktop. RGB blending is unchanged, so X11/Windows/macOS are unaffected.
Delay opening the object-list filament dropdown on wxGTK until the editor
window is mapped, avoiding popup creation without a valid native toplevel.
Also set the GTK transient parent for dropdown popups created from data-view
cell editors.
# Description
Currently, there is some suspicious behavior going on with the logout
flow, adding some logs to potentially catch any unwanted logouts or
unintentional behaviors.
[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
When the spool holder is selected for printing, use the opGcodeFile
command with enableSelfTest instead of colorMatch + multiColorPrint.
This matches the protocol used by CrealityPrint desktop for spool
holder prints.
- Detect spool holder mode: any colorMatch entry with box_id 0
- Spool holder: send opGcodeFile + enableSelfTest (single command)
- CFS: send colorMatch + multiColorPrint (existing behavior)
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Show the spool holder (external filament roll) as a selectable option
in the K2 Plus filament mapping dialog. Previously only CFS slots were
shown because the box state filter excluded the spool holder.
- Only skip inactive CFS boxes (type 0, state != 1); spool holder
(type 1) is always available
- Label spool holder slots as "Ext - {type}" in the dropdown
- Auto-match priority is now:
1. CFS exact (type + color)
2. CFS type-only
3. Ext exact (type + color)
4. Ext type-only
5. Positional default
- When Ext is selected (by user or auto-match), disable other combos
since firmware does not support mixing CFS and spool holder
Signed-off-by: Igor Mammedov <niallain@gmail.com>
When the filament mapping dialog opens, automatically select the best
matching CFS slot for each gcode filament by comparing color and type.
Falls back to positional index if no exact match is found.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Query CFS material slots and show colored dropdowns to map gcode
filaments to physical printer slots. Color mapping is passed through
extended_info as colorMatch entries for the multi-color print protocol.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
---
v4:
- Use gcode tool index (T1A, T1B, ...) as colorMatch id instead of
CFS slot tool_id — firmware expects the gcode filament identifier,
not the destination slot
Add enableSelfTest checkbox to CrealityPrintHostSendDialog that
persists across sessions via AppConfig. The checkbox state is
passed to the upload via extendedInfo().
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Add model_name() to map firmware model codes (F008, F012, F021)
to human-readable names (K2 Plus, K2 Pro, K2). Update the send
dialog init() to detect multi-color support and show a group box
with the printer name.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Add CrealityPrintHostSendDialog scaffolding: an empty dialog class
that inherits from PrintHostSendDialog, and Plater wiring to use
it when the host type is CrealityPrint.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
For supported models, start_print() sends colorMatch (filament-to-slot
mapping) followed by multiColorPrint (with optional calibration via
enableSelfTest) instead of the legacy opGcodeFile command. The dialog
passes color mapping and calibration settings through extended_info.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
---
v4:
- Skip "path" form field in multipart upload for multi-color printers
(extra field breaks K2 Plus firmware parser)
- Use fire-and-forget ws.write() for colorMatch and multiColorPrint
instead of ws_send_and_read() (printer sends response asynchronously)
Add query_boxes_info() to discover loaded materials in the CFS
(Creality Filament System) via websocket. Returns the boxsInfo
JSON with slot details (type, color, vendor, temperature range).
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Add a reusable websocket helper that sends a JSON command and loops
reads until finding a response containing the expected key. This
handles the printer's unsolicited status messages that arrive on
connect before the actual response. Returns empty string on timeout
instead of throwing.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Consolidate websocket connection setup into a reusable helper.
Migrate from tcp::socket to beast::tcp_stream for timeout support.
Set SO_RCVTIMEO read timeout (3s) and connect timeout (5s).
Refactor query_boxes_info() and start_print() to use ws_connect().
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Parse the model field from the /info JSON response to enable
model-specific features. Add supports_multi_color_print() which
returns true for K2-platform printers (K2 Plus, K2 Pro, K2).
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Change start_print() from void to bool with a wxString& msg
out-parameter, matching the error handling pattern used by Duet,
MKS, ESP3D and Flashforge. On failure, the error message is now
reported to the user via error_fn instead of being silently
swallowed. Use BOOST_LOG_TRIVIAL for logging instead of std::cerr.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Move duplicate get_host_from_url() implementations from ElegooLink and
OctoPrint into Http as a static method using the curl_url API. This
eliminates code duplication and provides a single reliable URL host
extraction utility for all print host implementations.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
get_host_from_url() returns host:port which may cause
boost::asio::ip::make_address() to fail when a port is present,
bypassing the direct IP upload path and falling through to DNS
resolution via upload_inner_with_host(). Use get_host_from_url_no_port()
to extract just the host.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
* unify footer
adds "Done" Buttons,
standardize "Reset" Buttons,
adds disabled logic to "Reset" Buttons
* adds ImGuiWrapper::COL_WARNING = ColorRGB:Warning,
replaces ColorRGB::Warning
* consistently display warnings,
moves assermbly warning after footer,
make cut warnings warning color
* adds separator above cut warnings
* adds tooltip entry in move, rotate & scale for auto-drop
* use wrapper tooltip in wrapper->button for consistent text color
* restructures brim ears button,
renames "Reset" button in painting tools to "Erase All",
small styling fixes
* small adjustments,
moves "Edge detection" checkbox in painting tool underneath,
moves "Section View" in Brim ears tool after buttons,
moves warnings in Assemble tool under footer
* small brim ear tool structure changes,
adds separator between "Head Diameter" and "Max angle",
adds tooltip to "Auto-generate" button,
rewords shortcut descriptions to match other tools
---------
Co-authored-by: Hanno Witzleb <hannowitzleb@gmail.com>
* adds UI and preview plane for multiple dovetail cuts
* adds multiple dovetail cuts to perform_with_groove()
* adds ui text info for spacing, adjusts max_val for gap to respect plate dimensions
* adds spacing before multpile UI
* adjusts wording, adjust gap max by count
---------
Co-authored-by: Hanno Witzleb <hannowitzleb@gmail.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Add logic to handle the left, middle and right buttons being assigned to do nothing, pan or rotate
* Add entries for setting the drag actions to preferences
* Allow the label text in preferences to wrap
* Show mouse mappings in Help -> Keyboard Shortcuts
* Re-add preferences in updated layout
* Add camera mouse options under camera
* Change mouse action strings to use L() for localization
* Display "None" when it is selected instead of blank in keyboard shortcuts
---------
Co-authored-by: Rob O <robertolabode@gmail.com>
Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
load_selections() and update_selections() size the parallel project_config
arrays (filament_colour, filament_colour_type, filament_map) off
filament_presets.size(). When the saved list is shorter than the printer's
nozzle count — never-used printer, hand-trimmed conf, or fewer filament_NN
entries than nozzles — the loaded colors get truncated and the sidebar
starts up one combo short.
## Summary
- skip CLI thumbnail generation when an OpenGL/GLFW context cannot be
created, allowing export workflows to continue in headless/automation
environments
- guard filament variant remapping against missing config options and
out-of-range variant indexes
- log warnings instead of dereferencing invalid config state during
CLI/profile-driven export
## Context
These guards came out of automating OrcaSlicer CLI exports for printer
workflows. In that flow, slicing/export can still be valid even when
thumbnail rendering is unavailable, but the current path can proceed
into OpenGL thumbnail setup after context creation fails. Separately,
malformed or mismatched filament/profile state can index past option
vectors during multi-filament value remapping.
## Test plan
- `git diff --check`
- `cmake --build build/arm64 --config RelWithDebInfo --target OrcaSlicer
-- -j4`
# Description
Fixes a macOS object-list filament editor crash/glitch where the
filament column could enter Cocoa native text editing and expose
`wxCustomRendererObject: 0x...` or crash while committing an invalid
`DataViewBitmapText` value.
The visible `wxCustomRendererObject` glitch was observed on macOS
through Cocoa `wxDataViewCtrl` editing. The underlying unsafe
assignment/variant/editor assumptions are not inherently macOS-only, so
the defensive data-path fixes are cross-platform.
Changes:
- Adds an explicit `DataViewBitmapText` assignment operator that avoids
copying the `wxObject` base, matching the existing copy constructor.
- Rejects unexpected variant types before reading object-list
name/filament values as `DataViewBitmapText`.
- Hardens filament editor value extraction against unexpected editor
controls.
- On macOS, routes filament-column editing through the custom
bitmap-choice renderer instead of `wxDataViewCtrl::EditItem()`, avoiding
native text editing of `wxCustomRendererObject`.
Fixes https://github.com/OrcaSlicer/OrcaSlicer/issues/13682
Previous PR with conversation:
[#13684](https://github.com/OrcaSlicer/OrcaSlicer/pull/13684)
This should fix the crash observed by @Noisyfox as we're addressing the
underlying problem of presenting the `wxCustomRendererObject`.
## Tests
Validated on macOS arm64. Repeated double-click/edit attempts on an
unselected object's filament cell no longer show
`wxCustomRendererObject` and no crash reproduced.
<!--
> A guide for users on how to download the artifacts from this PR.
-->
[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
This can be enabled in Preference->Developer->Keep painted feature after
mesh change.
<img width="731" height="633" alt="init"
src="https://github.com/user-attachments/assets/8b195486-538e-4eda-9e77-bfdf1a794306"
/>
TODO:
- [ ] Bug fixes
- [ ] Make it faster
- Keep painting after other mesh operations such as reload from
disk/simplify/boolean operation etc:
- [x] Planar cut
- [x] Dovetail cut
- [x] Cut with part assigned to other side
- [x] Split to parts
- [x] Split to objects
- [x] Mesh boolean gizmo
- [x] Mesh boolean in right click
- [x] Reload from disk/replace stl (won't work well if mesh changed too
much)
- [x] Fix model
- [x] Simplify/smooth (this two won't work well due to too much mesh
changes)
- [x] Add options in settings since I think this will be experimental
for a long time until being tested by a lot of ppl
* Expose Antialiasing velues
Expose Antialiasing multipliers.
Default to 4 as current implementation but enables the user to disable it to improve performante or increase sampling to improve quality.
* FXAA
* Improve descriptions
* Require restart when MSAA setting changes
Detect changes to the OpenGL MSAA (multisample anti-aliasing) preference when opening Preferences and prompt the user to restart the application to apply the change. Adds a constant key for the MSAA setting, stores the previous value, checks for changes (similar to the existing FXAA handling), and shows a warning dialog explaining the restart will close the current project without saving. If the user accepts, recreate_GUI is invoked to apply the MSAA change immediately.
* Revert "Require restart when MSAA setting changes"
This reverts commit dde134d346c3849598c91d025d2faed1b51c8a22.
* Menu and FPS options
* Fix FPS limiter and remove VSYNC
* Grouped FPS settings and mode up rigth fps counter
---------
Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
FlowRateCalibrationDialog was missing the SetSizeHints call that every
other calibration dialog in calib_dlg.cpp uses (Cornering, Pa, Pa Pattern,
Max Volumetric Speed, Temperature, Retraction, VFA, Input Shaping). Without
it, the dialog has no enforced minimum size: on wxGTK, iconizing the main
window while the dialog is open triggers a layout/refresh that re-runs
Fit() with transient zero-sized children, collapsing the dialog to ~222x249
px with the OK button clipped and unreachable. The window manager then
honors the (incorrect) small geometry hint, so the user cannot resize it
back manually.
Two changes:
* Add v_sizer->SetSizeHints(this) after Fit() in the constructor, matching
the pattern used by all other dialogs in this file. This locks in the
correct minimum the first time Fit() runs, before any iconize event.
* Remove the redundant Fit() from on_dpi_changed. With SetSizeHints in
place the WM enforces the minimum, but the unconditional Fit() on every
DPI/refresh signal was the trigger for the shrink path; Refresh() alone
is sufficient here.
Co-authored-by: Packerlschupfer <packerl@schupfer.at>
* Add tooltips to Transfer buttons
Set contextual tooltips for the Discard, Transfer and Save buttons when a dependent preset is present. The code computes the previous and new profile names and provides localized explanatory tooltips that clarify that switching will discard changes, transfer "New Value" settings, or save changes into the current profile. This improves UX by making the consequences of each action explicit.
* added some endlines
Co-Authored-By: yw4z <yw4z@outlook.com>
---------
Co-authored-by: yw4z <yw4z@outlook.com>
* 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>
* Support file uploads and the device details page for CC2 printers.
* Resolved build issues for Linux and macOS.
* 1. Added `ElegooPrinterWebViewHandler` to handle WebUI messages for Elegoo printers. Other printers will keep the current behavior.
2. Added a static `get_print_host_webui` method in `PrintHost` to retrieve the printer WebUI URL.
* Improved timeout handling for CC2 file upload and SN info APIs.
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* perf: speed up startup and show progress in splash screen
Cold-start was ~15 s. Profiled in GUI_App::on_init_inner: 5 s in
preset_bundle->load_presets (sequential vendor loading of ~3000 JSON
profile files), 3.7 s in new MainFrame(), and a 1.5 s splash screen
that closed long before init finished — so the user stared at a
frozen blank screen for several seconds with no feedback.
Changes:
- PresetBundle::load_system_presets_from_json: parallelize vendor
loading with TBB. ORCA_FILAMENT_LIBRARY is loaded first
synchronously (it is the inheritance base for filaments); the
remaining vendors are loaded in parallel into separate PresetBundle
instances, then sequentially merged. On a typical setup this drops
load_presets from ~5 s to ~3.5 s; the saving scales with vendor
count and CPU cores.
- SplashScreen: remove the wxSPLASH_TIMEOUT flag so the splash stays
visible until the main window is shown explicitly, and add status
updates at each slow init phase ("Loading printer and filament
profiles", "Creating main window", "Loading current preset",
"Showing main window"). The splash is destroyed right after
mainframe->Show(true).
- MainFrame: FileHistory::LoadThumbnails moved to a detached
background thread. The previous synchronous call opened every recent
3MF file at startup — on macOS that triggered the TCC permission
dialog for ~/Downloads mid-launch, freezing the whole app until the
user clicked. Letting it run in the background means the UI is
responsive from the start and thumbnails populate when ready.
* revert: keep LoadThumbnails on the main thread (review feedback)
SoftFever pointed out the detached thread introduces race conditions
(e.g. MainFrame::open_recent_project() reading while the thread writes
m_thumbnails) and that thumbnails may not appear if the homepage shows
before it finishes. LoadThumbnails already uses tbb::parallel_for
internally, so the call-site offload gave no real speedup. Reverted to
the original synchronous call. The macOS TCC-dialog concern that
motivated this will be handled properly in the lazy-init refactor.
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
fix(printconfig): register enable_filament_dynamic_map and has_filament_switcher options
PR #13388 (X2D Support) added import/export for these options in
bbs_3mf.cpp but never registered them in PrintConfig.cpp. Loading any
.3mf containing these keys throws UnknownOptionException at
PartPlate.cpp:6153 when config->apply() looks up the missing definition.
* bbl device selector search box
* align file and more menus with its button
* fix multiline inputbox border color on windows
* fix multiline inputbox border color on windows
* preferences: use content width on combobox dropdowns
* about: match version text size on macOS
* msg dialog improvements
* fix canvas menu overlapping with sliced plates toolbar
* bbl bind dialog button placement
* bbl color picker
* Update StepMeshDialog.cpp
* drop file dialog
* drop dialog revert fonts
* revert windows multiline border
* Update StepMeshDialog.cpp
* update
* Flushing Volumes: match style of combobox
* fix hyperlink color on canvas notifications
* fix possible issues with shared profiles notification
fix: eliminate UI freeze during cloud preset sync on startup
Move synchronous HTTP calls off the main thread in
GUI_App::start_sync_user_preset():
- Call scan_orphaned_info_files() and process_delete_presets() in
the background sync thread instead of the UI thread, so their
HTTP DELETE calls don't block startup.
- Call reload_settings() directly from the background thread
instead of via CallAfter, so get_user_presets() (HTTP GET) and
load/save_user_presets (file I/O) run off the main thread.
- Guard update_side_preset_ui() and app_config->save() with
is_main_thread_active() / CallAfter so they're safe when called
from a worker thread.
- Simplifiy finishFn lambdas: the progress-dialog case only
destroys the dialog; the no-dialog case is a no-op.
Two related fixes for LAN printing with newer Bambu networking plugins:
1. FileTransferUtils: guard against missing ft_tunnel_* symbols
The eMMC tunnel constructor calls ft_tunnel_create / ft_tunnel_set_status_cb
without checking if the plugin exported them. Older plugins (e.g.
01.10.01.01) don't have these symbols, so the calls dereference null and
crash when sending a print. Now throw a clear exception so callers can
fall back gracefully.
2. PrintJob: disable eMMC print path by default
Plugin 02.03.00.62's eMMC tunnel code hangs indefinitely at the upload
phase (30%) on Bambu H2D, blocked inside the plugin waiting on a future
that never resolves. Cancel doesn't work because the plugin doesn't
check cancel_fn during the wait. The plain FTP path works reliably.
Default to try_emmc_print=false; opt-in via AppConfig setting
"disable_emmc_print" = "0". Also wrap the eMMC tunnel creation in
try/catch so a missing-plugin exception cleanly falls back to FTP
instead of killing the worker thread.
Co-authored-by: hyiger <hyiger@gmail.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
Enable air filtration support in affected system printer profiles
Some system printer profiles that support air filtration had the feature
incorrectly disabled in the printer settings.
This caused the related filament settings to be hidden, making the feature
unavailable to users even though it is supported by the printer.
Enable "support_air_filtration" in affected system printer profiles and
bump profile version thus forcing Orca to refresh cached settings.
This ensures air filtration settings are visible and usable on printers
that support the feature.
Fix Windows single-instance file handoff
On Windows, opening a model file while OrcaSlicer is already running could
fail when single-instance mode was enabled.
The second launch correctly detected that another instance already existed,
but it could no longer find the running main window to forward the file-open
request. As a result, the new process exited and the file was dropped.
This happened because the existing-instance lookup depended on the native
window title containing "OrcaSlicer". After the titlebar change from #12706,
the title may contain only the project name, so the running instance was no
longer discoverable that way.
Fix this by identifying the existing main window through stable window
properties instead of title text:
- require the expected wxWidgets window class
- require the instance hash properties to exist
- match against the current instance hash
This restores forwarding of externally opened files to the already-running
instance without depending on the current titlebar text.
Hide tree support parameters not in use
- hide independent support layer height for organic tree support
- hide threshold overlap for tree supports
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Fix speed popup refresh and sizing in Preview
Fix two UX issues in the Preview actual speed profile popup.
Keyboard-driven horizontal slider changes could leave the popup visually stale
until a later input event, which made keyboard navigation feel delayed.
Also, the speed-profile popup could briefly render at an incorrect height
before resizing on the next frame.
This change makes keyboard slider updates explicitly request a follow-up frame,
so refresh no longer depends on incidental mouse activity.
It also removes auto-resize from ToolPositionTableWnd and sizes the popup
before begin() each frame. The popup height is computed from plot height,
table rows, and window paddings, then clamped to at least the height of the
adjacent ToolPosition window.
The popup width is now computed from translated header text and padding terms,
with a 16:9-derived minimum for a more stable appearance. The width is cached
for the session and recalculated when UI scale changes.
Result:
- keyboard navigation updates reliably
- popup no longer shows the transient wrong-height first draw
- sizing is more stable across scale and localization
* Fix ToolPosition window also + other fixes
* Fix compile error when ENABLE_ACTUAL_SPEED_DEBUG disabled
IMGUI_DEFINE_MATH_OPERATORS is needed even if ENABLE_ACTUAL_SPEED_DEBUG is not enabled
* Guard seam fallback vertex index in GCodeViewer
Fix legend hover hit-testing
Fix GCode viewer legend where the eye icon and right edge don’t respond to hover/click unless you click slightly left (works after switching view types unless the vertical slide is used).
Fix hybrid tree first-layer support base flow and UI consistency
Fix incorrect first-layer generation for hybrid tree supports.
The support base on the first layer used brim flow instead of support material flow,
which could lead to incorrect extrusion behavior and wrong material usage in
multi-material prints.
Additionally, spacing and density for the regular support part were not consistently
derived from the actual first-layer support flow when first-layer and regular
line widths differed.
Hybrid-specific behavior is clarified:
- first-layer expansion applies only to the regular support part
- tree-only regions keep their existing behavior
The first-layer support pattern is aligned with normal and organic tree supports
to ensure consistent and meaningful density behavior.
Also make first-layer support expansion and density settings visible whenever
supports are enabled, as density was already affecting hybrid supports but was
hidden in the UI.
Avoid calling Show() on the main frame when it is already visible from BaseTransparentDPIFrame::on_hide(). On GTK this can re-enter size/layout handling after filament sync and leave the UI unresponsive.
Fix issue that printer name disappear if profile (other than the first one among its variants) is modified
for printers that have multiple variants with different nozzle size
* [Fix] Anycubic machine print profiles fix-patch
default_material changed. Wrong referenced Material deleted. No filament profile available.
* Anycubic Kobra X profile
These are the files for a new printer profile in OrcaSlicer for Anycubic Kobra X
Tested on Ubuntu 26.04 LTS.
Local Build = passed
OrcaSlicer Profile Validator = passed
Python Profile Validation Script = passed
* Rename resources/profiles/0.08mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.08mm Standard @Anycubic Kobra X 0.4 nozzle.json
correcct folder
* Rename resources/profiles/0.12mm High Quality @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.12mm High Quality @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/0.12mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.12mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/0.16mm High Quality @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.16mm High Quality @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/0.20mm High Quality @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.20mm High Quality @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/0.16mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.16mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/0.20mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.20mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/0.24mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.24mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/0.28mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/process/0.28mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/process/0.08mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.08mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/process/0.12mm High Quality @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.12mm High Quality @Anycubic Kobra X 0.4 nozzle.json
* Rename 0.12mm Standard @Anycubic Kobra X 0.4 nozzle.json to process0.12mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic/process0.12mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.12mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/process/0.16mm High Quality @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.16mm High Quality @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/process/0.16mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.16mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/process/0.20mm High Quality @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.20mm High Quality @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/process/0.20mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.20mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/process/0.24mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.24mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/process/0.28mm Standard @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/process/0.28mm Standard @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic Kobra X.json to resources/profiles/Anycubic/machine/Anycubic Kobra X.json
* Rename resources/profiles/Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/machine/Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic Kobra X_buildplate_model-test.stl to resources/profiles/Anycubic/Anycubic Kobra X_buildplate_model-test.stl
* Rename resources/profiles/Anycubic Kobra X_buildplate_texture-test.svg to resources/profiles/Anycubic/Anycubic Kobra X_buildplate_texture-test.svg
* Rename resources/profiles/Anycubic Kobra X_cover.png to resources/profiles/Anycubic/Anycubic Kobra X_cover.png
* Rename resources/profiles/Anycubic ABS @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic ABS @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic PETG @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic PETG @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic ASA @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic ASA @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic PLA @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic PLA @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic PLA Glow @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic PLA Glow @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic PLA Matte @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic PLA Matte @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic PVA @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic PVA @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic PLA High Speed @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic PLA High Speed @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic TPU 95A @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic TPU 95A @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic PLA Silk @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic PLA Silk @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic PLA+ @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic PLA+ @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Anycubic TPU for ACE @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Anycubic TPU for ACE @Anycubic Kobra X 0.4 nozzle.json
* Rename resources/profiles/Generic PETG @Anycubic Kobra X 0.4 nozzle.json to resources/profiles/Anycubic/filament/Generic PETG @Anycubic Kobra X 0.4 nozzle.json
* Delete resources/profiles/Anycubic/Anycubic Kobra X_buildplate_texture-test.svg
wrong file
* Delete resources/profiles/Anycubic/Anycubic Kobra X_buildplate_model-test.stl
wrong file
* corrected Files
correct files uploaded (buildplate).
missing file was included (hotned)
* Delete resources/profiles/Anet directory
No profiles found for vendor: Anet at OrcaSlicer/resources/profiles/Anet.json
* Delete resources/profiles/Anycubic.json
Replaced
* Replaced
Replaced after running: python3 ./orca_filament_lib.py --fix --force
* Space indentation correction via script
Space indentation correction via script
* Space indentation correct via script
Indentation Check Failed
python3 ./scripts/orca_filament_lib.py --fix --force
* Space indentation corrected via script
Indentation Check Failed
python3 ./scripts/orca_filament_lib.py --fix --force
* Tab correction
* Tab correction
* Tab correction
* Tab correction
* fix format
* Anet restore
* Create Anet A8 Plus 0.4 nozzle.json
* restored Anet
* Delete resources/profiles/Anet/machine directory
the Anet profile is corrupted
* Create Anet A8 Plus.json
* machine
* Rename resources/profiles/Anet/Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/machine/Anet A8 Plus 0.4 nozzle.json
corect folder
* Filament
* Rename resources/profiles/Anet/Anycubic Generic ABS @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic ABS @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic ASA @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic ASA @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic PA @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic PA @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic PA-CF @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic PA-CF @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic PC @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic PC @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic PETG @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic PETG @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic PLA @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic PLA @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic PLA-CF @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic PLA-CF @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic PVA @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic PVA @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/Anycubic Generic TPU @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/filament/Anycubic Generic TPU @Anet A8 Plus 0.4 nozzle.json
* process
* Rename resources/profiles/Anet/0.15mm Optimal @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/process/0.15mm Optimal @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/0.20mm Standard @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/process/0.20mm Standard @Anet A8 Plus 0.4 nozzle.json
* Rename resources/profiles/Anet/0.30mm Draft @Anet A8 Plus 0.4 nozzle.json to resources/profiles/Anet/process/0.30mm Draft @Anet A8 Plus 0.4 nozzle.json
* Delete resources/profiles/Anet/machine directory
* Delete resources/profiles/Anet/filament directory
* Delete resources/profiles/Anet/process directory
* restore
* Rename resources/profiles/Anet/Anet A8 Plus.json to resources/profiles/Anet/machine/Anet A8 Plus.json
* restore
* restore
* Delete resources/profiles/Anet/machine/Anet A8 Plus.json
* Changed to original OrcaSlicer profile
My modified printer profiles were overwritten by the original OrcaSlicer profiles. This reversed the changes made under “default_materials.” As a result, 47 errors appear when running the “Python Profile Validation Script”!
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
Fix a regression that second extruder settings not properly handled for H2D/X2D (OrcaSlicer/OrcaSlicer#13559)
The problem here is how it deals with comparasion between signed & unsigned unmbers. It will convert both into unsigned then do the comparasion,
which means when `extruder_id` is `-1` (which is a valid value, means all extruders), it will be treated as `0xFFFFFFFF` which is obviously greater than `nozzle_volumes->size()`
then be reset to `0`. So when the parameter dialog is built (which will call this function with `extruder_id=-1`), only the first extruder will be set to the correct variant index.
* Update fix model
* updated
* List missing files
* Orca Slicer to OrcaSlicer
* Revert "Orca Slicer to OrcaSlicer"
This reverts commit 711d796e05c4eaaa7579280f83f6ecd555fe3560.
* Only update date if a change was made
* Gcodewriter messages
* #13432 update
* Update OrcaSlicer_it.po
* Add get_json_string_field helper
Introduce get_json_string_field in OrcaCloudServiceAgent.cpp to safely extract string fields from JSON objects.
* Add resolve_display_name helper
Introduce resolve_display_name to normalize provider metadata labels for the UI. The helper returns the first non-empty value from display_name, nickname, full_name, name, falling back to username, resolving human-facing label across varying provider payloads.
* Replace safe_str anonymous function
Replace get_json_string_field for better readability.
* Replace resolution flow for nickname with function
Consolidate both flows into one function for easier maintenance and more consistency.
* Update OrcaCloudServiceAgent.hpp
* Add OrcaCloudServiceAgent display name tests
Add unit tests verifying OrcaCloudServiceAgent resolves a user's display name from various session JSON shapes.
* Use GTK sink for Wayland liveview
Keep native Wayland sessions on the GTK backend and use a GTK widget based GStreamer sink for Bambu liveview instead of the Wayland video overlay path, which can render black on NVIDIA/Hyprland.
Keep the existing wxMediaCtrl path for X11 and continue preferring software H.264 decoding while demoting GL and hardware decoder paths that caused liveview crashes.
* Narrow Linux liveview fix to native Wayland
* Tighten native Wayland liveview setup
* Tighten Wayland liveview teardown and rank setup
* Package GStreamer gtksink for Wayland liveview
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Update eigen from v3.3.7 to v5.0.1.
This updates eigen from v3.3.7 released on December 11, 2018-12-11 to v5.0.1
released on 2025-11-11. There have be a large number of bug-fixes,
optimizations, and improvements between these releases. See the details at;
https://gitlab.com/libeigen/eigen/-/releases
It retains the previous custom minimal `CMakeLists.txt`, and adds a
README-OrcaSlicer.md that explains what version and parts of the upstream
eigen release have been included, and where the full release can be found.
* Update libigl from v2.0.0 (or older) to v2.6.0.
This updates libigl from what was probably v2.0.0 released on 2018-10-16 to
v2.6.0 released on 2025-05-15. It's possible the old version was even older
than that but there is no version indicators in the code and I ran out of
patience identifying missing changes and only went back as far as v2.0.0.
There have been a large number of bug-fixes, optimizations, and improvements
between these versions. See the following for details;
https://github.com/libigl/libigl/releases
I retained the minimal custom `CMakeLists.txt`, added `README.md` from the
libigl distribution which identifies the version, and added a
README-OrcaSlicer.md that details the version and parts that have been
included.
* Update libslic3r for libigl v2.6.0 changes.
This updates libslic3r for all changes moving to eigen v5.0.1 and libigl
v2.6.0. Despite the large number of updates to both dependencies, no changes
were required for the eigen update, and only one change was required for the
libigl update.
For libigl, `igl::Hit` was changed to a template taking the Scalar type to
use. Previously it was hard-coded to `float`, so to minimize possible impact
I've updated all places it is used from `igl::Hit` to `igl::Hit<float>`.
* Add compiler option `-DNOMINMAX` for libigl with MSVC.
MSVC by default defines `min(()` and `max()` macros that break
`std::numeric_limits<>::max()`. The upstream cmake that we don't include
adds `-DNOMINMAX` for the libigl module when compiling with MSVC, so we need
to add the same thing here.
* Fix src/libslic3r/TriangleMeshDeal.cpp for the unmodified upstream libigl.
This fixes `TriangleMeshDeal.cpp` to work with the unmodified upstream
libigl v2.6.0. loop.{h,cpp} implementation.
This file and feature was added in PR "BBS Port: Mesh Subdivision" (#12150)
which included changes to `loop.{h,cpp}` in the old version of libigl. This PR
avoids modifying the included dependencies, and uses the updated upstream
versions of those files without any modifications, which requires fixing
TriangleMeshDeal.cpp to work with them.
In particular, the modifications made to `loop.{h,cpp}` included changing the
return type from void to bool, adding additional validation checking of the
input meshes, and returning false if they failed validation. These added
checks looked unnecessary and would only have caught problems if the input
mesh was very corrupt.
To make `TriangleMeshDeal.cpp` work without this built-in checking
functionality, I removed checking/handling of any `false` return value.
There was also a hell of a lot of redundant copying and casting back and forth
between float and double, so I cleaned that up. The input and output meshs use
floats for the vertexes, and there would be no accuracy benefits from casting
to and from doubles for the simple weighted average operations done by
igl::loop(). So this just uses `Eigen:Map` to use the original input mesh
vertex data directly without requiring any copy or casting.
* Move eigen from included `deps_src` to externaly fetched `deps`.
This copys what PrusaSlicer did and moved it from an included dependency under
`deps_src` to an externaly fetched dependency under `deps`. This requires
updating some `CMakeList.txt` configs and removing the old and obsolete
`cmake/modules/FindEigen3.cmake`. The details of when this was done in
PrusaSlicer and the followup fixes are at;
* 21116995d7
* https://github.com/prusa3d/PrusaSlicer/issues/13608
* https://github.com/prusa3d/PrusaSlicer/pull/13609
* e3c277b9ee
For some reason I don't fully understand this also required fixing
`src/slic3r/GUI/GUI_App.cpp` by adding `#include <boost/nowide/cstdio.hpp>` to
fix an `error: ‘remove’ is not a member of ‘boost::nowide'`. The main thing I
don't understand is how it worked before. Note that this include is in the
PrusaSlicer version of this file, but it also significantly deviates from what
is currently in OrcaSlicer in many other ways.
* Whups... I missed adding the deps/Eigen/Eigen.cmake file...
* Tidy some whitespace indenting in CMakeLists.txt.
* Ugh... tabs indenting needing fixes.
* Change the include order of deps/Eigen.
It turns out that although Boost includes some references to Eigen, Eigen also
includes some references to Boost for supporting some of it's additional
numeric types.
I don't think it matters much since we are not using these features, but I
think technically its more correct to say Eigen depends on Boost than the
other way around, so I've re-ordered them.
* Add source for Eigen 5.0.1 download to flatpak yml config.
* Add explicit `DEPENDS dep_Boost to deps/Eigen.
I missed this before. This ensures we don't rely on include orders to make
sure Boost is installed before we configure Eigen.
* Add `DEPENDS dep_Boost dep_GMP dep_MPFR` to deps/Eigen.
It turns out Eigen can also use GMP and MPFR for multi-precision and
multi-precision-rounded numeric types if they are available.
Again, I don't think we are using these so it doesn't really matter, but it is
technically correct and ensures they are there if we ever do need them.
* Fix deps DEPENDENCY ordering for GMP, MPFR, Eigen, and CGAL.
I think this is finally correct. Apparently CGAL also optionally depends on
Eigen, so the correct dependency order from lowest to highest is GMP, MPFR, Eigen, and CGAL.
---------
Co-authored-by: Donovan Baarda <dbaarda@google.com>
Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
On macOS, PopupWindow::OnMouseEvent2 synthesizes a wxEVT_ENTER_WINDOW on
`this` whenever the hovered target transitions from a child back to the
popup itself. wxPopupTransientWindow's OnIdle re-acquires mouse capture
once the cursor leaves the popup, so the next MOTION (with the cursor
already outside) hits OnMouseEvent2 with no child and synthesizes ENTER
on the popup — which would otherwise cancel the dismissal timer started
by OnLeaveWindow. Verify the cursor is actually inside before resetting.
* Base IS Machine
* Toggle line
* Rebase
* Intento 1
* Wiki IS
* Flavorized
* Tooltips
* Calibration using the same list
* max
* Reorder JD validation
* Refactor set input shaping
* Calibrations IS
* Default values
* Axis
* Orca comments
* Rename input_shaping_enable to input_shaping_emit
Refactor all references of the input shaping configuration option from 'input_shaping_enable' to 'input_shaping_emit' across the codebase. This improves clarity by better reflecting the option's purpose of controlling whether input shaping commands are emitted in the generated G-code.
Restore DONT EMIT FOR KLIPPER
* Refactor input shaping option toggling logic
Simplifies and consolidates the logic for toggling input shaping related options in TabPrinter::toggle_options(). Uses a loop to handle enabling/disabling lines based on GCode flavor compatibility, and refines the conditions for toggling individual options.
* Improve input shaping option toggling logic in TabPrinter
* GrayOut Emit to gcode limits for klipper
* Typo
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Typo
* Skip Y input-shaper when type is Disable
If marlin2 and disabled it will be already disabled at X.
* IS expert
Co-Authored-By: SoftFever <softfeverever@gmail.com>
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
Hovering a group item (e.g. "Generic" in the filament list) now opens
its submenu correctly. The dropdown stays usable while moving the
cursor between the parent list and the submenu, and dismisses normally
when the user clicks outside.
* K2 Plus: add print area bounding box for adaptive bed mesh
The K2 firmware reads MINX/MINY/MAXX/MAXY gcode comments to
determine the adaptive bed mesh area. Without these, it falls
back to full bed mesh even when calibration is enabled.
K2 Pro also reads these comments (its profiles already had them).
Signed-off-by: Igor Mammedov <niallain@gmail.com>
* K2: add print area bounding box for adaptive bed mesh
Same change as K2 Plus — prepend MINX/MINY/MAXX/MAXY gcode comments
so firmware can determine the adaptive bed mesh area.
K2 Pro already had these.
Signed-off-by: Igor Mammedov <niallain@gmail.com>
* Creality: bump profile version to 02.03.02.72
Signed-off-by: Igor Mammedov <niallain@gmail.com>
---------
Signed-off-by: Igor Mammedov <niallain@gmail.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Add Cubicon xCeler-Mini printer model and material profiles
- Add xCeler-Mini machine configuration and 0.4mm nozzle profile
- Add filament profiles for all Cubicon materials (PLA, PLA+, PLAi21, ABS, ABSk, ABS-A100, PETG, PC, PA-CF) for xCeler-Mini
- Add default process profile for xCeler-Mini 0.4mm nozzle
- Add xCeler-Mini cover image
- Update Cubicon.json to register xCeler-Mini machine, filaments, process, and machine list
- Update PA-CF and PLA base filament profiles (filament_max_volumetric_speed adjustment)
- Fix missed per-machine filament and process profiles for xCeler-I and xCeler-Plus
* fix format
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Fixed PrintConfig.hpp order so Repetier outputs, updated ConfigWizard to use gcode_flavor value rather than static
Add Repetier to enum values and labels
Update to add Repetier base profile to the setup wizard
Re-order gcode_flavors in PrintConfig.hpp and PrintConfig.cpp to match
Revise ConfigWizard.cpp to use gcode_flavor rather than list order
Add Repetier profiles and include in custom.json (profile disables m73 and stop emit machine limits which Repetier doesn't use)
* Fix JSON formatting in Custom.json
* Add support for pressure advance in Repetier flavor
* Add Repetier flavor show motion ability tab is visible
* Refactor jerk handling for Repetier flavor
* Update resources/profiles/Custom/machine/MyRepetier 0.4 nozzle.json
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update resources/profiles/Custom/machine/fdm_repetier_common.json
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update src/libslic3r/PrintConfig.cpp
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* add back localisation flag for Klipper
* tidy up indentation and braces
* Space indentation for Repetier profiles changed to tab
* Fix space indentation in Custom.json file for Repetier profiles
---------
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
Warn for first and other layers big temperature delta
Warn user if temperature differences (first layer vs other layers) for nozzle and plates are above a certain delta.
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Fix support interface semantics and gap handling
Fix zero-gap interface detection and gap initialization for supports and raft.
Ensures correct top/bottom contact semantics and avoids relying on default zero gaps.
* Additional fixes and robustness improvements
Fix incorrect coupling between top and bottom support interface spacing and density, ensuring bottom interfaces use their own parameters for smoothing and toolpath generation.
Restore correct bottom interface generation for organic (tree) supports when a non-zero bottom Z gap is used, and preserve contacts even when base polygons are empty.
Improve robustness of organic support slicing by fixing layer index drift and guarding against degenerate polygon boolean operations.
* Typo and semantics fix
differnt_support_interface_filament -> different_support_interface_filament
soluble -> zero_top_z_gap
* Fix non organic tree bottom support interface generation
Slim tree bottom interface layer numbers were capped by the object's layer number beneath it.
Fixed by refactoring the generation algorithm.
* Fix non organic tree interlaced support generation
Deterministic local interlaced support layers generation for non-organic tree support
* Enable support interface multimaterial for non organic tree
Enables mixed-material support interface behavior for non organic tree support type.
* Fix tree support interface layer counts and contact handling
- Correct non‑organic tree top interface layer budgeting so gaps don’t consume a layer (N stays N).
- Remove the extra roof interface pass that was duplicating the 2nd layer.
- Organic tree: use only the lowest contact footprint and avoid extra bottom‑contact extrusion so interface count matches the user setting.
* Bugfixes (a lot)
Many, many bugs fixed, majority edge-case but still not playing by the rule.
Some of them:
- on multilevel base, on very small level variations the support was capped to the topmost level height
- non-organic tree had gaps for supports in a multilevel base situiation
- independent support layer height had issues with support interfaces (base support beneath bottom interface, top contact layer sometimes missing)
- organic tree had issues with small variation multi-level base
- organic tree support with zero top Z distance could overlap support-material and interface-material paths when separate materials were used
- many, many others (I lost track of them)
Fix "Jump to" links opening wrong preset type
Fixes an issue where notification "Jump to" links always assumed the target setting belongs to the Print preset.
Resolve the correct preset type for each option before jumping to it, and only switch to object settings when the target is a Print preset.
Result: links now correctly open the intended setting across all preset types.
* Make filament compatibility temperature-aware
Extend filament compatibility checks to consider actual nozzle temperatures and temperature ranges.
Print::check_multi_filaments_compatibility now accepts nozzle temperatures and range lows/highs; it resolves missing ranges from material defaults, computes per-filament effective temperatures, and checks pairwise compatibility (including high/low/mid mixed cases).
Updated callers in Print::check_multi_filament_valid and CalibrationWizardPresetPage to pass nozzle settings, consolidated user-facing warning strings, and fixed extruder index handling and minor logic/path improvements.
Clarify incompatible nozzle temperature warnings
* Update Print.cpp
* Remove json usage
* Reduce messages
* 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
* Disable arc fitting by default on BBL P2S
* Update BBL P2S printer profile
* bump the version so that it automatically update the cache
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Add safety checks and add logic to avoid creating degenerate polygons in contour_extrusion_path
* fix comment
* fix(zaa): cast from slice_z upward only, guard normal on miss
* remove old code
---------
Co-authored-by: Aleksandr Dobkin <alex@dobk.in>
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
* fix: manual filament change not emitting MANUAL_TOOL_CHANGE for BBL printers
BBL-specific M1020 S handling in toolchange() bypassed toolchange_prefix(),so manual_filament_change had no effect — M1020 was always emitted regardless of the setting. Move the BBL logic into toolchange_prefix() so all callers respect the option consistently.
Fixes#11795
* add comment
Fix Ender-3 V3 KE nozzle switching by adding printer_variant
The four Creality Ender-3 V3 KE 0.X nozzle profiles were missing the
printer_variant key, so OrcaSlicer could not map a UI nozzle selection
to a specific profile and reverted every choice to 0.2mm. Add the
matching printer_variant to each, following the CR-10 SE / K1C pattern.
Introduce an 'indentation_check' job step to .github/workflows/check_profiles.yml that validates profile JSON files under resources/profiles use tab-only indentation (1 tab per level). The step runs an inline Python check, emits a log (indentation_check.log) with errors and a fix tip, and exits non‑zero on violations. Workflow conditionals for preparing the PR comment artifact, uploading the artifact, and failing the job were updated to include the new step so indentation failures are reported alongside other profile validation failures.
Fix extrusion of some support layers at wrong Z height
Fixes the issue that PR #12736 (github.com/OrcaSlicer/OrcaSlicer/pull/12736) reverted the changes of PR #13327 (github.com/OrcaSlicer/OrcaSlicer/pull/13327)
# Description
With this change, builds on ARM64 hosts will successfully kick off!
Unfortunately there are still missing/outdated dependencies, so the
build doesn't yet succeed. This makes it much easier to check what we're
failing on though.
I've also added the processor/arch to "Unknown X" error messages for
easier debugging.
Follow-up to #10183
Affects #5783
# Screenshots/Recordings/Graphs
N/A
## Tests
Kicked off `build_release_vs.bat` on my Windows ARM machine. Observed
progress in the build process!
<!--
> A guide for users on how to download the artifacts from this PR.
-->
[How to Download Pull Requests Artifacts for
Testing](https://www.orcaslicer.com/wiki/how_to_download_pr_artifacts)
This PR supersedes #12225, which originally proposed this feature but
appears inactive.
The feature originated from work I developed earlier in
[BambuStudio-ZAA](https://github.com/adob/BambuStudio-ZAA), a private
fork of Bambu Studio
Compared to #12225, I updated the implementation for current upstream
and fixed the following issues:
- fixed broken tests
- removed references to nonplanar directory
Reviewers may want to compare against #12225 for earlier
discussion/context.
## Summary
Port of **Z Anti-Aliasing (ZAA)** from
[BambuStudio-ZAA](https://github.com/adob/BambuStudio-ZAA) to
OrcaSlicer.
ZAA eliminates visible stair-stepping on curved and sloped top surfaces
by raycasting each extrusion point against the original 3D mesh and
micro-adjusting its Z height to follow the actual surface geometry. The
result is visibly smoother domes, chamfers, and shallow slopes — without
post-processing.
## How It Works
1. The slicer runs normally, then a **posContouring** step processes
each layer
2. `ContourZ.cpp` raycasts every extrusion point vertically against the
source mesh
3. Each point's Z is adjusted to the mesh intersection, converting flat
`Polyline` paths into `Polyline3` paths with per-point Z coordinates
4. The G-code writer emits the adjusted Z values, so the printer follows
the true surface
## Configuration
Five new settings under **Print Settings > Quality**:
| Setting | Type | Default | Description |
|---------|------|---------|-------------|
| `zaa_enabled` | bool | off | Master enable/disable switch |
| `zaa_min_z` | float | 0.06 mm | Minimum Z layer height; controls
slicing plane offset |
| `zaa_minimize_perimeter_height` | float | 35° | Reduce perimeter
heights on slopes below this angle (0 = disabled) |
| `zaa_dont_alternate_fill_direction` | bool | off | Keep fill direction
consistent instead of alternating |
| `zaa_region_disable` | bool | off | Disable ZAA for a specific print
region/material |
## Key Changes
- **Core algorithm**: New `src/libslic3r/ContourZ.cpp` (~330 lines) —
raycasting engine
- **3D geometry**: `Point3`, `Line3`, `Polyline3`, `MultiPoint3` extend
existing 2D types
- **Arc fitting**: Templated to work with both 2D and 3D geometry
- **Pipeline**: `ExtrusionPath::polyline` changed from `Polyline` to
`Polyline3`; new `posContouring` step in `PrintObject.cpp`
- **G-code**: `GCode.cpp` writes per-point Z when `path.z_contoured` is
set
- **UI**: ZAA settings exposed in Print Settings > Quality panel
- **Documentation**: `docs/ZAA.md` with usage and implementation details
57 files changed, ~1800 insertions, ~200 deletions.
## Test Plan
- [ ] Load a model with curved top surfaces (sphere, dome, chamfered
box)
- [ ] Enable **Z contouring** in Print Settings > Quality
- [ ] Slice and verify G-code has varying Z values within contoured
layers
- [ ] Build on macOS (verified), test on Linux and Windows
* 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
With this change, builds on ARM64 hosts will successfully kick off!
Unfortunately there are still missing/outdated dependencies, so the build doesn't yet succeed. This makes it much easier to check what we're failing on though.
Fix fan speed staying high
When fan speed-up time is enabled, layers can inherit a higher fan speed than intended.
If a layer ended with a role-driven fan change, the last applied fan speed
was not properly tracked. As a result, the next layer could start with an
incorrect fan state and keep the higher speed until another fan command
overrode it.
Ensure the emitted fan speed is always tracked correctly, including when
flushing buffered commands at the end of a layer.
The X1C's RTSPS server emits unreliable decode timestamps (wildly
non-monotonic jumps, sometimes none at all). The previous AVC1 path in
gstbambusrc forwarded sample.decode_time straight into the pipeline as
DTS, which made GStreamer's basesink wait for the pipeline clock to
catch up with timestamps that were thousands of seconds in the future,
freezing playback after a few seconds of streaming.
Replace the trust-the-printer approach with synthesized monotonic
timestamps, the same trick mpv uses when it reports "No video PTS!
Making something up.":
* stamp PTS = sttime + frame_count * period
* adapt period to the real inter-arrival rate via EWMA (the announced
frame_rate is also unreliable -- X1C reports 30 fps but delivers
~28 fps), keeping the synthesized timeline aligned with arrival
* apply a 100 ms lead so the sink has a small jitter buffer to
absorb the bursty 2-3-frames-then-gap delivery pattern of the
Bambu tunnel
* re-anchor only on large divergence (printer pause, stream resume,
fps change) instead of every few seconds
The MJPEG path was already wall-clock-stamping arrivals; this unifies
both formats on the same scheme.
Confirmed on an X1C in LAN-only mode (RTSPS) on Fedora 43; not tested
on P1/A1 hardware. Other Bambu printers share the same Linux source
and could see the same fix where their decode timestamps or announced
framerate are similarly unreliable, but that has not been verified.
No effect on Windows/macOS -- gstbambusrc.c is Linux-only. Trade-off
is +100 ms of camera-view latency, which is invisible for a print-
monitor use case.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Fix: Enable instance collision detection in GCode and Print clearance
Squashed commit containing:
- Fix gcode path conflict detection in ConflictChecker.cpp by iterating all instances.
- Improve clearance validation in Print.cpp by calculating convex hulls per instance (fixes scaling/mirroring issues).
- Added // Orca: comments to mark changes.
* Fix Wipe Tower G-code conflict detection for WipeTower2
* Fix: Improve object/instance selection for collision and validation warnings
- Updated validation logic in Print.cpp to report specific ModelInstance instead of ModelObject for collision/clearance warnings.
- Updated NotificationManager and Plater to handle ModelInstance selection in 'Jump to' links.
- Added fallback to object selection if specific instance cannot be selected.
- Included fixes for G-code conflict detection (ConflictChecker, GLCanvas3D) to also report instances.
- Improved GUI_ObjectList to update canvas selection when items are selected via API.
* Fix: Prevent crash when loading .3mf projects
Moved update_selections_on_canvas() out of ObjectList::select_items() to avoid premature UI updates during loading. Canvas updates are now explicitly called in NotificationManager and Plater callbacks where needed.
* Fix: Address code review comments
- Fix memory allocation for extrusion layers deep copy
- Remove unused variable in GLCanvas3D
- Fix string formatting crash risk in NotificationManager
- Remove dead code in Plater
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Elefant foot compensation for solid layers
Elefant foot compensation for solid layers above bottommost by infill density manipulation.
* Update Fill.cpp
* change the option to expert cat
* use is_approx for float
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
changes "Pen size" to "Brush size",
moves "On overhangs only" underneath "Brush Size" and rephrases as "On highlighted overhangs only" in all translations
Co-authored-by: Hanno Witzleb <hannowitzleb@gmail.com>
* feat: Add flow rate calibration pattern selector dialog
* feat: Integrate PR #11881 and improve Flow Rate Calibration Wizard
- Integrated PR #11881: Display layer duration in G-code viewer position window.
- Enhanced Flow Rate Calibration:
- Implemented a Wizard dialog (FlowRateCalibrationDialog) using DPIDialog for Dark Mode support.
- Restricted pattern selection to 'Archimedean Chords' and 'Monotonic'.
- Integrated logic to pass the selected pattern to the calibration generation.
* fix(UI): Refactor FlowRateCalibrationDialog to calib_dlg for macOS build fix and UI consistency
Moved FlowRateCalibrationDialog from MainFrame.cpp to calib_dlg.hpp/.cpp to resolve build errors on macOS. Updated UI to match Pressure Advance calibration dialog style (Dark Mode support, RadioGroups). Logic moved to dialog class.
* Update Wiki link for flow rate calibration
* ui: replace RadioGroup with BitmapComboBox for Flow Rate pattern selection
* fix(ui): use custom ComboBox widget for Flow Rate Calibration
Replaces wxBitmapComboBox with OrcaSlicer's custom ComboBox widget to fix rendering issues on Windows (empty selection) and compilation errors on Linux.
* Refactor: Cleanup unused includes and members in FlowRate calibration dialog
* Fix: Complete rename of Flow Rate to Flow ratio in calibration menus after merge
* Fix: Update Flow Rate to Flow Ratio in Calibration Dialog and Wiki Link
---------
Co-authored-by: yw4z <ywsyildiz@gmail.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
The OnText handler in ObjectTableDialog catches WXK_ESCAPE but swallows it. Invert the logic to call Close() on Esc, and pass anything else to evt.Skip().
While at it, fix a typo in the dialog's title.
* restructures text tool ui,
moves style selector over font,
moves reset buttons after settings,
matches style popup styling to font popup
* makes operation setting single-line
* makes "Advanced" button bigger, matching BambuStudio
---------
Co-authored-by: Hanno Witzleb <hannowitzleb@gmail.com>
refactors tooltipbutton,
one common implementation,
one common shortcut data structure,
add tooltip button to text gizmo,
consistent shortcut wording
Co-authored-by: Hanno Witzleb <hannowitzleb@gmail.com>
* reduces number of clicks to change filament in objectlist
* dont set minimum width in dropdown if use_content_width == true
---------
Co-authored-by: Hanno Witzleb <hannowitzleb@gmail.com>
Co-authored-by: yw4z <ywsyildiz@gmail.com>
restructure painting tools
place "On Overhangs only" checkbox under Overhand slider,
place "Vertical"/"Horizontal" checkboxes under pen size,
move some separators,
fix changing window width in MMUSegmentation,
show "Section View" slider for gap fill too
Co-authored-by: Hanno Witzleb <hannowitzleb@gmail.com>
* Add extrusion role change G-code options
Introduces new G-code options for handling extrusion role changes at the process and filament levels. Updates configuration, GUI, and GCode logic to support 'process_change_extrusion_role_gcode' and 'filament_change_extrusion_role_gcode', allowing custom G-code insertion when the extrusion role changes.
Co-Authored-By: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
* Optimize extrusion role-change gcode handling
Cache gcode template strings and current filament id, and guard creation of DynamicConfig/placeholder processing behind a check that at least one role-change gcode is non-empty. This avoids redundant config lookups and DynamicConfig/placeholder parsing when no custom role-change gcode is defined, improving clarity and performance without changing behavior.
---------
Co-authored-by: Rodrigo Faselli <162915171+RF47@users.noreply.github.com>
* Add nightly build reproducibility checkbox
Add a required checkbox to the bug report template prompting reporters to verify the issue is reproducible in the latest nightly build (links to the nightly builds release). This helps catch issues already fixed in nightly releases and reduces duplicate reports.
* Add PR artifact download guide to template
Update the pull request template to include a commented section and a link to the OrcaSlicer wiki explaining how to download artifacts from a PR. This helps contributors and reviewers locate and retrieve build/test artifacts for verification and testing.
* Using bbs versioning for bbs atributes
* Orca tags
* Bump SLIC3R version to match current BBS
* New import logic
* to_string_sf
* 2.3.2 No tagged
* Update comment
wxWidgets defines _UNICODE globally, which causes Catch2's
catch_main.cpp to provide wmain() instead of main(). This leads to
LNK2001 "unresolved external symbol main" for all test executables
when building with BUILD_TESTS=ON on MSVC.
Add DO_NOT_USE_WMAIN compile definition to Catch2WithMain target
so that Catch2 provides the standard main() entry point.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* WIP: benchmarking caching vs multi-thread parsing json
* stick to just caching, other functions does not seem to have any duplicate traversals
* Remove benchmarking code
* cleanup leftover code and clear cache when loading is done
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
Fix missing dirty marker for edited system printer presets
System printer presets did not display the modified (“*”) marker in the sidebar when edited. Unlike other preset types, printer presets use `printer_model` as their display label, bypassing the normal dirty-state formatting.
This patch prepends the modified suffix to the displayed name when the selected system printer preset is dirty, restoring consistent UI behavior across all preset types.
In some rare support edge cases, Orca could start extruding a new layer before moving to the correct Z height.
This happened when two support layers were generated back-to-back and the next layer started exactly where the previous one ended. In that situation, there was no movement that naturally updated the Z position first.
The code was clearing the “pending layer change” flag too early, so it lost track of the fact that a Z move was still required.
This change ensures that if a layer change is still pending, Orca will always move to the correct Z height before the first extrusion of that layer.
This guarantees that every layer starts at the correct height and fixes the missing / incorrect support layers seen in those edge cases.
Fix support preview artifacts caused by incorrect gap subdivision
Support generation could sometimes split a gap into too many steps,
even when it should fit exactly into a single layer.
This was most noticeable when max_suport_layer_height was equal to
the print layer height (e.g. 0.2 mm).
This resulted in incorrect support layering and visible artifacts
in preview.
The issue was caused by floating-point precision, where values that
should be equal to the configured limit were treated as slightly larger.
Fix by biasing the subdivision calculation with EPSILON so near-equal
values are not split into extra steps.
Applied consistently to:
- SupportMaterial (normal supports)
- TreeSupportCommon (tree stepping)
- TreeSupport (layer creation)
* Restore SVG/text→Support crash guard (#5070), disable change_part_type()
The crash fix from #5070 prevented converting SVG/text modifiers to Support
Blocker / Support Enforcer by hiding those entries in the old SingleChoiceDialog
opened from ObjectList::change_part_type(). When the "Change type" UI was
reworked into a submenu that calls ObjectList::set_volume_type() directly, the
guard was left behind in the unused change_part_type() path -- the submenu path
had no protection, silently reintroducing the #5070 crash on the submenu route
(ModelVolume::set_type() does not clear text_configuration / emboss_shape, so
the stale emboss state stays attached to a support volume).
- Guard set_volume_type(): reject SUPPORT_BLOCKER / SUPPORT_ENFORCER when any
selected volume is SVG or text, showing the same error as before.
- Wrap ObjectList::change_part_type() in #if 0 instead of deleting it: the
function is unused since the submenu rework, but keeping it in commented-out
form preserves traceability with upstream Bambu Studio (avoids merge
conflicts on each BBL sync). Suggested by RF47, confirmed by ianalexis.
* Log instead of showing user error; action guard is defense-in-depth only
Per review feedback from RF47: with the UI-side guard in #13120, the
set_volume_type() action-time check is a pure safety net -- a healthy UI
should never let the user reach it. Showing a modal error dialog would
therefore either confuse a user who did nothing wrong (if the UI guard
is bypassed by a future refactor/plugin/shortcut) or be dead code at
runtime. Log the event for developers instead, keep the early return so
the crash is still prevented.
Adjust initial- and slowdown-layer speed logic to correctly account for raft layers. Replace the previous layer checks with object_layer_over_raft(), simplify initial-layer speed selection, and split the slow_down_layers interpolation into separate branches for configurations with and without rafts so the lerp uses the correct layer offset. Also avoid applying overhang speed adjustments to object layers that are over rafts.
# Description
This commit adds the enhancement of https://github.com/OrcaSlicer/OrcaSlicer/issues/13116
- Adds checkboxes to enable or disable the fan speed override during print or after printing is completed. This allows users to, for example, only override the fan speed during printing whilst leaving the fan speed as is set in the machine gcode at the end.
- Two new flags are added for this: `activate_air_filtration_during_print[extruder]` and `activate_air_filtration_on_completion[extruder]`. These can be used to more finely control machine gcode
- Current filament settings remain as they are: `activate_air_filtration[extruder]` settings are unaffected and by default both new flags are set to true, ensuring the same set behavior as before.
# Screenshots/Recordings/Graphs
<img width="856" height="208" alt="Screenshot From 2026-04-09 18-57-14" src="https://github.com/user-attachments/assets/e71e7de3-2def-4046-b5dc-55bf3b516ce5" />
As you can see there are now checkboxes left of the fan speeds. They have their own tooltip too, which also helps identify the correct flags for users who want to adjust their machine gcode.
## Tests
I have thoroughly tested this on my own computer (CachyOS) and on my printer. I have also carefully checked the gcode in every possible state this is in and ensured that the unsaved changes dialog properly displays the labels for these settings. Flags are set properly, sliced files properly use the flags if you check for them in machine gcode and default behavior is unaffected for those who have already changed settings for air filtration. From what I can see, this does exactly what it should be doing without any issues.
* make initial layer travel move acceleration and jerk configurable
* Update spelling to match UI pattern
* Update min integer and re-order to match patterns
---------
Co-authored-by: Thomas Scheiblauer <tom@sharkbay.at>
Co-authored-by: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com>
* deps: Use CMAKE_BUILD_PARALLEL_LEVEL for dependency builds.
If set when initial CMake is run, don't hard-code the number of CPUs for all the
recursive child builds.
* build_linux: Pass -j1 for dependency build.
This is recommended by the comment at the top of deps/CMakeLists.txt, and makes
sense as the recursive build steps will pick up
CMAKE_BUILD_PARALLEL_LEVEL (otherwise the number of parallel jobs is squared).
# Description
- Changing the filament name from Z-Bolt PLA (ABS, ABS HT, PETG, PA) to Generic PLA @Z-Bolt (etc);
- Increased size of g-code thumbnails for S800 Dual and S1000/S1000 Dual;
- The profile structure has been optimized to reduce the variety of profiles for each printer model;
- Extruder temperatures for all filaments have been increased for hardened steel nozzles;
- New process profiles have been added for the 0.6mm nozzle (0.16mm High Quality and 0.20mm High Quality);
- Disabling multicolor printing for single-head printers;
- The "_BEFORE_LAYER_CHANGE" and "_AFTER_LAYER_CHANGE" macros have been added to printer profiles.
<!--
> Please provide a summary of the changes made in this PR. Include details such as:
> * What issue does this PR address or fix?
> * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be considered?
-->
# Screenshots/Recordings/Graphs
<img width="762" height="257" alt="изображение" src="https://github.com/user-attachments/assets/b5c2ef09-343f-47e8-adb5-fcf682866882" />
<img width="731" height="361" alt="изображение" src="https://github.com/user-attachments/assets/b3259fed-7698-4ab2-89d7-b6b00d974b02" />
<img width="736" height="889" alt="изображение" src="https://github.com/user-attachments/assets/be79822a-da82-4715-a5c0-c393f0cb98b7" />
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
OrcaSlicer_profile_validator.py
<img width="1053" height="84" alt="изображение" src="https://github.com/user-attachments/assets/a3427a51-e77f-40f3-a7b4-efbd62992290" />
check_profiles.yml
<img width="2203" height="681" alt="изображение" src="https://github.com/user-attachments/assets/994d0423-660a-4e0e-be4f-4b1c72b653f3" />
orca_extra_profile_check.py
<img width="1024" height="142" alt="изображение" src="https://github.com/user-attachments/assets/ddd8e3bf-b845-48fc-b736-ca80c138ce64" />
<!--
> Please describe the tests that you have conducted to verify the changes made in this PR.
-->
Fix segfault in CLI mode when extruder/filament options absent
When slicing via CLI (--slice) with a BBL printer profile such as the
P1S, update_values_to_printer_extruders and
update_values_to_printer_extruders_for_multiple_filaments dereference
option pointers without checking for nullptr first, causing a SIGSEGV.
Root cause: printer profiles that have different_extruder=true (e.g.
P1S variants) trigger these code paths even in single-extruder CLI
invocations where filament_map, extruder_type, and nozzle_volume_type
options may not be present in the resolved config.
Fix: add null guards before dereferencing option<> / dynamic_cast<>
results, consistent with the pattern used in PR #12719. Log a warning
and return early rather than crashing.
Fixes CLI --slice segfault (exit 139) with P1S profiles.
Related: #12426, #12719
# Description
<!--
> Please provide a summary of the changes made in this PR. Include details such as:
> * What issue does this PR address or fix?
> * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be considered?
-->
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the changes made in this PR.
-->
Reduce the size of current and new JSONs by standardising them with 1 tab indentation instead of 4 spaces.
This effectively reduces the size by almost 20 MB.
| Current | New |
|---|---|
| 85.2 Mib | 67 Mib |
Used [JQ](https://jqlang.org/) `--tab` to automatically format every current JSON.
> [!NOTE]
> Some profiles had the arrays on the same line, but those created by Orca were in the standard format (each object below the previous one). In some cases, this increases the number of tabs due to the new lines, but the increase is negligible, and this way both the base profiles and those created by Orca maintain the same style.
* identified code for snapping to buidlplate
* rename internal name to ensure_on_bed to be consistent, saves option in 2mf, finish Move UI, use in both ensure_on_bed() functions
* makes auto_drop a per-object setting, removes global setting
* remove adUndef, add auto_drop to constructor/serialize
* fixes drop() button
* add "auto_drop" checkmark to "load as single object" dialog,
nothing changes if auto_drop == yes || "load as single object",
if auto_drop == false and "load as single object" == false the objects now retain their relative position to each other
* retains auto_drop (and printable) state when assembling or splitting objects,
adds ObjectList::printable_state_changed() overload to be able to only provide ModelObject* vector
* adds dialog when splitting to ask if auto_drop should be disabled,
only shows when auto_drop enabled and atleast one volume floating
* adds arrow indicator on bounding box if auto_drop == false
* removes unneeded code, keeps "auto_drop" naming consistent
* makes for loop simpler in set_printable, set_auto_drop and get_auto_drop,
makes get_auto_drop const,
fixes wording in Snapshot text
---------
Co-authored-by: Hanno Witzleb <hannowitzleb@gmail.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
* Add runtime display backend detection for Wayland support
Add LinuxDisplayBackend utility to detect X11 vs Wayland at runtime
using GDK_IS_X11_DISPLAY / GDK_IS_WAYLAND_DISPLAY macros. This is
the foundation for removing the forced GDK_BACKEND=x11 and enabling
native Wayland support.
- New files: LinuxDisplayBackend.hpp/.cpp with get_linux_display_backend(),
is_running_on_wayland(), and is_running_on_x11()
- Propagate wxHAVE_GDK_X11 / wxHAVE_GDK_WAYLAND from FindGTK3.cmake
as compile definitions to libslic3r_gui
- No-op on non-Linux platforms (returns Unknown / false)
* Fix Phase 1 code quality: pragma once, source ordering, static cache
* Make X11 initialization conditional for Wayland support
Remove the unconditional GDK_BACKEND=x11 force that blocked native
Wayland. Replace with conditional logic:
- EGL safety fallback: re-force X11 only when wxUSE_GLCANVAS_EGL is
off and WAYLAND_DISPLAY is set, with a warning log
- XInitThreads() only called when DISPLAY is set (X11 in use)
- __GLX_VENDOR_LIBRARY_NAME only set when DISPLAY is present (GLX-specific)
- WEBKIT_DISABLE_COMPOSITING_MODE only set under XWayland (both
DISPLAY and WAYLAND_DISPLAY present)
- Guard X11/Xlib.h include with __has_include for robustness
- Restore display validation to accept either DISPLAY or WAYLAND_DISPLAY
This is Phase 2 of the Wayland support plan.
* Fix Phase 2: safer EGL macro check, add clarifying comments
* Add GLAD2 library and replace GLEW linkage in build system
Set up GLAD2 as a static library to replace GLEW for OpenGL loading.
GLAD2 supports both GLX and EGL, which is required for Wayland support.
- Create src/glad/ with pre-generated GLAD2 sources (GL 4.6 compat)
- Add src/glad/CMakeLists.txt building glad as a static library
- Wire glad into src/CMakeLists.txt before libvgcode
- Modify libvgcode to use shared glad for GL path (keeps local copy
only for GLES2/Emscripten) to avoid duplicate symbol conflicts
- Replace GLEW::GLEW with glad in libslic3r_gui link libraries
Note: GLEW is kept in deps for OpenCSG. Code migration from GL/glew.h
to glad/gl.h headers will follow in Phase 3B+3C.
* Fix Phase 3A+3D: libvgcode GLAD include, dead files, dlopen dep, OpenGL link var
* Migrate from GLEW to GLAD: replace headers and API calls across codebase
Replace all #include <GL/glew.h> with <glad/gl.h> across 49 source files.
Migrate GLEW API calls to GLAD equivalents:
- glewInit/glewExperimental -> gladLoaderLoadGL()
- GLEW_EXT_* / GLEW_ARB_* extension checks -> GLAD_GL_EXT_* / GLAD_GL_ARB_*
- Remove GLEW-specific EGL/GLX mismatch #error guards (not needed with GLAD)
- Replace unavailable EXT symbols with core GL equivalents in
GLCanvas3D.cpp (GL_MAX_SAMPLES, glRenderbufferStorageMultisample,
glBlitFramebuffer, GL_READ/DRAW_FRAMEBUFFER)
- Update log messages from glewInit to gladLoadGL
* Fix Phase 3B+3C: remove GLEW find, clean EXT symbols, update attribution
- Remove find_package(GLEW) block from root CMakeLists.txt since GLEW
is no longer linked by any main application code
- Remove "glew" from SLIC3R_STATIC option description
- Replace all remaining EXT framebuffer symbols with core equivalents
in render_thumbnail_framebuffer_ext and _rectangular_selection_picking_pass
- Update AboutDialog credits from GLEW to GLAD
* Enable EGL in wxWidgets and add runtime GLX/EGL selection for Wayland
- Set wxUSE_GLCANVAS_EGL=ON in wxWidgets build and Flatpak manifest
- Add PreferGLX() call on X11 sessions for driver compatibility
- Remove Phase 2 safety fallback (EGL is now always compiled in)
- Guard SwapBuffers against hidden canvases to prevent Wayland stalls
* Fix Phase 4: move PreferGLX to app startup, fix FPS counter guard
Move wxGLCanvas::PreferGLX() from OpenGLManager::create_wxglcanvas()
(static initializer) to GUI_App::on_init_inner() before any wxGLCanvas
is constructed. This prevents a race where SkipPartCanvas could trigger
wxGLBackend::Init() before the GLX preference is set. The new location
also adds explicit is_running_on_wayland() detection with a warning for
unknown backends.
Move increment_fps_counter() inside the IsShownOnScreen() guard so FPS
is only counted when a frame is actually swapped.
* Update GLFW from 3.3.7 to 3.4 for runtime Wayland/X11 backend selection
Replace the compile-time GLFW_USE_WAYLAND flag (which locked to a single
backend) with GLFW 3.4's GLFW_BUILD_WAYLAND + GLFW_BUILD_X11 flags that
build both backends and auto-select at runtime based on the available
display server. This enables the CLI thumbnail renderer to work on both
Wayland and X11 sessions without separate builds.
* wayland: Fix UI call sites that rely on global screen coordinates
On Wayland, wxGetMousePosition() returns (0,0) and SetPosition() is a
no-op for top-level windows. Fix the highest-impact call sites:
- GLCanvas3D: Use cached m_mouse.position from event handlers instead
of wxGetMousePosition() + ScreenToClient() in get_local_mouse_position()
- Plater: Use event-relative coords via ClientToScreen(e.GetPosition())
instead of wxGetMousePosition() in 3 leave-window handlers
- BBLTopbar: Use event.GetPosition() and FindToolByPosition() directly
in mouse handlers instead of wxGetMousePosition()/FindToolByCurrentPosition()
- Search: Use focus-based dismiss logic on Wayland instead of
wxGetMousePosition()-based rect checks in SearchDialog and
SearchObjectDialog
- GUI_App: Skip SetPosition() in window_pos_restore() on Wayland where
it is a no-op; still restore size and maximize state
- Button: Position tooltip relative to button widget via ClientToScreen
instead of wxGetMousePosition()
* Fix SearchDialog Wayland dismiss: guard against search_line focus
* flatpak: Add Wayland socket permission for native Wayland support
* spec
* Fix crash on Wayland when wxWidgets lacks EGL support
Restore the safety fallback that forces GDK_BACKEND=x11 when wxWidgets
was not built with wxUSE_GLCANVAS_EGL=ON. Without this, the GLX backend
tries to access a non-existent X11 display on native Wayland, crashing
in wxGLCanvas::IsDisplaySupported() with SIGSEGV at offset 0xe4.
Also add a defense-in-depth guard in detect_multisample() that skips
the IsDisplaySupported call entirely on Wayland without EGL.
Root cause: deps/wxWidgets must be rebuilt after enabling EGL. The
compile-time check in OrcaSlicer.cpp detects the mismatch and falls
back safely.
* Fix EGL detection: use wxHAS_EGL instead of wxUSE_GLCANVAS_EGL
wxUSE_GLCANVAS_EGL is a CMake build option, NOT a C++ preprocessor
macro. The actual macro defined in wxWidgets setup.h is wxHAS_EGL.
All compile-time EGL checks were using the wrong macro, causing
the safety fallback to always trigger even with a properly built
EGL-enabled wxWidgets.
* Fix GL function pointers invalidated on Wayland/EGL
gladLoaderLoadGL() dlopen's libGL.so.1 to resolve GL function pointers
via dlsym, then immediately dlclose's the handle. On X11/GLX this is
fine because the GLX context keeps libGL.so mapped. On Wayland/EGL,
nothing else holds libGL.so open, so dlclose unmaps it and all function
pointers become dangling — causing SIGSEGV on the first GL call.
Fix: on Wayland, use gladLoadGL(eglGetProcAddress) which resolves
function pointers through the EGL loader without opening/closing
libGL.so.
* fix crash on start and various rendering issues
* fix crash on close
* small refactor
* move GPU selection to desktop file
* clean up a bit
* clean up more
* fix appimage error
- add a new mode to build in docker
- Improve AppImage
1. fix libbz2 soname differeence issue on appimage
2. Downgrade to 22.04 for better compatibility
3. improve appimage overall
Bump GitHub Actions action versions
Update workflow action versions: upgrade geekyeggo/delete-artifact from v5 to v6 and microsoft/setup-msbuild from v2 to v3 across .github/workflows/build_all.yml, build_deps.yml, and build_orca.yml. This brings workflows to newer action releases for compatibility and fixes.
* Updated profile to match latest officlal BBL tweaks
Updated the profile for the P2S with several changes to match the latest machine gcode changes made by BBL:
- Added Ventobox support
- Added air purification at the end of the print. When exhaust fan controls are setup in the filament profile, this is skipped
- Disabled auxiliary_fan by default to fix the issue that it overrides auto cooling and heating managed by the printer. Enabling this in printer settings makes it behave as before if so desired
- Updated with other tweaks made by BBL
* Reverted one line in layer change code
Reverted one line in layer change gcode as it was causing issues and was bambu studio specific anyway. Filament change works exactly as expected now.
* Re-enabled soaking time
This was a personal change that sneaked in, but may be unwanted for other users who have been using Orca for this printer for a while.
* Fixed redundant homing command and moved enable input shaping up
Fixed some issues BBL made in their original startup code that executes one redundant homing command for people who disable ABL. Also moved up the enable input shaping command to make the startup sequence quieter.
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
## Summary
Adds proper system profiles for the **Anycubic Kobra Neo** with 0.4mm nozzle (stock Marlin firmware).
This replaces the profiles from #12341 which had several issues:
- All files had `"from": "User"` instead of `"from": "system"` — causing profile loading failures
- No `inherits` or `type` fields — broke the inheritance chain
- Klipper-only gcode (not stock firmware)
- No `Anycubic.json` index entries — printer never appeared in the UI
- Cover image was 382x600 instead of 240x240 (displayed squashed)
- Profiles were subsequently removed in #12889
### Files added/modified
| File | Description |
|------|-------------|
| `machine/Anycubic Kobra Neo.json` | Base machine model (220x220x250mm) |
| `machine/Anycubic Kobra Neo 0.4 nozzle.json` | 0.4mm nozzle variant, stock Marlin gcode |
| `process/0.12mm Detail @Anycubic Kobra Neo 0.4 nozzle.json` | Detail process profile |
| `process/0.16mm Standard @Anycubic Kobra Neo 0.4 nozzle.json` | Standard process profile |
| `process/0.20mm Standard @Anycubic Kobra Neo 0.4 nozzle.json` | Standard process profile |
| `process/0.28mm Standard @Anycubic Kobra Neo 0.4 nozzle.json` | Standard process profile |
| `filament/Anycubic PLA @Anycubic Kobra Neo 0.4 nozzle.json` | PLA filament profile |
| `Anycubic Kobra Neo_cover.png` | Resized to 240x240 |
| `Anycubic.json` | Added index entries for all new profiles |
### Approach
- Based on the working **Anycubic Kobra 2 Neo** profiles (similar hardware — direct drive, 220x220 bed)
- Start gcode uses `G29` for auto bed leveling (stock Kobra Neo probes fresh each print)
- Profiles use proper `"from": "system"` and `"inherits": "fdm_machine_common"` / `"fdm_process_common"` chains
- Buildplate model and texture from #12341 are already in the repo
### Testing
- Verified profiles load correctly in OrcaSlicer 2.3.2 (no errors in log)
- Printer appears in Printer Selection dialog with correct 240x240 cover image
- Process/filament presets appear when printer is selected
- **Note:** Start/end gcode adapted from Kobra 2 Neo for stock Marlin — testing on stock firmware by Kobra Neo owners would be appreciated
Closes the gap left by #12341 and #12889.
* Fix crash-inconsistent draft shield
* Skip empty skirt G-code and fix skirt_done handling
Track whether a skirt was actually generated for the current print Z and avoid appending empty skirt G-code. Only pop m_skirt_done when a skirt was emitted to prevent corrupting skirt state across multiple instances per layer. Also use a temporary string (moved into the main gcode) to detect emptiness before updating state. Preserves existing first-layer clearing behavior.
* Union ex brims
Revert "Union ex brims"
This reverts commit bbc9a39faf318dc2df093eb2bdcebf19a4162fe9.
Update Brim.cpp
* dont repeat paths
* Update Brim.cpp
* multimaterial brim independiente
* Normal brim if is by object
* fix print order
* cleaning 1
* cleaning 2
* Normal brim if multimaterial on first layer
* fix artifact
* combine_brim optional
refactoring
* refactoring gcode.cpp
* refactoring brim.cpp
Update Brim.cpp
* Remove multimaterial first-layer check for brims
Stop detecting extruders used on the first layer and remove the is_multimaterial_first_layer guard. Simplify can_combine_brims to only consider combine_brims and whether printing is ByObject, allowing brims to be combined across extruders unless printing by object or combine_brims is disabled. Cleans up unused code and simplifies brim-generation conditions.
* Remove material specification from unified brim comment
* Update PrintConfig.cpp
* Fix return from assembly linux
* Tie deferred callback to canvas lifetime and add shutdown guards
Use m_canvas->CallAfter instead of wxGetApp().CallAfter to ensure the callback is only executed if the canvas is still alive.
Add early returns if wxGetApp().is_closing() is true before accessing plater or the 3D canvas, reducing the risk of use-after-free during application shutdown.
Addresses feedback regarding potential UI teardown race conditions.
* copilot suggestion
* Use local reference to wxGetApp() in Return button callback
Replace multiple calls to wxGetApp() with a single local reference
to improve readability and avoid redundant function calls.
* 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>
# Description
The Qidi Max 4 and Q2 don't report what they are via /server/info like
the other Qidi printers apparently do. This means that filament matching
is a fool's erand because you'll never actually match anything. this
adds a fallback where we just use the configured machine type. I'm not
sure why we wouldn't just do that all the time, but I wanted to change
as little as possible.
Here's the entirety of the `/server/info` output from a Qidi Max 4:
```
{
"result": {
"klippy_connected": true,
"klippy_state": "ready",
"components": [
"secrets",
"template",
"klippy_connection",
"jsonrpc",
"internal_transport",
"application",
"websockets",
"database",
"dbus_manager",
"file_manager",
"authorization",
"klippy_apis",
"shell_command",
"machine",
"data_store",
"proc_stats",
"job_state",
"job_queue",
"history",
"http_client",
"announcements",
"webcam",
"extensions",
"octoprint_compat",
"timelapse",
"frp_manager",
"mqtt"
],
"failed_components": [],
"registered_directories": [
"config",
"logs",
"gcodes",
"timelapse",
"timelapse_frames",
"config_examples",
"docs"
],
"warnings": [],
"websocket_count": 3,
"moonraker_version": "?",
"missing_klippy_requirements": [],
"api_version": [
1,
4,
0
],
"api_version_string": "1.4.0"
}
}
```
There's no machine name or hostname. This is also what the response
looks like from a Q2, including the exact same API version numbers, so
we cannot match on that either.
In GLCanvas3D::on_mouse, avoid calling SetFocus when the currently focused window is a text input control (wxTextCtrl, wxComboBox or wxSpinCtrl). This prevents deselection bugs when the mouse leaves the window while a text control is focused. Also commented out explicit wx text-control includes near the top of the file.
Only TextCtrl needed
cleaning
Removed unused wxWidgets header includes.
Update GLCanvas3D.cpp
Co-authored-by: yw4z <yw4z@outlook.com>
Co-authored-by: yw4z <ywsyildiz@gmail.com>
The Qidi Max 4 doesn't report that it's a Qidi Max 4 via /server/info
like the other Qidi printers apparently do. This means that filament
matching is a fool's erand because you'll never actually match anything.
this adds a fallback where we just use the configured machine type. I'm
not sure why we wouldn't just do that all the time, but I wanted to
change as little as possible.
Fix: generic locale fallback on all platforms when language is unavailable
Move the locale fallback chain out of the #ifdef __linux__ block so it
applies on macOS and Windows too. Add a base-language fallback step that
strips the region code (e.g. en_IL -> en) before trying the full
fallback chain (current locale, system, best, en_US, en_UK).
Previously, if wxLocale::IsAvailable() failed on non-Linux, the app
would show an error and exit. Now it gracefully falls back to a working
locale.
Co-authored-by: SoftFever <softfeverever@gmail.com>
# Description
Upgrade wxWidgets to the latest 3.3.2.
The wxWidgets team mentioned that while 3.3 is not labeled “stable,” it
is production-ready. It isn’t labeled “stable” only because it may
introduce breaking ABI/API changes. As Linux distros are moving to
Wayland, and given the number of fixes in wxWidgets to improve Wayland
support, it’s worth upgrading to 3.3.2 instead of staying on 3.2.x.
Note:
I didn’t switch the dark mode implementation to wxWidgets for two
reasons:
1. To avoid broader changes, since the current dark mode works well with
wxWidgets 3.3.2.
2. wxWidgets dark mode doesn’t support changing themes on the fly; it
requires an application restart for the change to take effect.
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
Commit ed88cbe removed `new WebViewWebKit` on macOS because wx 3.3
dropped the no-arg wxWebViewWebKit constructor, falling through to
wxWebView::New(). That bypassed the WebViewWebKit destructor that calls
RemoveScriptMessageHandler("wx"), reintroducing the WebKit teardown bug
the subclass was added to fix.
Restore the macOS-specific subclass path by adding a constructor that
forwards to the wx 3.3 wxWebViewConfiguration-based ctor.
wxWidgets 3.3.2 changed MSWGetStyle to add WS_CAPTION when
wxMINIMIZE_BOX/wxMAXIMIZE_BOX/wxCLOSE_BOX is set. This caused
DefWindowProc to subtract the caption height in WM_NCCALCSIZE for
maximized windows, shrinking the client area and creating a gap
above the taskbar.
Fix by handling WM_NCCALCSIZE for the maximized case explicitly
(strip only border overshoot, not caption) and removing the now
unnecessary wxEVT_MAXIMIZE workaround.
On Linux/GTK, CheckBox, RadioBox, and SwitchButton set their size to
exactly the bitmap size (18x18 or 16x16), but GTK's internal CSS padding
requires additional space, resulting in negative content width warnings.
Use GetBestSize() on GTK to account for theme padding.
wxWidgets 3.3 cmake install doesn't include private headers.
OrcaSlicer uses some private headers for accessibility support.
Add a post-install step to copy the private headers directory.
wxWidgets 3.3 bundles its own NanoSVG in bmpsvg.cpp, conflicting with
OrcaSlicer's bundled copy which includes the nsvgRasterizeXY extension.
Set wxUSE_NANOSVG=OFF in deps cmake to use OrcaSlicer's version only.
- Plater: use Add() instead of wxArrayString(size_t, wxString) ctor
- Search: change sep from std::wstring to wxString for concatenation
- SendMultiMachinePage: replace wxList::Node* with compatibility_iterator
(Node type removed in wx 3.3 with wxUSE_STD_CONTAINERS=ON)
- PhysicalPrinterDialog: disambiguate set_values() call with explicit
std::vector<std::string> (wxArrayString now also matches initializer list)
- Preferences: use ToStdString() instead of mb_str() for std::string comparison
- Plater: use wxString::FromUTF8() for wxArrayString constructor argument
In wx 3.3 with wxUSE_STD_CONTAINERS=ON, wxString is backed by
std::wstring, so direct concatenation of const char[] with
std::wstring or wxUniCharRef fails. Fix by splitting compound
concatenations into separate += operations on wxString, or by
wrapping the left operand in wxString() to use its operator+.
Files fixed:
- AuxiliaryDataViewModel.cpp: split "\\" + wxString/wstring chains
- AboutDialog.cpp: split std::string("\n") + wxUniCharRef
- Auxiliary.cpp: wrap dir.wstring() in wxString(), split "/" + wstring
In wxWidgets 3.3, wxBitmapComboBoxBase::OnAddBitmap changed its
parameter from const wxBitmap& to const wxBitmapBundle&, and m_bitmaps
was replaced by m_bitmapbundles. Update OnAddBitmap signature and
OnDrawItem to use wxBitmapBundle, extracting wxBitmap via
GetBitmap(GetDefaultSize()) where needed.
- Handle z contouring in variable speed flow when emitting GCode
- Add logic to restore nominnal z height for regular extrusions
- preserve z_contoured flag when splitting extrusion paths
- Wrap GetToolTipCtrl() call in GUI_App.cpp with #if wxVERSION_NUMBER < 3300
guard, as this API may not be accessible in wxWidgets 3.3. The dark tooltip
theming is cosmetic and non-critical.
- Add explicit #include <wx/utils.h> to 7 source files that use functions from
that header (wxGetMousePosition, wxLaunchDefaultBrowser, wxGetDisplaySize,
wxBell) but relied on transitive includes. This preempts breakage from
wxWidgets 3.3 reducing transitive includes.
Files with wx/utils.h added: BBLTopbar.cpp, CreatePresetsDialog.cpp,
CameraPopup.cpp, GLCanvas3D.cpp, GCodeViewer.cpp, GUI_ObjectList.cpp,
FilamentMapPanel.cpp.
Skipped BindDialog.cpp and FilamentPickerDialog.cpp as they already include
wx/wx.h which provides wx/utils.h transitively.
Part of wxWidgets 3.1.5 -> 3.3.2 upgrade.
In wxWidgets 3.3, wxWindow::Raise() no longer implies Show(). Add
explicit Show() before Raise() in two event handlers that activate the
main frame from another instance (load model, start download), and swap
the Show/Raise order in bring_instance_forward() so Show() precedes
Raise().
wxTRANSPARENT_WINDOW is removed in wxWidgets 3.3. Remove all 3
occurrences in MainFrame.cpp:
- ResizeEdgePanel constructor: already uses wxBG_STYLE_TRANSPARENT
via SetBackgroundStyle(), so the flag was redundant
- slice_panel and print_panel: drop the style parameter entirely
(defaults to 0)
wxWidgets 3.2+ asserts on invalid sizer flag combinations where
wxEXPAND (which fills the entire space in the secondary direction)
is combined with wxALIGN_* flags (which are meaningless when expanding).
Remove the conflicting wxALIGN_* flags from all 112 occurrences across
21 files, keeping wxEXPAND and any non-conflicting flags intact.
Since we now target wxWidgets 3.3, all wxCHECK_VERSION(3,1,N) checks
are always true. Remove the guards keeping only the true branches:
- I18N.hpp: Remove version guard around _wxGetTranslation_ctx macro
- ExtraRenderers.hpp, GUI_App.hpp: Simplify SUPPORTS_MARKUP to check
only wxUSE_MARKUP (version check always true)
- ConfigWizard.cpp: Remove manual wxArrayInt comparison fallback
- SendSystemInfoDialog.cpp: Simplify display scaling guard to _WIN32 only
- GUI_Utils.cpp: Remove IsDark() fallback using luma approximation
- wxinit.h: Remove legacy wxEVT_BUTTON and wxEVT_HTML_LINK_CLICKED
compat macros (these event names exist natively in wx 3.3)
wxWidgets 3.3 requires macOS 10.11+, making the 10.9.5-specific crash
workaround in OpenGLManager impossible to trigger. Remove:
- OSInfo struct and s_os_info static member from the header
- OS version recording in init_glcontext()
- Conditional wxGLContext deletion in the destructor (now always deletes)
- Unused #include <wx/platinfo.h>
The MacDarkMode.hpp include is retained as mac_max_scaling_factor() is
still used by GLInfo::get_max_tex_size().
wxWidgets 3.1+ accepts const argv arrays (const wchar_t* const* and
const char* const*) in wxExecute(), making the const_casts unnecessary.
Remove all 14 const_cast<char**>/const_cast<wchar_t**> wrappers around
wxExecute calls and their associated FIXME comments across GUI.cpp,
NotificationManager.cpp, and Downloader.cpp.
Remove scale_win_font() and scale_controls_fonts() functions along
with the #if !wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3) guard in
rescale(). Since wx >= 3.1.3 is now guaranteed, this code could
never execute and the functions had no other callers.
Since we now target wxWidgets 3.3, the custom DPI change event
workaround (DpiChangedEvent, EVT_DPI_CHANGED_SLICER,
register_win32_dpi_event) is dead code. wxWidgets 3.1.3+ provides
native wxEVT_DPI_CHANGED / wxDPIChangedEvent which is already
wired up in the "true" branch of the version guards.
Removes:
- DpiChangedEvent struct and EVT_DPI_CHANGED_SLICER declaration/definition
- register_win32_dpi_event() function and its call site
- All associated #if !wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3) guards
* Aktualisiere deutsche Übersetzungen in der i18n-Datei für bessere Klarheit und Konsistenz
* Update German localization for OrcaSlicer
- Improved translations for various messages, ensuring clarity and consistency.
- Corrected terminology for technical terms such as "flow ratio" and "emboss text object."
- Adjusted phrasing for better readability and grammatical accuracy.
- Removed redundant or unclear phrases to streamline user experience.
- Added new entries for warnings and notifications related to printer operations.
* typo
# Description
<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
> * What issue does this PR address or fix?
> * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
# Description
update cmake to 4.3.x version for better support of new build tools
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
# Description
We want to ignore everything on this path so that the build uses its own
dependencies rather than picking up, e.g., the wrong version of libpng
just because that's what someone has in their MacPorts.
This fixes https://github.com/OrcaSlicer/OrcaSlicer/issues/10460
## Tests
I confirmed that this patch fixes the build (`./build_release_macos.sh
-x`).
Defaults to ignore:
/opt/local (MacPorts)
/opt/homebrew (Homebrew on ARM)
/opt/local (Homebrew on x86)
We want to ignore these paths so any dependencies they might contain don't interfere with the build.
This fixes https://github.com/OrcaSlicer/OrcaSlicer/issues/10460
# Description
<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
> * What issue does this PR address or fix?
> * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
# Description
tweak some wipe tower related warnings to reduce confusion
1. Skip flushing volume validation for multi-tool printers
2. check precise_z_height and enable_prime_tower conflicts in print
validate
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
Flushing volumes only apply to SEMM and BBL printers. Multi-tool printers don't perform filament purging between tool changes, so the zero-volume warning was being incorrectly triggered.
# Description
Reverted PR #12191 and #12777 and added new fixes. This also resolves an
issue where, in some cases, the sliced result was immediately
invalidated after the first slicing.
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
# Description
Previously, wipe tower behavior was determined by the printer model.
In this PR, we introduced an option that lets users choose which wipe
tower type to use.
BBL printers remain hardcoded to Type 1. Qidi profiles default to Type
1.
This may be useful for users with a filament-cutter-based system
(similar to Bambu printers) who want to use similar configurations—they
can select the "Type 1" wipe tower. That said, Wipe Tower Type 2 is
generally recommended for all printers, whether they use a typical MMU
setup, a filament cutter, or a tool changer.
# Screenshots/Recordings/Graphs
<img width="1307" height="854" alt="Screenshot 2026-03-15 at 22 27 29"
src="https://github.com/user-attachments/assets/04bc5c42-88c4-458a-a933-a22f8408b6a8"
/>
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
The check_profiles workflow used gh pr comment directly, which fails for
fork PRs due to read-only GITHUB_TOKEN. Split into artifact upload +
workflow_run pattern so comments post with proper write permissions.
## FIXES
• Corrects area height on windows while using 125% and 175% scaling. it
shows scrollbar when it incorrectly set. i have used directly size of
combobox this time instead static number
## IMPROVEMENTS
• Removes restriction for restarting orca when setting changed
# Description
Add the localization/ directory to the Flatpak source list so
run_gettext.sh can compile .po files into .mo translations.
Replace LC_ALL=C.UTF-8 with LC_NUMERIC=C in the entrypoint script to
preserve the user's language settings while still preventing
decimal-separator parsing issues.
fixes#12714
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
Add the localization/ directory to the Flatpak source list so
run_gettext.sh can compile .po files into .mo translations.
Replace LC_ALL=C.UTF-8 with LC_NUMERIC=C in the entrypoint script
to preserve the user's language settings while still preventing
decimal-separator parsing issues.
# Description
This pull request fixes the bug where Orca Slicer enters an infinite
loop when a density of zero is introduced for the top layer solid infill
# Screenshots/Recordings/Graphs
<img width="2560" height="1392" alt="image"
src="https://github.com/user-attachments/assets/5bf5c220-a398-483f-9f69-63dadbc888af"
/>
Note: For bottom solid infill, this is not a problem because the minimum
density is 10%.
Makes sure all non-bbl printers go through the same filament reordering
code so custom filament sequence is properly handled, while skipping the
filament grouping part by mapping all filaments to group 0.
This is the same method used by BBL printer to calculate the optimal
filament grouping so should be robust.
Fix#12449Fix#12766
# Description
<!--
> Please provide a summary of the changes made in this PR. Include
details such as:
> * What issue does this PR address or fix?
> * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be
considered?
-->
Happy Hare now writes mmu lane data to the moonraker db similar to AFC,
so we can normalize to the one implementation. For now, i've just
re-ordered it so that the moonraker db is checked first. I want this
because I've actually updated the happy hare data to include more data
than we had access to via the "mmu" object. For happy hare we now have
access to vendor name, which we can eventually use to further fine tune
the auto-matched filament preset.
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
_n/a_
## Tests
<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->
# Description
Qidi printers run Klipper and we don't want arc fitting enabled for
these.
This is wrongly enabled in QidiStudio as well, likely where these
profiles originated.
With certain irrational beam interlocking parameters, it will take a few
minutes to complete the interlocking generation; even worse:
cancellation doesn't work once it started.
This PR fix that by adding cancellation check inside some of the most
time consuming loops so it can be stopped ASAP.
Also cherry picked a sanity check from
https://github.com/bambulab/BambuStudio/pull/9925 by @mpaperno. Thanks!
The following test project (which was modified from the upper PR by
@mpaperno) took me more than 90s to complete with 0.1mm beam width:
[Interloack-Test2.orca.3mf.txt](https://github.com/user-attachments/files/25975637/Interloack-Test2.orca.3mf.txt)
# Description
I was just building the project and checked out the CMakeLists to see if
there are some optional features I can disable to speed up compilation
and tripped on this chinese comment.
This just translates the comment to English for consistency
Previously, wipe tower behavior was determined by checking if the printer
was a QIDI vendor. This introduces a configurable enum (Type 1 / Type 2)
so any printer can select its wipe tower implementation. BBL printers
remain hardcoded to Type 1. Qidi profiles default to Type 1.
# Description
The wipe tower config position (wipe_tower_x/y) could be outside the plate boundary (e.g. default y=250 on a 200mm printer). No constraint was applied at slice time, so the tower was generated out-of-bounds.
issue reported in #12731
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the changes made in this PR.
-->
The wipe tower config position (wipe_tower_x/y) could be outside the
plate boundary (e.g. default y=250 on a 200mm printer). No constraint
was applied at slice time, so the tower was generated out-of-bounds.
Happy Hare now writes mmu lane data to the moonraker db similar to AFC, so we can normalize to the one implementation. For now, i've just re-ordered it so that the moonraker db is checked first. I want this because I've actually updated the happy hare data to include more data than we had access to via the "mmu" object. For happy hare we now have access to vendor name, which we can eventually use to further fine tune the auto-matched filament preset.
std::map::at() throws std::out_of_range when option.category or
"Basic information" is not present in the tab's category_icon_map,
crashing the app. Replace with a safe find()-based helper lambda
that falls back to an empty string (no icon) when the key is missing.
Add a guard that skips creating fill params for top surfaces when the configured density is less than or equal to zero. This avoids generating surface fills for zero/negative densities and prevents unnecessary processing or potential errors when top surface density is disabled.
In CLI mode, PartPlateList is constructed with a NULL plater pointer
(OrcaSlicer.cpp:3612). When set_shapes() calls PartPlate::set_shape(),
it unconditionally executes render data preparation code that
dereferences the null plater through calls like generate_print_polygon()
→ wxGetApp().plater(), causing a segmentation fault (exit code 139).
This adds a null check on m_plater in PartPlate::set_shape() to skip
the render-only code block that generates logo triangles, print/exclude
polygons, gridlines, icon vertices, and plate name textures.
These rendering operations are not needed in CLI mode and this change
has no impact on GUI mode where m_plater is always valid.
* Fix GIT_COMMIT_HASH not set in Flatpak builds
The env var check was gated inside the .git directory check, so
Flatpak builds (which exclude .git from the sandbox) always fell
back to "0000000". Lift the env var check to top level and inject
the commit hash into the Flatpak manifest via build-options.env.
* Switch Flatpak build to Clang/LLD via LLVM 21 SDK extension
- Add org.freedesktop.Sdk.Extension.llvm21
- Bump runtime to GNOME 49 (SDK 25.08) for llvm21 availability
* fix build errors and improving build speed for flatpak
* fxi more build errors
* Update error messages for GNOME Platform and SDK versions
The env var check was gated inside the .git directory check, so
Flatpak builds (which exclude .git from the sandbox) always fell
back to "0000000". Lift the env var check to top level and inject
the commit hash into the Flatpak manifest via build-options.env.
Fix hotkeys blocked in Prepare view when notification is shown
Restore SetFocus() in the GLCanvas3D mouse-entering handler so the
canvas reclaims wxWidget keyboard focus whenever the mouse enters it
(provided the main window is active). Without this, clicking a sidebar
control or a UI update triggered by slicing could leave the canvas
without focus, causing hotkeys like Tab to stop working until the user
clicked the canvas or dismissed the notification.
* optimize resize feature on Linux
* fix the black screen issue on app startup on Linux
* Fixed an issue that Filament Grouping dialog always popup on Linux
* Fix an issue that on Linux the project name or model file name was not displayed in title bar
* optimize resize feature on Linux
* fix the black screen issue on app startup on Linux
* Fixed an issue that Filament Grouping dialog always popup on Linux
# Description
Esthetic filaments such as wood-infused, matte and marble filaments will now be handled by the Snapmaker printer agent so that they could be matched to more appropriate print profiles instead of generic PLA.
When flush_multiplier is applied to flush_volumes_matrix values, the
result can be a decimal (e.g., 272 * 1.3 = 353.6). Some printer firmware
metadata parsers (notably Creality K2) crash when parsing decimal values
in flush_volumes_matrix, causing prints to get stuck at "File selected".
This fix rounds the multiplied values to integers, ensuring compatibility
with firmware that expects integer values in this field.
Fixes compatibility with Creality K2 and potentially other Klipper-based
printers that parse the CONFIG_BLOCK metadata.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude <noreply@anthropic.com>
# Description
<!--
> Please provide a summary of the changes made in this PR. Include details such as:
> * What issue does this PR address or fix?
> * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be considered?
-->
Added eSUN Filament PLA Basic, Marble, Matte to Orca Filament Library
<img width="811" height="331" alt="image" src="https://github.com/user-attachments/assets/5cda8b59-cd44-4e32-bae0-d08d2346dd39" />
## Tests
<!--
> Please describe the tests that you have conducted to verify the changes made in this PR.
-->
```
./OrcaSlicer_profile_validator -v eSUN
Total loaded vendors: 1
Validation completed successfully
```
Translation added
# Description
<!--
> Please provide a summary of the changes made in this PR. Include details such as:
> * What issue does this PR address or fix?
> * What new features or enhancements does this PR introduce?
> * Are there any breaking changes or dependencies that need to be considered?
-->
# Screenshots/Recordings/Graphs
<!--
> Please attach relevant screenshots to showcase the UI changes.
> Please attach images that can help explain the changes.
-->
## Tests
<!--
> Please describe the tests that you have conducted to verify the changes made in this PR.
-->
### Description
A couple of warning dialogs still used a caption containing "**BambuStudio warning**". It is a leftover from the original BambuStudio codebase.
### This PR
- removes the explicit caption so the dialogs use the standard application warning title instead.
### Result
- removes the remaining Bambu reference while keeping the visible behavior consistent with the rest of the UI.
- addresses point 1. of "New ports from Bambu Studio" section from #12684
### Screenshots
- **Before:**
<img width="1352" height="277" alt="image" src="https://github.com/user-attachments/assets/d107acaa-f159-496a-b14e-93cd149bf355" />
- **After:**
<img width="1356" height="278" alt="image" src="https://github.com/user-attachments/assets/e111b5b3-9b3e-4b13-b20d-f98e5173ea16" />
Added entry to wipingdialog.html css to prevent it from being overscrollable and its position fixed.
Added escape button to close dialog event on both javascript and webview events
JIRA-136
# Description
When using the Bambu H2D, users can use Filament Grouping, a button found next to the bed preview. When not on a H2D profile, the button is hidden. However, it remained usable, and clicking an empty space below all the buttons causes the dialog to appear.
This PR fixes that by adding a check before the button is registered.
Addresses point 9 (focusing on the 2nd bullet) in #12684
## Tests
Tried to click on the empty area right below the column of buttons (see the below images)
Made sure to have the H2D profile loaded as well, and checked that the dialog still opens for that printer.
H2D active
<img width="1635" height="949" alt="image" src="https://github.com/user-attachments/assets/da6fb03b-e3c8-4504-ac60-b96ecc6347dc" />
Area to click for the invisible button
<img width="935" height="788" alt="image" src="https://github.com/user-attachments/assets/1f001bcf-0224-4922-b5bf-47a95820e536" />
The WipeTower2 code path never called construct_mesh(), leaving
wipe_tower_mesh_data as std::nullopt. GCode export then dereferenced
it unconditionally, triggering an assertion failure / crash.
1. Dirty flags not showing for extruder options:
2. Crash when switching to non-first extruder tabs:
3. Modifying one extruder's parameter affects other extruders:
External spools (virtual trays) are not AMS slots and should not count
toward the firmware's 16-material limit. Fixes blocking error when using
4 AMS units (16 slots) plus an external spool (17 total).
Fixes#12135
extrude_to_xyz() unconditionally emitted Z on every extrusion move
via emit_xyz(), even when Z hadn't changed. With ZAA enabled, this
produced ~987K redundant Z coordinates (98.2% of all Z emissions),
causing 10-20% file bloat.
Now compares quantized Z values before and after, and only emits Z
when it actually differs at export precision (0.001mm). Reduces
ZAA gcode Z emissions from 1,038,468 to 50,022 while preserving
all legitimate contouring Z changes.
The split point was being prepended (append_before) to p1 instead of
appended, causing it to be placed at the start of the segment rather
than the end. This resulted in rogue extrusion jumps (stringing)
across the model during ZAA sloped extrusions.
Also adds missing append/append_before calls in the exact-point
(index != -1) branch, which previously lost the split point entirely.
- build.sh: Handles full lifecycle (deps, configure, incremental build)
with auto-detection of architecture, CMake 4.x compat, and preflight checks
- BUILD.md: Beginner-friendly walkthrough from zero (no Xcode, no Homebrew,
no git) to running OrcaSlicer.app
Port Z Anti-Aliasing from BambuStudio-ZAA (https://github.com/adob/BambuStudio-ZAA)
to OrcaSlicer. ZAA eliminates stair-stepping on curved and sloped top surfaces
by raycasting each extrusion point against the original 3D mesh and micro-adjusting
Z height to follow the actual surface geometry.
Key changes:
- Add ContourZ.cpp raycasting algorithm (~330 lines)
- Extend geometry with 3D support (Point3, Line3, Polyline3, MultiPoint3)
- Template arc fitting for 2D/3D compatibility
- Change ExtrusionPath::polyline from Polyline to Polyline3
- Add 5 ZAA config options (zaa_enabled, zaa_min_z, etc.)
- Add posContouring pipeline step in PrintObject
- Update GCode writer for 3D coordinate output
- Add ZAA settings UI in Print Settings > Quality
- Add docs/ZAA.md with usage and implementation details
ZAA is opt-in and disabled by default. When disabled, the slicing pipeline
is unchanged.
2026-02-09 20:42:26 +01:00
15117 changed files with 2373190 additions and 2074662 deletions
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.
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 issue reproducible in the latest nightly build?
description:>
Please verify this issue still happens in the latest nightly build first. It may already be fixed there:
OrcaSlicer’s C++17 sources live in `src/`, split by feature modules and platform adapters. User assets, icons, and printer presets are in `resources/`; translations stay in `localization/`. Tests sit in `tests/`, grouped by domain (`libslic3r/`, `sla_print/`, etc.) with fixtures under `tests/data/`. CMake helpers reside in `cmake/`, and longer references in `doc/` and `SoftFever_doc/`. Automation scripts belong in `scripts/` and `tools/`. Treat everything in `deps/` and `deps_src/` as vendored snapshots—do not modify without mirroring upstream tags.
Platform helpers such as `build_linux.sh`, `build_release_macos.sh`, and `build_release_vs2022.bat` wrap the same flow with toolchain flags. Use `build_release_macos.sh -sx` when reproducing macOS build issues, and `scripts/DockerBuild.sh` for reproducible container builds.
## Build Commands
## Coding Style & Naming Conventions
`.clang-format` enforces 4-space indents, a 140-column limit, aligned initializers, and brace wrapping for classes and functions. Run `clang-format -i <file>` before committing; the CMake `clang-format` target is available when LLVM tools are on your PATH. Prefer `CamelCase` for classes, `snake_case` for functions and locals, and `SCREAMING_CASE` for constants, matching conventions in `src/`. Keep headers self-contained and align include order with the IWYU pragmas.
```bash
# macOS
cmake --build build/arm64 --config RelWithDebInfo --target all --
## Testing Guidelines
Unit tests rely on Catch2 (`tests/catch2/`). Name specs after the component under test—for example `tests/libslic3r/TestPlanarHole.cpp`—and tag long-running cases so `ctest -L fast` remains useful. Cover new algorithms with deterministic fixtures or sample G-code stored in `tests/data/`. Document manual printer validation or regression slicer checks in your PR when automated coverage is insufficient.
# Linux
cmake --build build --config RelWithDebInfo --target all --
## Commit & Pull Request Guidelines
The history favors concise, sentence-style subject lines with optional issue references, e.g., `Fix grid lines origin for multiple plates (#10724)`. Squash fixups locally before opening a PR. Complete `.github/pull_request_template.md`, include reproduction steps or screenshots for UI changes, and mention impacted presets or translations. Link issues via `Closes #NNNN` when applicable, and call out dependency bumps or profile migrations for maintainer review.
# Windows (replace %build_type% with Debug/Release/RelWithDebInfo)
Follow `SECURITY.md` for vulnerability reporting. Keep API tokens and printer credentials out of tracked configs; use `sandboxes/` for experimental settings. When touching third-party code in `deps_src/`, record the upstream commit or release in your PR description and run the relevant platform build script to confirm integration.
## Testing
Catch2 framework. Tests in `tests/` directory.
```bash
cd build && ctest --output-on-failure # all tests
ctest --test-dir ./tests/libslic3r # individual suite
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
OrcaSlicer is an open-source 3D slicer application forked from Bambu Studio, built using C++ with wxWidgets for the GUI and CMake as the build system. The project uses a modular architecture with separate libraries for core slicing functionality, GUI components, and platform-specific code.
## Build Commands
### Building on Windows
**Always use this command to build the project when testing build issues on Windows.**
Comprehensive suite: temperature towers, flow rate, retraction & more for optimal performance.
- **[Precise Wall](https://www.orcaslicer.com/wiki/quality_settings_precision#precise-wall) and [Seam Control](https://www.orcaslicer.com/wiki/quality_settings_seam)**
Adjust outer wall spacing and apply scarf seams to enhance print accuracy.
@@ -71,7 +76,7 @@ If you come across any of these in search results, please <b>report them</b> as
The [wiki](https://www.orcaslicer.com/wiki) aims to provide a detailed explanation of the slicer settings, including how to maximize their use and how to calibrate and set up your printer.
- **[Access the wiki here](https://www.orcaslicer.com/wiki)**
- **[Contribute to the wiki](https://www.orcaslicer.com/wiki/How-to-wiki)**
- **[Contribute to the wiki](https://www.orcaslicer.com/wiki/how_to_wiki)**
# Download
@@ -91,17 +96,17 @@ Explore the latest developments in OrcaSlicer with our nightly builds. Feedback
Download the **Windows Installer exe** for your preferred version from the [releases page](https://github.com/OrcaSlicer/OrcaSlicer/releases).
- *For convenience there is also a portable build available.*
- *For convenience there is also a portable build available.*
<details>
<summary>Troubleshooting</summary>
- *If you have troubles to run the build, you might need to install following runtimes:*
- [Alternative Download Link Hosted by Microsoft](https://aka.ms/vs/17/release/vc_redist.x64.exe)
- This file may already be available on your computer if you've installed visual studio. Check the following location: `%VCINSTALLDIR%Redist\MSVC\v142`
- *If you have troubles to run the build, you might need to install following runtimes:*
- [Alternative Download Link Hosted by Microsoft](https://aka.ms/vs/17/release/vc_redist.x64.exe)
- This file may already be available on your computer if you've installed visual studio. Check the following location: `%VCINSTALLDIR%Redist\MSVC\v142`
1. If you run into trouble executing it, try this command in the terminal:
### Flathub (Recommended)
OrcaSlicer is available through FlatHub:
<a href='https://flathub.org/apps/com.orcaslicer.OrcaSlicer'><img width='240' alt='Download on Flathub' src='https://dl.flathub.org/assets/badges/flathub-badge-en.png'/></a>
Install from the command line:
```shell
flatpak install flathub com.orcaslicer.OrcaSlicer
flatpak run com.orcaslicer.OrcaSlicer
```
It can also be installed through graphical software managers (KDE Discover, GNOME Software, etc.) when Flathub is enabled. Search for **OrcaSlicer** in your software center.
### AppImage
1. Download App image from the [releases page](https://github.com/OrcaSlicer/OrcaSlicer/releases).
2. Double click the downloaded file to run it.
3. If you run into trouble executing it, try this command in the terminal:
All updated build instructions for Windows, macOS, and Linux are now available on the official [OrcaSlicer Wiki - How to build](https://www.orcaslicer.com/wiki/How-to-build) page.
All updated build instructions for Windows, macOS, and Linux are now available on the official [OrcaSlicer Wiki - How to build](https://www.orcaslicer.com/wiki/how_to_build) page.
Please refer to the wiki to ensure you're following the latest and most accurate steps for your platform.
@@ -167,7 +192,7 @@ resolution: 0.1
Their generous support enables me to purchase filaments and other essential 3D printing materials for the project.
OrcaSlicer was originally forked from BambuStudio, it was previously known as BambuStudio-SoftFever.
Open-source slicing has always been built on a tradition of collaboration and attribution. [Slic3r](https://github.com/Slic3r/Slic3r), created by Alessandro Ranellucci and the RepRap community, laid the foundation. [PrusaSlicer](https://github.com/prusa3d/PrusaSlicer) by Prusa Research built on Slic3r and acknowledged that heritage. [Bambu Studio](https://github.com/bambulab/BambuStudio) in turn forked from PrusaSlicer, and [SuperSlicer](https://github.com/supermerill/SuperSlicer) by @supermerill extended PrusaSlicer with community-driven enhancements. Each project carried the work of its predecessors forward, crediting those who came before.
[Bambu Studio](https://github.com/bambulab/BambuStudio) is forked from [PrusaSlicer](https://github.com/prusa3d/PrusaSlicer) by Prusa Research, which is from [Slic3r](https://github.com/Slic3r/Slic3r) by Alessandro Ranellucci and the RepRap community.
OrcaSlicer incorporates a lot of features from [SuperSlicer](https://github.com/supermerill/SuperSlicer) by @supermerill
OrcaSlicer's logo is designed by community member Justin Levine (@freejstnalxndr).
OrcaSlicer began in that same spirit, drawing from BambuStudio, PrusaSlicer, and ideas inspired by CuraSlicer and SuperSlicer. But it has since grown far beyond its origins. Through relentless innovation — introducing advanced calibration tools, precise wall and seam control, tree supports, adaptive slicing, and hundreds of other features — OrcaSlicer has become the most widely used and actively developed open-source slicer in the 3D printing community. Many of its innovations have been adopted by other slicers, making it a driving force for the entire industry.
The OrcaSlicer logo was designed by community member [Justin Levine](https://github.com/jal-co).
# License
- **OrcaSlicer** is licensed under the GNU Affero General Public License, version 3. OrcaSlicer is based on Bambu Studio by BambuLab.
- **Bambu Studio** is licensed under the GNU Affero General Public License, version 3. Bambu Studio is based on PrusaSlicer by PrusaResearch.
- **PrusaSlicer** is licensed under the GNU Affero General Public License, version 3. PrusaSlicer is owned by Prusa Research. PrusaSlicer is originally based on Slic3r by Alessandro Ranellucci.
- **Slic3r** is licensed under the GNU Affero General Public License, version 3. Slic3r was created by Alessandro Ranellucci with the help of many other contributors.
- **OrcaSlicer** is licensed under the GNU Affero General Public License, version 3.
- The **GNU Affero General Public License**, version 3 ensures that if you use any part of this software in any way (even behind a web server), your software must be released under the same license.
- OrcaSlicer includes a **pressure advance calibration pattern test** adapted from Andrew Ellis' generator, which is licensed under GNU General Public License, version 3. Ellis' generator is itself adapted from a generator developed by Sineos for Marlin, which is licensed under GNU General Public License, version 3.
- The **Bambu networking plugin** is based on non-free libraries from BambuLab. It is optional to the OrcaSlicer and provides extended functionalities for Bambulab printer users.
echo" -1: limit builds to one core (where possible)"
echo" -j N: limit builds to N cores (where possible)"
echo" -b: build in Debug mode"
@@ -16,6 +17,8 @@ function usage() {
echo" -d: download and build dependencies in ./deps/ (build prerequisite)"
echo" -D: dry run"
echo" -e: build in RelWithDebInfo mode"
echo" -F: rebuild the cached Docker/Podman runner image from scratch when used with -g"
echo" -g: run the requested build steps inside a Docker/Podman Ubuntu 24.04 container similar to the GitHub Actions Linux runner"
echo" -h: prints this help text"
echo" -i: build the Orca Slicer AppImage (optional)"
echo" -p: boost ccache hit rate by disabling precompiled headers (default: ON)"
@@ -27,6 +30,9 @@ function usage() {
echo" -L: use ld.lld as linker (if available)"
echo"For a first use, you want to './${SCRIPT_NAME} -u'"
echo" and then './${SCRIPT_NAME} -dsi'"
echo"For a GitHub Actions-like Linux build locally, use './${SCRIPT_NAME} -g -istrlL'"
echo"Use './${SCRIPT_NAME} -gF -istrlL' to rebuild the cached runner image first."
echo"Set ORCA_CONTAINER_CLI, ORCA_DOCKER_IMAGE, ORCA_DOCKER_BASE_IMAGE, or ORCA_DOCKER_CMAKE_VERSION to override the container runtime, cached image tag, base image, or CMake version."
if ! curl -fsSL "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-${cmake_arch}.tar.gz" | tar -xz -C /opt ; then \
echo "Warning: failed to install CMake ${CMAKE_VERSION}; falling back to the distro cmake package." ; \
* This module provides an interface to the Cholmod library which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
* It provides the two following main factorization classes:
* - class CholmodSupernodalLLT: a supernodal LLT Cholesky factorization.
* - class CholmodDecomposiiton: a general L(D)LT Cholesky factorization with automatic or explicit runtime selection of the underlying factorization method (supernodal or simplicial).
*
* For the sake of completeness, this module also propose the two following classes:
* - class CholmodSimplicialLLT
* - class CholmodSimplicialLDLT
* Note that these classes does not bring any particular advantage compared to the built-in
* SimplicialLLT and SimplicialLDLT factorization classes.
*
* \code
* #include <Eigen/CholmodSupport>
* \endcode
*
* In order to use this module, the cholmod headers must be accessible from the include paths, and your binary must be linked to the cholmod library and its dependencies.
* The dependencies depend on how cholmod has been compiled.
* For a cmake based project, you can use our FindCholmod.cmake module to help you in this task.
#if defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS || defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API || defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS || defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API || defined EIGEN2_SUPPORT
// This will generate an error message:
#error Eigen2-support is only available up to version 3.2. Please go to "http://eigen.tuxfamily.org/index.php?title=Eigen2" for further information
#endif
namespace Eigen {
// we use size_t frequently and we'll never remember to prepend it with std:: everytime just to
// ensure QNX/QCC support
using std::size_t;
// gcc 4.6.0 wants std:: for ptrdiff_t
using std::ptrdiff_t;
}
/** \defgroup Core_Module Core module
* This is the main module of Eigen providing dense matrix and vector support
* (both fixed and dynamic size) with all the features corresponding to a BLAS library
* and much more...
*
* \code
* #include <Eigen/Core>
* \endcode
*/
#include "src/Core/util/Constants.h"
#include "src/Core/util/Meta.h"
#include "src/Core/util/ForwardDeclarations.h"
#include "src/Core/util/StaticAssert.h"
#include "src/Core/util/XprHelper.h"
#include "src/Core/util/Memory.h"
#include "src/Core/NumTraits.h"
#include "src/Core/MathFunctions.h"
#include "src/Core/GenericPacketMath.h"
#include "src/Core/MathFunctionsImpl.h"
#include "src/Core/arch/Default/ConjHelper.h"
#if defined EIGEN_VECTORIZE_AVX512
#include "src/Core/arch/SSE/PacketMath.h"
#include "src/Core/arch/AVX/PacketMath.h"
#include "src/Core/arch/AVX512/PacketMath.h"
#include "src/Core/arch/AVX512/MathFunctions.h"
#elif defined EIGEN_VECTORIZE_AVX
// Use AVX for floats and doubles, SSE for integers
* This module currently provides iterative methods to solve problems of the form \c A \c x = \c b, where \c A is a squared matrix, usually very large and sparse.
* Those solvers are accessible via the following classes:
* - ConjugateGradient for selfadjoint (hermitian) matrices,
* - LeastSquaresConjugateGradient for rectangular least-square problems,
* - BiCGSTAB for general square matrices.
*
* These iterative solvers are associated with some preconditioners:
* - IdentityPreconditioner - not really useful
* - DiagonalPreconditioner - also called Jacobi preconditioner, work very well on diagonal dominant matrices.
* - IncompleteLUT - incomplete LU factorization with dual thresholding
*
* Such problems can also be solved using the direct sparse decomposition modules: SparseCholesky, CholmodSupport, UmfPackSupport, SuperLUSupport.
* This module provides an interface to the <a href="http://pastix.gforge.inria.fr/">PaSTiX</a> library.
* PaSTiX is a general \b supernodal, \b parallel and \b opensource sparse solver.
* It provides the two following main factorization classes:
* - class PastixLLT : a supernodal, parallel LLt Cholesky factorization.
* - class PastixLDLT: a supernodal, parallel LDLt Cholesky factorization.
* - class PastixLU : a supernodal, parallel LU factorization (optimized for a symmetric pattern).
*
* \code
* #include <Eigen/PaStiXSupport>
* \endcode
*
* In order to use this module, the PaSTiX headers must be accessible from the include paths, and your binary must be linked to the PaSTiX library and its dependencies.
* The dependencies depend on how PaSTiX has been compiled.
* For a cmake based project, you can use our FindPaSTiX.cmake module to help you in this task.
* This module brings support for the Intel(R) MKL PARDISO direct sparse solvers.
*
* \code
* #include <Eigen/PardisoSupport>
* \endcode
*
* In order to use this module, the MKL headers must be accessible from the include paths, and your binary must be linked to the MKL library and its dependencies.
* See this \ref TopicUsingIntelMKL "page" for more information on MKL-Eigen integration.
* This module provides an interface to the SPQR library, which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
*
* \code
* #include <Eigen/SPQRSupport>
* \endcode
*
* In order to use this module, the SPQR headers must be accessible from the include paths, and your binary must be linked to the SPQR library and its dependencies (Cholmod, AMD, COLAMD,...).
* For a cmake based project, you can use our FindSPQR.cmake and FindCholmod.Cmake modules
* This module provides an interface to the <a href="http://crd-legacy.lbl.gov/~xiaoye/SuperLU/">SuperLU</a> library.
* It provides the following factorization class:
* - class SuperLU: a supernodal sequential LU factorization.
* - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative methods).
*
* \warning This wrapper requires at least versions 4.0 of SuperLU. The 3.x versions are not supported.
*
* \warning When including this module, you have to use SUPERLU_EMPTY instead of EMPTY which is no longer defined because it is too polluting.
*
* \code
* #include <Eigen/SuperLUSupport>
* \endcode
*
* In order to use this module, the superlu headers must be accessible from the include paths, and your binary must be linked to the superlu library and its dependencies.
* The dependencies depend on how superlu has been compiled.
* For a cmake based project, you can use our FindSuperLU.cmake module to help you in this task.
* This module provides an interface to the UmfPack library which is part of the <a href="http://www.suitesparse.com">suitesparse</a> package.
* It provides the following factorization class:
* - class UmfPackLU: a multifrontal sequential LU factorization.
*
* \code
* #include <Eigen/UmfPackSupport>
* \endcode
*
* In order to use this module, the umfpack headers must be accessible from the include paths, and your binary must be linked to the umfpack library and its dependencies.
* The dependencies depend on how umfpack has been compiled.
* For a cmake based project, you can use our FindUmfPack.cmake module to help you in this task.
/** Update the LDLT decomposition: given A = L D L^T, efficiently compute the decomposition of A + sigma w w^T.
* \param w a vector to be incorporated into the decomposition.
* \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column vectors. Optional; default value is +1.
eigen_assert(m_factorizationIsOk&&"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
constIndexsize=m_cholmodFactor->n;
EIGEN_UNUSED_VARIABLE(size);
eigen_assert(size==b.rows());
// Cholmod needs column-major stoarge without inner-stride, which corresponds to the default behavior of Ref.
eigen_assert(m_factorizationIsOk&&"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
/** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization.
*
* During the numerical factorization, an offset term is added to the diagonal coefficients:\n
* \c d_ii = \a offset + \c d_ii
*
* The default is \a offset=0.
*
* \returns a reference to \c *this.
*/
Derived&setShift(constRealScalar&offset)
{
m_shiftOffset[0]=double(offset);
returnderived();
}
/** \returns the determinant of the underlying matrix from the current factorization */
Scalardeterminant()const
{
usingstd::exp;
returnexp(logDeterminant());
}
/** \returns the log determinant of the underlying matrix from the current factorization */
ScalarlogDeterminant()const
{
usingstd::log;
usingnumext::real;
eigen_assert(m_factorizationIsOk&&"The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
* \brief Generic expression of a matrix where all coefficients are defined by a functor
*
* \tparam NullaryOp template functor implementing the operator
* \tparam PlainObjectType the underlying plain matrix/array type
*
* This class represents an expression of a generic nullary operator.
* It is the return type of the Ones(), Zero(), Constant(), Identity() and Random() methods,
* and most of the time this is the only way it is used.
*
* However, if you want to write a function returning such an expression, you
* will need to use this class.
*
* The functor NullaryOp must expose one of the following method:
<table class="manual">
<tr ><td>\c operator()() </td><td>if the procedural generation does not depend on the coefficient entries (e.g., random numbers)</td></tr>
<tr class="alt"><td>\c operator()(Index i)</td><td>if the procedural generation makes sense for vectors only and that it depends on the coefficient index \c i (e.g., linspace) </td></tr>
<tr ><td>\c operator()(Index i,Index j)</td><td>if the procedural generation depends on the matrix coordinates \c i, \c j (e.g., to generate a checkerboard with 0 and 1)</td></tr>
</table>
* It is also possible to expose the last two operators if the generation makes sense for matrices but can be optimized for vectors.
*
* See DenseBase::NullaryExpr(Index,const CustomNullaryOp&) for an example binding
* C++11 random number generators.
*
* A nullary expression can also be used to implement custom sophisticated matrix manipulations
* that cannot be covered by the existing set of natively supported matrix manipulations.
* See this \ref TopicCustomizing_NullaryExpr "page" for some examples and additional explanations
* on the behavior of CwiseNullaryOp.
*
* \sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.