diff --git a/src/libnest2d/include/libnest2d/nester.hpp b/src/libnest2d/include/libnest2d/nester.hpp index db6cc050a..2ac0392d7 100644 --- a/src/libnest2d/include/libnest2d/nester.hpp +++ b/src/libnest2d/include/libnest2d/nester.hpp @@ -75,7 +75,7 @@ class _Item { public: int itemid_{ 0 }; - int extrude_id{ 1 }; + std::vector extrude_ids; double height{ 0 }; double print_temp{ 0 }; double bed_temp{ 0 }; diff --git a/src/libnest2d/include/libnest2d/selections/firstfit.hpp b/src/libnest2d/include/libnest2d/selections/firstfit.hpp index bc2b5a96b..e739a8870 100644 --- a/src/libnest2d/include/libnest2d/selections/firstfit.hpp +++ b/src/libnest2d/include/libnest2d/selections/firstfit.hpp @@ -114,13 +114,14 @@ public: double score = LARGE_COST_TO_REJECT+1, best_score = LARGE_COST_TO_REJECT+1; double score_all_plates = 0, score_all_plates_best = std::numeric_limits::max(); typename Placer::PackResult result, result_best, result_firstfit; - size_t j = 0; + int j = 0; while(!was_packed && !cancelled()) { for(; j < placers.size() && !was_packed && !cancelled(); j++) { result = placers[j].pack(*it, rem(it, store_)); score = result.score(); score_all_plates = std::accumulate(placers.begin(), placers.begin() + j, score, [](double sum, const Placer& elem) { return sum + elem.score(); }); + if (this->unfitindicator_) this->unfitindicator_(it->get().name + " bed_id="+std::to_string(j) + ",score=" + std::to_string(score)); if(score >= 0 && score < LARGE_COST_TO_REJECT) { if (bed_id_firstfit == -1) { diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index 83c803b3c..2eb90dfe6 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -452,20 +452,25 @@ protected: } std::set extruder_ids; + int non_virt_cnt = 0; for (int i = 0; i < m_items.size(); i++) { Item& p = m_items[i]; if (p.is_virt_object) continue; - extruder_ids.insert(p.extrude_id); - // add a large cost if not multi materials on same plate is not allowed - if (!params.allow_multi_materials_on_same_plate) - score += LARGE_COST_TO_REJECT * (item.extrude_id != p.extrude_id); + extruder_ids.insert(p.extrude_ids.begin(),p.extrude_ids.end()); + non_virt_cnt++; } + extruder_ids.insert(item.extrude_ids.begin(),item.extrude_ids.end()); + // add a large cost if not multi materials on same plate is not allowed + if (!params.allow_multi_materials_on_same_plate) { + // non_virt_cnt==0 means it's the first object, which can be multi-color + if (extruder_ids.size() > 1 && non_virt_cnt > 0) + score += LARGE_COST_TO_REJECT * 1.1; + } // for layered printing, we want extruder change as few as possible // this has very weak effect, CAN NOT use a large weight if (!params.is_seq_print) { - extruder_ids.insert(item.extrude_id); - score += 1 * std::max(0, ((int)extruder_ids.size() - 1)); + score += 1 * std::max(0, ((int) extruder_ids.size() - 1)); } return std::make_tuple(score, fullbb); @@ -601,7 +606,7 @@ public: } else { return i1.bed_temp != i2.bed_temp ? (i1.bed_temp > i2.bed_temp) : - (i1.extrude_id != i2.extrude_id ? (i1.extrude_id < i2.extrude_id) : (i1.area() > i2.area())); + (i1.extrude_ids != i2.extrude_ids ? (i1.extrude_ids.front() < i2.extrude_ids.front()) : (i1.area() > i2.area())); } }; @@ -850,7 +855,7 @@ static void process_arrangeable(const ArrangePolygon &arrpoly, item.binId(arrpoly.bed_idx); item.priority(arrpoly.priority); item.itemId(arrpoly.itemid); - item.extrude_id = arrpoly.extrude_ids.front(); + item.extrude_ids = arrpoly.extrude_ids; item.height = arrpoly.height; item.name = arrpoly.name; //BBS: add virtual object logic