From 91635416d2cb614ad96e7c58c1c3cb5d6c80a078 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Fri, 21 Jun 2024 13:42:08 +0200 Subject: [PATCH] Change behavior of infill overlap to match expected behavior The infill overlap previously worked by extending the whole infill area and filling it. However, infill areas sometimes have inner walls, and in this case we would expand the walls, but the pattern generated inside would not overlap the walls, which is actually what we want to achieve in order to ensure that the sparser inner pattern properly sticks to what is outside it, whenever this is an infill wall or a skin wall. --- include/infill.h | 13 ++++--------- src/FffGcodeWriter.cpp | 22 ++++++++-------------- src/infill.cpp | 10 +++------- src/skin.cpp | 2 -- src/support.cpp | 1 - 5 files changed, 15 insertions(+), 33 deletions(-) diff --git a/include/infill.h b/include/infill.h index 3a644c6418..89b9bba689 100644 --- a/include/infill.h +++ b/include/infill.h @@ -41,8 +41,7 @@ class Infill Shape inner_contour_{}; //!< The part of the contour that will get filled with an infill pattern. Equals outer_contour minus the extra infill walls. coord_t infill_line_width_{}; //!< The line width of the infill lines to generate coord_t line_distance_{}; //!< The distance between two infill lines / polygons - coord_t infill_overlap_{}; //!< the distance by which to overlap with the actual area within which to generate infill - coord_t pattern_overlap_{ 0 }; //!< The distance by which to overlap the inner infill pattern with the infill walls + coord_t infill_overlap_{}; //!< The distance by which to overlap the inner infill pattern with the infill walls size_t infill_multiplier_{}; //!< the number of infill lines next to each other AngleDegrees fill_angle_{}; //!< for linear infill types: the angle of the infill lines (or the angle of the grid) coord_t z_{}; //!< height of the layer for which we generate infill @@ -164,8 +163,7 @@ class Infill bool use_endpieces, bool skip_some_zags, size_t zag_skip_count, - coord_t pocket_size, - coord_t pattern_overlap = 0) noexcept + coord_t pocket_size) noexcept : pattern_{ pattern } , zig_zaggify_{ zig_zaggify } , connect_polygons_{ connect_polygons } @@ -190,7 +188,6 @@ class Infill , zag_skip_count_{ zag_skip_count } , pocket_size_{ pocket_size } , mirror_offset_{ zig_zaggify } - , pattern_overlap_{ pattern_overlap } { } @@ -222,19 +219,17 @@ class Infill * This function is called within the generate() function but can also be called stand-alone * * \param toolpaths [out] The generated toolpaths. Binned by inset_idx. - * \param outer_contour [in,out] the outer contour, this is offsetted with the infill overlap + * \param outer_contour [in] the outer contour * \param wall_line_count [in] The number of walls that needs to be generated * \param line_width [in] The optimum wall line width of the walls - * \param infill_overlap [in] The overlap of the infill * \param settings [in] A settings storage to use for generating variable-width walls. * \return The inner contour of the wall toolpaths */ static Shape generateWallToolPaths( std::vector& toolpaths, - Shape& outer_contour, + const Shape& outer_contour, const size_t wall_line_count, const coord_t line_width, - const coord_t infill_overlap, const Settings& settings, int layer_idx, SectionType section_type); diff --git a/src/FffGcodeWriter.cpp b/src/FffGcodeWriter.cpp index 0d664918ac..43bb607980 100644 --- a/src/FffGcodeWriter.cpp +++ b/src/FffGcodeWriter.cpp @@ -623,8 +623,7 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage) const size_t wall_line_count = base_settings.get("raft_base_wall_count"); const coord_t small_area_width = 0; // A raft never has a small region due to the large horizontal expansion. const coord_t line_spacing = base_settings.get("raft_base_line_spacing"); - constexpr coord_t infill_overlap = 0; - const coord_t pattern_overlap = base_settings.get("raft_base_infill_overlap_mm"); + const coord_t infill_overlap = base_settings.get("raft_base_infill_overlap_mm"); const coord_t line_spacing_prime_tower = base_settings.get("prime_tower_raft_base_line_spacing"); const Point2LL& infill_origin = Point2LL(); constexpr bool skip_stitching = false; @@ -685,8 +684,7 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage) use_endpieces, skip_some_zags, zag_skip_count, - pocket_size, - pattern_overlap); + pocket_size); std::vector raft_paths; infill_comp.generate(raft_paths, raft_polygons, raft_lines, base_settings, layer_nr, SectionType::ADHESION); if (! raft_paths.empty()) @@ -755,8 +753,7 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage) const coord_t interface_line_spacing = interface_settings.get("raft_interface_line_spacing"); const Ratio interface_fan_speed = interface_settings.get("raft_interface_fan_speed"); const coord_t interface_line_width = interface_settings.get("raft_interface_line_width"); - constexpr coord_t interface_infill_overlap = 0; - const coord_t interface_pattern_overlap = interface_settings.get("raft_interface_infill_overlap_mm"); + const coord_t interface_infill_overlap = interface_settings.get("raft_interface_infill_overlap_mm"); const coord_t interface_avoid_distance = interface_settings.get("travel_avoid_distance"); const coord_t interface_max_resolution = interface_settings.get("meshfix_maximum_resolution"); const coord_t interface_max_deviation = interface_settings.get("meshfix_maximum_deviation"); @@ -846,8 +843,7 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage) use_endpieces, skip_some_zags, zag_skip_count, - pocket_size, - interface_pattern_overlap); + pocket_size); std::vector raft_paths; infill_comp.generate(raft_paths, raft_polygons, raft_lines, interface_settings, layer_nr, SectionType::ADHESION); if (! raft_paths.empty()) @@ -917,8 +913,7 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage) const coord_t surface_max_resolution = surface_settings.get("meshfix_maximum_resolution"); const coord_t surface_max_deviation = surface_settings.get("meshfix_maximum_deviation"); const coord_t surface_line_width = surface_settings.get("raft_surface_line_width"); - constexpr coord_t surface_infill_overlap = 0; - const coord_t surface_pattern_overlap = surface_settings.get("raft_surface_infill_overlap_mm"); + const coord_t surface_infill_overlap = surface_settings.get("raft_surface_infill_overlap_mm"); const coord_t surface_avoid_distance = surface_settings.get("travel_avoid_distance"); const Ratio surface_fan_speed = surface_settings.get("raft_surface_fan_speed"); const bool surface_monotonic = surface_settings.get("raft_surface_monotonic"); @@ -1014,8 +1009,7 @@ void FffGcodeWriter::processRaft(const SliceDataStorage& storage) use_endpieces, skip_some_zags, zag_skip_count, - pocket_size, - surface_pattern_overlap); + pocket_size); std::vector raft_paths; infill_comp.generate(raft_paths, raft_polygons, raft_lines, surface_settings, layer_nr, SectionType::ADHESION); @@ -1933,7 +1927,7 @@ bool FffGcodeWriter::processMultiLayerInfill( constexpr size_t wall_line_count = 0; // wall toolpaths are when gradual infill areas are determined const coord_t small_area_width = 0; - constexpr coord_t infill_overlap = 0; // Overlap is handled when the wall toolpaths are generated + const coord_t infill_overlap = mesh.settings.get("infill_overlap_mm"); constexpr bool skip_stitching = false; constexpr bool connected_zigzags = false; constexpr bool use_endpieces = true; @@ -2214,7 +2208,7 @@ bool FffGcodeWriter::processSingleLayerInfill( constexpr size_t wall_line_count_here = 0; // Wall toolpaths were generated in generateGradualInfill for the sparsest density, denser parts don't have walls by default const coord_t small_area_width = 0; - constexpr coord_t overlap = 0; // overlap is already applied for the sparsest density in the generateGradualInfill + const coord_t overlap = mesh.settings.get("infill_overlap_mm"); wall_tool_paths.emplace_back(); Infill infill_comp( diff --git a/src/infill.cpp b/src/infill.cpp index 86f72c646c..6067fa625b 100644 --- a/src/infill.cpp +++ b/src/infill.cpp @@ -57,17 +57,13 @@ namespace cura Shape Infill::generateWallToolPaths( std::vector& toolpaths, - Shape& outer_contour, + const Shape& outer_contour, const size_t wall_line_count, const coord_t line_width, - const coord_t infill_overlap, const Settings& settings, int layer_idx, SectionType section_type) { - outer_contour = outer_contour.offset(infill_overlap); - scripta::log("infill_outer_contour", outer_contour, section_type, layer_idx, scripta::CellVDI{ "infill_overlap", infill_overlap }); - Shape inner_contour; if (wall_line_count > 0) { @@ -100,10 +96,10 @@ void Infill::generate( return; } - inner_contour_ = generateWallToolPaths(toolpaths, outer_contour_, wall_line_count_, infill_line_width_, infill_overlap_, settings, layer_idx, section_type); + inner_contour_ = generateWallToolPaths(toolpaths, outer_contour_, wall_line_count_, infill_line_width_, settings, layer_idx, section_type); scripta::log("infill_inner_contour_0", inner_contour_, section_type, layer_idx); - inner_contour_ = inner_contour_.offset(pattern_overlap_); + inner_contour_ = inner_contour_.offset(infill_overlap_); // It does not make sense to print a pattern in a small region. So the infill region // is split into a small region that will be filled with walls and the normal region diff --git a/src/skin.cpp b/src/skin.cpp index c0dcadd3d8..351290be93 100644 --- a/src/skin.cpp +++ b/src/skin.cpp @@ -470,7 +470,6 @@ void SkinInfillAreaComputation::generateGradualInfill(SliceMeshStorage& mesh) const auto infill_wall_count = mesh.settings.get("infill_wall_line_count"); const auto infill_wall_width = mesh.settings.get("infill_line_width"); - const auto infill_overlap = mesh.settings.get("infill_overlap_mm"); const auto is_connected = mesh.settings.get("zig_zaggify_infill") || mesh.settings.get("infill_pattern") == EFillMethod::ZIG_ZAG; for (LayerIndex layer_idx = 0; layer_idx < static_cast(mesh.layers.size()); layer_idx++) { // loop also over layers which don't contain infill cause of bottom_ and top_layer to initialize their infill_area_per_combine_per_density @@ -485,7 +484,6 @@ void SkinInfillAreaComputation::generateGradualInfill(SliceMeshStorage& mesh) part.getOwnInfillArea(), infill_wall_count, infill_wall_width, - infill_overlap, mesh.settings, layer_idx, SectionType::SKIN); diff --git a/src/support.cpp b/src/support.cpp index a432da3d58..ea7f4164ef 100644 --- a/src/support.cpp +++ b/src/support.cpp @@ -226,7 +226,6 @@ void AreaSupport::generateGradualSupport(SliceDataStorage& storage) original_area, support_infill_part.inset_count_to_generate_, wall_width, - 0, infill_extruder.settings_, layer_nr, SectionType::SUPPORT);