From 8cb30a7329f529a98b361c9866e5364313aefef3 Mon Sep 17 00:00:00 2001 From: Wang YB <94800665+Gradbb@users.noreply.github.com> Date: Fri, 1 Mar 2024 13:15:40 +0800 Subject: [PATCH 1/4] debug top_infill areas --- src/libslic3r/PerimeterGenerator.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 6f88316..8d7ef59 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1093,9 +1093,7 @@ void PerimeterGenerator::add_infill_contour_for_arachne(ExPolygons infill_contou for (ExPolygon &ex : infill_contour) ex.simplify_p(params.scaled_resolution, &inner_pp); ExPolygons inner_union = union_ex(inner_pp); - float offset1 = -min_perimeter_infill_spacing / 2.; - float offset2 = insert + min_perimeter_infill_spacing / 2.; - infill_areas = offset2_ex(inner_union, offset1, offset2); + infill_areas = offset_ex(inner_union, insert); append(out_fill_expolygons, std::move(infill_areas)); } From 02857e3fd828501d1d0c459ce5a2319f34dd2475 Mon Sep 17 00:00:00 2001 From: Wang YB <94800665+Gradbb@users.noreply.github.com> Date: Fri, 1 Mar 2024 13:18:53 +0800 Subject: [PATCH 2/4] update fill.cpp --- src/libslic3r/Fill/Fill.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 660b6e6..858b617 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -549,7 +549,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: params.anchor_length_max = surface_fill.params.anchor_length_max; params.resolution = resolution; //w14 - params.use_arachne = (perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentricInternal) || surface_fill.params.pattern == ipEnsuring; + params.use_arachne = (perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentricInternal) || surface_fill.params.pattern == ipEnsuring || surface_fill.params.pattern == ipConcentricInternal; params.layer_height = layerm.layer()->height; for (ExPolygon &expoly : surface_fill.expolygons) { @@ -561,25 +561,25 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: try { if (params.use_arachne) { //w14 - if (surface_fill.params.pattern == ipConcentricInternal) { + /* if (surface_fill.params.pattern == ipConcentricInternal) { layerm.region().config().infill_overlap.percent ? f->overlap = layerm.region().config().perimeter_extrusion_width * layerm.region().config().infill_overlap.value / 100 *(-1): f->overlap = float(layerm.region().config().infill_overlap.value); } else - f->overlap = 0; + f->overlap = 0;*/ thick_polylines = f->fill_surface_arachne(&surface_fill.surface, params); } //w14 else { - if (surface_fill.params.pattern == ipConcentricInternal) { + /* if (surface_fill.params.pattern == ipConcentricInternal) { layerm.region().config().infill_overlap.percent ? f->overlap = layerm.region().config().perimeter_extrusion_width * layerm.region().config().infill_overlap.value / 100 * (-1) : f->overlap = float(layerm.region().config().infill_overlap.value); } else - f->overlap = 0; + f->overlap = 0;*/ polylines = f->fill_surface(&surface_fill.surface, params); } } catch (InfillFailedException &) { From 7a7fb7da00aff58d44818a3384227978b5a09e54 Mon Sep 17 00:00:00 2001 From: QIDI TECH <893239786@qq.com> Date: Mon, 4 Mar 2024 18:28:52 +0800 Subject: [PATCH 3/4] Update Fill.cpp --- src/libslic3r/Fill/Fill.cpp | 71 +++++++++++++------------------------ 1 file changed, 24 insertions(+), 47 deletions(-) diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp index 858b617..df9a7e0 100644 --- a/src/libslic3r/Fill/Fill.cpp +++ b/src/libslic3r/Fill/Fill.cpp @@ -19,6 +19,7 @@ #include "Polygon.hpp" //w11 #define NARROW_INFILL_AREA_THRESHOLD 3 +#define NARROW_INFILL_AREA_THRESHOLD_MIN 0.5 namespace Slic3r { //static constexpr const float NarrowInfillAreaThresholdMM = 3.f; @@ -117,7 +118,8 @@ struct SurfaceFill { static bool is_narrow_infill_area(const ExPolygon &expolygon) { ExPolygons offsets = offset_ex(expolygon, -scale_(NARROW_INFILL_AREA_THRESHOLD)); - if (offsets.empty()) + ExPolygons offsets_min = offset_ex(expolygon, -scale_(NARROW_INFILL_AREA_THRESHOLD_MIN)); + if (offsets.empty() && !offsets_min.empty()) return true; return false; @@ -316,47 +318,31 @@ std::vector group_fills(const Layer &layer) } // Use ipEnsuring pattern for all internal Solids. - { - for (size_t surface_fill_id = 0; surface_fill_id < surface_fills.size(); ++surface_fill_id) - if (SurfaceFill &fill = surface_fills[surface_fill_id]; fill.surface.surface_type == stInternalSolid) { - fill.params.pattern = ipEnsuring; - } - } //w11 if (layer.object()->config().detect_narrow_internal_solid_infill) { - size_t surface_fills_size = surface_fills.size(); - for (size_t i = 0; i < surface_fills_size; i++) { + for (size_t i = 0; i < surface_fills.size(); i++) { if (surface_fills[i].surface.surface_type != stInternalSolid) continue; - size_t expolygons_size = surface_fills[i].expolygons.size(); + size_t expolygons_size = surface_fills[i].expolygons.size(); std::vector narrow_expolygons_index; narrow_expolygons_index.reserve(expolygons_size); + for (size_t j = 0; j < expolygons_size; j++) if (is_narrow_infill_area(surface_fills[i].expolygons[j])) narrow_expolygons_index.push_back(j); - if (narrow_expolygons_index.size() == 0) { - continue; - } else if (narrow_expolygons_index.size() == expolygons_size) { - // w11 - // w14 + if (narrow_expolygons_index.size() == expolygons_size) { surface_fills[i].params.pattern = ipConcentricInternal; } else { - params = surface_fills[i].params; - params.pattern = ipConcentricInternal; - surface_fills.emplace_back(params); - surface_fills.back().region_id = surface_fills[i].region_id; - surface_fills.back().surface.surface_type = stInternalSolid; - surface_fills.back().surface.thickness = surface_fills[i].surface.thickness; - for (size_t j = 0; j < narrow_expolygons_index.size(); j++) { - surface_fills.back().expolygons.emplace_back(std::move(surface_fills[i].expolygons[narrow_expolygons_index[j]])); - } - for (int j = narrow_expolygons_index.size() - 1; j >= 0; j--) { - surface_fills[i].expolygons.erase(surface_fills[i].expolygons.begin() + narrow_expolygons_index[j]); - } + surface_fills[i].params.pattern = ipEnsuring; } } + } else { + for (size_t surface_fill_id = 0; surface_fill_id < surface_fills.size(); ++surface_fill_id) + if (SurfaceFill &fill = surface_fills[surface_fill_id]; fill.surface.surface_type == stInternalSolid) { + fill.params.pattern = ipEnsuring; + } } return surface_fills; } @@ -549,7 +535,7 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: params.anchor_length_max = surface_fill.params.anchor_length_max; params.resolution = resolution; //w14 - params.use_arachne = (perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentricInternal) || surface_fill.params.pattern == ipEnsuring || surface_fill.params.pattern == ipConcentricInternal; + params.use_arachne = (perimeter_generator == PerimeterGeneratorType::Arachne && surface_fill.params.pattern == ipConcentric) || surface_fill.params.pattern == ipEnsuring || surface_fill.params.pattern == ipConcentricInternal; params.layer_height = layerm.layer()->height; for (ExPolygon &expoly : surface_fill.expolygons) { @@ -558,28 +544,19 @@ void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive: surface_fill.surface.expolygon = std::move(expoly); Polylines polylines; ThickPolylines thick_polylines; - try { +//w14 + if (this->object()->config().detect_narrow_internal_solid_infill && (surface_fill.params.pattern == ipConcentricInternal || surface_fill.params.pattern == ipEnsuring)) { + layerm.region().config().infill_overlap.percent ? + f->overlap = layerm.region().config().perimeter_extrusion_width * layerm.region().config().infill_overlap.value / 100 * (-1) : + f->overlap = float(layerm.region().config().infill_overlap.value); + } else + f->overlap = 0; + + try { if (params.use_arachne) { - //w14 - /* if (surface_fill.params.pattern == ipConcentricInternal) { - layerm.region().config().infill_overlap.percent ? - f->overlap = layerm.region().config().perimeter_extrusion_width * layerm.region().config().infill_overlap.value / 100 *(-1): - f->overlap = float(layerm.region().config().infill_overlap.value); - - } else - f->overlap = 0;*/ thick_polylines = f->fill_surface_arachne(&surface_fill.surface, params); } - //w14 - else { - /* if (surface_fill.params.pattern == ipConcentricInternal) { - layerm.region().config().infill_overlap.percent ? - f->overlap = layerm.region().config().perimeter_extrusion_width * - layerm.region().config().infill_overlap.value / 100 * (-1) : - f->overlap = float(layerm.region().config().infill_overlap.value); - - } else - f->overlap = 0;*/ + else { polylines = f->fill_surface(&surface_fill.surface, params); } } catch (InfillFailedException &) { From 48ed13e6f17cda38a9e9a369373455d2791d5d32 Mon Sep 17 00:00:00 2001 From: Wang YB <94800665+Gradbb@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:30:39 +0800 Subject: [PATCH 4/4] update upper_slices_cache --- src/libslic3r/PerimeterGenerator.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index 8d7ef59..b4cfe4e 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1093,8 +1093,10 @@ void PerimeterGenerator::add_infill_contour_for_arachne(ExPolygons infill_contou for (ExPolygon &ex : infill_contour) ex.simplify_p(params.scaled_resolution, &inner_pp); ExPolygons inner_union = union_ex(inner_pp); - infill_areas = offset_ex(inner_union, insert); - append(out_fill_expolygons, std::move(infill_areas)); + float offset1 = -min_perimeter_infill_spacing / 2.; + float offset2 = insert + min_perimeter_infill_spacing / 2.; + infill_areas = offset2_ex(inner_union, offset1, offset2); + append(out_fill_expolygons, offset2_ex(union_ex(inner_pp), float(-min_perimeter_infill_spacing / 2.), float(insert + min_perimeter_infill_spacing / 2.))); } @@ -1399,7 +1401,7 @@ void PerimeterGenerator::process_with_one_wall_arachne( } if (params.config.overhangs && upper_slices != nullptr && upper_slices_polygons_cache.empty()) { double upper_nozzle_diameter = params.print_config.nozzle_diameter.get_at(params.config.perimeter_extruder - 1); - upper_slices_polygons_cache = offset(*upper_slices, float(scale_(+upper_nozzle_diameter / 2))); + upper_slices_polygons_cache = offset(*upper_slices, float(scale_(EPSILON))); }