ENH: improve tree support interface quality

Always draw a wall before infill for 1st interface.

Jira: STUDIO-1402

Change-Id: I9cba46f9bcacbe6c78a82bbb7099cc1d1182cb97
(cherry picked from commit d7381adb78c99414f538db82f0ac1f2de2e968cf)
This commit is contained in:
Arthur 2022-11-24 14:37:19 +08:00 committed by Lane.Wei
parent 2a8fe9ec54
commit e61e6c3c95
1 changed files with 30 additions and 18 deletions

View File

@ -1301,7 +1301,7 @@ static void make_perimeter_and_inner_brim(ExtrusionEntitiesPtr &dst, const Print
float(flow.mm3_per_mm()), float(flow.width()), float(flow.height()));
}
static void make_perimeter_and_infill(ExtrusionEntitiesPtr& dst, const Print& print, const ExPolygon& support_area, size_t wall_count, const Flow& flow, ExtrusionRole role, Fill* filler_support, double support_density)
static void make_perimeter_and_infill(ExtrusionEntitiesPtr& dst, const Print& print, const ExPolygon& support_area, size_t wall_count, const Flow& flow, ExtrusionRole role, Fill* filler_support, double support_density, bool infill_first=true)
{
Polygons loops;
ExPolygons support_area_new = offset_ex(support_area, -0.5f * float(flow.scaled_spacing()), jtSquare);
@ -1362,20 +1362,29 @@ static void make_perimeter_and_infill(ExtrusionEntitiesPtr& dst, const Print& pr
expoly_list.erase(first_iter);
}
extrusion_entities_append_loops(dst, std::move(loops), role,
float(flow.mm3_per_mm()), float(flow.width()), float(flow.height()));
if (infill_first)
extrusion_entities_append_loops(dst, std::move(loops), role,
float(flow.mm3_per_mm()), float(flow.width()), float(flow.height()));
else { // loops first
ExtrusionEntitiesPtr loops_entities;
extrusion_entities_append_loops(loops_entities, std::move(loops), role,
float(flow.mm3_per_mm()), float(flow.width()), float(flow.height()));
loops_entities.insert(loops_entities.end(), dst.begin(), dst.end());
dst = std::move(loops_entities);
}
}
if (infill_first) {
// sort regions to reduce travel
Points ordering_points;
for (const auto& area : dst)
ordering_points.push_back(area->first_point());
std::vector<Points::size_type> order = chain_points(ordering_points);
ExtrusionEntitiesPtr new_dst;
new_dst.reserve(ordering_points.size());
for (size_t i : order)
new_dst.emplace_back(dst[i]);
dst = new_dst;
}
// sort regions to reduce travel
Points ordering_points;
for (const auto& area : dst)
ordering_points.push_back(area->first_point());
std::vector<Points::size_type> order = chain_points(ordering_points);
ExtrusionEntitiesPtr new_dst;
new_dst.reserve(ordering_points.size());
for (size_t i : order)
new_dst.emplace_back(dst[i]);
dst = new_dst;
}
void TreeSupport::generate_toolpaths()
@ -1507,7 +1516,7 @@ void TreeSupport::generate_toolpaths()
TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_id);
Flow support_flow(support_extrusion_width, ts_layer->height, nozzle_diameter);
ts_layer->support_fills.no_sort = false;
for (auto& area_group : ts_layer->area_groups) {
ExPolygon& poly = *area_group.first;
@ -1534,8 +1543,10 @@ void TreeSupport::generate_toolpaths()
fill_params.density = interface_density;
// Note: spacing means the separation between two lines as if they are tightly extruded
filler_Roof1stLayer->spacing = m_support_material_interface_flow.spacing();
fill_expolygons_generate_paths(ts_layer->support_fills.entities, std::move(polys), filler_Roof1stLayer.get(), fill_params, erSupportMaterial,
m_support_material_interface_flow);
// generate a perimeter first to support interface better
make_perimeter_and_infill(ts_layer->support_fills.entities, *m_object->print(), poly, 1, m_support_material_interface_flow, erSupportMaterial,
filler_Roof1stLayer.get(), interface_density, false);
ts_layer->support_fills.no_sort = true; // make sure loops are first
} else if (area_group.second == TreeSupportLayer::FloorType) {
// floor_areas
fill_params.density = bottom_interface_density;
@ -1658,7 +1669,8 @@ void TreeSupport::generate_toolpaths()
}
// sort extrusions to reduce travel, also make sure walls go before infills
chain_and_reorder_extrusion_entities(ts_layer->support_fills.entities);
if(ts_layer->support_fills.no_sort==false)
chain_and_reorder_extrusion_entities(ts_layer->support_fills.entities);
}
}
);