diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp index 5acdb6fb9..ed3f7a509 100644 --- a/src/libslic3r/ModelArrange.cpp +++ b/src/libslic3r/ModelArrange.cpp @@ -157,6 +157,11 @@ ArrangePolygon get_instance_arrange_poly(ModelInstance* instance, const Slic3r:: } #else ap.brim_width = 0; + // For by-layer printing, need to shrink bed a little, so the support won't go outside bed. + // We set it to 5mm because that's how much a normal support will grow by default. + auto supp_type_ptr = obj->get_config_value(config, "enable_support"); + if (supp_type_ptr && supp_type_ptr->getBool()) + ap.brim_width = 5.0; #endif ap.height = obj->bounding_box().size().z(); diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index 78286a048..78ae95c89 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -497,7 +497,8 @@ void ArrangeJob::process() auto & partplate_list = m_plater->get_partplate_list(); auto& print = wxGetApp().plater()->get_partplate_list().get_current_fff_print(); - if (params.avoid_extrusion_cali_region && print.full_print_config().opt_bool("scan_first_layer")) + const Slic3r::DynamicPrintConfig& global_config = wxGetApp().preset_bundle->full_config(); + if (params.avoid_extrusion_cali_region && global_config.opt_bool("scan_first_layer")) partplate_list.preprocess_nonprefered_areas(m_unselected, MAX_NUM_PLATES); update_arrange_params(params, *m_plater, m_selected); @@ -776,15 +777,6 @@ void update_arrange_params(arrangement::ArrangeParams ¶ms, const Plater &p, params.bed_shrink_x -= shift_dist; params.bed_shrink_y -= shift_dist; } - - // For by-layer printing, need to shrink bed a little, so the support won't go outside bed. - // We set it to 5mm because that's how much a normal support will grow by default. - // But for by-object printing, it's not needed since the clerance distance is already very large. - if (print.full_print_config().opt_bool("enable_support") && !params.is_seq_print) { - params.bed_shrink_x = std::max(5.f, params.bed_shrink_x); - params.bed_shrink_y = std::max(5.f, params.bed_shrink_y); - params.min_obj_distance = std::max(scaled(10.0), params.min_obj_distance); - } } //it will bed accurate after call update_params @@ -807,7 +799,7 @@ void update_selected_items_inflation(arrangement::ArrangePolygons &selected, con Points bedpts = get_shrink_bedpts(p, params); BoundingBox bedbb = Polygon(bedpts).bounding_box(); std::for_each(selected.begin(), selected.end(), [&](ArrangePolygon &ap) { - ap.inflation = params.min_obj_distance / 2; + ap.inflation = std::max(scaled(ap.brim_width), params.min_obj_distance / 2); BoundingBox apbb = ap.poly.contour.bounding_box(); auto diffx = bedbb.size().x() - apbb.size().x() - 5; auto diffy = bedbb.size().y() - apbb.size().y() - 5; @@ -834,7 +826,8 @@ void update_unselected_items_inflation(arrangement::ArrangePolygons &unselected, // 其他物体的膨胀轮廓是可以跟它们重叠的。 double scaled_exclusion_gap = scale_(1); std::for_each(unselected.begin(), unselected.end(), - [&](auto &ap) { ap.inflation = !ap.is_virt_object ? params.min_obj_distance / 2 : (ap.is_extrusion_cali_object ? 0 : scaled_exclusion_gap); }); + [&](auto &ap) { ap.inflation = !ap.is_virt_object ? std::max(scaled(ap.brim_width), params.min_obj_distance / 2) + : (ap.is_extrusion_cali_object ? 0 : scaled_exclusion_gap); }); } }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/Jobs/FillBedJob.cpp b/src/slic3r/GUI/Jobs/FillBedJob.cpp index b6ecbaae9..c00968180 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.cpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.cpp @@ -45,6 +45,7 @@ void FillBedJob::prepare() ModelObject *model_object = m_plater->model().objects[m_object_idx]; if (model_object->instances.empty()) return; + const Slic3r::DynamicPrintConfig& global_config = wxGetApp().preset_bundle->full_config(); m_selected.reserve(model_object->instances.size()); for (size_t oidx = 0; oidx < model.objects.size(); ++oidx) { @@ -53,7 +54,7 @@ void FillBedJob::prepare() { bool selected = (oidx == m_object_idx); - ArrangePolygon ap = get_arrange_poly(mo->instances[inst_idx]); + ArrangePolygon ap = get_instance_arrange_poly(mo->instances[inst_idx], global_config); BoundingBox ap_bb = ap.transformed_poly().contour.bounding_box(); ap.height = 1; ap.name = mo->name; @@ -167,7 +168,7 @@ void FillBedJob::prepare() // if the selection is not a single instance, choose the first as template //sel_id = std::max(sel_id, 0); ModelInstance *mi = model_object->instances[sel_id]; - ArrangePolygon template_ap = get_arrange_poly(mi); + ArrangePolygon template_ap = get_instance_arrange_poly(mi, global_config); for (int i = 0; i < needed_items; ++i) { ArrangePolygon ap = template_ap; @@ -209,7 +210,8 @@ void FillBedJob::process() auto &partplate_list = m_plater->get_partplate_list(); auto &print = wxGetApp().plater()->get_partplate_list().get_current_fff_print(); - if (params.avoid_extrusion_cali_region && print.full_print_config().opt_bool("scan_first_layer")) + const Slic3r::DynamicPrintConfig& global_config = wxGetApp().preset_bundle->full_config(); + if (params.avoid_extrusion_cali_region && global_config.opt_bool("scan_first_layer")) partplate_list.preprocess_nonprefered_areas(m_unselected, MAX_NUM_PLATES); update_selected_items_inflation(m_selected, *m_plater, params);