Repository navigation
Orca port 5B-5: plates, instances and workflow UI (7 PRs) - #679
Merged
Merged
Conversation
…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
marked this pull request as ready for review
October 24, 2026 15:30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
8d874cdc36)74cf148384)49fe64cb07)1d61962ea7)589eb2cfeb)f8dd56053c)cc89416055)Not ported (parts): OrcaSlicer#15613's
Plater::increase_instances()/decrease_instances()half - both functions are#if 0in EdgeSlicer; enabling them is Orca OrcaSlicer#6237 "Add instances", owner decision OD9, untouched here. OrcaSlicer#11419's GUI_App half - ourpost_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
do_move()hasforce_volume_move(Alignment gizmo); it counts as a part move, so every instance of the object is notified, like Volume mode.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" throughMacOpenFilesafterpost_initstarted, a file handed over from a second instance, or the hub loading one into a hidden instance.caption_max; its captions ("Align/Distribute", "Align selected") count towardscaption_maxso 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
do_move("")goes through the same per-instance notification.git merge-treeagainst open PRs touching the same files: Run post-processing scripts on .gcode.3mf exports (Orca #16464) #650, Keep colour, fuzzy, support and seam painting through Mesh Boolean and Split #605, ImageMap 5a: side walls from the dialog, and image rows that only cost what they print #567, Keep per-volume settings when adding a 3MF (Snapmaker #962) #350 clean; Creality: sync CFS filaments into the project (C6) #619, Creality: CFS probe, Use CFS, and Calibrate before printing (C3+C4) #616, Happy Hare and AFC slot reading for the Moonraker send dialog #612, Diagnostic: printer switch timing (diagnostic, not for merge) #521, spike: do not merge — per-plate presets (Option A) #421 conflict with main already (no new files); Run the phone hub headless on Linux (service mode, supervisor, go2rtc, POSIX run_capture) #267 (linux headless hub) gains a Plater.cpp conflict on top of its existing ones.Tests
~[NotWorking]~[.]. (Job 475 on local failed on aSlic3r::GUI::TextInputforward declaration shadowing the global widget; fixed in the Match style of height range modifier section on sidebar OrcaSlicer/OrcaSlicer#15703 commit with::TextInput.)tests/libslic3r/test_arrange_seq_print.cpp[SeqPrint] - upstream fix: sequential-print arrange settings are ignored and never persisted OrcaSlicer/OrcaSlicer#15425's arrange-floor andmin_object_distancecases, ported to Catch2 v2 (loops instead ofGENERATE(values<Case>)). They pin existing libslic3r behaviour the GUI change now relies on, so they pass without the change too.PartPlate,Plater, ImGui panels), which the test targets do not link; covered by the owner hand test.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 undersrc/libslic3r,resources/profilesor the CLI (src/Snapmaker_Orca.cpp). The CLI slices plates from the 3MF's own plate assignments and never runsdo_move(), the GUIPartPlateregistry, the arrange popup orload_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).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.(No printer needed; Mac: not needed.)