From 8dd401d35f51377bccd2c9d8b43138ad55b458cc Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 28 Oct 2022 17:57:19 +0800 Subject: [PATCH] FIX: auto-arrange reads wrongs first_bed_temp Also change words for extruder clearance parameters. Change-Id: I736fd9049d184c140b33078d78f764b4fe172765 (cherry picked from commit e70c0c0ea133cffa5788efbfc9633332b196e8df) --- .../include/libnest2d/selections/firstfit.hpp | 26 ++++++++++++++----- src/libslic3r/Arrange.cpp | 15 +++++------ src/libslic3r/ModelArrange.cpp | 4 +-- src/libslic3r/PrintConfig.cpp | 8 +++--- src/slic3r/GUI/Jobs/ArrangeJob.cpp | 1 + 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/libnest2d/include/libnest2d/selections/firstfit.hpp b/src/libnest2d/include/libnest2d/selections/firstfit.hpp index 713768a42..bc2b5a96b 100644 --- a/src/libnest2d/include/libnest2d/selections/firstfit.hpp +++ b/src/libnest2d/include/libnest2d/selections/firstfit.hpp @@ -84,6 +84,15 @@ public: std::sort(store_.begin(), store_.end(), sortfunc); + // debug: write down intitial order + for (auto it = store_.begin(); it != store_.end(); ++it) { + std::stringstream ss; + ss << "initial order: " << it->get().name << ", p=" << it->get().priority() << ", bed_temp=" << it->get().bed_temp << ", height=" << it->get().height + << ", area=" << it->get().area(); + if (this->unfitindicator_) + this->unfitindicator_(ss.str()); + } + int item_id = 0; auto makeProgress = [this, &item_id](Placer &placer, size_t bin_idx) { packed_bins_[bin_idx] = placer.getItems(); @@ -102,7 +111,7 @@ public: bool was_packed = false; int best_bed_id = -1; int bed_id_firstfit = -1; - double score = LARGE_COST_TO_REJECT, best_score = LARGE_COST_TO_REJECT; + 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; @@ -130,8 +139,8 @@ public: // item is not fit because we have tried all possible plates to find a good enough fit if (bed_id_firstfit == MAX_NUM_PLATES) { it->get().binId(BIN_ID_UNFIT); - //if (this->unfitindicator_) - // this->unfitindicator_(it->get().name + " bed_id_firstfit == MAX_NUM_PLATES" + ",best_score=" + std::to_string(best_score)); + if (this->unfitindicator_) + this->unfitindicator_(it->get().name + " bed_id_firstfit == MAX_NUM_PLATES" + ",best_score=" + std::to_string(best_score)); break; } else { @@ -152,10 +161,13 @@ public: } if(!was_packed){ - //if (this->unfitindicator_) - // this->unfitindicator_(it->get().name + " ,plate_id=" + std::to_string(j) + ",score=" + std::to_string(score) - // + ", score_all_plates=" + std::to_string(score_all_plates) - // + ", overfit=" + std::to_string(result.overfit())); + if (this->unfitindicator_ && !placers.empty()) + this->unfitindicator_(it->get().name + ", height=" +std::to_string(it->get().height) + + " ,plate_id=" + std::to_string(j-1) + + ", score=" + std::to_string(score) + + ", best_bed_id=" + std::to_string(best_bed_id) + + ", score_all_plates=" + std::to_string(score_all_plates) + +", overfit=" + std::to_string(result.overfit())); placers.emplace_back(bin); placers.back().plateID(placers.size() - 1); diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index cc2f1721a..82dcf0c9a 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -404,8 +404,8 @@ protected: hasLidHeightConflict |= (p.height > clearance_height_to_lid); } - double lambda3 = LARGE_COST_TO_REJECT; - double lambda4 = LARGE_COST_TO_REJECT; + double lambda3 = LARGE_COST_TO_REJECT*1.1; + double lambda4 = LARGE_COST_TO_REJECT*1.2; for (int i = 0; i < m_items.size(); i++) { Item& p = m_items[i]; if (p.is_virt_object) continue; @@ -556,12 +556,11 @@ public: } }); - //if (progressind) { - // m_pck.unfitIndicator([this, progressind](std::string name) { - // progressind(100, name+" not fit!"); - // BOOST_LOG_TRIVIAL(debug) << "arrange not fit: " + name; - // }); - //} + if (progressind) { + m_pck.unfitIndicator([this, progressind](std::string name) { + BOOST_LOG_TRIVIAL(debug) << "arrange not fit: " + name; + }); + } if (stopcond) m_pck.stopCondition(stopcond); diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp index 7e280d76b..a1c43cd39 100644 --- a/src/libslic3r/ModelArrange.cpp +++ b/src/libslic3r/ModelArrange.cpp @@ -127,11 +127,11 @@ ArrangePolygon get_instance_arrange_poly(ModelInstance* instance, const Slic3r:: const ConfigOptionInts* bed_opt = config.option(get_bed_temp_key(curr_bed_type)); if (bed_opt != nullptr) - ap.bed_temp = bed_opt->get_at(ap.extrude_ids.back()); + ap.bed_temp = bed_opt->get_at(ap.extrude_ids.back()-1); const ConfigOptionInts* bed_opt_1st_layer = config.option(get_bed_temp_1st_layer_key(curr_bed_type)); if (bed_opt_1st_layer != nullptr) - ap.first_bed_temp = bed_opt_1st_layer->get_at(ap.extrude_ids.back()); + ap.first_bed_temp = bed_opt_1st_layer->get_at(ap.extrude_ids.back()-1); } if (config.has("nozzle_temperature")) //get the print temperature diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index bfd56bf65..55cd810d7 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -968,7 +968,7 @@ void PrintConfigDef::init_fff_params() def = this->add("extruder_clearance_height_to_rod", coFloat); def->label = L("Height to rod"); def->tooltip = L("Distance of the nozzle tip to the lower rod. " - "Used as input of auto-arranging to avoid collision when printing by object"); + "Used for collision avoidance in by-object printing."); def->sidetext = L("mm"); def->min = 0; def->mode = comAdvanced; @@ -978,7 +978,7 @@ void PrintConfigDef::init_fff_params() def = this->add("extruder_clearance_height_to_lid", coFloat); def->label = L("Height to lid"); def->tooltip = L("Distance of the nozzle tip to the lid. " - "Used as input of auto-arranging to avoid collision when printing by object"); + "Used for collision avoidance in by-object printing."); def->sidetext = L("mm"); def->min = 0; def->mode = comAdvanced; @@ -986,7 +986,7 @@ void PrintConfigDef::init_fff_params() def = this->add("extruder_clearance_radius", coFloat); def->label = L("Radius"); - def->tooltip = L("Clearance radius around extruder. Used as input of auto-arranging to avoid collision when printing by object"); + def->tooltip = L("Clearance radius around extruder. Used for collision avoidance in by-object printing."); def->sidetext = L("mm"); def->min = 0; def->mode = comAdvanced; @@ -994,7 +994,7 @@ void PrintConfigDef::init_fff_params() def = this->add("extruder_clearance_max_radius", coFloat); def->label = L("Max Radius"); - def->tooltip = L("Max clearance radius around extruder. Used as input of auto-arranging to avoid collision when printing by object"); + def->tooltip = L("Max clearance radius around extruder. Used for collision avoidance in by-object printing."); def->sidetext = L("mm"); def->min = 0; def->mode = comAdvanced; diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index d481ee83d..f8a3874ec 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -575,6 +575,7 @@ void ArrangeJob::process() << ", bed_temp: " << selected.first_bed_temp << ", print_temp: " << selected.print_temp; BOOST_LOG_TRIVIAL(debug) << "items unselected before arrange: "; for (auto item : m_unselected) + if (!item.is_virt_object) BOOST_LOG_TRIVIAL(debug) << item.name << ", extruder: " << item.extrude_ids.back() << ", bed: " << item.bed_idx << ", trans: " << item.translation.transpose(); }