From 869b93e270b8e6bac37e23fb68ec7f9ca99fbeba Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 21 Nov 2022 15:00:01 +0800 Subject: [PATCH] ENH: improve auto-arrange compactness around wipe tower 1. improve auto-arrange compactness around wipe tower 2. do not show "Avoid extrusion calibration region" for P1P 3. encourage objects with similar height to be arranged together Jira: STUDIO-1364 Change-Id: I5efa61a676c453618cdb3915fb98928d07138deb (cherry picked from commit 571ee0c6d91d8a5f6a60838052f09d49d85f12ed) --- src/libslic3r/Arrange.cpp | 14 +++++++++++--- src/libslic3r/Arrange.hpp | 1 + src/slic3r/GUI/GLCanvas3D.cpp | 15 +++++++++++---- src/slic3r/GUI/Jobs/ArrangeJob.cpp | 8 +------- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp index 7394317e5..4dffcf39f 100644 --- a/src/libslic3r/Arrange.cpp +++ b/src/libslic3r/Arrange.cpp @@ -425,12 +425,20 @@ protected: Item& p = m_items[i]; if (p.is_virt_object) { // Better not put items above wipe tower - if (p.is_wipe_tower) - score += ibb.maxCorner().y() > p.boundingBox().maxCorner().y(); + if (p.is_wipe_tower) { + if (ibb.maxCorner().y() > p.boundingBox().maxCorner().y()) + score += 1; + else if(m_pilebb.defined) + score += norm(pl::distance(ibb.center(), m_pilebb.center())); + } else continue; - } else + } else { + // 高度接近的件尽量摆到一起 + score += (1- std::abs(item.height - p.height) / params.printable_height) + * norm(pl::distance(ibb.center(), p.boundingBox().center())); score += LARGE_COST_TO_REJECT * (item.bed_temp - p.bed_temp != 0); + } } } diff --git a/src/libslic3r/Arrange.hpp b/src/libslic3r/Arrange.hpp index 09b325365..d1f905b89 100644 --- a/src/libslic3r/Arrange.hpp +++ b/src/libslic3r/Arrange.hpp @@ -124,6 +124,7 @@ struct ArrangeParams { float clearance_height_to_rod = 0; float clearance_height_to_lid = 0; float cleareance_radius = 0; + float printable_height = 256.0; ArrangePolygons excluded_regions; // regions cant't be used ArrangePolygons nonprefered_regions; // regions can be used but not prefered diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 31ccb73e1..76420081b 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -5195,10 +5195,17 @@ bool GLCanvas3D::_render_arrange_menu(float left, float right, float bottom, flo settings_changed = true; } - if (imgui->bbl_checkbox(_L("Avoid extrusion calibration region"), settings.avoid_extrusion_cali_region)) { - settings_out.avoid_extrusion_cali_region = settings.avoid_extrusion_cali_region; - appcfg->set("arrange", avoid_extrusion_key.c_str(), settings_out.avoid_extrusion_cali_region ? "1" : "0"); - settings_changed = true; + // only show this option if the printer has micro Lidar and can do first layer scan + DynamicPrintConfig ¤t_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto op = current_config.option("scan_first_layer"); + if (op && op->getBool()) { + if (imgui->bbl_checkbox(_L("Avoid extrusion calibration region"), settings.avoid_extrusion_cali_region)) { + settings_out.avoid_extrusion_cali_region = settings.avoid_extrusion_cali_region; + appcfg->set("arrange", avoid_extrusion_key.c_str(), settings_out.avoid_extrusion_cali_region ? "1" : "0"); + settings_changed = true; + } + } else { + settings_out.avoid_extrusion_cali_region = false; } ImGui::Separator(); diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index f97f9927d..9c9bdc83d 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -388,6 +388,7 @@ void ArrangeJob::prepare() params.clearance_height_to_rod = print.config().extruder_clearance_height_to_rod.value; params.clearance_height_to_lid = print.config().extruder_clearance_height_to_lid.value; params.cleareance_radius = print.config().extruder_clearance_radius.value; + params.printable_height = print.config().printable_height.value; params.allow_rotations = settings.enable_rotation; params.allow_multi_materials_on_same_plate = settings.allow_multi_materials_on_same_plate; params.avoid_extrusion_cali_region = settings.avoid_extrusion_cali_region; @@ -563,13 +564,6 @@ void ArrangeJob::process() update_status(num_finished, _L("Arranging") + " " + str); }; - if(!params.is_seq_print) - { - // force all heights be the same, so items are sorted by area - for (auto& ap : m_selected) ap.height = 1; - for (auto& ap : m_unselected) ap.height = 1; - } - { BOOST_LOG_TRIVIAL(debug) << "items selected before arrange: "; for (auto selected : m_selected)