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:
parent
2a8fe9ec54
commit
e61e6c3c95
|
@ -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()));
|
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;
|
Polygons loops;
|
||||||
ExPolygons support_area_new = offset_ex(support_area, -0.5f * float(flow.scaled_spacing()), jtSquare);
|
ExPolygons support_area_new = offset_ex(support_area, -0.5f * float(flow.scaled_spacing()), jtSquare);
|
||||||
|
@ -1362,10 +1362,18 @@ static void make_perimeter_and_infill(ExtrusionEntitiesPtr& dst, const Print& pr
|
||||||
expoly_list.erase(first_iter);
|
expoly_list.erase(first_iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (infill_first)
|
||||||
extrusion_entities_append_loops(dst, std::move(loops), role,
|
extrusion_entities_append_loops(dst, std::move(loops), role,
|
||||||
float(flow.mm3_per_mm()), float(flow.width()), float(flow.height()));
|
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
|
// sort regions to reduce travel
|
||||||
Points ordering_points;
|
Points ordering_points;
|
||||||
for (const auto& area : dst)
|
for (const auto& area : dst)
|
||||||
|
@ -1376,6 +1384,7 @@ static void make_perimeter_and_infill(ExtrusionEntitiesPtr& dst, const Print& pr
|
||||||
for (size_t i : order)
|
for (size_t i : order)
|
||||||
new_dst.emplace_back(dst[i]);
|
new_dst.emplace_back(dst[i]);
|
||||||
dst = new_dst;
|
dst = new_dst;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TreeSupport::generate_toolpaths()
|
void TreeSupport::generate_toolpaths()
|
||||||
|
@ -1507,7 +1516,7 @@ void TreeSupport::generate_toolpaths()
|
||||||
|
|
||||||
TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_id);
|
TreeSupportLayer* ts_layer = m_object->get_tree_support_layer(layer_id);
|
||||||
Flow support_flow(support_extrusion_width, ts_layer->height, nozzle_diameter);
|
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) {
|
for (auto& area_group : ts_layer->area_groups) {
|
||||||
ExPolygon& poly = *area_group.first;
|
ExPolygon& poly = *area_group.first;
|
||||||
|
@ -1534,8 +1543,10 @@ void TreeSupport::generate_toolpaths()
|
||||||
fill_params.density = interface_density;
|
fill_params.density = interface_density;
|
||||||
// Note: spacing means the separation between two lines as if they are tightly extruded
|
// Note: spacing means the separation between two lines as if they are tightly extruded
|
||||||
filler_Roof1stLayer->spacing = m_support_material_interface_flow.spacing();
|
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,
|
// generate a perimeter first to support interface better
|
||||||
m_support_material_interface_flow);
|
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) {
|
} else if (area_group.second == TreeSupportLayer::FloorType) {
|
||||||
// floor_areas
|
// floor_areas
|
||||||
fill_params.density = bottom_interface_density;
|
fill_params.density = bottom_interface_density;
|
||||||
|
@ -1658,6 +1669,7 @@ void TreeSupport::generate_toolpaths()
|
||||||
}
|
}
|
||||||
|
|
||||||
// sort extrusions to reduce travel, also make sure walls go before infills
|
// sort extrusions to reduce travel, also make sure walls go before infills
|
||||||
|
if(ts_layer->support_fills.no_sort==false)
|
||||||
chain_and_reorder_extrusion_entities(ts_layer->support_fills.entities);
|
chain_and_reorder_extrusion_entities(ts_layer->support_fills.entities);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue