Custom support blockers are now working

This commit is contained in:
Lukas Matena 2020-04-27 17:43:34 +02:00
parent 9fdc54bfff
commit 2bd524849a
2 changed files with 18 additions and 12 deletions

View file

@ -2686,7 +2686,7 @@ void PrintObject::project_and_append_custom_supports(
// Iterate over all triangles. // Iterate over all triangles.
tbb::parallel_for( tbb::parallel_for(
tbb::blocked_range<size_t>(0, custom_facets.size() - 1), tbb::blocked_range<size_t>(0, custom_facets.size()),
[&](const tbb::blocked_range<size_t>& range) { [&](const tbb::blocked_range<size_t>& range) {
for (size_t idx = range.begin(); idx < range.end(); ++ idx) { for (size_t idx = range.begin(); idx < range.end(); ++ idx) {
@ -2799,10 +2799,9 @@ void PrintObject::project_and_append_custom_supports(
// Now append the collected polygons to respective layers. // Now append the collected polygons to respective layers.
for (auto& trg : projections_of_triangles) { for (auto& trg : projections_of_triangles) {
int layer_id = trg.first_layer_id; int layer_id = trg.first_layer_id;
if (layer_id == 0)
continue;
for (const LightPolygon& poly : trg.polygons) { for (const LightPolygon& poly : trg.polygons) {
expolys[layer_id-1].emplace_back(std::move(poly.pts)); expolys[layer_id].emplace_back(std::move(poly.pts));
++layer_id; ++layer_id;
} }
} }

View file

@ -1101,10 +1101,10 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
if (! enforcers.empty()) { if (! enforcers.empty()) {
// Apply the "support enforcers". // Apply the "support enforcers".
//FIXME add the "enforcers" to the sparse support regions only. //FIXME add the "enforcers" to the sparse support regions only.
const ExPolygons &enforcer = enforcers[layer_id - 1]; const ExPolygons &enforcer = enforcers[layer_id];
if (! enforcer.empty()) { if (! enforcer.empty()) {
// Enforce supports (as if with 90 degrees of slope) for the regions covered by the enforcer meshes. // Enforce supports (as if with 90 degrees of slope) for the regions covered by the enforcer meshes.
Polygons new_contacts = diff(intersection(layerm_polygons, to_polygons(enforcer)), Polygons new_contacts = diff(intersection(layerm_polygons, to_polygons(std::move(enforcer))),
offset(lower_layer_polygons, 0.05f * fw, SUPPORT_SURFACES_OFFSET_PARAMETERS)); offset(lower_layer_polygons, 0.05f * fw, SUPPORT_SURFACES_OFFSET_PARAMETERS));
if (! new_contacts.empty()) { if (! new_contacts.empty()) {
if (diff_polygons.empty()) if (diff_polygons.empty())
@ -1115,14 +1115,21 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
} }
} }
} }
// Apply the "support blockers".
if (! diff_polygons.empty() && ! blockers.empty() && ! blockers[layer_id].empty()) {
// Enforce supports (as if with 90 degrees of slope) for the regions covered by the enforcer meshes.
diff_polygons = diff(diff_polygons, to_polygons(blockers[layer_id]));
}
if (diff_polygons.empty()) if (diff_polygons.empty())
continue; continue;
// Apply the "support blockers".
if (! blockers.empty() && ! blockers[layer_id].empty()) {
// Expand the blocker a bit. Custom blockers produce strips
// spanning just the projection between the two slices.
// Subtracting them as they are may leave unwanted narrow
// residues of diff_polygons that would then be supported.
diff_polygons = diff(diff_polygons,
offset(union_(to_polygons(std::move(blockers[layer_id]))),
1000.*SCALED_EPSILON));
}
#ifdef SLIC3R_DEBUG #ifdef SLIC3R_DEBUG
{ {
::Slic3r::SVG svg(debug_out_path("support-top-contacts-raw-run%d-layer%d-region%d.svg", ::Slic3r::SVG svg(debug_out_path("support-top-contacts-raw-run%d-layer%d-region%d.svg",