diff --git a/src/libslic3r/Support/TreeModelVolumes.cpp b/src/libslic3r/Support/TreeModelVolumes.cpp index d7750431f..9d0faee74 100644 --- a/src/libslic3r/Support/TreeModelVolumes.cpp +++ b/src/libslic3r/Support/TreeModelVolumes.cpp @@ -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 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(num_raft_layers, num_layers, std::min(1, std::max(16, num_layers / (8 * tbb::this_task_arena::max_concurrency())))), [&](const tbb::blocked_range &range) { - 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); + 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 diff --git a/src/libslic3r/Support/TreeSupport.cpp b/src/libslic3r/Support/TreeSupport.cpp index 912338735..bc097cf3d 100644 --- a/src/libslic3r/Support/TreeSupport.cpp +++ b/src/libslic3r/Support/TreeSupport.cpp @@ -1828,7 +1828,7 @@ void TreeSupport::generate() generate_tree_support_3D(*m_object, this, this->throw_on_cancel); return; } - + profiler.stage_start(STAGE_total); // Generate overhang areas @@ -3181,7 +3181,7 @@ void TreeSupport::drop_nodes() #endif coordf_t next_radius = calc_radius(node.dist_mm_to_top + height_next); auto avoidance_next = get_avoidance(next_radius, obj_layer_nr_next); - + Point to_outside = projection_onto(avoidance_next, node.position); Point direction_to_outer = to_outside - node.position; 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_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;