diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index f9c0411b2..76ff92fd3 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -863,9 +863,6 @@ static ExPolygons outer_inner_brim_area(const Print& print, brimToWrite.insert({ objectWithExtruder.first, {true,true} }); ExPolygons objectIslands; - auto bedPoly = Model::getBedPolygon(); - auto bedExPoly = diff_ex((offset(bedPoly, scale_(30.), jtRound, SCALED_RESOLUTION)), { bedPoly }); - auto save_polygon_if_is_inner_island = [](const Polygons& holes_area, const Polygon& contour, int& hole_index) { for (size_t i = 0; i < holes_area.size(); i++) { Polygons contour_polys; @@ -1050,18 +1047,39 @@ static ExPolygons outer_inner_brim_area(const Print& print, } } } - if (!bedExPoly.empty()){ - no_brim_area.push_back(bedExPoly.front()); + + int extruder_nums = print.config().nozzle_diameter.values.size(); + std::vector extruder_unprintable_area; + if (extruder_nums == 1) + extruder_unprintable_area.emplace_back(Polygons{Model::getBedPolygon()}); + else { + extruder_unprintable_area = print.get_extruder_printable_polygons(); } - no_brim_area = offset2_ex(no_brim_area, scaled_flow_width, -scaled_flow_width); // connect scattered small areas to prevent generating very small brims + std::vector filament_map = print.get_filament_maps(); + for (const PrintObject* object : print.objects()) { - if (brimAreaMap.find(object->id()) != brimAreaMap.end()) - { - brimAreaMap[object->id()] = diff_ex(brimAreaMap[object->id()], no_brim_area); + ExPolygons extruder_no_brim_area = no_brim_area; + auto iter = std::find_if(objPrintVec.begin(), objPrintVec.end(), [object](const std::pair& item) { + return item.first == object->id(); + }); + + 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 + + } + + if (brimAreaMap.find(object->id()) != brimAreaMap.end()) { + brimAreaMap[object->id()] = diff_ex(brimAreaMap[object->id()], extruder_no_brim_area); } if (supportBrimAreaMap.find(object->id()) != supportBrimAreaMap.end()) - supportBrimAreaMap[object->id()] = diff_ex(supportBrimAreaMap[object->id()], no_brim_area); + supportBrimAreaMap[object->id()] = diff_ex(supportBrimAreaMap[object->id()], extruder_no_brim_area); } brim_area.clear(); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 9069b6fd6..44be6dc64 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -1344,15 +1344,7 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu // check gcode is valid in multi_extruder printabele area int extruder_size = m_print->config().nozzle_diameter.values.size(); if (extruder_size > 1) { - std::vector printable_area = m_print->get_printable_area(); - Polygon printable_poly = Polygon::new_scale(printable_area); - std::vector> extruder_printable_areas = m_print->get_extruder_printable_area(); - std::vector extruder_unprintable_polys; - for (const auto &e_printable_area : extruder_printable_areas) { - Polygons ploys = diff(printable_poly, Polygon::new_scale(e_printable_area)); - extruder_unprintable_polys.emplace_back(ploys); - } - + std::vector extruder_unprintable_polys = m_print->get_extruder_unprintable_polygons(); m_processor.check_multi_extruder_gcode_valid(extruder_unprintable_polys, m_print->get_extruder_printable_height(), m_print->get_filament_maps()); } diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 655957bc6..8248fb373 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -2411,21 +2411,35 @@ FilamentMapMode Print::get_filament_map_mode() const return m_config.filament_map_mode; } -std::vector Print::get_printable_area() -{ - return m_config.printable_area.values; -} - -std::vector> Print::get_extruder_printable_area() -{ - return m_config.extruder_printable_area.values; -} - -std::vector Print::get_extruder_printable_height() +std::vector Print::get_extruder_printable_height() const { return m_config.extruder_printable_height.values; } +std::vector Print::get_extruder_printable_polygons() const +{ + std::vector extruder_printable_polys; + std::vector> extruder_printable_areas = m_config.extruder_printable_area.values; + for (const auto &e_printable_area : extruder_printable_areas) { + Polygons ploys = {Polygon::new_scale(e_printable_area)}; + extruder_printable_polys.emplace_back(ploys); + } + return std::move(extruder_printable_polys); +} + +std::vector Print::get_extruder_unprintable_polygons() const +{ + std::vector printable_area = m_config.printable_area.values; + Polygon printable_poly = Polygon::new_scale(printable_area); + std::vector> extruder_printable_areas = m_config.extruder_printable_area.values; + std::vector extruder_unprintable_polys; + for (const auto &e_printable_area : extruder_printable_areas) { + Polygons ploys = diff(printable_poly, Polygon::new_scale(e_printable_area)); + extruder_unprintable_polys.emplace_back(ploys); + } + return std::move(extruder_unprintable_polys); +} + size_t Print::get_extruder_id(unsigned int filament_id) const { std::vector filament_map = get_filament_maps(); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index cc3c3b265..c087bf34a 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -834,9 +834,9 @@ public: // 1 based ids const std::vector> &get_unprintable_filament_ids() const; - std::vector get_printable_area(); - std::vector> get_extruder_printable_area(); - std::vector get_extruder_printable_height(); + std::vector get_extruder_printable_height() const; + std::vector get_extruder_printable_polygons() const; + std::vector get_extruder_unprintable_polygons() const; bool enable_timelapse_print() const;