mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-13 09:47:58 -06:00
Fixes Support Interface printed on air #2903
Fixes Supports generated loose in space #4874 Fixes Support Interface layers in midair #5016
This commit is contained in:
parent
d2ca4563e8
commit
3985d7bb81
1 changed files with 25 additions and 41 deletions
|
@ -1376,6 +1376,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
|
||||||
// Get the regions needing a suport, collapse very tiny spots.
|
// Get the regions needing a suport, collapse very tiny spots.
|
||||||
//FIXME cache the lower layer offset if this layer has multiple regions.
|
//FIXME cache the lower layer offset if this layer has multiple regions.
|
||||||
#if 1
|
#if 1
|
||||||
|
//FIXME this solution will trigger stupid supports for sharp corners, see GH #4874
|
||||||
diff_polygons = offset2(
|
diff_polygons = offset2(
|
||||||
diff(layerm_polygons,
|
diff(layerm_polygons,
|
||||||
offset2(lower_layer_polygons, - 0.5f * fw, lower_layer_offset + 0.5f * fw, SUPPORT_SURFACES_OFFSET_PARAMETERS)),
|
offset2(lower_layer_polygons, - 0.5f * fw, lower_layer_offset + 0.5f * fw, SUPPORT_SURFACES_OFFSET_PARAMETERS)),
|
||||||
|
@ -1602,7 +1603,10 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
|
||||||
slices_margin_cached);
|
slices_margin_cached);
|
||||||
SupportGridPattern support_grid_pattern(
|
SupportGridPattern support_grid_pattern(
|
||||||
// Support islands, to be stretched into a grid.
|
// Support islands, to be stretched into a grid.
|
||||||
dense_interface_polygons,
|
//FIXME The regularization of dense_interface_polygons above may stretch dense_interface_polygons outside of the contact polygons,
|
||||||
|
// thus some dense interface areas may not get supported. Trim the excess with contact_polygons at the following line.
|
||||||
|
// See for example GH #4874.
|
||||||
|
intersection(dense_interface_polygons, *new_layer.contact_polygons),
|
||||||
// Trimming polygons, to trim the stretched support islands.
|
// Trimming polygons, to trim the stretched support islands.
|
||||||
slices_margin_cached,
|
slices_margin_cached,
|
||||||
// Grid resolution.
|
// Grid resolution.
|
||||||
|
@ -1611,50 +1615,30 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
|
||||||
m_support_material_flow.spacing());
|
m_support_material_flow.spacing());
|
||||||
new_layer.polygons = support_grid_pattern.extract_support(m_support_material_flow.scaled_spacing()/2 + 5, false);
|
new_layer.polygons = support_grid_pattern.extract_support(m_support_material_flow.scaled_spacing()/2 + 5, false);
|
||||||
#ifdef SLIC3R_DEBUG
|
#ifdef SLIC3R_DEBUG
|
||||||
{
|
SVG::export_expolygons(debug_out_path("support-top-contacts-final0-run%d-layer%d-z%f.svg", iRun, layer_id, layer.print_z),
|
||||||
BoundingBox bbox = get_extents(dense_interface_polygons);
|
{ { { union_ex(lower_layer_polygons, false) }, { "lower_layer_polygons", "gray", 0.2f } },
|
||||||
bbox.merge(get_extents(slices_margin_cached));
|
{ { union_ex(*new_layer.contact_polygons, false) }, { "new_layer.contact_polygons", "yellow", 0.5f } },
|
||||||
bbox.merge(get_extents(new_layer.polygons));
|
{ { union_ex(slices_margin_cached, false) }, { "slices_margin_cached", "blue", 0.5f } },
|
||||||
::Slic3r::SVG svg(debug_out_path("support-top-contacts-grid-run%d-layer%d-z%f.svg", iRun, layer_id, layer.print_z), bbox);
|
{ { union_ex(dense_interface_polygons, false) }, { "dense_interface_polygons", "green", 0.5f } },
|
||||||
svg.draw(union_ex(lower_layer_polygons, false), "gray", 0.2f);
|
{ { union_ex(new_layer.polygons, true) }, { "new_layer.polygons", "red", "black", "", scaled<coord_t>(0.1f), 0.5f } } });
|
||||||
svg.draw(union_ex(*new_layer.contact_polygons, false), "gray", 0.5f);
|
//support_grid_pattern.serialize(debug_out_path("support-top-contacts-final-run%d-layer%d-z%f.bin", iRun, layer_id, layer.print_z));
|
||||||
svg.draw(union_ex(slices_margin_cached, false), "blue", 0.5f);
|
SVG::export_expolygons(debug_out_path("support-top-contacts-final0-run%d-layer%d-z%f.svg", iRun, layer_id, layer.print_z),
|
||||||
svg.draw(union_ex(dense_interface_polygons, false), "green", 0.5f);
|
{ { { union_ex(lower_layer_polygons, false) }, { "lower_layer_polygons", "gray", 0.2f } },
|
||||||
svg.draw(union_ex(new_layer.polygons, true), "red", 0.5f);
|
{ { union_ex(*new_layer.contact_polygons, false) }, { "new_layer.contact_polygons", "yellow", 0.5f } },
|
||||||
svg.draw_outline(union_ex(new_layer.polygons, true), "black", "black", scale_(0.1f));
|
{ { union_ex(contact_polygons, false) }, { "contact_polygons", "blue", 0.5f } },
|
||||||
}
|
{ { union_ex(dense_interface_polygons, false) }, { "dense_interface_polygons", "green", 0.5f } },
|
||||||
#endif /* SLIC3R_DEBUG */
|
{ { union_ex(new_layer.polygons, true) }, { "new_layer.polygons", "red", "black", "", scaled<coord_t>(0.1f), 0.5f } } });
|
||||||
#ifdef SLIC3R_DEBUG
|
|
||||||
{
|
|
||||||
//support_grid_pattern.serialize(debug_out_path("support-top-contacts-final-run%d-layer%d-z%f.bin", iRun, layer_id, layer.print_z));
|
|
||||||
|
|
||||||
BoundingBox bbox = get_extents(contact_polygons);
|
|
||||||
bbox.merge(get_extents(new_layer.polygons));
|
|
||||||
::Slic3r::SVG svg(debug_out_path("support-top-contacts-final0-run%d-layer%d-z%f.svg", iRun, layer_id, layer.print_z), bbox);
|
|
||||||
svg.draw(union_ex(lower_layer_polygons, false), "gray", 0.2f);
|
|
||||||
svg.draw(union_ex(*new_layer.contact_polygons, false), "gray", 0.5f);
|
|
||||||
svg.draw(union_ex(contact_polygons, false), "blue", 0.5f);
|
|
||||||
svg.draw(union_ex(dense_interface_polygons, false), "green", 0.5f);
|
|
||||||
svg.draw(union_ex(new_layer.polygons, true), "red", 0.5f);
|
|
||||||
svg.draw_outline(union_ex(new_layer.polygons, true), "black", "black", scale_(0.1f));
|
|
||||||
}
|
|
||||||
#endif /* SLIC3R_DEBUG */
|
#endif /* SLIC3R_DEBUG */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef SLIC3R_DEBUG
|
#ifdef SLIC3R_DEBUG
|
||||||
{
|
SVG::export_expolygons(debug_out_path("support-top-contacts-final0-run%d-layer%d-z%f.svg", iRun, layer_id, layer.print_z),
|
||||||
BoundingBox bbox = get_extents(contact_polygons);
|
{ { { union_ex(lower_layer_polygons, false) }, { "lower_layer_polygons", "gray", 0.2f } },
|
||||||
bbox.merge(get_extents(new_layer.polygons));
|
{ { union_ex(*new_layer.contact_polygons, false) }, { "new_layer.contact_polygons", "yellow", 0.5f } },
|
||||||
bbox.merge(get_extents(overhang_polygons));
|
{ { union_ex(contact_polygons, false) }, { "contact_polygons", "blue", 0.5f } },
|
||||||
::Slic3r::SVG svg(debug_out_path("support-top-contacts-final-run%d-layer%d-z%f.svg", iRun, layer_id, layer.print_z), bbox);
|
{ { union_ex(overhang_polygons, false) }, { "overhang_polygons", "green", 0.5f } },
|
||||||
svg.draw(union_ex(lower_layer_polygons, false), "gray", 0.2f);
|
{ { union_ex(new_layer.polygons, true) }, { "new_layer.polygons", "red", "black", "", scaled<coord_t>(0.1f), 0.5f } } });
|
||||||
svg.draw(union_ex(*new_layer.contact_polygons, false), "gray", 0.5f);
|
#endif /* SLIC3R_DEBUG */
|
||||||
svg.draw(union_ex(contact_polygons, false), "blue", 0.5f);
|
|
||||||
svg.draw(union_ex(overhang_polygons, false), "green", 0.5f);
|
|
||||||
svg.draw(union_ex(new_layer.polygons, true), "red", 0.5f);
|
|
||||||
svg.draw_outline(union_ex(new_layer.polygons, true), "black", "black", scale_(0.1f));
|
|
||||||
}
|
|
||||||
#endif /* SLIC3R_DEBUG */
|
|
||||||
|
|
||||||
// Even after the contact layer was expanded into a grid, some of the contact islands may be too tiny to be extruded.
|
// Even after the contact layer was expanded into a grid, some of the contact islands may be too tiny to be extruded.
|
||||||
// Remove those tiny islands from new_layer.polygons and new_layer.contact_polygons.
|
// Remove those tiny islands from new_layer.polygons and new_layer.contact_polygons.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue