Commit Graph
32403 Commits
Author SHA1 Message Date
Lam Wei Lun 54e6df0235 Group texture packs under one picker section and add a Download from OrcaCloud shortcut
The texture picker lists every plugin pack as an indented, collapsible child of one
"Resource Texture" section, which now always renders so the new button is reachable even
before any pack is installed. A pack whose name carries a " by ..." suffix shows that part
on a smaller, dimmed second line, keeping the name line short.

The button switches to the Home tab and opens the OrcaCloud pane on the plugin hub filtered
to resource textures. A native open now also drives the homepage shell (nav highlight and the
cloud-mode layout), and the requested page is remembered so a sign-in re-seed keeps it.

Also fixes the PluginsDialog fuzzy-search script path, which pointed at a directory the file
is not in.
2026-10-15 18:10:33 +08:00
SoftFever 79ed246d26 Refresh the texture picker's look and scrolling 2026-10-15 15:34:05 +08:00
SoftFever 92b5301bf6 Fix trackpad scroll bounce in ImGui panels 2026-10-15 15:34:05 +08:00
SoftFever 20c157b0f4 Merge branch 'main' into feature/resource-texture-pack-plugins 2026-10-15 13:57:38 +08:00
Kiss Lorand b75af485ce Fix DPI scaling for Move gizmo alignment icons (#16498)
Fix Move gizmo alignment icon scaling

Apply the native Windows DPI factor when sizing Move gizmo alignment icons.

This matches the sizing path used by other 16 px gizmo controls,
including support paint, seam, fuzzy-skin, and MMU painting tools.
2026-10-15 06:03:09 +03:00
6a7763f08d ENH: Add "Drop" button to move gizmo for objects, parts, and modifiers. And unify all Drop actions / checks (#16323)
* Add Drop to bed button for objects, parts and modifiers to the Position panel

Ported from BambuStudio PR #11511. The button appears under the position
inputs when the selection is not resting on the bed and moves it along
global Z. Works for a single full instance as well as a single part or
modifier, and is undoable.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7uDtamzhNGT6PFwmVdRJ8

* Reuse existing 'Drop to Bed' string so the button is already translated

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7uDtamzhNGT6PFwmVdRJ8

* Add tooltip to the Drop to Bed button

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N7uDtamzhNGT6PFwmVdRJ8

* unify function usage across UI

* Update GizmoObjectManipulation.cpp

* show tooltip even its disabled

* update

* Update GizmoObjectManipulation.cpp

* update

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-10-15 03:22:28 +03:00
mosfet80 70e5b330be Fix openSUSE package names for ninja and WebKitGTK (#15384)
`ninja-build` and `webkit2gtk4-devel` no longer exist on Tumbleweed. Use `ninja`, and use `webkitgtk3-devel` for WebKit. It is the GTK3 build and ships the `webkit2gtk-4.1.pc` that `src/slic3r/CMakeLists.txt` requires.
2026-10-14 16:22:30 -05:00
xNoVoSx 5e94368863 Write the first layer temperatures of the printed filaments into the G-code header (#16422)
The `; first_layer_bed_temperature` and `; first_layer_temperature` compatibility lines were always taken from filament 1. Anycubic's GoKlipper reads the bed line to heat the bed, so a plate printed only with another filament got the wrong temperature.

The bed line now follows `bed_temperature_formula` (highest used filament or first printing filament). The nozzle line uses the first printing filament. Both values are computed before the by-object loop.
2026-10-14 16:11:57 -05:00
Kris Austin 0df9b782bb Remove unused CMake modules (#16452)
* Remove unused CMake modules

FindAlienWx.cmake and FindPerlEmbed.cmake came over from the Slic3r Perl
build. Nothing calls find_package(AlienWx) or find_package(PerlEmbed).

LibFindMacros.cmake was only included by those two modules.

bin2h.cmake lost its last caller when the avrdude sources were removed
in e6fcbfae07.

* ci: build changes under cmake/

The Build all path filters did not include cmake/, so a change to a
find module or to ClangClShowIncludes.cmake ran no build on a pull
request or on a push to main.
2026-10-14 15:36:54 -05:00
Kris Austinandyw4z d5403ccc94 fix: pin CPython's build Python and externals on Windows (#16420)
* fix: pin the Python that builds CPython on Windows

CPython's build needs a Python to run its own build scripts. Without a local
Python 3.10-3.13, find_python.bat installs the newest pythonx86 from nuget.
That became 3.15.0 on 2026-10-09, and 3.15 removed
SourceFileLoader.load_module, which 3.12's makeopcodetargets.py calls:

  AttributeError: 'SourceFileLoader' object has no attribute 'load_module'

Download Python 3.13.16 from nuget.org as its own dependency, with a hash
(pythonarm64 on ARM64 hosts, pythonx86 elsewhere), and pass it to PCbuild as
PYTHON, which find_python.bat takes before any other Python. PYTHONHOME and
PYTHONPATH are dropped from that step, since PCbuild runs the scripts
without -E. DEP_PYTHON_HOST points at an existing Python 3.10-3.13 instead,
for machines that cannot reach nuget.org.

Drop 01-windows-nuget.patch. It fixed the dead nuget.exe download link in
find_python.bat, and that fallback is never reached now. Existing deps trees
keep working: with no patch command, ExternalProject skips the patch step
instead of re-applying the patch to patched sources.

* fetch externals separately

---------

Co-authored-by: yw4z <ywsyildiz@gmail.com>
2026-10-14 15:36:26 -05:00
SoftFever 32d690ecee docs: add code signing policy and details about Windows release binaries 2026-10-15 01:48:46 +08:00
Rodrigo FaselliandIan Bassi 303d7a1a07 Option: Focus Mode (Show/ Hide inactive plates) (#16325)
* Option: Show/ Hide inactive plates

* Hide inactive plate volumes by bounds

Switch inactive-plate volume hiding to use geometric overlap with the current plate bounding box instead of object and wipe tower ID mapping. This also guards against a missing current plate and keeps any active volume visible when its transformed bounds overlap the current plate footprint.

* Hide inactive plates per instance and keep them unpickable

Decide what is shown per object instance, from its footprint over the
current plate, so the parts of an object are never split; a selected
instance stays visible.

Keep the hidden state between frames instead of restoring it after each
one. GLVolume::on_hidden_plate records what this update hid, so it only
shows that again and leaves the volumes gizmos hide alone, and the raycasts
made while handling the mouse see the same scene as the frame. Nothing runs
while the inactive plates are shown.

Deactivate the raycasters of the other plates, whose icons still took
clicks where nothing was drawn, move the axes to the current plate, and
limit the option to Prepare, as Preview already shows the current plate
alone.

* Follow the selected plate with the camera while the others are hidden

Selecting a plate in Prepare while the inactive plates are hidden moves
the camera target over it and keeps the angle, distance and height, so
the plate comes into view where the previous one was. A zoom to all
plates, as after loading a project or adding a plate, frames the current
plate instead.

* Add a compact plate switcher while inactive plates are hidden

The hidden plates can no longer be clicked, and the object list gets
crowded on large projects. While they are hidden in Prepare, a column of
numbered buttons in the top left corner, a compact counterpart of the
Preview plate toolbar, selects the plate to show. It highlights the
current plate, dims the empty ones and gives the plate name in the
tooltip.

* Simplify the inactive plates update and the plate switcher layout

Decide and apply each volume's state in one pass instead of filling a
per-volume vector first, and hoist the switcher's loop-invariant colors.
Keep the height the bottom-left corner takes next to the constants it is
made of, with the canvas toolbar's button spacing named, rather than
repeating that layout in the switcher.

* Rename the option to Focus mode

The canvas menu entry reads Focus mode, lit while the other plates are
hidden, and is off by default, so nothing changes until it is turned on.
The app config key is focus_mode. Turning it on zooms to the current
plate, so the plate fills the view.

* Show plate thumbnails in the plate switcher

The switcher shows the thumbnails of the Preview plate toolbar instead of
numbered buttons, with rounded corners concentric with the window's.
Plater::plate_toolbar_image_version() lets it refresh them without
clearing the Preview toolbar's dirty flag.

* Don't draw the sinking contours of inactive volumes

GLVolume::render() skips an inactive volume, but its sinking contour was
still drawn, so an object on a hidden plate left its outline behind.

* Show the plate switcher's scrollbar only on hover, as in Preview

The plate switcher now shares the Preview plate toolbar's scrollbar: the
same width and colors, shown only while the mouse is over the column or
drags the bar, with the mouse wheel scrolling it either way, and tighter
window corners while it shows. Both toolbars draw it through the same
helpers, so they cannot drift apart; the Preview toolbar behaves as before.

Drop the frame style the switcher no longer uses since it draws
thumbnails instead of buttons.

* Make the plate switcher's thumbnails cheaper and match the Preview toolbar

The thumbnail version moves after almost every edit, and the switcher
redrew both thumbnails of every plate each time. It now redraws only the
current plate's, the only one edited while the others are hidden, and the
other plates' once their thumbnails are invalidated, through the new
Plater::update_plate_thumbnails().

IMToolbarItem::set_thumbnail() uploads a plate thumbnail without keeping
a copy of its pixels, a megabyte per plate, and replaces the item setup
the Preview toolbar and the switcher each repeated. The switcher's hover
border takes the Preview toolbar's color.

---------

Co-authored-by: Ian Bassi <ian.bassi@outlook.com>
2026-10-14 14:23:41 -03:00
Ian Bassi c0e6db227d Export G-code statistics as JSON (#16487)
* Export G-code statistics as JSON

Add an export of a plate's G-code statistics for scripts and
spreadsheets that compare prints or settings: print time, travel,
filament and feature totals, the same per layer, and the filament of
each object instance and its supports. The times are the preview's
estimates, summed the way the preview sums them.

The GUI writes <name>.statistics.json next to an exported G-code when
"Export statistics with G-code" is enabled in Preferences (Control >
Slicing). The CLI writes plate_N.statistics.json to the output directory
with --export-statistics, and exits with -25 when it cannot.

The per-instance masses now carry the object's name and the instance's
index, so the export can name them. The vertices the processor adds
inside a move for the actual speed view repeat the move's extrusion, so
the filament sums skip them.

* Move the statistics export preference to the Developer tab

"Export statistics with G-code" now sits in Developer > Settings
instead of Control > Slicing.

* Store the G-code statistics inside exported 3MF files

With the preference on, an exported sliced 3MF file holds each plate's
statistics as Metadata/plate_N.statistics.json, next to its G-code. The
print job sent to a printer and the autosave backup leave them out.

The CLI does the same with --export-3mf, and writes the separate file
only next to the G-code in --outputdir, as without it the G-code is a
temporary file. The file is written in binary mode, so it reads the
same on every platform and matches the copy in the 3MF.

* Address review of the statistics export

- Number each object instance by its position among its model object's
  copies. A copy of another rotation or scale, and every copy on a belt
  printer, slices as a print object of its own, where it was always
  instance 0; a copy after a non-printable one shifted too.
- Take the filament totals from the processor's statistics, which count
  the flush as the preview's filament table does, and list each
  filament's model, support, prime tower and flush use. The summary's
  cost is now filament_cost, as the preview's cost adds the time cost.
- State when the version goes up.
- Drop the preference's default, which get_bool already gives.
2026-10-14 14:22:04 -03:00
Ian Chua a078155890 fix: remove external open icon from orcacloud tab (#16489) 2026-10-15 01:15:08 +08:00
Rodrigo Faselli 3b6e27d725 add missing header GLGizmoTextureDisplacement.cpp (#16488)
Update GLGizmoTextureDisplacement.cpp
2026-10-14 14:14:05 -03:00
SoftFever 6254ab643a fix missing icon in control panel for Windows 2026-10-15 01:08:01 +08:00
Ian Chua 9ab0178dd0 feat: add orcacloud to homepage (#16402)
* feat: add orcacloud to homepage

* feat: add OrcaCloud webview pane and session handoff from the app

* feat: OrcaCloud pane crash, per-open re-sign-in, and web-session persistence

* fix: clang-tidy
2026-10-15 01:01:25 +08:00
SoftFever 1cbf97568d Texture displacement: tooltips beside the panel, with illustrations (#16472)
Draft - description to follow.
2026-10-15 00:03:57 +08:00
SoftFever 7a2fe7d64b Merge branch 'main' into feat/texdisp-tooltip-media 2026-10-15 00:02:11 +08:00
Ioannis Giannakasandraistlin7447 ae138090f1 Fix uninitialised object ids in "; printing object" comments (#16115)
Object and copy ids were only assigned in set_object_info(), which runs only for Klipper, Marlin and RRF with Exclude objects on. Every other printer, Bambu included, printed an uninitialized object id and labeled every copy as copy 0. The numbering now runs on every export, so the labels are stable and unique on all printers. Output for Klipper, Marlin and RRF with Exclude objects on is unchanged.

The label test covers Marlin, Klipper and Repetier, plus a BBL row that checks each copy gets its own M624/M625 skip block.

Co-authored-by: raistlin7447 <kris.austin@gmail.com>
2026-10-14 10:51:57 -05:00
packerlschupfer e028476d2a 3mf: record the no-light thumbnail in its own status flag (#16307)
When a CLI export rendered the no-light thumbnail but no plate thumbnail, the no-light loop set the plate thumbnail's status flag. That skipped the fallback that copies the plate thumbnail from disk, so re-exporting a 3mf that has plate_N.png but no plate_no_light_N.png left plate_N.png out of the package. The loop now sets no_light_thumbnail_status instead.
2026-10-14 10:46:35 -05:00
SoftFever 96464ccdf6 Fix Align/Distribute and add it to the Move gizmo (#16479)
# Description

Follow-up to #13373, which added Align/Distribute to the object context
menu. This fixes the problems found in its review and brings
BambuStudio's align and distribute controls to the Move gizmo.

Align and distribute now work when all copies of an object are selected,
on parts of rotated, scaled or mirrored objects, and on objects with
several copies, whose other copies used to lose the part move. Aligning
a single object arranges its solid parts and leaves modifiers and
negative volumes in place. Moves in Z are offered only when Auto-Drop
would not undo them. Commands that would do nothing are disabled, each
operation is a single undo step, and other plates keep their slicing
result. The same fix stops the automatic drop to the bed after a move,
rotate, scale or mirror from also moving copies of other selected
objects.

The Move gizmo gets BambuStudio's align row. It aligns or distributes
the selected objects or parts, or aligns them to their object or to the
plate, and previews the target while you hover an icon. While the Move
gizmo is open, Ctrl+click adds objects to the selection, and Alt+click
adds or removes parts of the selected object.

No change to slicing output or project files.

# Screenshots/Recordings/Graphs



https://github.com/user-attachments/assets/44c308c3-faff-4f51-a3b7-88f264f03743



## Tests

<!--
> Please describe the tests that you have conducted to verify the
changes made in this PR.
-->

<!--
> 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)
2026-10-14 23:39:36 +08:00
SoftFever 76e0168d1e Stop Windows builds failing when the Chocolatey feed is down (#16482) 2026-10-14 23:39:11 +08:00
yw4z bb7dfdc808 update layout, icons and terms 2026-10-14 18:08:14 +03:00
fa1k3 f1658855c8 Apply filament shrinkage compensation on the first slice (#16312)
Print::apply() decided the shrinkage compensation from the existing PrintObjects and their regions. On the first apply() they do not exist yet, so the first slice was not scaled. The CLI calls apply() only once, so filament_shrink and filament_shrinkage_compensation_z had no effect there.

The compensation is now decided before the PrintObjects are built, from the filaments the model uses, and stored in Print. When the filaments have different shrinkage values, every filament assigned to a feature, height range, modifier, support, tool change or the wipe tower counts, even if it does not end up printing. If they disagree, compensation stays off with the existing warning.
2026-10-14 09:39:08 -05:00
Eldenroot 888012c30e Painter gizmos: reset out-of-range paint states at load (#16341)
Supports, seam, fuzzy skin and texture displacement loaded paint data with the default max_ebt, so a 3mf with a paint state above what the gizmo paints read past the 3-entry color table. Each gizmo now passes its highest paint state as max_ebt, as the MMU gizmo already does, and higher states load as unpainted.
2026-10-14 09:35:27 -05:00
packerlschupfer 16efd3458b 3mf: claim the backup lock when the backup's state cannot be established (#16431)
has_restore_data() signals "this backup is in use, leave it alone" by setting
origin to "<lock>". Its caller treats anything else as permission to delete
(Plater.cpp, the EVT_RESTORE_PROJECT handler):

    try {
        if (originfile != "<lock>") // see bbs_3mf.cpp for lock detail
            boost::filesystem::remove_all(last);
    }
    catch (...) {}

So every "return false" that leaves origin empty is a delete instruction, and
three of them fired without anyone having established that the backup was
spent.

lock.txt exists but cannot be read. load_string_file() was outside the try, so
the exception left has_restore_data() altogether. The handler is queued and has
no try around the call, so this took the application down. Fixes #15670.

lock.txt reads but holds no pid. A crash or a full disk mid-write leaves a
zero-length lock.txt, because save_string_file() truncates before it writes.
boost::lexical_cast<int>("") throws into the catch, which returned false with
origin still empty, and the caller deleted the backup. Also #15670.

The .3mf probe could not answer. A path that cannot be probed at all reports
false exactly like a missing one, so an unreachable backup looked spent. The
error_code now separates the two: ENOENT and ENOTDIR mean "not there" and stay
collectable, any other error means the question was never answered.

All three now claim the lock. Declining a restore is recoverable; deleting a
backup nobody could examine is not.

What deliberately did not change: a readable directory with no lock and no
project still comes back with origin empty and stays collectable, as do a lock
held by another process and a directory that does not exist. Claiming the lock
whenever anything looked amiss would strand every spent backup on disk, so
those three cases are tests rather than prose.

Tested in tests/libslic3r/test_3mf.cpp. Against the previous behaviour the new
cases fail as they should -- the two uninterpretable locks come back with an
empty origin, and the unreadable one escapes as

  basic_ios::clear: iostream error

while the three collectable cases pass unchanged, before and after.
2026-10-14 08:57:08 -05:00
Ian Bassi b050d5b924 Translate the Align/Distribute menu
Regenerate the template after rebasing onto main, which brought the 14
strings of the object Align/Distribute menu (#13373), and translate
them in all 22 catalogs. Each language reuses its catalog's existing
"align" wording, with one consistent pattern for the edge, center and
distribute items. Entries whose wording needs a native speaker's check
carry review notes.
2026-10-14 10:30:48 -03:00
Ian Bassi 368bf91bbb Fix translation labels and align terms with the glossary
Labels that were wrong or contradicted the glossary:
- Bridge flow ratio and internal bridge flow ratio use the glossary's
  Flow ratio term (ca, de, fr, ja, nl, ru, sv, zh_CN, zh_TW), with the
  tooltips that quote them.
- tr Line width was "layer width"; tr Modifier was the verb "change";
  hu Rectangle was "square"; pl No sparse layers meant "layers without
  purging"; uk Auto backup was slang.
- Wall order labels made consistent (de, fr, it); th Migrate User
  Presets uses the glossary's preset term; lt keeps Pressure Advance in
  English per the glossary and translates Adaptive.
- Role based wipe speed now says it follows the extrusion role (de, ru,
  pl, tr, zh_CN, zh_TW).
- ru Line infill pattern is "Линия", matching the glossary.

Translations that only covered part of the source or had typos: de
external bridge flow tooltip, zh_TW role-based wipe tooltip, ru wall
type tooltip option names, fr apostrophes, uk final period. es entries
from the last pass now use usted, the catalog's register.

Terms aligned with the glossary: purge/flush, prime tower, wipe and
flushing volume (ko), flow ratio (ca, ja), layer, shell, travel, walls,
plates, raft and fuzzy skin (th), wipe (eu), bridge (de).

Machine-translated entries that use the unsettled Prime tower / Wipe
tower and Tool (printer) terms carry review notes (cs, fr, ja, nl, tr,
uk).
2026-10-14 10:30:48 -03:00
Ian Bassi 15aff97c35 update translations 2026-10-14 10:30:48 -03:00
Ian Bassi 63544e3459 Describe 3D Honeycomb's multiline in the multiline infill design
The design said every pattern other than the trapezoidal and adaptive
ones outlines its centerlines with multiline_fill(). 3D Honeycomb skips
it and draws its own parallel copies of each wave, which never cross.
2026-10-14 10:30:48 -03:00
Ian Bassi b73e1b7999 Remove an unused variable from the segmented region cutter
interlocking_cut_width has not been read since the interlocking depth
started cutting every other layer by the depth directly.
2026-10-14 10:30:48 -03:00
Ian Bassi 8df8de11a5 Resolve small support perimeter percentages against the support speed
small_support_perimeter_speed declared outer_wall_speed as its ratio_over
parent, while GCode.cpp and the tooltip use the support or support
interface speed. The option is a per-nozzle vector, so ratio_over is
only metadata here and no output changes.
2026-10-14 10:30:48 -03:00
Ian Bassi 6e7d5b0a9b Ask about clumping detection whenever the prime tower is disabled
The prompt that clumping detection needs a prime tower was nested inside
the smooth timelapse check, so disabling the tower with clumping
detection on and traditional timelapse gave no prompt; the problem only
surfaced as a warning after slicing. The prompt now appears whenever
clumping detection is on. The smooth timelapse prompt is unchanged, and
answering it with No still skips the clumping one.
2026-10-14 10:30:48 -03:00
Ian Bassi 721ec56f22 Link the printable area and compatibility conditions to their wiki sections
extruder_printable_area linked to the Extruder offset Position section,
which describes a different setting; the wiki now has an Extruder
printable area section. The two compatibility conditions linked to their
parent sections instead of the Printer Condition and Process Condition
sub-sections that describe them.
2026-10-14 10:30:48 -03:00
Ian Bassi 7d6e1f85c8 Link the new wiki sections from the settings tabs
The wiki now has sections for options that were linked to a page top or
not linked at all: the polyhole sub-options, accel to decel, extrusion
rate smoothing on external features, max bridge length, the tree support
brim, seven prime tower options, Flush into this object and clumping
detection. Point each link at its section, and follow the corrected
spelling of the wall transitioning threshold angle heading.
2026-10-14 10:30:48 -03:00
Ian Bassi 011005e12a Correct settings tooltips that contradicted the code
- Minimize wall height angle acts on slopes steeper than the angle, not
  shallower (ContourZ.cpp).
- The wipe tower's default wall type is Rib, not Rectangle; extra flow
  for purging can't make lines narrower (minimum 100%); the max purge
  speed caps the sparse infill speed on sparse layers and also the outer
  walls.
- Interlocking depth is no longer ignored without a maximum width: every
  other layer is cut to that depth unless beam interlocking is on.
- Draft shield: skirts are placed around brims now, so the note about
  intersecting brims is removed.
- Infill/wall overlap percentages are relative to the inner wall line
  width, not the sparse infill width.
- Bridge line width 0 uses the nozzle diameter for thick bridges.
- Fully overhanging walls use the 75% overhang speed limited by the
  bridge speed; there is no 100% speed. The bridge speed tooltip no
  longer mentions the removed classic overhang mode.
- First layer speed covers walls and brim; everything else uses first
  layer infill speed.
- Inner/Outer/Inner is recommended over Outer/Inner, not against it.
- Minimum wall length is a multiple of the wall width, not mm, and One
  wall threshold is in the Walls and surfaces group.
- Small perimeter speeds can't be set to zero (min 1), so "Set to zero
  for auto" is removed.
- Label typo: Role based wipe speed.

The translation template is regenerated; it also picks up strings that
other recent changes added without regenerating it.
2026-10-14 10:30:48 -03:00
SoftFever 987c57dc15 Add align and distribute to the Move gizmo 2026-10-14 19:47:03 +08:00
HanifKoh 0a336941f4 Restore the Tagged User-Agent on Linux with WebKitGTK's Own Prefix (#16466)
Linux webviews lost the BBL-Slicer, dark|light and BBL-Language tags
with the stock WebKitGTK User-Agent, so the bundled pages stayed light
and dropped every message to the host. The tags come back on Linux, now
appended to the string WebKitGTK reports for itself instead of the Mac
one. Windows and macOS are untouched.
2026-10-14 19:03:53 +08:00
SoftFever 48d07a831d Simplify the Align/Distribute context menu 2026-10-14 18:25:16 +08:00
Lam Wei Lun 4cf16febf6 Fix plugin unit test 2026-10-14 18:23:32 +08:00
SoftFever 4e7fa93981 Fix align and distribute on copies, rotated parts and Z 2026-10-14 18:19:47 +08:00
Lam Wei Lun 70e52a105f Fix clang tidy 2026-10-14 17:38:52 +08:00
Lam Wei Lun b525cb79e1 Merge main 2026-10-14 17:31:35 +08:00
Lam Wei Lun 86ab598899 Add a ResourceTexture plugin capability for height-map texture packs
A fifth Python plugin capability type, ResourceTexture, contributes
height-map textures to the Texture Displacement picker. A pack returns a
directory of images; the host validates it once at load and lists the
images under a section of their own.

- New capability type ResourceTexture, type string "resource-texture",
  exposed to plugin authors as
  orca.resource_texture.ResourceTexturePluginCapabilityBase with one
  required method, get_texture_dir().
- The directory is resolved once on the load worker, under the GIL, and
  cached as a plain string: the picker runs inside the ImGui frame, where
  a trampoline call would block on the GIL behind a load/unload worker, or
  throw past EndPopup.
- Validation resolves the directory and requires containment in the plugin
  root, re-checked per file so a symlink inside the pack cannot resolve
  outside it. Containment is the only security control here and it guards
  exfiltration: layer bytes are embedded in every saved .3mf, so a pack
  that could return ~/.ssh/id_rsa would leak it through any shared project.
- New host registry PluginResourceTextures, filled from both the plugin
  and the capability lifecycle callbacks plus a startup sweep. It holds
  strings only and never a capability reference, so nothing outlives
  Py_Finalize.
- The picker lists pack textures read-only, one collapsible section per
  pack, in a fixed-size scrolling popup whose height follows the window. A
  generation counter invalidates the cached listing, and each gizmo's
  cached thumbnails, when the set of packs changes.
- Tests in tests/slic3rutils/test_plugin_resource_texture.cpp cover the
  validator (parent-directory and absolute escapes, an escaping symlink,
  the extension whitelist, the 64-file cap), the listing and its
  load/disable/re-enable/unload lifecycle, hostile get_texture_dir()
  overrides, decode parity with hand-picked files, and a .3mf round trip
  with the pack uninstalled.

No persistence work is needed: a layer carries its own image bytes and 3MF
writes them into the archive, so uninstalling a pack leaves existing
projects intact.

Behaviour change worth noting for review: the picker popup is now a fixed
size that scrolls, rather than sizing itself to its content, and it gains
one collapsible section per pack. That sizing applies to every user, not
only those with packs installed.
2026-10-14 17:15:39 +08:00
ea90f45127 Add Align/Distribute objects on the print plate (#13373)
* Add Align/Distribute objects on the print plate

Ports the Align/Distribute feature from BambuStudio 2.5 (AGPLv3,
same license as OrcaSlicer). Adds a new GLGizmoAlignment helper
that operates on the GLCanvas3D selection, twelve thin Plater
wrappers, and an Align/Distribute submenu attached to the same
five context menus BambuStudio attaches it to: object menu, text
part, BBL part, and the single/multi-volume context menus.

GLCanvas3D::do_move gains a defaulted force_volume_move parameter
so the helper can move multiple selected volumes within a single
object even when selection mode is Instance. GLGizmosManager gains
check_object_located_outside_plate, which switches the active plate
to the one containing the selection before align/distribute runs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix build errors

---------
Co-authored-by: yw4z <ywsyildiz@gmail.com>
Co-authored-by: SoftFever <103989404+SoftFever@users.noreply.github.com>
2026-10-14 17:06:56 +08:00
HanifKoh c7b4e8ef84 build_linux.sh: Forward Arguments After -- to the CMake Configure Step (#16465)
Everything after `--` is appended, unchanged and last, to the cmake
configure line of the deps and OrcaSlicer builds, so a custom compiler,
compile flags or linker can be passed without adding an option to the
script for each one. The arguments are kept as an array, so a value with
spaces such as -DCMAKE_CXX_FLAGS="-O2 -march=native" survives, and they are
forwarded into the -g container. A stray argument without `--` aborts with
a message instead of reaching cmake as a path.

The existing DEPS_EXTRA_BUILD_ARGS and ORCA_EXTRA_BUILD_ARGS hooks are
unchanged and now mentioned in the usage text.
2026-10-14 15:59:41 +08:00
8f1103f064 Re-pull request regarding the printers of goofoo company (#16283)
* add new repositories and new push

* fix bug about setting_id

* fix bug and complete the test

* Fix Goofoo profiles so the bundle loads and passes profile checks

Repair the OrcaFilamentLibrary index entry that broke JSON parsing, regenerate the hand-written filament ids as Orca ids, and bump the library version. Point each printer's default filament and print profiles at presets that exist, normalize the two presets that needed it, rebuild both indexes, correct the ABS-GF/PA-GF/PA6-CF filament types, align the GP1/Velo+ preset names with the library's @ spacing, and fix the casing and resolution of the model cover images.

* Drop the copied Custom Klipper printer from the Goofoo bundle

Goofoo shipped Custom's MyKlipper machine model verbatim, so the Add Printer list offered "Generic Klipper Printer" twice and the printer type resolved its model_id by vendor order. The Goofoo machines now inherit the shared fdm_klipper_common directly, carrying over the per-variant layer heights the removed base supplied, matching how the other Klipper vendors wire theirs. Each machine's resolved settings are unchanged.

* Align the Goofoo preset names with the profile conventions

The machine models and variants already followed the <Model> / <Model> <nozzle> nozzle shape, but the processes put the model in the quality slot and used the bare vendor as the @ target (0.20mm GP1 @Goofoo). They are now named like every other vendor's: <lh>mm <Quality> @<Vendor> <Model> (0.20mm Standard @Goofoo GP1), with the machines' default_print_profile and the index updated to match. The four leaves also inherit the shared fdm_process_klipper_common directly instead of the copied Custom "0.20mm Standard @MyKlipper" base, which is removed; GP1 and TurboM gained the layer_height 0.2 that base supplied, so every preset's resolved settings are unchanged. Removed the orphaned Generic Klipper Printer cover and the unused Turbo-M texture, and renamed TurboM's bed texture to the -texture.svg form the other two models use.

* new Goofoo machine and clean profile

* Restore library filaments dropped by merges from main

* Give the Goofoo Velo+ Tool and 0.2 nozzle fitting processes

---------

Co-authored-by: SoftFever <103989404+SoftFever@users.noreply.github.com>
Co-authored-by: SoftFever <softfeverever@gmail.com>
2026-10-14 15:44:58 +08:00
Lizard 6e42a9b0ae Hot reload local preset bundles (#15424) 2026-10-14 14:18:56 +08:00
SoftFever e77ba5f672 Open .gcode files with their own settings, as .gcode.3mf files are (#16463) 2026-10-14 14:13:58 +08:00