mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-10-07 15:51:08 +00:00
Follow-up to #16195 and the review discussion on #14394 (yw4z's note about the third column on the *Belt tilt* row). Removes the belt options that are redundant or unused before the branch ships, so they never need compatibility handling after a release, and fixes supports under a leading overhang. Every removed key is on `handle_legacy()`'s ignore list, so existing profiles and 3MFs load silently. ## Removed - **`belt_slice_rotation_global`**, **`preslice_remap_global`**, **`belt_preslice_global`** (*Global mesh transforms*) and **`gcode_back_transform`** — the global mode and the back-transform are what belt printing is; they are presumed on wherever the flags were consulted (`PrintObjectSlice`, `BeltBackTransform`, `BeltGCode`, `Print::process`, `PrintApply`, `GCodeViewer`). The *Belt tilt* row is axis + angle only; the three `fdm_belt_common.json` drop the keys. - **`preslice_remap_x/y/z`** — no profile used the pre-slice axis remap; the belt tilt axis plus the G-code axis remap cover the machines that exist, and its implementation only agreed with itself for a plain swap. The forward transform is the rotation. - **`belt_support_z_offset_mode`** and **`belt_support_floor_mode`** — the first was never read by a generator; the second's only shipped value (*Generator only*) is now the behaviour. - **`first_layer_plane`**, **`first_layer_plane_offset`**, **`first_layer_plane_thickness`** and `FirstLayerPlane.{cpp,hpp}` — the first-layer band is measured from the belt surface and is one first layer height thick. - `belt_brim_instances_compatible()` and its validation warning: instances along the belt get their brim. ## Supports under a leading overhang (the clipping at the object's local Z = 0) The slicing frame of a belt object started at its lowest vertex, but the belt under the leading end of an overhang lies below that, so no generator could reach it: normal supports stopped at the object's lowest layer, and both tree generators carried extension hacks sized from the pre-rotation bbox and capped at global Z = 0 (right only for the trailing half of the belt). The frame now starts at the lowest belt-floor point under the footprint, less a 10 mm margin along the belt for the base of a support column, and the extensions are gone: - **Normal supports** run in the object frame and get the global belt Z offset shifted onto the result (as organic already did). With the offset on the object layers, a top contact at negative Z turned the intermediate-layer count negative and the generator allocated layers until the kernel killed it — any overhang in the leading half of the belt did this. The first-layer flange expansion is skipped on a belt (the first support layer is the leading tip, not a flange). - **Classic tree** nodes keep dropping until their whole circle is in the belt, so a branch tapers to a tip on the belt instead of stopping a radius above it. - **Organic**: the belt is no longer a support blocker. A blocker is a collision, and a branch descending onto one slides off it, down the belt and ahead of the part; the belt is where branches end, which the per-layer floor clipping already does. Regression test *Belt supports reach the belt under a leading overhang*: a cube with a fin whose underside is parallel to the layers, 20 mm ahead of the cube and up to 41 mm of slicing Z above the belt, for normal, organic and classic tree supports; the lowest support layer must sit on the belt beneath its own lines. The belt object height (the layer range) is now estimated from the box of the mesh as placed on the bed. `raw_bounding_box()` has the instance's Z offset removed, which was harmless for the old rotated-extent estimate but not for one anchored at the belt floor (a point's rotated z and the floor under it move in opposite directions under a Z shift): with the first version of this change every part came out as a wedge, sliced only up to its diagonal, in the GUI and CLI alike. Caught by a GUI test pass; the leading-overhang test now also checks that the whole part is sliced. ## Belt brim after the parallel support step `belt_brim_obstacles()` reads every object's layers and support layers, which another object's support step rebuilds (and now shifts) at the same time. The brim is generated sequentially once the parallel step is over (`PrintObject::generate_belt_brim()`). This is the race behind the Windows arm64 segfault in *Belt brim of each object precedes its perimeters on its own filament*. ## UI - *Belt tilt* is two rows: the angle (Advanced) and the axis (Developer; a profile-level kinematics choice). A shared line is shown by its first option's mode, so they cannot share one. - *Machine frame transforms* is five single-option rows (G-code remap X / Y / Z, Decouple machine-frame tilt, Machine-frame tilt angle — the angle row only appears when decoupled) instead of two multi-column lines; the remap fields got full labels since they stand alone now. - The gravity indicator on the bed is a plain line along the up direction (no cone, 60 % of the axes' length), per yw4z. - The *Show raw G-code (belt only)* legend/canvas toggle and its `B` shortcut are gone; the preview is the designed view. Also carries the two-line `phong.fs` fix from #16226 (merges as a no-op). ## Verification - `libslic3r_tests` 1116 passed (92 648 assertions); `fff_print_tests` 351 passed (561 696 assertions). - `scripts/clang_tidy_diff.py --base upstream/belt-printer`: no findings. - `scripts/orca_profile_tool.py check`: no profile references a removed key. - GUI target builds; a scripted GUI pass (xdotool) checked the settings groups in every mode, slicing, export, instances, the purge tower, calibration dialogs, the wizard, printer switching and 3MF round-trip. The wiki pages (OrcaSlicer/OrcaSlicer_WIKI#374) get a follow-up dropping the removed sections once this is in.