From b1dee600dff0c95f03a3f57ac634d2c991e81db5 Mon Sep 17 00:00:00 2001 From: "lane.wei" Date: Thu, 16 Jan 2025 22:40:17 +0800 Subject: [PATCH] FIX: seq_print: fix the seq_print collision check issue the collision check in y direction has bugs jira: STUDIO-9899 Change-Id: I6fed29797dce98c9a1e7cd7610c8244148ee9cc1 --- src/libslic3r/Print.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 9e9688c85..d264414c0 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -547,6 +547,10 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print return -1; }; std::vector print_instance_with_bounding_box; + + + bool all_objects_are_short = print.is_all_objects_are_short(); + float obj_distance = all_objects_are_short ? scale_(0.5*MAX_OUTER_NOZZLE_RADIUS-0.1) : scale_(0.5*print.config().extruder_clearance_max_radius.value-0.1); { // sequential_print_horizontal_clearance_valid Polygons convex_hulls_other; @@ -554,11 +558,8 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print polygons->clear(); std::vector intersecting_idxs; - bool all_objects_are_short = print.is_all_objects_are_short(); // Shrink the extruder_clearance_radius a tiny bit, so that if the object arrangement algorithm placed the objects // exactly by satisfying the extruder_clearance_radius, this test will not trigger collision. - float obj_distance = all_objects_are_short ? scale_(0.5*MAX_OUTER_NOZZLE_RADIUS-0.1) : scale_(0.5*print.config().extruder_clearance_max_radius.value-0.1); - for (const PrintObject *print_object : print.objects()) { assert(! print_object->model_object()->instances.empty()); assert(! print_object->instances().empty()); @@ -788,9 +789,14 @@ StringObjectException Print::sequential_print_clearance_valid(const Print &print std::map> too_tall_instances; for (int k = 0; k < print_instance_count; k++) { - auto inst = print_instance_with_bounding_box[k].print_instance; // 只需要考虑喷嘴到滑杆的偏移量,这个比整个工具头的碰撞半径要小得多 - auto bbox = print_instance_with_bounding_box[k].bounding_box.inflated(scale_(print_config.extruder_clearance_dist_to_rod.value - print_config.extruder_clearance_max_radius.value)); + BoundingBox& bbox = print_instance_with_bounding_box[k].bounding_box; + bbox.offset( scale_(print_config.extruder_clearance_dist_to_rod.value*0.5) - obj_distance); + } + for (int k = 0; k < print_instance_count; k++) + { + auto inst = print_instance_with_bounding_box[k].print_instance; + auto bbox = print_instance_with_bounding_box[k].bounding_box; auto iy1 = bbox.min.y(); auto iy2 = bbox.max.y(); (const_cast(inst->model_instance))->arrange_order = k+1;