From b48c8c354776aa6fb7812a8071fa0fa90ffead90 Mon Sep 17 00:00:00 2001 From: "xun.zhang" Date: Fri, 11 Apr 2025 10:18:56 +0800 Subject: [PATCH] FIX: too slow slice in brim generate 1.Cache extruder_brim_areas jira: STUDIO-11478 Signed-off-by: xun.zhang Change-Id: I370aad43b043e72a674da79271a806d3b3d97ffa --- src/libslic3r/Brim.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 186964dcf..988dce63b 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -1067,6 +1067,16 @@ static ExPolygons outer_inner_brim_area(const Print& print, expolygons_append(no_brim_area, expolyFromLines); } + std::vector extruder_no_brim_area_cache(extruder_nums, no_brim_area); + for (int extruder_id = 0; extruder_id < extruder_nums; ++extruder_id) { + auto bedPoly = extruder_unprintable_area[extruder_id]; + auto bedExPoly = diff_ex((offset(bedPoly, scale_(30.), jtRound, SCALED_RESOLUTION)), {bedPoly}); + if (!bedExPoly.empty()) { + extruder_no_brim_area_cache[extruder_id].push_back(bedExPoly.front()); + } + extruder_no_brim_area_cache[extruder_id] = offset2_ex(extruder_no_brim_area_cache[extruder_id], scaled_flow_width, -scaled_flow_width); // connect scattered small areas to prevent generating very small brims + } + for (const PrintObject* object : print.objects()) { ExPolygons extruder_no_brim_area = no_brim_area; auto iter = std::find_if(objPrintVec.begin(), objPrintVec.end(), [object](const std::pair& item) { @@ -1075,13 +1085,7 @@ static ExPolygons outer_inner_brim_area(const Print& print, if (iter != objPrintVec.end()) { int extruder_id = filament_map[iter->second - 1] - 1; - auto bedPoly = extruder_unprintable_area[extruder_id]; - auto bedExPoly = diff_ex((offset(bedPoly, scale_(30.), jtRound, SCALED_RESOLUTION)), {bedPoly}); - if (!bedExPoly.empty()) { - extruder_no_brim_area.push_back(bedExPoly.front()); - } - extruder_no_brim_area = offset2_ex(extruder_no_brim_area, scaled_flow_width, -scaled_flow_width); // connect scattered small areas to prevent generating very small brims - + extruder_no_brim_area = extruder_no_brim_area_cache[extruder_id]; } if (brimAreaMap.find(object->id()) != brimAreaMap.end()) {