* 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
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.
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:
## Summary
- Change default bed temperature type from "By First filament" to "By Highest Temp"
- Move `bed_temperature_formula` option from develop mode to advanced mode for better accessibility
- Relocate UI control from "Basic Information - Advanced" to "Multimaterial Setup" section where it's more relevant for multi-filament printing
Using the highest temperature of all printed filaments is generally safer for bed adhesion than using the first filament's temperature, especially in multi-material prints where different filaments may require different bed temperatures.
<img width="390" height="239" alt="Screenshot 2026-02-26 at 18 44 56" src="https://github.com/user-attachments/assets/0fe9f8c7-062a-4a7a-8ab3-c52df7e74b26" />
Wipe tower interface features and preheat fixes
Fresh PR branch rebuilt on upstream/main (squash of origin/BBL-studio-wipe-tower-merge) to avoid merge-history issues.
* Fix extruder_id out-of-bounds in switch_excluder
Added a check to reset extruder_id to 0 if it exceeds the size of nozzle_volumes or extruders, preventing potential out-of-bounds access.
Co-Authored-By: Christopher R. Palmer <1305033+crpalmer@users.noreply.github.com>
* Add custom nozzle diameter option in sidebar
Ensures that if the actual nozzle diameter is not present in the list, it is added as a custom option. This improves user experience by allowing selection of non-standard nozzle diameters.
Refactor nozzle diameter selection logic in Sidebar
Simplified the logic for updating the extruder nozzle diameter combo box by removing redundant checks and streamlining the addition of custom nozzle diameters. This improves code clarity and ensures the actual nozzle diameter from the printer config is always considered.
Co-Authored-By: yw4z <yw4z@outlook.com>
* Prevent profile switch if selected diameter matches nozzle
Adds a check in Sidebar::priv::switch_diameter to avoid switching printer profiles when the selected diameter matches the current nozzle diameter in the configuration. This prevents unnecessary profile changes and improves user experience.
---------
Co-authored-by: Christopher R. Palmer <1305033+crpalmer@users.noreply.github.com>
Co-authored-by: yw4z <yw4z@outlook.com>
* fixes: keys_map is initialized with itself [-Winit-self]
* fixes: operation on repeats may be undefined [-Wsequence-point]
* fixes: warning: suggest parentheses around && within || [-Wparentheses]
* fixes: moving brim_points to itself [-Wself-move]
* fixes: operation on unprintability may be undefined [-Wsequence-point]
* fixes: extra tokens at end of #endif directive [-Wendif-labels]
* fixes: converting to non-pointer type int from NULL [-Wconversion-null]
* review result: simplifies fix 'operation on repeats may be undefined'
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.
## Problem
Some Creality printers (e.g. Ender-3 V3 SE) rely on metadata comments in the first lines of G-code files to display print info on the screen (estimated time, filament usage, layer height). This follows a format originally used by Cura/Creality Print:
```
;FLAVOR:Marlin
;TIME:3708.97
;Filament used:6.21m
;Layer height:0.2
```
OrcaSlicer currently has no way to write content before the `HEADER_BLOCK` in the G-code output, and does not expose `print_time_sec` or `filament_length_m` as usable placeholders. As a result, these printers show zeroed-out print info on screen.
## Changes
### 1. New placeholders (post-processing)
Added two new G-code placeholders resolved during post-processing:
- `{print_time_sec}` — total estimated print time in seconds (double)
- `{filament_length_m}` — total filament length in meters (double)
These values are only available after G-code generation, so they use inline marker replacement (`@PRINT_TIME_SEC@`, `@FILAMENT_LENGTH_M@`) that `GCodeProcessor::run_post_process()` substitutes with actual computed values — the same pattern used by existing M73 and layer count placeholders.
### 2. New "File header G-code" option (`machine_top_gcode`)
Added a new G-code field in **Printer Settings > Machine G-code** that writes content at the very top of the output file, before `HEADER_BLOCK_START`. This allows users to add firmware-specific metadata that must appear in the first lines.
### 3. Creality Ender-3 V3 SE profile update
Pre-configured the Ender-3 V3 SE profiles (all 4 nozzle variants) with a default `machine_top_gcode` value matching the Cura-compatible header format, so print info displays correctly out of the box.
# Screenshots
| Before (current OrcaSlicer) | After (this PR) |
|---|---|
|  |  |
## Tests
- Sliced test model with Ender-3 V3 SE profile
- Verified G-code output contains correct values in first lines:
- `;TIME:` with actual print time in seconds
- `;Filament used:` with filament length in meters
- `;Layer height:` with correct layer height
- Verified `{print_time_sec}` and `{filament_length_m}` work in both Machine Start G-code and File header G-code fields
- Verified empty `machine_top_gcode` produces no extra output
- Built and tested on macOS (arm64)
* added option to save a profile as detached(no inheritance)
* Revert "added option to save a profile as detached(no inheritance)"
This reverts commit c1326c6decd7bae49d2e8e811ae2f477a3b1186a.
* re-commiting the changes
* fixed conflicts with upstream
---------
Co-authored-by: SoftFever <softfeverever@gmail.com>
Changed the help link for the 'symmetric_infill_y_axis' option from 'strength_settings_patterns#zig-zag' to 'strength_settings_infill#symmetric-infill-y-axis' to provide more accurate documentation.
# Description
When creating a new filament preset and setting the Printer Dependencies to "All", the preset does not save this setting. This issue only occurs on creation due to code that is meant to validate the data to prevent a case where the filament is compatible with none of the printers.
EDIT: While I considered redoing the data validation for this tab overall, I have now preserved the original purpose of the code, which is to add the current printer as a compatible printer only if:
- the base preset is a System preset
- the user has not specified any compatible printers
Notably, this seems to be the cause of #11959
Moving the data validation from `Preset::save_current_preset` to `Tab::save_preset` allows the Preset function to be simplified through removal of the current printer parameter.
# Screenshots/Recordings/Graphs
There is no visible change on the UI.
## Tests
Tested the following combinations of filament presets:
- System->new User
- User->new User
- User->same User
Tried to set them to All, where the System->new User should be the only case where this is replaced by a default.
In any case where there are printers already set, those settings should be kept.
* Brim can follow EFC outline
* Optimization
* Update Spanish EFC brim description
Adopt reviewer-proposed wording from RF47.
Co-authored-by: RF47 <RF47@users.noreply.github.com>
* 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
* Tooltip update
---------
Co-authored-by: RF47 <RF47@users.noreply.github.com>
Co-authored-by: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com>
Refresh filament setting overrides on preset change
The filament “Setting Overrides” page derives its UI state from multiple configs
(filament, printer, process), but this derived state was not recomputed during
preset reloads.
As a result, override widgets could reflect stale values until the page was
revisited or a user interaction triggered an update.
Recompute the filament setting overrides as part of TabFilament::reload_config(),
keeping the derived UI in sync with the active preset immediately after reload.
Fix filament preset undo/dirty tracking to match Bambu behavior
Use deep compare for filament presets so vector options report #idx keys.
Align undo/dirty mapping with indexed fields and Bambu’s filter_diff_option.
Pass explicit indices for filament override fields.
Add missing filament variant keys (retract lift bounds, ironing overrides) to filament_options_with_variant so per‑filament undo works.
* Automatically generate extruder id & printer extruder variant mappings for non-BBL multi-extruder printers
* Support different layer height limit for non-bbl multi-extruder printer
* Add ability to disable Power Loss Recovery
* Fix typo in PrintConfig.hpp for power loss recovery
* Attempt to resolve Unknown option exception: disable_power_less_recovery
Add disable_power_loss_recovery property to any json which had scan_first_layer
* Revert "Attempt to resolve Unknown option exception: disable_power_less_recovery"
This reverts commit ddaf34b317f8797540235b8f7d179b1c9b6d10f8.
* Fix typo
* Change attribution from BBS to Orca in PrintConfig.cpp
* Mini refactor power loss recovery handling in GCode export
- Moved power loss recovery G-code generation to a new method in GCodeWriter.
- Support Marlin 2
* Update comments and power loss recovery handling
* Implement power loss recovery G-code commands
Added functions to start and end power loss recovery with appropriate G-code commands and comments.
* Add power loss recovery methods to GCodeWriter
* refactor and fix build errors
---------
Co-authored-by: Michael Rook <michael@rook.id.au>
Co-authored-by: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
* Fix tooltip + URL
* Full Material wiki redirection maping
* Machine wiki + append_option_line wiki linking
* Machine wiki 2
* Update README with improved wiki links and clarity
* Bring back Print statistics options
* Move num_extruders config to OtherSlicingStatesConfigDef
The num_extruders configuration option was relocated from OtherPresetsConfigDef to OtherSlicingStatesConfigDef for better organization and relevance. This change ensures that the number of extruders is defined in the context of slicing states rather than presets.
* Unifi adaptative bed mesh
Renamed 'param_extruder_clearence.svg' to 'param_extruder_clearance.svg' and updated the corresponding resource reference in Tab.cpp to correct the spelling error.
Co-authored-by: Nanashi <53353250+NanashiTheNameless@users.noreply.github.com>
* The 0.30mm layer height configuration for the 0.4 nozzle of the QIDI model has been removed
* Merge branch 'main' into main
* Merge branch 'SoftFever:main' into main
* Revert "The 0.30mm layer height configuration for the 0.4 nozzle of the QIDI model has been removed"
This reverts commit 8d296720b8de58b1bfa4f008a24cee841a8472c6.
* Update Qidi Q2 0.4 nozzle.json
修改Q2打印高度
* Merge branch 'SoftFever:main' into main
* Merge branch 'SoftFever:main' into main
* change machine_gcode
* Merge branch 'main' of https://github.com/HYzd766/OrcaSlicer
* Merge branch 'SoftFever:main' into main
* Multi-color code compatible with QIDI models
* Merge branch 'main' into main
* toggle axis visibility on canvas (#9666)
* toggle axis visibility on canvas
* set show_axes config on toggle
* fix: Add pause and filament change to machine gcodes for Sovol SV08 MAX (#11214)
* Add fixed Ironing Angle setting for uniform surface finish (#11195)
* Initial working fixed ironing angle implemented with new Fixed ironing angle setting
* update documentation
* Combine Fill.is_using_template_angle and Fill.alternate_fill_direction into Fill.fixed_angle
* Rename SurfaceFillParams.is_using_template_angle to SurfaceFillParam.fixed_angle.
* Initial working fixed ironing angle implemented with new Fixed ironing angle setting
* update documentation
* Combine Fill.is_using_template_angle and Fill.alternate_fill_direction into Fill.fixed_angle
* Rename SurfaceFillParams.is_using_template_angle to SurfaceFillParam.fixed_angle.