mirror of
https://git.mirrors.martin98.com/https://github.com/bambulab/BambuStudio.git
synced 2025-09-23 07:23:12 +08:00
FIX: overhang interface may overlap with object
jira: STUDIO-6710 Change-Id: Ie13ec81e07326a2572d698607c03aeb793f119c8 (cherry picked from commit cc49c82793a877c2c4187e6254e4092de9285010)
This commit is contained in:
parent
480489b29b
commit
39839e3732
@ -806,7 +806,7 @@ void TreeSupport::detect_overhangs(bool check_support_necessity/* = false*/)
|
|||||||
Layer* layer = m_object->get_layer(layer_nr);
|
Layer* layer = m_object->get_layer(layer_nr);
|
||||||
|
|
||||||
if (layer->lower_layer == nullptr) {
|
if (layer->lower_layer == nullptr) {
|
||||||
for (auto& slice : layer->lslices) {
|
for (auto& slice : layer->lslices_extrudable) {
|
||||||
auto bbox_size = get_extents(slice).size();
|
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) {
|
&& g_config_support_sharp_tails) {
|
||||||
@ -1080,10 +1080,10 @@ void TreeSupport::detect_overhangs(bool check_support_necessity/* = false*/)
|
|||||||
if (layer_nr < enforcers.size() && lower_layer) {
|
if (layer_nr < enforcers.size() && lower_layer) {
|
||||||
float no_interface_offset = std::accumulate(layer->regions().begin(), layer->regions().end(), FLT_MAX,
|
float no_interface_offset = std::accumulate(layer->regions().begin(), layer->regions().end(), FLT_MAX,
|
||||||
[](float acc, const LayerRegion* layerm) { return std::min(acc, float(layerm->flow(frExternalPerimeter).scaled_width())); });
|
[](float acc, const LayerRegion* layerm) { return std::min(acc, float(layerm->flow(frExternalPerimeter).scaled_width())); });
|
||||||
Polygons lower_layer_polygons = (layer_nr == 0) ? Polygons() : to_polygons(lower_layer->lslices);
|
Polygons lower_layer_polygons = (layer_nr == 0) ? Polygons() : to_polygons(lower_layer->lslices_extrudable);
|
||||||
Polygons& enforcer = enforcers[layer_nr];
|
Polygons& enforcer = enforcers[layer_nr];
|
||||||
if (!enforcer.empty()) {
|
if (!enforcer.empty()) {
|
||||||
ExPolygons enforcer_polygons = diff_ex(intersection_ex(layer->lslices, enforcer),
|
ExPolygons enforcer_polygons = diff_ex(intersection_ex(layer->lslices_extrudable, enforcer),
|
||||||
// Inflate just a tiny bit to avoid intersection of the overhang areas with the object.
|
// Inflate just a tiny bit to avoid intersection of the overhang areas with the object.
|
||||||
expand(lower_layer_polygons, 0.05f * no_interface_offset, SUPPORT_SURFACES_OFFSET_PARAMETERS));
|
expand(lower_layer_polygons, 0.05f * no_interface_offset, SUPPORT_SURFACES_OFFSET_PARAMETERS));
|
||||||
append(layer->loverhangs, enforcer_polygons);
|
append(layer->loverhangs, enforcer_polygons);
|
||||||
@ -1114,21 +1114,21 @@ void TreeSupport::detect_overhangs(bool check_support_necessity/* = false*/)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
SVG::export_expolygons(debug_out_path("overhang_areas_%d_%.2f.svg",layer->id(), layer->print_z), {
|
SVG::export_expolygons(debug_out_path("overhang_areas_%d_%.2f.svg",layer->id(), layer->print_z), {
|
||||||
{ m_object->get_layer(layer->id())->lslices, {"lslices","yellow",0.5} },
|
{ m_object->get_layer(layer->id())->lslices_extrudable, {"lslices_extrudable","yellow",0.5} },
|
||||||
{ layer->loverhangs, {"overhang","red",0.5} }
|
{ layer->loverhangs, {"overhang","red",0.5} }
|
||||||
});
|
});
|
||||||
|
|
||||||
if (enforcers.size() > layer->id()) {
|
if (enforcers.size() > layer->id()) {
|
||||||
SVG svg(format("SVG/enforcer_%s.svg", layer->print_z), m_object->bounding_box());
|
SVG svg(format("SVG/enforcer_%s.svg", layer->print_z), m_object->bounding_box());
|
||||||
if (svg.is_opened()) {
|
if (svg.is_opened()) {
|
||||||
svg.draw_outline(m_object->get_layer(layer->id())->lslices, "yellow");
|
svg.draw_outline(m_object->get_layer(layer->id())->lslices_extrudable, "yellow");
|
||||||
svg.draw(enforcers[layer->id()], "red");
|
svg.draw(enforcers[layer->id()], "red");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (blockers.size() > layer->id()) {
|
if (blockers.size() > layer->id()) {
|
||||||
SVG svg(format("SVG/blocker_%s.svg", layer->print_z), m_object->bounding_box());
|
SVG svg(format("SVG/blocker_%s.svg", layer->print_z), m_object->bounding_box());
|
||||||
if (svg.is_opened()) {
|
if (svg.is_opened()) {
|
||||||
svg.draw_outline(m_object->get_layer(layer->id())->lslices, "yellow");
|
svg.draw_outline(m_object->get_layer(layer->id())->lslices_extrudable, "yellow");
|
||||||
svg.draw(blockers[layer->id()], "red");
|
svg.draw(blockers[layer->id()], "red");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2062,7 +2062,6 @@ void TreeSupport::draw_circles(const std::vector<std::vector<SupportNode*>>& con
|
|||||||
if(!tmp.empty())
|
if(!tmp.empty())
|
||||||
circle = tmp[0];
|
circle = tmp[0];
|
||||||
}
|
}
|
||||||
area = avoid_object_remove_extra_small_parts(ExPolygon(circle), get_collision(node.is_sharp_tail && node.distance_to_top <= 0));
|
|
||||||
// merge overhang to get a smoother interface surface
|
// merge overhang to get a smoother interface surface
|
||||||
// Do not merge when buildplate_only is on, because some underneath nodes may have been deleted.
|
// 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 && !node.is_sharp_tail) {
|
if (top_interface_layers > 0 && node.support_roof_layers_below > 0 && !on_buildplate_only && !node.is_sharp_tail) {
|
||||||
@ -2075,6 +2074,11 @@ void TreeSupport::draw_circles(const std::vector<std::vector<SupportNode*>>& con
|
|||||||
}
|
}
|
||||||
append(area, overhang_expanded);
|
append(area, overhang_expanded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
area = avoid_object_remove_extra_small_parts(ExPolygon(circle), get_collision(node.is_sharp_tail && node.distance_to_top <= 0));
|
||||||
|
//area = diff_clipped({ ExPolygon(circle) }, get_collision(node.is_sharp_tail && node.distance_to_top <= 0));
|
||||||
|
|
||||||
|
if (!area.empty())
|
||||||
has_circle_node = true;
|
has_circle_node = true;
|
||||||
if(node.need_extra_wall)
|
if(node.need_extra_wall)
|
||||||
need_extra_wall = true;
|
need_extra_wall = true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user