Skip to content

Orca port 5B-5: plates, instances and workflow UI (7 PRs) - #679

Merged
aceRage merged 9 commits into
mainfrom
port/orca-pkg-5b5
Oct 24, 2026
Merged

aceRage merged 9 commits into
mainfrom
port/orca-pkg-5b5

Conversation

@aceRage

@aceRage aceRage commented Oct 24, 2026

Copy link
Copy Markdown
Owner

Package 5B-5 of the Orca upstream catch-up (tests/orca_port_plan_remaining.md, section 3 5B-5): plates, instances and workflow UI. 7 upstream PRs ported (2 identical, 5 adapted, 2 of those partly), 0 skipped outright, 0 Edge-only commits.

Base: origin/main f57396e (#677 5B-3 merged); main merged in at c15bdaa (#678 6A-4/6A-5; no conflicts, no shared files).

Ports

Upstream What changes Status
OrcaSlicer#15613 Register Instance Copies and Moves with Their Plate (8d874cdc36) Moving instance 1+ of an object to another plate now registers it on that plate (filament list, wipe tower, saved plate); the preview's plate filament list counts an object when any instance is on the plate Adapted, partly (below)
OrcaSlicer#15425 fix: sequential-print arrange settings are ignored and never persisted (74cf148384) Arrange popup settings for "By object" printing are saved under their own keys and read back on start; Reset clears the stored keys Identical to upstream (+ tests)
OrcaSlicer#14406 Fix: Filament section not foldable on launch for toolchanger / idex printers (49fe64cb07) Clicking the Filament Management title folds it on printers with no AMS button and no Flushing volumes button (U1) Adapted (below)
OrcaSlicer#14262 Add Vertical/Horizontal axis-lock checkboxes to Support Painting (1d61962ea7) Support painting Circle/Sphere brushes get Vertical / Horizontal lock checkboxes Identical to upstream
OrcaSlicer#11419 FIX: Open provided file at startup (589eb2cfeb) The startup restore handler starts a blank project only when nothing is loaded Adapted, partly (below)
OrcaSlicer#15703 Match style of height range modifier section on sidebar (f8dd56053c) Height-range rows: layer icon + "Range", "-" between fields, "mm" inside TextInput fields, tighter spacing Adapted (small, below)
OrcaSlicer#14410 Improve layout of transform gizmos (cc89416055) Move/Rotate/Scale panels: "World/Object/Part" combo, compact caption column, reset icons keep their slot Adapted (below)

Not ported (parts): OrcaSlicer#15613's Plater::increase_instances()/decrease_instances() half - both functions are #if 0 in EdgeSlicer; enabling them is Orca OrcaSlicer#6237 "Add instances", owner decision OD9, untouched here. OrcaSlicer#11419's GUI_App half - our post_init() never queues the restore event when started with files, so the upstream symptom does not occur on a plain "Open with" launch.

Deviations from upstream, and why

  1. Register Instance Copies and Moves with Their Plate OrcaSlicer/OrcaSlicer#15613: our do_move() has force_volume_move (Alignment gizmo); it counts as a part move, so every instance of the object is notified, like Volume mode.
  2. Fix: Filament section not foldable on launch for toolchanger / idex printers OrcaSlicer/OrcaSlicer#14406: our Filament Management title row is different (add/delete moved to the Filaments row, gear hidden, Color Mixing Match always shown). The fold limit is the x of the first visible button of AMS sync / Flushing volumes / Color Mixing Match, no limit when none is shown. Upstream's fallback (the gear's position) would be 0 here because our gear is hidden - the same bug again. Our fold-on-LEFT_DOWN (Fix: Filament / Printer areas collapses after closing selection dialogs OrcaSlicer/OrcaSlicer#16600 adaptation) is kept.
  3. FIX: Open provided file at startup OrcaSlicer/OrcaSlicer#11419: the guard covers both of our new_project() calls in the restore handler, including the hidden hub-managed instance's. Files can still arrive before the queued event runs: macOS "Open with" through MacOpenFiles after post_init started, a file handed over from a second instance, or the hub loading one into a hidden instance.
  4. Match style of height range modifier section on sidebar OrcaSlicer/OrcaSlicer#15703: unit stays the literal "mm" (we do not translate it); Ctrl+A is bound on the inner text control (key events do not reach the TextInput); the kill-focus handler also checks the parent of the window taking focus (now the other editor's inner control).
  5. Improve layout of transform gizmos OrcaSlicer/OrcaSlicer#14410: our Move panel has the Align/Distribute section, whose icons start at caption_max; its captions ("Align/Distribute", "Align selected") count towards caption_max so the narrower layout cannot overlap them, and its "Align selected / Align Plate" combo keeps its old width. Our Move panel has no "Translate(Relative)" caption, so that hunk does not apply. Reset icons keep our font-sized buttons.

Conflicts with our own work

Tests

G-code gate

No G-code change. Every change is in src/slic3r/GUI (GLCanvas3D, PartPlate, Plater, GUI_App, gizmos, GUI_ObjectLayers) plus a new unit test; nothing under src/libslic3r, resources/profiles or the CLI (src/Snapmaker_Orca.cpp). The CLI slices plates from the 3MF's own plate assignments and never runs do_move(), the GUI PartPlate registry, the arrange popup or load_arrange_settings(). The OrcaSlicer#15425 test only pins existing libslic3r behaviour (update_selected_items_inflation, min_object_distance), which is unchanged. OrcaSlicer#15613 changes which plate a moved copy is saved on from the GUI - covered by the owner's hand test (save, re-open, slice) rather than a CLI gate, which cannot exercise it.

Owner hand test

Test copy: C:/Dev/EdgeSlicerTest/pkg_5b5. A two-instance project for step 1: C:/Dev/EdgeSlicerTest/pkg5b5_two_instances.3mf (one 20 mm cube object with two instances, plain 3MF).

  1. Instances and plates (Register Instance Copies and Moves with Their Plate OrcaSlicer/OrcaSlicer#15613): open pkg5b5_two_instances.3mf (object list: one object, two instances), add a second plate. Select only the second cube and drag it onto plate 2. Slice plate 1: one cube. Slice plate 2: one cube (on main only instance 0 was re-registered after a move, so the moved copy could stay on plate 1's list). Save, close, re-open: the copy is still on plate 2. On a multi-colour printer with a second filament on another object on plate 2, plate 2's wipe tower / filament list includes the copy's filament.
  2. Sequential arrange (fix: sequential-print arrange settings are ignored and never persisted OrcaSlicer/OrcaSlicer#15425): set Print sequence = By object, open the Arrange popup, set spacing 25 and tick Auto rotate; restart: the popup shows 25 / ticked in By object mode, and By layer mode keeps its own values. Reset in the popup clears them back to defaults.
  3. U1 filament fold (Fix: Filament section not foldable on launch for toolchanger / idex printers OrcaSlicer/OrcaSlicer#14406): select a Snapmaker U1, restart: clicking "Filament Management" title folds/unfolds the section. With a Bambu printer, clicks on/right of the AMS / Flushing volumes buttons do not fold.
  4. Support painting (Add Vertical/Horizontal axis-lock checkboxes to Support Painting OrcaSlicer/OrcaSlicer#14262): Support painting gizmo, Circle and Sphere tools: Vertical / Horizontal checkboxes, only one at a time; dragging with Vertical paints a straight vertical stroke.
  5. Open with (FIX: Open provided file at startup OrcaSlicer/OrcaSlicer#11419): with the slicer closed, open an STL/3MF via Explorer "Open with" EdgeSlicer: it loads and stays on the plate (no blank project afterwards). Plain start still offers to restore an unsaved project.
  6. Height range + transform panels (Match style of height range modifier section on sidebar OrcaSlicer/OrcaSlicer#15703, Improve layout of transform gizmos OrcaSlicer/OrcaSlicer#14410): right-click an object > Height range modifier: rows show the layer icon, "Range", "x - y" with "mm" inside the fields; editing and Enter/Tab still change the range. Move/Rotate/Scale panels: "World/Object/Part" combo with tooltip, Align/Distribute icons not overlapping their caption, reset icons appear without the panel changing width.
    (No printer needed; Mac: not needed.)

…with Their Plate

Upstream 8d874cd. GLCanvas3D::do_move() notified the plate list about
instance 0 of every selected object only, so moving instance 1+ to another
plate left it registered on its old plate (wrong filament list, missing
wipe tower, saved on the wrong plate). It now notifies each moved instance,
or every instance of the object when parts moved (Volume mode or our
force_volume_move from the Alignment gizmo).

PartPlate::get_extruders_without_support() now counts an object when any of
its instances is on the plate, not only instance 0 (the other two call
sites already did this here).

Not ported: the Plater::increase_instances()/decrease_instances() half.
Both functions are compiled out (#if 0) in EdgeSlicer; enabling them is
Orca OrcaSlicer#6237 "Add instances" (owner decision OD9).

Deft
…ngs are ignored and never persisted

Upstream 74cf148. The arrange popup edited a copy of the settings and
picked the "_fff_seq_print" postfix by comparing that copy's address with
m_arrange_settings_fff_seq_print, which never matched, so sequential-print
spacing and rotation were written under the layered keys. The loader read
"min_object_distance_seq_print_fff" / "enable_rotation_seq_print", which
nothing writes, so they never came back either.

- _render_arrange_menu() edits the live settings and picks the postfix from
  the global print sequence; it no longer returns a changed flag.
- load_arrange_settings() reads the keys the menu writes, parses floats with
  string_to_double_decimal_point, and loads the shared multi-material and
  calibration-region keys into both FFF modes.
- Reset erases the stored keys instead of writing defaults.
- "Align to Y axis" is no longer written to AppConfig (it was never read;
  Plater sets it from printer_structure).
- The const get_arrange_settings() copy with its seq-print floor and the
  unused get_arrange_settings(PrintSequence) overload are gone; the floor is
  applied in update_selected_items_inflation().
- GUI_App::global_print_sequence() takes the config by reference instead of
  copying it every frame.

Tests: upstream's arrange and min_object_distance cases ported to Catch2 v2
in tests/libslic3r/test_arrange_seq_print.cpp ([SeqPrint]); this tree has no
test_arrange.cpp, so the helpers come with them.

Deft
…on launch for toolchanger / idex printers

Upstream 49fe64c, adapted. Clicking the Filament Management title only
folds left of the title's buttons. The limit fell back to the AMS sync
button's x minus 30 px whenever "Flushing volumes" was hidden, even when the
AMS button was hidden too; a button that was never shown sits at x = 0, so
on toolchanger / IDEX and non-Bambu printers (U1) no click ever folded the
section after launch.

Our title row differs from upstream's (add/delete moved to the Filaments
row, the gear is hidden there, Color Mixing Match is always shown), so the
limit is now the x of the first visible button of AMS sync, Flushing
volumes, Color Mixing Match, and there is no limit if none is shown. Null
checks as upstream. Our fold-on-LEFT_DOWN (Orca OrcaSlicer#16600 adaptation) is kept.

Deft
…heckboxes to Support Painting

Upstream 1d61962. The support painting gizmo's Circle and Sphere brushes
get the same Vertical / Horizontal axis-lock checkboxes the colour painting
gizmo already has (mutually exclusive). The lock itself lives in
GLGizmoPainterBase and already applied to every brush; only the controls
were missing here.

Deft
Upstream 589eb2c, partly. Verified against our app-open flow: when the
app is started with files, our post_init() never queues EVT_RESTORE_PROJECT
(it is only triggered on the no-input-files path), so the upstream symptom
(model shown, then cleared by a blank project) does not happen for a plain
"Open with" launch here. Upstream's GUI_App part (moving
trigger_restore_project() out of that branch) is therefore not taken.

The Plater guard is ported: the restore handler only starts a blank project
when there is no project file and no object on the plate. The event is
queued, and files can still arrive before it runs - macOS delivers "Open
with" through MacOpenFiles after post_init has started, another instance
can hand over a file, and the hub can load one into a hidden instance. The
guard covers both of our new_project() calls (the hidden hub-managed
instance's too). Adds Plater::is_empty_project().

Deft
…r section on sidebar

Upstream f8dd560. The height-range modifier rows in the sidebar now look
like the rest of it: a layer icon with "Range", "-" between the two fields,
the fields are TextInput widgets carrying the "mm" unit inside (the separate
unit label is gone), and tighter DIP-based spacing around the +/- buttons.
Events are bound on the TextInput's inner text control.

Edge adaptations: the unit stays the literal "mm" (this tree does not
translate it), Ctrl+A select-all is bound on the inner control (key events
do not reach the TextInput), and the kill-focus handler also looks at the
parent of the window taking focus, which is now the other editor's inner
control, so the next editor's focus data is still set.

Deft
Upstream cc89416. Move, Rotate and Scale panels:
- shorter coordinate-system names ("World" / "Object" / "Part") in a
  narrower combo, with a tooltip explaining it; the value columns start
  right after the widest row caption instead of a fixed offset;
- Rotate rows read "World" / "Relative" / "Absolute" and its unit column is
  sized for the degree sign;
- the reset buttons always keep their slot (drawn invisible and disabled
  when not available), so the panels no longer change width;
- render_combo() skips the label column when the label is empty.

Edge adaptations: our Move panel has no "Translate(Relative)" caption (that
hunk does not apply), keeps its font-sized reset icons, and carries the
Align/Distribute section, whose icons start at caption_max: its captions
count towards caption_max so the narrower layout cannot overlap them, and
its "Align selected / Align Plate" combo keeps its previous width.

Deft
@aceRage
aceRage marked this pull request as ready for review October 24, 2026 15:30
@aceRage
aceRage merged commit 932028e into main Oct 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant