From ad0215fa2f39f805a932692a8893f08c700d012a Mon Sep 17 00:00:00 2001 From: Wang YB <94800665+Gradbb@users.noreply.github.com> Date: Sat, 25 May 2024 11:23:26 +0800 Subject: [PATCH] add "precise_outer_wall" --- .../BeadingStrategyFactory.cpp | 4 +- src/libslic3r/PerimeterGenerator.cpp | 45 ++++++++++++++++--- src/libslic3r/Preset.cpp | 4 +- src/libslic3r/PrintConfig.cpp | 7 +++ src/libslic3r/PrintConfig.hpp | 3 +- src/libslic3r/PrintObject.cpp | 4 +- src/slic3r/GUI/Tab.cpp | 3 ++ 7 files changed, 58 insertions(+), 12 deletions(-) diff --git a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp index 853facb..dd17b35 100644 --- a/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp +++ b/src/libslic3r/Arachne/BeadingStrategy/BeadingStrategyFactory.cpp @@ -41,8 +41,8 @@ BeadingStrategyPtr BeadingStrategyFactory::makeStrategy(const coord_t preferred_ BOOST_LOG_TRIVIAL(trace) << "Applying the Widening Beading meta-strategy with minimum input width " << min_feature_size << " and minimum output width " << min_bead_width << "."; ret = std::make_unique(std::move(ret), min_feature_size, min_bead_width); } - - if (outer_wall_offset > 0) { + //w39 + if (outer_wall_offset != 0){//if (outer_wall_offset > 0) { BOOST_LOG_TRIVIAL(trace) << "Applying the OuterWallOffset meta-strategy with offset = " << outer_wall_offset << "."; ret = std::make_unique(outer_wall_offset, std::move(ret)); } diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp index d648d6f..7774258 100644 --- a/src/libslic3r/PerimeterGenerator.cpp +++ b/src/libslic3r/PerimeterGenerator.cpp @@ -1298,15 +1298,27 @@ void PerimeterGenerator::process_arachne( // extra perimeters for each one // detect how many perimeters must be generated for this island int loop_number = params.config.perimeters + surface.extra_perimeters - 1; // 0-indexed loops - ExPolygons last = offset_ex(surface.expolygon.simplify_p(params.scaled_resolution), - float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); + //w39 + //ExPolygons last = offset_ex(surface.expolygon.simplify_p(params.scaled_resolution), - float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); + double surface_simplify_resolution = (params.print_config.arc_fitting != ArcFittingType::Disabled && + params.config.fuzzy_skin == FuzzySkinType::None) ? + 0.2 * scale_(params.print_config.resolution) : + params.print_config.resolution; + auto apply_precise_outer_wall = params.config.precise_outer_wall && !params.config.external_perimeters_first; + ExPolygons last = apply_precise_outer_wall? offset_ex(surface.expolygon.simplify_p(surface_simplify_resolution), + -float(ext_perimeter_width - ext_perimeter_spacing) ) :offset_ex(surface.expolygon.simplify_p(params.scaled_resolution), + -float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); + coord_t wall_0_inset = 0; + if (apply_precise_outer_wall) + wall_0_inset = -coord_t(ext_perimeter_width / 2 - ext_perimeter_spacing / 2); Polygons last_p = to_polygons(last); //w16 //w23 if ((upper_slices == nullptr && params.object_config.top_one_wall_type == TopOneWallType::Onlytopmost)||(params.object_config.only_one_wall_first_layer && layer_id == 0)) loop_number = 0; - - Arachne::WallToolPaths wallToolPaths(last_p, ext_perimeter_spacing, perimeter_spacing, coord_t(loop_number + 1), 0, params.layer_height, params.object_config, params.print_config); + //w39 + Arachne::WallToolPaths wallToolPaths(last_p, ext_perimeter_spacing, perimeter_spacing, coord_t(loop_number + 1), wall_0_inset, params.layer_height, params.object_config, params.print_config); std::vector perimeters = wallToolPaths.getToolPaths(); loop_number = int(perimeters.size()) - 1; @@ -1583,7 +1595,20 @@ void PerimeterGenerator::process_with_one_wall_arachne( //w23 if (params.object_config.only_one_wall_first_layer && layer_id == 0) loop_number = 0; - ExPolygons last = offset_ex(surface.expolygon.simplify_p(params.scaled_resolution), - float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); + //w39 + //ExPolygons last = offset_ex(surface.expolygon.simplify_p(params.scaled_resolution), - float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); + double surface_simplify_resolution = (params.print_config.arc_fitting != ArcFittingType::Disabled && + params.config.fuzzy_skin == FuzzySkinType::None) ? + 0.2 * scale_(params.print_config.resolution) : + params.print_config.resolution; + auto apply_precise_outer_wall = params.config.precise_outer_wall && !params.config.external_perimeters_first; + ExPolygons last = apply_precise_outer_wall ? offset_ex(surface.expolygon.simplify_p(surface_simplify_resolution), + -float(ext_perimeter_width - ext_perimeter_spacing)) : + offset_ex(surface.expolygon.simplify_p(params.scaled_resolution), + -float(ext_perimeter_width / 2. - ext_perimeter_spacing / 2.)); + coord_t wall_0_inset = 0; + if (apply_precise_outer_wall) + wall_0_inset = -coord_t(ext_perimeter_width / 2 - ext_perimeter_spacing / 2); Polygons last_p = to_polygons(last); int remain_loops = -1; @@ -1593,8 +1618,8 @@ void PerimeterGenerator::process_with_one_wall_arachne( loop_number = 0; } - - Arachne::WallToolPaths wallToolPaths(last_p, ext_perimeter_spacing, perimeter_spacing, coord_t(loop_number + 1), 0, params.layer_height, params.object_config, params.print_config); + //w39 + Arachne::WallToolPaths wallToolPaths(last_p, ext_perimeter_spacing, perimeter_spacing, coord_t(loop_number + 1), wall_0_inset, params.layer_height, params.object_config, params.print_config); std::vector perimeters = wallToolPaths.getToolPaths(); loop_number = int(perimeters.size()) - 1; @@ -1952,7 +1977,13 @@ void PerimeterGenerator::process_classic( // external perimeters coord_t ext_perimeter_width = params.ext_perimeter_flow.scaled_width(); coord_t ext_perimeter_spacing = params.ext_perimeter_flow.scaled_spacing(); - coord_t ext_perimeter_spacing2 = scaled(0.5f * (params.ext_perimeter_flow.spacing() + params.perimeter_flow.spacing())); + coord_t ext_perimeter_spacing2; //= scaled(0.5f * (params.ext_perimeter_flow.spacing() + params.perimeter_flow.spacing())); + //w39 + if (params.config.precise_outer_wall && !params.config.external_perimeters_first) + ext_perimeter_spacing2 = scaled(0.5f * (params.ext_perimeter_flow.width() + params.perimeter_flow.width())); + else + ext_perimeter_spacing2 = scaled(0.5f * (params.ext_perimeter_flow.spacing() + params.perimeter_flow.spacing())); + // solid infill coord_t solid_infill_spacing = params.solid_infill_flow.scaled_spacing(); diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 1b9547c..b4d28c9 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -496,7 +496,9 @@ static std::vector s_Preset_print_options { //w33 ,"ironing_pattern" //w38 - ,"overhang_reverse","overhang_reverse_internal_only","overhang_reverse_threshold"}; + ,"overhang_reverse","overhang_reverse_internal_only","overhang_reverse_threshold" + //w39 + ,"precise_outer_wall"}; static std::vector s_Preset_filament_options { "filament_colour", "filament_diameter", "filament_type", "filament_soluble", "filament_notes", "filament_max_volumetric_speed", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 5af8147..a2c056a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -332,6 +332,13 @@ void PrintConfigDef::init_common_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionBool(0)); + //w39 + def = this->add("precise_outer_wall", coBool); + def->label = L("Precise wall"); + def->tooltip = L("Improve shell precision by adjusting outer wall spacing. This also improves layer consistency.\nNote: This setting " + "will only take effect if the wall sequence is configured to Inner-Outer"); + def->set_default_value(new ConfigOptionBool{false}); + def = this->add("thumbnails", coString); def->label = L("G-code thumbnails"); def->tooltip = L("Picture sizes to be stored into a .gcode / .bgcode and .sl1 / .sl1s files, in the following format: \"XxY/EXT, XxY/EXT, ...\"\n" diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 7305ed5..2be9e53 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -680,7 +680,8 @@ PRINT_CONFIG_CLASS_DEFINE( ((ConfigOptionBool, overhang_reverse)) ((ConfigOptionBool, overhang_reverse_internal_only)) ((ConfigOptionFloatOrPercent, overhang_reverse_threshold)) -) + //w39 + ((ConfigOptionBool, precise_outer_wall))) PRINT_CONFIG_CLASS_DEFINE( MachineEnvelopeConfig, diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp index 13e9b31..b1c4c7e 100644 --- a/src/libslic3r/PrintObject.cpp +++ b/src/libslic3r/PrintObject.cpp @@ -852,7 +852,9 @@ bool PrintObject::invalidate_state_by_config_options( || opt_key == "fuzzy_skin_point_dist" || opt_key == "overhangs" || opt_key == "thin_walls" - || opt_key == "thick_bridges") { + || opt_key == "thick_bridges" + //w39 + || opt_key == "precise_outer_wall") { steps.emplace_back(posPerimeters); steps.emplace_back(posSupportMaterial); } else if (opt_key == "bridge_flow_ratio") { diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index ceb17f2..d7a3809 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1708,6 +1708,7 @@ void TabPrint::build() optgroup->append_single_option_line("elefant_foot_compensation_layers"); //w27 optgroup->append_single_option_line("precise_z_height"); + optgroup->append_single_option_line("precise_outer_wall", "Precise-wall"); optgroup = page->new_optgroup(L("Arachne perimeter generator")); optgroup->append_single_option_line("wall_transition_angle"); @@ -3032,6 +3033,8 @@ void TabPrinter::build_sla() optgroup->append_single_option_line("elefant_foot_min_width"); //w27 optgroup->append_single_option_line("precise_z_height"); + //w39 + optgroup->append_single_option_line("precise_outer_wall", "Precise-wall"); optgroup->append_single_option_line("gamma_correction");