From c8c073a1997caf7471d283c59d98623e3cfbec45 Mon Sep 17 00:00:00 2001 From: Arthur Date: Wed, 26 Oct 2022 21:12:19 +0800 Subject: [PATCH] FIX: print ordering didn't consider object height This may cause tall objects be printed before short ones. There are two possible solutions: 1. do strict ordering only when y-overlap is large enough (the one chosen in this commit) 2. when considering vertical collision with rod, the actual expansion can be much smaller (because the rod is only slightly off extruder). But this solution requires an extra parameter. Let's hold it for a while. Change-Id: Icc9a4796d49dad93cbcc20d4103e641a48886e5e (cherry picked from commit 6a958b1fa9e58e4ca3be63b4918da77bcdc53314) (cherry picked from commit ceff67789c27ea576afd663a2e5bae9a10241728) --- src/libslic3r/Print.cpp | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 1ab618b65..5a93877ea 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -392,6 +392,7 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print Polygon hull_polygon; int index; double arrange_score; + double height; }; std::vector print_instance_with_bounding_box; { @@ -469,6 +470,7 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print } } struct print_instance_info print_info {&instance, convex_hull.bounding_box(), convex_hull}; + print_info.height = instance.print_object->height(); print_instance_with_bounding_box.push_back(std::move(print_info)); convex_hulls_other.emplace_back(std::move(convex_hull)); } @@ -484,6 +486,10 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print } // calc sort order + double hc1 = scale_(print.config().extruder_clearance_height_to_lid); + double hc2 = scale_(print.config().extruder_clearance_height_to_rod); + double printable_height = scale_(print.config().printable_height); + auto bed_points = get_bed_shape(print_config); float bed_width = bed_points[1].x() - bed_points[0].x(); // 如果扩大以后的多边形的距离小于这个值,就需要严格保证从左到右的打印顺序,否则会撞工具头右侧 @@ -497,9 +503,9 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print } for (size_t i = 0; i < print_instance_with_bounding_box.size(); i++) { auto &inst = print_instance_with_bounding_box[i]; + auto &l = print_instance_with_bounding_box[i]; for (size_t j = 0; j < print_instance_with_bounding_box.size(); j++) { if (j != i) { - auto &l = print_instance_with_bounding_box[i]; auto &r = print_instance_with_bounding_box[j]; auto ly1 = l.bounding_box.min.y(); auto ly2 = l.bounding_box.max.y(); @@ -516,22 +522,30 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print inter_max = std::min(lx2, rx2); auto inter_x = inter_max - inter_min; - // 如果y方向有重合,说明两个物体在一行,应该先打左边的物体,即先比较二者的x坐标。 - if (inter_y > 0) { + // 如果y方向的重合超过轮廓的膨胀量,说明两个物体在一行,应该先打左边的物体,即先比较二者的x坐标。 + if (inter_y > scale_(0.5 * print.config().extruder_clearance_radius.value)) { if (std::max(rx1 - lx2, lx1 - rx2) < unsafe_dist) { std::string dir = "left"; if (lx1 > rx1) { left_right_pair.emplace_back(j, i); - print_instance_with_bounding_box[i].arrange_score = std::max(inst.arrange_score, r.arrange_score + bed_width); + l.arrange_score = std::max(l.arrange_score, r.arrange_score + bed_width); } else { left_right_pair.emplace_back(i, j); - print_instance_with_bounding_box[j].arrange_score = std::max(r.arrange_score, l.arrange_score + bed_width); + r.arrange_score = std::max(r.arrange_score, l.arrange_score + bed_width); dir = "right"; } BOOST_LOG_TRIVIAL(debug) << "print_instance " << inst.print_instance->model_instance->get_object()->name << ", right=" << r.print_instance->model_instance->get_object()->name << ", l.score: " << l.arrange_score << ", r.score: " << r.arrange_score << ", dist:" << std::max(rx1 - lx2, lx1 - rx2) << ", dir: " << dir; } + } + if (l.height>hc2) { + // 如果当前物体的高度超过滑杆,且比r高,就给它加一点代价 + if (l.height > r.height) + l.arrange_score = std::max(l.arrange_score, r.arrange_score + bed_width); + BOOST_LOG_TRIVIAL(debug) << "height print_instance " << inst.print_instance->model_instance->get_object()->name + << ", right=" << r.print_instance->model_instance->get_object()->name << ", l.score: " << l.arrange_score + << ", r.score: " << r.arrange_score; } } } @@ -549,6 +563,10 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print else return l.arrange_score < r.arrange_score;}); + for (auto &inst : print_instance_with_bounding_box) + BOOST_LOG_TRIVIAL(debug) << "after sorting print_instance " << inst.print_instance->model_instance->get_object()->name << ", score: " << inst.arrange_score + << ", height:"<< inst.height; + // sequential_print_vertical_clearance_valid { // Ignore the last instance printed. @@ -578,9 +596,6 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print break; }*/ - double hc1 = scale_(print.config().extruder_clearance_height_to_lid); - double hc2 = scale_(print.config().extruder_clearance_height_to_rod); - double printable_height = scale_(print.config().printable_height); // if objects are not overlapped on y-axis, they will not collide even if they are taller than extruder_clearance_height_to_rod int print_instance_count = print_instance_with_bounding_box.size();