From 29d4513694d9ff0d6d9915eaddfdf1c37b9f1a3d Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Tue, 28 Jul 2026 23:46:14 +0300 Subject: [PATCH] Fix overlapping brims (#14991) --- src/libslic3r/Brim.cpp | 22 ++++++++++++++-------- tests/fff_print/test_skirt_brim.cpp | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 6473dc5c21..b22c9c323e 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -32,15 +32,13 @@ static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const P for (; dst_idx < dst.size(); ++dst_idx) dst[dst_idx].translate(instance_shift); } -// BBS: generate brim area by objs -static void append_and_translate(ExPolygons& dst, const ExPolygons& src, - const PrintInstance& instance, size_t instance_idx, std::map& brimAreaMap) { +// Orca: Translate the brim area into print coordinates and store it per instance. +static void append_and_translate(const ExPolygons& src, const PrintInstance& instance, + size_t instance_idx, std::map& brimAreaMap) { ExPolygons srcShifted = src; Point instance_shift = instance.shift_without_plate_offset(); - for (size_t src_idx = 0; src_idx < srcShifted.size(); ++src_idx) - srcShifted[src_idx].translate(instance_shift); - srcShifted = diff_ex(srcShifted, dst); - //expolygons_append(dst, temp2); + for (ExPolygon& expoly : srcShifted) + expoly.translate(instance_shift); expolygons_append(brimAreaMap[{ instance.print_object->id(), instance_idx }], std::move(srcShifted)); } @@ -572,7 +570,7 @@ static ExPolygons outer_inner_brim_area(const Print& print, for (size_t instance_idx = 0; instance_idx < object->instances().size(); ++instance_idx) { const PrintInstance& instance = object->instances()[instance_idx]; if (!brim_area_object.empty()) - append_and_translate(brim_area, brim_area_object, instance, instance_idx, brimAreaMap); + append_and_translate(brim_area_object, instance, instance_idx, brimAreaMap); append_and_translate(no_brim_area, no_brim_area_object, instance); append_and_translate(holes, holes_object, instance); append_and_translate(objectIslands, objectIsland, instance); @@ -875,6 +873,14 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ ExPolygons islands_area_ex = outer_inner_brim_area(print, float(flow.scaled_spacing()), brimAreaMap, objPrintVec, printExtruders); + if (!print.config().combine_brims) { + ExPolygons claimed_area; + for (auto& [_, areas] : brimAreaMap) { + areas = diff_ex(areas, claimed_area); + expolygons_append(claimed_area, areas); + } + } + // BBS: Find boundingbox of the first layer for (const ObjectID printObjID : print.print_object_ids()) { BoundingBox bbx; diff --git a/tests/fff_print/test_skirt_brim.cpp b/tests/fff_print/test_skirt_brim.cpp index d957a4c649..3f63d3de5f 100644 --- a/tests/fff_print/test_skirt_brim.cpp +++ b/tests/fff_print/test_skirt_brim.cpp @@ -153,6 +153,24 @@ TEST_CASE("Object brims are generated per instance", "[SkirtBrim]") } } +TEST_CASE("Uncombined neighboring brims precede their respective objects", "[SkirtBrim]") +{ + Print print; + Model model; + place_two_cubes_apart(0, { + { "skirt_loops", 0 }, + { "brim_type", "outer_only" }, + { "brim_width", 5 }, + { "combine_brims", 0 }, + }, print, model); + print.process(); + + REQUIRE(print.skirt_brim_groups().size() == 1); + REQUIRE(print.skirt_brim_groups().front().brims.size() == 2); + CHECK(role_sequence(gcode(print), { "brim", "perimeter" }) == + std::vector{ "brim", "perimeter", "brim", "perimeter" }); +} + TEST_CASE("Combine brims merges neighboring object instances", "[SkirtBrim]") { Print print;