diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 6029d4d..0e1f2b1 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -228,14 +228,14 @@ std::vector group_fills(const Layer &layer) fill.expolygons.emplace_back(std::move(fill.surface.expolygon)); //w21 fill.region_id_group.push_back(region_id); - fill.no_overlap_expolygons = layerm.fill_no_overlap_expolygons(); + fill.no_overlap_expolygons = layerm.fill_no_overlap_expolygons; } else { //w21 fill.expolygons.emplace_back(surface.expolygon); auto t = find(fill.region_id_group.begin(), fill.region_id_group.end(), region_id); if (t == fill.region_id_group.end()) { fill.region_id_group.push_back(region_id); - fill.no_overlap_expolygons = union_ex(fill.no_overlap_expolygons, layerm.fill_no_overlap_expolygons()); + fill.no_overlap_expolygons = union_ex(fill.no_overlap_expolygons, layerm.fill_no_overlap_expolygons); } } } @@ -495,6 +495,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: const Slic3r::BoundingBox bbox = this->object()->bounding_box(); const auto resolution = this->object()->print()->config().gcode_resolution.value; const auto perimeter_generator = this->object()->config().perimeter_generator; + //w21 + float filter_gap_infill_value = this->object()->config().filter_top_gap_infill; #ifdef SLIC3R_DEBUG_SLICE_PROCESSING { @@ -578,6 +580,9 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: try { if (params.use_arachne) { thick_polylines = f->fill_surface_arachne(&surface_fill.surface, params); + //w21 + //if (f->layer_id % 2 == 0 && surface_fill.params.pattern == ipConcentricInternal) + // std::reverse(thick_polylines.begin(), thick_polylines.end()); } else { polylines = f->fill_surface(&surface_fill.surface, params); @@ -664,7 +669,8 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: }), polylines.end()); - variable_width_gap(polylines, ExtrusionRole::GapFill, surface_fill.params.flow, gap_fill.entities); + variable_width_gap(polylines, ExtrusionRole::GapFill, surface_fill.params.flow, gap_fill.entities,filter_gap_infill_value); + eec->append(std::move(gap_fill.entities)); } } @@ -715,7 +721,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: #endif } //w21 -void Layer::variable_width_gap(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector &out) +void Layer::variable_width_gap(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector &out,const float filter_gap_infill_value) { const float tolerance = float(scale_(0.05)); for (const ThickPolyline &p : polylines) { @@ -726,8 +732,12 @@ void Layer::variable_width_gap(const ThickPolylines &polylines, ExtrusionRole ro } else { for (ExtrusionPath &path : paths) { - if (path.length() >= scale_(flow.nozzle_diameter()/2.0) || path.width() >= scale_(flow.nozzle_diameter()/2.0)) - out.emplace_back(new ExtrusionPath(std::move(path))); + if (filter_gap_infill_value != 0) { + if (path.length() >= scale_(filter_gap_infill_value) || path.width() >= scale_(filter_gap_infill_value)) + out.emplace_back(new ExtrusionPath(std::move(path))); + } + else + out.emplace_back(new ExtrusionPath(std::move(path))); } } } diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp index 8282ba8..ad6d6ae 100644 --- a/src/libslic3r/Layer.cpp +++ b/src/libslic3r/Layer.cpp @@ -654,7 +654,7 @@ void Layer::make_perimeters() fill_expolygons_ranges.clear(); surfaces_to_merge.clear(); //w21 - fill_no_overlap_expolygons.clear(); + //fill_no_overlap_expolygons.clear(); // find compatible regions layer_region_ids.clear(); @@ -696,7 +696,7 @@ void Layer::make_perimeters() if (layer_region_ids.size() == 1) { // optimization //w21 - (*layerm)->make_perimeters((*layerm)->slices(), perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges,fill_no_overlap_expolygons); + (*layerm)->make_perimeters((*layerm)->slices(), perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges,(*layerm)->fill_no_overlap_expolygons); this->sort_perimeters_into_islands((*layerm)->slices(), region_id, perimeter_and_gapfill_ranges, std::move(fill_expolygons), fill_expolygons_ranges, layer_region_ids); } else { SurfaceCollection new_slices; @@ -732,7 +732,8 @@ void Layer::make_perimeters() } // make perimeters //w21 - layerm_config->make_perimeters(new_slices, perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges,fill_no_overlap_expolygons); + ExPolygons fill_no_overlap; + layerm_config->make_perimeters(new_slices, perimeter_and_gapfill_ranges, fill_expolygons, fill_expolygons_ranges,fill_no_overlap); this->sort_perimeters_into_islands(new_slices, region_id_config, perimeter_and_gapfill_ranges, std::move(fill_expolygons), fill_expolygons_ranges, layer_region_ids); //w21 if (!new_slices.surfaces.empty()) { @@ -743,7 +744,7 @@ void Layer::make_perimeters() layer.m_fill_expolygons = std::move(expp); if (!layer.m_fill_expolygons.empty()) { layer.m_fill_surfaces.set(std::move(layer.m_fill_expolygons), layer.slices().surfaces.front()); - layer.m_fill_no_overlap_expolygons = intersection_ex(layer.slices().surfaces, fill_no_overlap_expolygons); + layer.fill_no_overlap_expolygons = intersection_ex(layer.slices().surfaces, fill_no_overlap); } } diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp index 9ec7ebf..d4c8205 100644 --- a/src/libslic3r/Layer.hpp +++ b/src/libslic3r/Layer.hpp @@ -133,7 +133,7 @@ public: // (this collection contains only ExtrusionEntityCollection objects) [[nodiscard]] const ExtrusionEntityCollection& fills() const { return m_fills; } //w21 - [[nodiscard]] const ExPolygons &fill_no_overlap_expolygons() const { return m_fill_expolygons; } + ExPolygons fill_no_overlap_expolygons; Flow flow(FlowRole role) const; Flow flow(FlowRole role, double layer_height) const; @@ -393,7 +393,7 @@ public: virtual bool has_extrusions() const { for (auto layerm : m_regions) if (layerm->has_extrusions()) return true; return false; } // virtual bool has_extrusions() const { for (const LayerSlice &lslice : lslices_ex) if (lslice.has_extrusions()) return true; return false; } //w21 - void variable_width_gap(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector &out); + void variable_width_gap(const ThickPolylines &polylines, ExtrusionRole role, const Flow &flow, std::vector &out,const float filter_gap_infill_value); ExtrusionPaths thick_polyline_to_extrusion_paths(const ThickPolyline &thick_polyline,ExtrusionRole role,const Flow & flow,const float tolerance); protected: diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 85e747f..8d56348 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1367,7 +1367,7 @@ void PerimeterGenerator::process_arachne( } } //w21 - append(out_fill_no_overlap, offset2_ex(union_ex(pp),float(-min_perimeter_infill_spacing / 2.), float(inset + min_perimeter_infill_spacing / 2.))); + append(out_fill_no_overlap, offset2_ex(union_ex(pp),float(-min_perimeter_infill_spacing / 2.), float( min_perimeter_infill_spacing / 2.))); append(out_fill_expolygons, std::move(infill_areas)); } diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 9d65dd6..443206d 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -479,6 +479,8 @@ static std::vector s_Preset_print_options { , "top_one_wall_type" //w17 ,"top_area_threshold" + //w21 + ,"filter_top_gap_infill" }; static std::vector s_Preset_filament_options { diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 0060f27..6d572fc 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3683,6 +3683,15 @@ void PrintConfigDef::init_fff_params() " Otherwise, rectilinear pattern is used defaultly."); def->mode = comExpert; def->set_default_value(new ConfigOptionBool(true)); + + //w21 + def = this->add("filter_top_gap_infill", coFloat); + def->label = L("Filter out tiny top gaps infill"); + def->category = L("Infill"); + def->tooltip = L("Filter out gaps smaller than the threshold specified. This setting affact top surface's gap infill"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0)); } diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 3c579f9..dd2c22d 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -595,6 +595,8 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionEnum, top_one_wall_type)) //w17 ((ConfigOptionPercent, top_area_threshold)) + //w21 + ((ConfigOptionFloat, filter_top_gap_infill)) ) PRINT_CONFIG_CLASS_DEFINE( diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 70a04e8..81d5d9f 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1509,6 +1509,8 @@ void TabPrint::build() optgroup->append_single_option_line("infill_first"); //w11 optgroup->append_single_option_line("detect_narrow_internal_solid_infill"); + //w21 + optgroup->append_single_option_line("filter_top_gap_infill"); page = add_options_page(L("Skirt and brim"), "skirt+brim"); category_path = "skirt-and-brim_133969#";