[Feature Request] Height-aware (3D) exclusion zones via bed_exclude_area_max_z #319

Closed
opened 2026-04-05 16:19:51 +02:00 by MrUnknownDE · 0 comments
Owner

Originally created by @Ryan-Battersby on 3/15/2026

Summary

The current bed_exclude_area setting defines a 2D polygon that is projected as a full-height vertical column through the entire build volume. This prevents the toolhead from travelling through that XY space at any height, even when the physical obstacle (e.g. a bed clip, a tool-changer dock, a low-profile sensor) is only a few millimetres tall.

Use Case

A 3×3 cm bed clip sits in the centre of the build plate. It is 5 mm tall. The slicer currently treats the entire air column above it as a no-go zone. This means:

  • Parts cannot be placed anywhere near the clip footprint
  • Travel moves are routed around the column even at Z = 50 mm, Z = 100 mm, etc.
  • This unnecessarily restricts the usable build volume and forces long travel detours

What we actually want: block the nozzle from entering the XY zone only below a configurable Z height, and allow free travel above it.

Proposed Change

Add a companion float config option: bed_exclude_area_max_z

Option Type Default Behaviour
bed_exclude_area ConfigOptionPoints (unchanged) Defines the XY polygon
bed_exclude_area_max_z ConfigOptionFloat 0.0 Max Z for the exclusion. 0 = full height (current behaviour, fully backward-compatible)

When bed_exclude_area_max_z > 0:

  • Object placement check (in Print.cpp) remains Z-agnostic — you still cannot place a model inside the zone footprint
  • Travel path planning (in GCode.cpp) skips the polygon check when current_z > bed_exclude_area_max_z, allowing the nozzle to pass freely

Implementation Scope

  • src/libslic3r/PrintConfig.cpp/.hpp — new config option + struct member
  • src/libslic3r/PrintConfig.hpp — update get_bed_excluded_area() helper to accept optional current_z
  • src/libslic3r/GCode.cpp — Z-aware travel avoidance
  • src/slic3r/GUI/Tab.cpp — UI field in Printer Settings > Basic Information, below the existing polygon input
  • src/slic3r/GUI/Jobs/ArrangeJob.cpp — no logic change, comment added to explain intentional 2D-only behaviour

Backward Compatibility

Default value of 0.0 preserves 100% of current behaviour. Existing printer profiles require no changes.

Status

I am actively developing this feature and intend to submit a PR. Raising this issue first to get early feedback before the code review stage.


Related issues: #10579, #10638 (3D exclusion zone requests)

*Originally created by @Ryan-Battersby on 3/15/2026* ## Summary The current `bed_exclude_area` setting defines a 2D polygon that is projected as a full-height vertical column through the entire build volume. This prevents the toolhead from **travelling** through that XY space at any height, even when the physical obstacle (e.g. a bed clip, a tool-changer dock, a low-profile sensor) is only a few millimetres tall. ## Use Case A 3×3 cm bed clip sits in the centre of the build plate. It is 5 mm tall. The slicer currently treats the entire air column above it as a no-go zone. This means: - Parts cannot be placed anywhere near the clip footprint - Travel moves are routed around the column even at Z = 50 mm, Z = 100 mm, etc. - This unnecessarily restricts the usable build volume and forces long travel detours **What we actually want:** block the nozzle from entering the XY zone only *below* a configurable Z height, and allow free travel above it. ## Proposed Change Add a companion float config option: **`bed_exclude_area_max_z`** | Option | Type | Default | Behaviour | |---|---|---|---| | `bed_exclude_area` | `ConfigOptionPoints` | (unchanged) | Defines the XY polygon | | `bed_exclude_area_max_z` | `ConfigOptionFloat` | `0.0` | Max Z for the exclusion. `0` = full height (current behaviour, fully backward-compatible) | When `bed_exclude_area_max_z > 0`: - **Object placement check** (in `Print.cpp`) remains Z-agnostic — you still cannot place a model inside the zone footprint - **Travel path planning** (in `GCode.cpp`) skips the polygon check when `current_z > bed_exclude_area_max_z`, allowing the nozzle to pass freely ## Implementation Scope - `src/libslic3r/PrintConfig.cpp/.hpp` — new config option + struct member - `src/libslic3r/PrintConfig.hpp` — update `get_bed_excluded_area()` helper to accept optional `current_z` - `src/libslic3r/GCode.cpp` — Z-aware travel avoidance - `src/slic3r/GUI/Tab.cpp` — UI field in Printer Settings > Basic Information, below the existing polygon input - `src/slic3r/GUI/Jobs/ArrangeJob.cpp` — no logic change, comment added to explain intentional 2D-only behaviour ## Backward Compatibility Default value of `0.0` preserves 100% of current behaviour. Existing printer profiles require no changes. ## Status I am actively developing this feature and intend to submit a PR. Raising this issue first to get early feedback before the code review stage. --- *Related issues: #10579, #10638 (3D exclusion zone requests)*
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/OrcaSlicer#319