FIX: sharptail missing when topz=0

jira: none
Change-Id: I627ab5503e47dafb32a548ae1123b6a50610c9a8
This commit is contained in:
jiaxi.chen 2025-04-01 16:57:06 +08:00 committed by lane.wei
parent 8f94e72c16
commit 0bbf795400
1 changed files with 13 additions and 7 deletions

View File

@ -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