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_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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue