FIX: tree branches reach out of borders

jira: STUDIO-11104, STUDIO-8741
Change-Id: Ia7bd0333ec36e43b8413d5c484cf232bebf4bb8c
This commit is contained in:
jiaxi.chen 2025-04-02 16:35:02 +08:00 committed by lane.wei
parent 9a80a45a82
commit 50059fad62
2 changed files with 31 additions and 4 deletions

View File

@ -67,6 +67,14 @@ TreeModelVolumes::TreeModelVolumes(
m_machine_border{ calculateMachineBorderCollision(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
std::unordered_map<size_t, size_t> mesh_to_layeroutline_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{});
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) {
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].insert(outlines[layer_idx].end(), machine_borders.begin(), machine_borders.end());
}
});
}
#endif

View File

@ -3928,6 +3928,22 @@ TreeSupportData::TreeSupportData(const PrintObject &object, coordf_t xy_distance
m_max_move_distances.resize(object.layers().size(), 0);
m_layer_outlines.resize(object.layers().size());
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) {
const Layer *layer = object.get_layer(layer_nr);
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.reserve(layer->lslices.size());
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)
m_layer_outlines_below[layer_nr] = outline;