From 51fd6327fee6c8e0a7d082906c3a8c56f35c477c Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Thu, 3 Sep 2026 00:15:18 +0300 Subject: [PATCH] Fix omitted assembly parts with height ranges (#15499) --- src/libslic3r/PrintApply.cpp | 8 +++++--- src/libslic3r/PrintObjectSlice.cpp | 13 ++++++++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/libslic3r/PrintApply.cpp b/src/libslic3r/PrintApply.cpp index f03271bf73..90d60b5917 100644 --- a/src/libslic3r/PrintApply.cpp +++ b/src/libslic3r/PrintApply.cpp @@ -560,9 +560,11 @@ static inline bool model_volume_solid_or_modifier(const ModelVolume &mv) static inline Transform3f trafo_for_bbox(const Transform3d &object_trafo, const Transform3d &volume_trafo) { - Transform3d m = object_trafo * volume_trafo; - m.translation().x() = 0.; - m.translation().y() = 0.; + // Orca: Keep the volume's local XY offset for multipart overlap checks, but remove the object's bed placement. + Transform3d object_trafo_local = object_trafo; + object_trafo_local.translation().x() = 0.; + object_trafo_local.translation().y() = 0.; + Transform3d m = object_trafo_local * volume_trafo; return m.cast(); } diff --git a/src/libslic3r/PrintObjectSlice.cpp b/src/libslic3r/PrintObjectSlice.cpp index f6a6b43e09..d16e381604 100644 --- a/src/libslic3r/PrintObjectSlice.cpp +++ b/src/libslic3r/PrintObjectSlice.cpp @@ -304,11 +304,16 @@ static std::vector> slices_to_regions( float z = zs[z_idx]; int idx_first_printable_region = -1; bool complex = false; + std::vector printable_region_ids; for (int idx_region = 0; idx_region < int(layer_range.volume_regions.size()); ++ idx_region) { const PrintObjectRegions::VolumeRegion ®ion = layer_range.volume_regions[idx_region]; if (region.bbox->min().z() <= z && region.bbox->max().z() >= z) { - if (idx_first_printable_region == -1 && region.model_volume->is_model_part()) + if (region.model_volume->is_model_part()) + printable_region_ids.push_back(idx_region); + + if (idx_first_printable_region == -1 && region.model_volume->is_model_part()) { idx_first_printable_region = idx_region; + } else if (idx_first_printable_region != -1) { // Test for overlap with some other region. for (int idx_region2 = idx_first_printable_region; idx_region2 < idx_region; ++ idx_region2) { @@ -324,8 +329,10 @@ static std::vector> slices_to_regions( if (complex) zs_complex.push_back({ z_idx, z }); else if (idx_first_printable_region >= 0) { - const PrintObjectRegions::VolumeRegion ®ion = layer_range.volume_regions[idx_first_printable_region]; - slices_by_region[region.region->print_object_region_id()][z_idx] = std::move(volume_slices_find_by_id(volume_slices, region.model_volume->id()).slices[z_idx]); + for (int printable_region_id : printable_region_ids) { + const PrintObjectRegions::VolumeRegion ®ion = layer_range.volume_regions[printable_region_id]; + append(slices_by_region[region.region->print_object_region_id()][z_idx], std::move(volume_slices_find_by_id(volume_slices, region.model_volume->id()).slices[z_idx])); + } } } }