diff --git a/src/libslic3r/Support/TreeSupport.cpp b/src/libslic3r/Support/TreeSupport.cpp index 5aeb7f65c..912338735 100644 --- a/src/libslic3r/Support/TreeSupport.cpp +++ b/src/libslic3r/Support/TreeSupport.cpp @@ -890,7 +890,7 @@ void TreeSupport::detect_overhangs(bool check_support_necessity/* = false*/) if (layer->lower_layer == nullptr) { for (auto& slice : layer->lslices_extrudable) { auto bbox_size = get_extents(slice).size(); - if (!((bbox_size.x() > length_thresh_well_supported && bbox_size.y() > length_thresh_well_supported)) + if (!((bbox_size.x() > length_thresh_well_supported || bbox_size.y() > length_thresh_well_supported)) && g_config_support_sharp_tails) { layer->sharp_tails.push_back(slice); layer->sharp_tails_height.push_back(layer->height); @@ -2299,12 +2299,13 @@ void TreeSupport::draw_circles() // merge overhang to get a smoother interface surface // Do not merge when buildplate_only is on, because some underneath nodes may have been deleted. - if (top_interface_layers > 0 && node.support_roof_layers_below >=0 && !on_buildplate_only) { + if (top_interface_layers > 0 && (node.support_roof_layers_below > 1 || (node.support_roof_layers_below >= 0 && !node.is_sharp_tail)) && + !on_buildplate_only) { ExPolygons overhang_expanded; - if (node.overhang.contour.size() > 100 || node.overhang.holes.size()>1) + if (node.overhang.contour.size() > 100 || node.overhang.holes.size() > 1) overhang_expanded.emplace_back(node.overhang); else { - overhang_expanded = offset_ex({ node.overhang }, scale_(m_ts_data->m_xy_distance)); + overhang_expanded = offset_ex({node.overhang}, scale_(m_ts_data->m_xy_distance)); } append(area, overhang_expanded); } @@ -2345,6 +2346,10 @@ void TreeSupport::draw_circles() roof_1st_layer = intersection_ex(roof_1st_layer, m_machine_border); ExPolygons roofs; append(roofs, roof_1st_layer); append(roofs, roof_areas);append(roofs, roof_gap_areas); + + // slightly slow down the slicing speed + base_areas = diff_ex(base_areas, collision_base.empty() ? m_ts_data->get_collision(0, obj_layer_nr) : collision_base); + base_areas = diff_ex(base_areas, ClipperUtils::clip_clipper_polygons_with_subject_bbox(roofs, get_extents(base_areas))); base_areas = intersection_ex(base_areas, m_machine_border); @@ -3774,9 +3779,9 @@ void TreeSupport::generate_contact_points() if (add_interface && xy_expansion > EPSILON && !is_sharp_tail) { overhangs = safe_offset_inc(overhangs, xy_expansion, relevant_forbidden, scale_(MIN_BRANCH_RADIUS * 1.75), 0, 1); } - overhangs_no_extra_expand = (unscale_(xy_expansion) - config.support_expansion.value) > EPSILON ? - safe_offset_inc({overhang_part}, scale_(config.support_expansion.value), relevant_forbidden, scale_(MIN_BRANCH_RADIUS * 1.75), 0, 1) : - overhangs; + overhangs_no_extra_expand = (!is_sharp_tail && (unscale_(xy_expansion) - config.support_expansion.value > EPSILON) && (config.support_expansion.value > EPSILON)) ? + safe_offset_inc({overhang_part}, scale_(config.support_expansion.value), relevant_forbidden, scale_(MIN_BRANCH_RADIUS * 1.75), 0, 1) : + overhangs; if (m_support_params.support_style == smsTreeHybrid && (overhang_type & (BigFlat | ThinPlate))) { overhangs_regular = offset_ex(intersection_ex(overhangs, m_ts_data->m_layer_outlines_below[layer_nr - 1]), radius_scaled); @@ -3812,6 +3817,7 @@ void TreeSupport::generate_contact_points() } for (auto &overhang : overhangs_regular) { + if (is_sharp_tail && overhang.area() < SQ(scale_(2.))) add_interface = false; BoundingBox overhang_bounds = get_extents(overhang); double radius = std::clamp(unscale_(overhang_bounds.radius()), MIN_BRANCH_RADIUS, base_radius); // add supports at corners for both auto and manual overhangs, github #2008