mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-16 03:07:55 -06:00
FIX: overhang interface may overlap with object
jira: STUDIO-6710 Change-Id: Ie13ec81e07326a2572d698607c03aeb793f119c8 (cherry picked from commit cc49c82793a877c2c4187e6254e4092de9285010) (cherry picked from commit 39839e37325bd93e73ba069a2ea18cb326911c42)
This commit is contained in:
parent
5a8612eb63
commit
6e05d9ef84
1 changed files with 6 additions and 7 deletions
|
@ -783,7 +783,7 @@ void TreeSupport::detect_overhangs(bool check_support_necessity/* = false*/)
|
|||
Layer* layer = m_object->get_layer(layer_nr);
|
||||
|
||||
if (layer->lower_layer == nullptr) {
|
||||
for (auto& slice : layer->lslices) {
|
||||
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))
|
||||
&& g_config_support_sharp_tails) {
|
||||
|
@ -1057,10 +1057,10 @@ void TreeSupport::detect_overhangs(bool check_support_necessity/* = false*/)
|
|||
if (layer_nr < enforcers.size() && lower_layer) {
|
||||
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())); });
|
||||
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];
|
||||
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.
|
||||
expand(lower_layer_polygons, 0.05f * no_interface_offset, SUPPORT_SURFACES_OFFSET_PARAMETERS));
|
||||
append(layer->loverhangs, enforcer_polygons);
|
||||
|
@ -1091,21 +1091,21 @@ void TreeSupport::detect_overhangs(bool check_support_necessity/* = false*/)
|
|||
continue;
|
||||
|
||||
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} }
|
||||
});
|
||||
|
||||
if (enforcers.size() > layer->id()) {
|
||||
SVG svg(format("SVG/enforcer_%s.svg", layer->print_z), m_object->bounding_box());
|
||||
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");
|
||||
}
|
||||
}
|
||||
if (blockers.size() > layer->id()) {
|
||||
SVG svg(format("SVG/blocker_%s.svg", layer->print_z), m_object->bounding_box());
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
@ -1994,7 +1994,6 @@ void TreeSupport::draw_circles(const std::vector<std::vector<SupportNode*>>& con
|
|||
if(!tmp.empty())
|
||||
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
|
||||
// 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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue