FIX: tree branches reach out of borders
jira: STUDIO-11104, STUDIO-8741 Change-Id: Ia7bd0333ec36e43b8413d5c484cf232bebf4bb8c
This commit is contained in:
parent
9a80a45a82
commit
50059fad62
|
@ -67,6 +67,14 @@ TreeModelVolumes::TreeModelVolumes(
|
||||||
m_machine_border{ calculateMachineBorderCollision(build_volume.polygon()) }
|
m_machine_border{ calculateMachineBorderCollision(build_volume.polygon()) }
|
||||||
{
|
{
|
||||||
m_bed_area = build_volume.polygon();
|
m_bed_area = build_volume.polygon();
|
||||||
|
Polygons machine_borders;
|
||||||
|
if (!m_bed_area.empty()) {
|
||||||
|
Polygon hole(m_bed_area);
|
||||||
|
hole.reverse();
|
||||||
|
ExPolygon machine_outline(offset(m_bed_area, scale_(1000))[0], hole);
|
||||||
|
ExPolygons outlines = machine_outline.split_expoly_with_holes(scale_(1.), {});
|
||||||
|
for (const auto &outline : outlines) machine_borders.emplace_back(outline.contour);
|
||||||
|
}
|
||||||
#if 0
|
#if 0
|
||||||
std::unordered_map<size_t, size_t> mesh_to_layeroutline_idx;
|
std::unordered_map<size_t, size_t> mesh_to_layeroutline_idx;
|
||||||
for (size_t mesh_idx = 0; mesh_idx < storage.meshes.size(); ++ mesh_idx) {
|
for (size_t mesh_idx = 0; mesh_idx < storage.meshes.size(); ++ mesh_idx) {
|
||||||
|
@ -110,8 +118,10 @@ TreeModelVolumes::TreeModelVolumes(
|
||||||
outlines.assign(num_layers, Polygons{});
|
outlines.assign(num_layers, Polygons{});
|
||||||
tbb::parallel_for(tbb::blocked_range<size_t>(num_raft_layers, num_layers, std::min<size_t>(1, std::max<size_t>(16, num_layers / (8 * tbb::this_task_arena::max_concurrency())))),
|
tbb::parallel_for(tbb::blocked_range<size_t>(num_raft_layers, num_layers, std::min<size_t>(1, std::max<size_t>(16, num_layers / (8 * tbb::this_task_arena::max_concurrency())))),
|
||||||
[&](const tbb::blocked_range<size_t> &range) {
|
[&](const tbb::blocked_range<size_t> &range) {
|
||||||
for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx)
|
for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++layer_idx) {
|
||||||
outlines[layer_idx] = polygons_simplify(to_polygons(print_object.get_layer(layer_idx - num_raft_layers)->lslices), mesh_settings.resolution);
|
outlines[layer_idx] = polygons_simplify(to_polygons(print_object.get_layer(layer_idx - num_raft_layers)->lslices), mesh_settings.resolution);
|
||||||
|
outlines[layer_idx].insert(outlines[layer_idx].end(), machine_borders.begin(), machine_borders.end());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1828,7 +1828,7 @@ void TreeSupport::generate()
|
||||||
generate_tree_support_3D(*m_object, this, this->throw_on_cancel);
|
generate_tree_support_3D(*m_object, this, this->throw_on_cancel);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
profiler.stage_start(STAGE_total);
|
profiler.stage_start(STAGE_total);
|
||||||
|
|
||||||
// Generate overhang areas
|
// Generate overhang areas
|
||||||
|
@ -3181,7 +3181,7 @@ void TreeSupport::drop_nodes()
|
||||||
#endif
|
#endif
|
||||||
coordf_t next_radius = calc_radius(node.dist_mm_to_top + height_next);
|
coordf_t next_radius = calc_radius(node.dist_mm_to_top + height_next);
|
||||||
auto avoidance_next = get_avoidance(next_radius, obj_layer_nr_next);
|
auto avoidance_next = get_avoidance(next_radius, obj_layer_nr_next);
|
||||||
|
|
||||||
Point to_outside = projection_onto(avoidance_next, node.position);
|
Point to_outside = projection_onto(avoidance_next, node.position);
|
||||||
Point direction_to_outer = to_outside - node.position;
|
Point direction_to_outer = to_outside - node.position;
|
||||||
if (node.skin_direction != Point(0, 0) && node.dist_mm_to_top < 3) {
|
if (node.skin_direction != Point(0, 0) && node.dist_mm_to_top < 3) {
|
||||||
|
@ -3928,6 +3928,22 @@ TreeSupportData::TreeSupportData(const PrintObject &object, coordf_t xy_distance
|
||||||
m_max_move_distances.resize(object.layers().size(), 0);
|
m_max_move_distances.resize(object.layers().size(), 0);
|
||||||
m_layer_outlines.resize(object.layers().size());
|
m_layer_outlines.resize(object.layers().size());
|
||||||
m_layer_outlines_below.resize(object.layer_count());
|
m_layer_outlines_below.resize(object.layer_count());
|
||||||
|
ExPolygons machine_border;
|
||||||
|
ExPolygon m_machine_border;
|
||||||
|
|
||||||
|
//cal m_machine_border twice, this may happen before TreeSupport builds
|
||||||
|
m_machine_border.contour = get_bed_shape_with_excluded_area(object.print()->config());
|
||||||
|
Vec3d plate_offset = object.print()->get_plate_origin();
|
||||||
|
// align with the centered object in current plate (may not be the 1st plate, so need to add the plate offset)
|
||||||
|
m_machine_border.translate(Point(scale_(plate_offset(0)), scale_(plate_offset(1))) - object.instances().front().shift);
|
||||||
|
|
||||||
|
if (!m_machine_border.empty()) {
|
||||||
|
Polygon hole(m_machine_border.contour);
|
||||||
|
hole.reverse();
|
||||||
|
ExPolygon machine_outline(offset(m_machine_border.contour, scale_(1000))[0], hole);
|
||||||
|
machine_border = machine_outline.split_expoly_with_holes(scale_(1.), {m_machine_border});
|
||||||
|
}
|
||||||
|
|
||||||
for (std::size_t layer_nr = 0; layer_nr < object.layers().size(); ++layer_nr) {
|
for (std::size_t layer_nr = 0; layer_nr < object.layers().size(); ++layer_nr) {
|
||||||
const Layer *layer = object.get_layer(layer_nr);
|
const Layer *layer = object.get_layer(layer_nr);
|
||||||
m_max_move_distances[layer_nr] = layer->height * branch_scale_factor;
|
m_max_move_distances[layer_nr] = layer->height * branch_scale_factor;
|
||||||
|
@ -3935,6 +3951,7 @@ TreeSupportData::TreeSupportData(const PrintObject &object, coordf_t xy_distance
|
||||||
outline.clear();
|
outline.clear();
|
||||||
outline.reserve(layer->lslices.size());
|
outline.reserve(layer->lslices.size());
|
||||||
for (const ExPolygon &poly : layer->lslices) { append(outline, union_ex_2( poly.simplify_p(scale_(m_radius_sample_resolution)))); }
|
for (const ExPolygon &poly : layer->lslices) { append(outline, union_ex_2( poly.simplify_p(scale_(m_radius_sample_resolution)))); }
|
||||||
|
append(outline, machine_border);
|
||||||
|
|
||||||
if (layer_nr == 0)
|
if (layer_nr == 0)
|
||||||
m_layer_outlines_below[layer_nr] = outline;
|
m_layer_outlines_below[layer_nr] = outline;
|
||||||
|
|
Loading…
Reference in New Issue