diff --git a/src/libnest2d/include/libnest2d/nester.hpp b/src/libnest2d/include/libnest2d/nester.hpp index b35e416e7..6a59d1c5b 100644 --- a/src/libnest2d/include/libnest2d/nester.hpp +++ b/src/libnest2d/include/libnest2d/nester.hpp @@ -10,6 +10,7 @@ #include #define LARGE_COST_TO_REJECT 1e7 +#define COST_OF_NEW_PLATE 0.1 namespace libnest2d { diff --git a/src/libnest2d/include/libnest2d/selections/firstfit.hpp b/src/libnest2d/include/libnest2d/selections/firstfit.hpp index 9ce68e7ee..e3d7e8f86 100644 --- a/src/libnest2d/include/libnest2d/selections/firstfit.hpp +++ b/src/libnest2d/include/libnest2d/selections/firstfit.hpp @@ -140,7 +140,7 @@ public: } result = placers[j].pack(*it, rem(it, store_)); score = result.score(); - score_all_plates = score; + score_all_plates = score + COST_OF_NEW_PLATE * j; // add a larger cost to larger plate id to encourace to use less plates for (int i = 0; i < placers.size(); i++) { score_all_plates += placers[i].score();} if (this->unfitindicator_) this->unfitindicator_((boost::format("item %1% bed_id=%2%, score=%3%, score_all_plates=%4%, pos=(%5%, %6%)") % it->get().name % j % score % diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index 0174f949c..eca703bd3 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -481,15 +481,19 @@ void ArrangeJob::prepare_outside_plate() { auto iter1 = all_inside_objects.find(std::pair(obj_idx, inst_idx)); auto iter2 = all_outside_objects.find(std::pair(obj_idx, inst_idx)); bool outside_plate = false; + PartPlate *plate_locked = nullptr; if (iter1 == all_inside_objects.end()) { continue; + } else { + int plate_idx = iter1->second; + if (plate_list.get_plate(plate_idx)->is_locked()) { plate_locked = plate_list.get_plate(plate_idx); } } if (iter2 != all_outside_objects.end()) { outside_plate = true; ARRANGE_LOG(debug) << object->name << " is outside!"; } ArrangePolygon&& ap = prepare_arrange_polygon(instance); - ArrangePolygons &cont = instance->printable ? (outside_plate ? m_selected : m_unselected) : m_unprintable; + ArrangePolygons &cont = !instance->printable ? m_unprintable : plate_locked ? m_locked : outside_plate ? m_selected : m_unselected; ap.itemid = cont.size(); if (!outside_plate) { plate_list.preprocess_arrange_polygon(obj_idx, inst_idx, ap, false);