FIX: too slow slice in brim generate

1.Cache extruder_brim_areas

jira: STUDIO-11478

Signed-off-by: xun.zhang <xun.zhang@bambulab.com>
Change-Id: I370aad43b043e72a674da79271a806d3b3d97ffa
This commit is contained in:
xun.zhang 2025-04-11 10:18:56 +08:00 committed by lane.wei
parent e7c94ed79e
commit b48c8c3547
1 changed files with 11 additions and 7 deletions

View File

@ -1067,6 +1067,16 @@ static ExPolygons outer_inner_brim_area(const Print& print,
expolygons_append(no_brim_area, expolyFromLines); expolygons_append(no_brim_area, expolyFromLines);
} }
std::vector<ExPolygons> 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()) { for (const PrintObject* object : print.objects()) {
ExPolygons extruder_no_brim_area = no_brim_area; ExPolygons extruder_no_brim_area = no_brim_area;
auto iter = std::find_if(objPrintVec.begin(), objPrintVec.end(), [object](const std::pair<ObjectID, unsigned int>& item) { auto iter = std::find_if(objPrintVec.begin(), objPrintVec.end(), [object](const std::pair<ObjectID, unsigned int>& item) {
@ -1075,13 +1085,7 @@ static ExPolygons outer_inner_brim_area(const Print& print,
if (iter != objPrintVec.end()) { if (iter != objPrintVec.end()) {
int extruder_id = filament_map[iter->second - 1] - 1; int extruder_id = filament_map[iter->second - 1] - 1;
auto bedPoly = extruder_unprintable_area[extruder_id]; extruder_no_brim_area = extruder_no_brim_area_cache[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
} }
if (brimAreaMap.find(object->id()) != brimAreaMap.end()) { if (brimAreaMap.find(object->id()) != brimAreaMap.end()) {