Commit Graph
28821 Commits
Author SHA1 Message Date
Clifford Garwood 5aa624b025 fix: Mark secondary carriages as used in iMEX parallel modes
In iMEX (IDEX/IQEX) parallel printing modes (copy/mirror), only the
primary extruder generates toolpaths. The firmware duplicates the
primary's movements for secondary carriages, so they don't appear in
tool_ordering.all_extruders().

This caused is_extruder_used[N] to return false for secondary tools
even though they're physically active and moving.

The fix adds logic to parse the active mode's tool assignments from
imex_mode_active_tools config and marks all assigned tools as used.

Changes:
- Added null checks and bounds validation for config options
- Skip empty tool strings to avoid unnecessary parsing
- Reordered bounds checks for defensive programming
- Added clarifying comments for exception handling

This ensures is_extruder_used[N] is true for all tools in a parallel
mode, allowing printer profiles to correctly enable heaters and
emit cleanup G-code for all active carriages.

Fixes: is_extruder_used[1] returns false in copy/mirror modes (#13086)

Related: Comment [28]/[30], Comment [18] (is_extruder_used in G-code header)
2026-04-11 02:00:02 -04:00
Clifford GarwoodandClaude Sonnet 4.6 73b5b750c6 feat: iMEX multi-material warning badge, conflict dialog, and mode row UI
- Add warning badge (obj_warning.svg overlay) to the iMEX plate icon when
  a parallel mode is active alongside multi-material objects on the same plate
- Add has_imex_multimaterial_conflict() using get_extruders(true) so only
  filaments actually used on the plate are checked
- Move multi-material caution dialog from reslice() into on_action_slice_plate /
  on_action_slice_all so it fires exactly once per user action and does not
  disrupt GL thumbnail generation during Slice All
- Fix is_imex missing from p->config init key list so on_config_change()
  diff detection correctly triggers refresh_imex_icons()
- Defer imex_changed handling until after set_bed_shape() so m_shape is current
- Replace plain remove button with ScalableButton (imex_remove.svg) in mode rows
- Add EditGCodeDialog launch button per mode row for placeholder browsing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 00:10:03 -04:00
Clifford GarwoodandClaude Sonnet 4.6 1d68f917b0 feat: add imex_mode/imex_mode_index/imex_mode_gcode placeholders with global var flow
Register imex_mode (string), imex_mode_index (int), and imex_mode_gcode
(string) in OtherSlicingStatesConfigDef so they appear in the placeholder
search UI under Slicing State.

Set all three via placeholder_parser().set() before any script processing
in _do_export(). Process imex_mode_gcode first so {global} declarations
defined there flow forward into machine_start_gcode.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:08:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 9a87363044 feat: 4-tool support, primary row, zone sizing, and stability fixes
IMEXModesCtrl:
- Primary mode is now a non-deletable first row stored as sentinel
  "primary" in imex_mode_names; older configs load cleanly
- New rows default T0 → Primary when no tool assignment is stored
- Filter "primary" from plater popup/cycle list to prevent double entry
- imex_tools_per_gantry cap raised 2 → 4

Zone sizing:
- Zone width/height now based on active tool count only; inactive tools
  donate their bed share to active neighbors (fixes 4-tool layout)
- Active col/row maps (col_to_zone/row_to_zone) applied consistently
  across zone fills, collision strips, and primary zone box

GCodeViewer animation:
- Mirror position formula fixed: left-of-copy reflects across copy
  zone's left edge; right-of-copy reflects across right edge
  (T3 was rendering on top of T1)
- strip_width/row_strip_height use active counts, matching PartPlate

Stability:
- Early return in calc_imex_zones() when tool_states is empty; prevents
  OOB crash on new printer with stale process-preset mode name
- is_imex toggle in on_config_change calls refresh_imex_icons() so the
  plate mode icon appears without requiring a new project

GCode:
- Remove "primary" guard so Primary mode gcode field is emitted at
  start of print

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:08:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 0d73cd13ba refactor: move IDEX/IQEX settings from standalone tab into Multimaterial section
- Remove standalone IDEX/IQEX printer tab
- Add IDEX/IQEX Configuration and Parallel Modes sections to the
  Multimaterial page, gated behind is_imex
- Carriage config options hidden via toggle_options() when is_imex is off
- Custom widgets (layout combo, theme combo, modes ctrl) show/hide accordingly

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:08:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 461c69c83e refactor: rename iXex → IMEX throughout; use IDEX/IQEX as user-facing label
- All config keys: ixex_* → imex_* (is_imex, imex_gantry_count, etc.)
- All C++ identifiers: IXexModesCtrl → IMEXModesCtrl, m_ixex_* → m_imex_*, etc.
- 3MF serialization key: ixex_parallel_mode → imex_parallel_mode
- UI strings: iXex → IDEX/IQEX
- SVG icons: plate_ixex_mode*.svg → plate_imex_mode*.svg
- Remove unused ixex_mode.svg

Breaking change for existing printer configs — acceptable pre-merge.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 19:08:57 -04:00
Clifford Garwood 2934b18d2a Merge remote-tracking branch 'upstream/main' 2026-04-09 00:22:06 -04:00
Clifford GarwoodandClaude Sonnet 4.6 f540cf87a8 fix: preserve iXex tool assignments across gantry count changes
- Add all_tool_states map to IXexModesCtrl Row, storing all tool
  assignments including those not currently visible due to grid size
- active_tools_string() now serializes from all_tool_states so
  off-screen assignments survive the round trip through a smaller grid
- Button clicks keep all_tool_states in sync with visible btn_states
- Display anchors to the gantry row containing the Primary assignment
  so reducing gantry count keeps the meaningful row visible rather
  than always defaulting to row 0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 23:35:32 -04:00
Eldenroot 984178ac29 Add fallback when color was not specified (crash fix) (#13002) 2026-04-08 17:21:22 -03:00
yw4z a9741b5274 Improve readability of "Only one wall on.." parameters (#13121) 2026-04-08 17:18:46 -03:00
Miki 71a84def1a Fix single-instance IPC by preserving "OrcaSlicer" suffix in Win32 title (#13017) 2026-04-08 17:15:43 -03:00
David Martínez MorenoandIan Bassi 47b28ee969 Update Spanish translation, remove fuzzies. (#12981)
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-04-08 17:04:21 -03:00
Ian Bassi d715dfc966 Wiki link fix and update (#13152) 2026-04-08 15:06:28 -03:00
Misterff1andSoftFever 211971b9d2 Updated profile to match latest officlal BBL tweaks (#13118)
* 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>
2026-04-08 22:09:52 +08:00
SoftFever 885a01129f clean up some Elegoo profiles (#13148)
* clean up some Elegoo profiles
2026-04-08 17:34:10 +08:00
goofoo afc3756843 fix+feat: Snapmaker U1 — 5 bug fixes and 0.6mm / mixed-nozzle profiles (#12244 #12390 #12652 #12073 #12797 #11424) (#12824) 2026-04-08 12:08:35 +08:00
Clifford Garwood 48b9e6ab26 Merge branch 'main' into feedback 2026-04-07 23:56:30 -04:00
WegerichandSoftFever 809e8d0012 Changed filament_name to filament_type[0] for Elegoo Centauri Carbon 2 (#13012)
* Update 0.20mm Standard @Elegoo CC2 0.4 nozzle.json

Changed filament_name to filament_type[0]

* Update 0.40mm Standard @Elegoo CC2 0.8 nozzle.json

Changed filament_name to filament_type[0]

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-04-08 11:42:24 +08:00
AndyHazz bd184655f4 Add Anycubic Kobra Neo 0.4 nozzle printer profiles (#12913)
## 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.
2026-04-08 11:34:38 +08:00
Danielle WheelerandSoftFever 1b2ff12868 Add Flashforge Artemis Printer Profile (#11902)
* add Artemis configuration files

* updated config files

* undo testing on a different nozzle

* matched settings to FlashPrint5

* lowered nozzle temperature

* renamed filed to match Flashforge.json file

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-04-08 11:32:21 +08:00
Clifford GarwoodandClaude Sonnet 4.6 5fa6480f61 feat: per-plate iXex mode selection with undo, dark mode icons, and menu fixes
- Add per-plate iXex mode icon to the plate toolbar (normal, hover, dark, dark-hover SVG variants)
- Left-click cycles through available modes; right-click shows a popup menu with all modes as radio items
- Mode changes are recorded in the undo/redo snapshot system
- Fix double context menu: suppress EVT_GLCANVAS_PLATE_RIGHT_CLICK and EVT_GLCANVAS_RIGHT_CLICK when the iXex icon popup was already shown
- Remove ixex_parallel_mode combo from Print Settings > Other > Special mode (superseded by per-plate icon)
- Remove dead code: refresh_ixex_mode_combo(), m_ixex_mode_combo member, related Tab reload hook
- iXex mode persisted in 3MF project files via existing plate metadata serialization

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 23:25:38 -04:00
Clifford GarwoodandClaude Sonnet 4.6 ec40172019 feat: per-plate iXex mode selection with undo, dark mode icons, and menu fixes
- Add per-plate iXex mode icon to the plate toolbar (normal, hover, dark, dark-hover SVG variants)
- Left-click cycles through available modes; right-click shows a popup menu with all modes as radio items
- Mode changes are recorded in the undo/redo snapshot system
- Fix double context menu: suppress EVT_GLCANVAS_PLATE_RIGHT_CLICK and EVT_GLCANVAS_RIGHT_CLICK when the iXex icon popup was already shown
- Remove ixex_parallel_mode combo from Print Settings > Other > Special mode (superseded by per-plate icon)
- Remove dead code: refresh_ixex_mode_combo(), m_ixex_mode_combo member, related Tab reload hook
- iXex mode persisted in 3MF project files via existing plate metadata serialization

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 23:25:22 -04:00
Clifford f25a433ec7 Merge branch 'OrcaSlicer:main' into main 2026-04-07 22:50:22 -04:00
Ian Bassi f685891b6e Fix: Wiki + Wall loop direction desc (#13143)
* Combine brims wiki fix

* Typo fix
2026-04-07 16:06:20 -03:00
4d1efad5e9 Inverse print direction for holes (#12669)
* Remove "auto" wall direction

* hole direction reverse

Co-Authored-By: Ian Bassi <12130714+ianalexis@users.noreply.github.com>
Co-Authored-By: discip <53649486+discip@users.noreply.github.com>

* Update description

Co-Authored-By: Ian Bassi <12130714+ianalexis@users.noreply.github.com>

* Improve description

* XNOR logic

* Classic wall generator XNOR

* thin wall holes arachne

* thin wall holes classic

* better handling of  thin wall holes arachne

Co-Authored-By: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com>

* Invert print order for thin wall holes

* Reverse path order for thin wall holes under condition

* avoid reverse

Co-Authored-By: Ian Bassi <12130714+ianalexis@users.noreply.github.com>
Co-Authored-By: Ian Bassi <ian.bassi@outlook.com>

---------

Co-authored-by: vovodroid <vovodroid@users.noreply.github.com>
Co-authored-by: Ian Bassi <12130714+ianalexis@users.noreply.github.com>
Co-authored-by: discip <53649486+discip@users.noreply.github.com>
Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
Co-authored-by: Ioannis Giannakas <59056762+igiannakas@users.noreply.github.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-04-07 23:46:39 +08:00
Vovodroid e1d6cb1764 Remove "auto" wall direction option (#6193)
Remove "auto" wall direction
2026-04-07 22:33:32 +08:00
Rodrigo Faselli 6975b5d84c 💥Fix crash - inconsistent draft shield layer height (#12937)
* 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.
2026-04-07 22:25:28 +08:00
Rodrigo Faselli 208ebfc703 Combine brims option (Prusa style brims) (#12343)
* 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
2026-04-07 22:24:46 +08:00
Rodrigo Faselli 9478af93e4 💥Fix Crash with painted Line in some corrupted models (#12806)
Safeguard EdgeGrid.hpp
2026-04-07 22:22:43 +08:00
mosfet80 2829b8eabb Update CMake policy version and minimum requirements (#12905)
Removed the old control code for cmake inside the CmakeList.txt file
2026-04-07 22:21:26 +08:00
Vovodroid 9282d2de1d Fix arc fitting time progress with firmware retraction. (#12888) 2026-04-07 22:20:33 +08:00
Alexandre Folle de Menezes 836e18b072 Update pt-BR translations (#12891) 2026-04-06 16:27:18 -03:00
Clifford Garwood f8565df113 Merge branch 'feedback' into main
Includes two feature sets on top of the base iXex implementation:

Auto-arrange iXex zone constraint:
  Constrains placement to the primary zone when a parallel mode is active.
  Collision strips registered as hard obstacles via m_unselected so the
  NFP placer correctly excludes them.

Nozzle clearance rename + carriage box visualization overhaul:
  ixex_carriage_width_x/y → ixex_nozzle_clearance_x/y (breaking rename).
  Collision strip width now uses the literal clearance value, not half.
  Carriage footprint boxes place the nozzle at the correct physical edge
  for all printer types (IDEX, IQEX 2x2) and modes (copy, mirror).
  Fixed GLModel::reset() bug causing stale mesh on config change.
2026-04-06 15:06:49 -04:00
Clifford GarwoodandClaude Sonnet 4.6 167211c85c refactor: rename ixex_carriage_width → ixex_nozzle_clearance; fix strip math and carriage box visualization
Config key rename (breaking for saved profiles — call out in PR):
  ixex_carriage_width_x/y → ixex_nozzle_clearance_x/y
  Labels updated to "Nozzle Clearance X/Y" with consistent tooltips
  describing the measurement as nozzle-to-collision-side-edge distance.

Strip math fix:
  Previously halved the clearance value (× 0.5) under the assumption
  the nozzle was centered in the carriage. The measurement is now the
  literal nozzle-to-edge distance, so the × 0.5 factor is removed.
  The collision strip width now equals the configured value directly.

Carriage box visualization (GCodeViewer):
  - Add per-carriage box_offset_x/y so the nozzle marker sits at the
    physically correct edge of the footprint box rather than centered.
  - X: zone-based by default (nozzle at inner edge facing bed center).
    Copy secondaries inherit the primary's X orientation (same movement
    direction). Mirror secondaries use the collision-side edge.
  - Y: always row-based regardless of copy/mirror mode. Gantry is always
    behind the nozzle (high-Y); front-row primaries with a back-row
    secondary override to place nozzle at the low-Y edge.
  - Fix stale mesh bug: GLModel::init_from() is a no-op when already
    initialized. Call reset() before init_from() so mesh rebuilds
    correctly when nozzle clearance values change in config.
  - Remove m_ixex_toolhead_box_dims (was the now-unnecessary cache key).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 a9ad17cea2 fix: route iXex collision zones through m_unselected for effective exclusion
params.excluded_regions flows into libnest2d PlacementConfig.m_excluded_regions
which is declared but never consumed by the NFP placer — the field is dead code.
m_unselected is the working path: it becomes fixeditems that are preloaded as
physical fixed obstacles in the NFP computation, same as the wipe tower.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 1cacc6d02d fix: exclude iXex collision strips from auto-arrange placement
Auto-arrange now injects the carriage collision zones as hard excluded
regions (is_virt_object) when an iXex parallel mode is active, using the
same BoundingBoxf3 data already stored for rendering and violation checks.
Objects will no longer be placed in the mirror-edge danger strips.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:57 -04:00
Clifford GarwoodandClaude Sonnet 4.6 b9f7148080 fix: constrain auto-arrange to iXex primary zone when parallel mode is active
Adds std::optional<BoundingBoxf> m_ixex_primary_zone_box to PartPlate,
populated by calc_ixex_zones() alongside the existing secondary/collision
zone geometry. The new ixex_primary_zone() getter calls ensure_ixex_zones()
so callers always get fresh data. ArrangeJob::process() replaces the
full-bed bedpts with the primary zone corners when the getter returns a
value, so auto-arrange no longer drops objects into the bed center.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:56 -04:00
Clifford GarwoodandClaude Sonnet 4.6 a3cac6c139 fix: remove iXex zone outline borders to eliminate aliasing flicker
The thin rectangular outlines around copy/mirror zones caused visible
aliasing and appeared to flash during interaction. Removed the border
GLModel, its build code in calc_ixex_zones(), the render block, and
the unused border field from IXexTheme.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:40 -04:00
Clifford GarwoodandClaude Sonnet 4.6 185b7084d2 fix: null m_ixex_mode_combo in TabPrint::clear_pages() to prevent dangling pointer crash
Same class of bug as the TabPrinter fix: clear_pages() destroys all
page widgets but didn't null m_ixex_mode_combo, causing a SIGSEGV in
refresh_ixex_mode_combo() when load_current_preset() ran after a
page rebuild (e.g. triggered by Plater::reset()).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 f4808ae7ba fix: avoid capturing C array in lambda for ixex_tool_layout combo
Arrays cannot be captured by value in C++ lambdas; replaced with a
static local declared inside the event handler.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 5297417518 fix: remove phantom phys_row variable reference from iXex button layout comment
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 a03d2cd566 fix: restore info log level in two commented-out PartPlate log lines
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 c75231ec03 fix: remove spurious blank lines in PrintConfig.hpp
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford GarwoodandClaude Sonnet 4.6 e786fabb6a fix: restore info log levels in PartPlate accidentally raised to warning
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 14:57:39 -04:00
Clifford Garwood 1e56b65146 feat: Add iXex parallel printing support for IDEX and IQEX printers
Introduces first-class parallel printing (copy/mirror modes) for printers
with multiple independent X-axis carriages. Branded iXex (independent X
extruder), targeting Klipper firmware with a firmware-agnostic design.

- PrintConfig: new printer options declaring iXex capability and geometry
  (is_ixex, ixex_gantry_count, ixex_tools_per_gantry, carriage dims,
  tool layout, and per-mode name/role/gcode arrays)
- Preset: iXex keys registered in printer and process preset option lists
- Tab: IXexModesCtrl visual grid editor in Printer preset tab; mode
  dropdown in Process → Others tab; clear_pages() nulls iXex pointers to
  prevent dangling-pointer crash on preset save
- PartPlate: 2D zone visualization (active/dimmed/dividers) and
  placement-violation detection (has_ixex_placement_violations) that
  blocks slicing when objects fall outside the primary zone
- Plater: violation detection wired into update_background_process so
  the Slice button is disabled with an error notification on violation
- GCode: mode-activation G-code injected before machine_start_gcode
- GCodeViewer: multi-carriage toolhead markers in sequential preview,
  filament legend annotated with active carriage count and mode name
2026-04-06 14:57:39 -04:00
Rodrigo FaselliandIan Bassi d27889eb0f Fix fuzzy skin regresion classic wall generator (#12920)
Co-authored-by: Ian Bassi <12130714+ianalexis@users.noreply.github.com>
2026-04-06 15:29:23 -03:00
Eldenroot 7bec6c2d6b unix: Add model/step to the list of supported mime-types (#13000)
Cherry picked:

https://github.com/bambulab/BambuStudio/commit/64d360523d8007b3a4c988d2dbef2402ad42110f#diff-cc4863f0a9f2b1f46d3b0e04611772075d67ba61b6bdcfdc3a746b265668f8f4
2026-04-06 15:51:52 +03:00
Sabriel-Koh b79d3e1701 Fix: generic filaments not showing on list (#13037) 2026-04-06 14:27:49 +08:00
Jürgen Herrmann ff77db77db Add build definitions for cachyos (#12898)
Derived from Arch linux.d file but changed a bit to build on CachyOS
2026-04-06 14:08:10 +08:00
Rodrigo Faselli 7d21cf78c7 💥Fix crash when return from assembly mode linux (#13091)
* 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.
2026-04-06 14:06:48 +08:00