add "precise_outer_wall"

This commit is contained in:
Wang YB
2024-05-25 11:23:26 +08:00
parent 8ef53eceee
commit ad0215fa2f
7 changed files with 58 additions and 12 deletions

View File

@@ -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 << "."; 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<WideningBeadingStrategy>(std::move(ret), min_feature_size, min_bead_width); ret = std::make_unique<WideningBeadingStrategy>(std::move(ret), min_feature_size, min_bead_width);
} }
//w39
if (outer_wall_offset > 0) { if (outer_wall_offset != 0){//if (outer_wall_offset > 0) {
BOOST_LOG_TRIVIAL(trace) << "Applying the OuterWallOffset meta-strategy with offset = " << outer_wall_offset << "."; BOOST_LOG_TRIVIAL(trace) << "Applying the OuterWallOffset meta-strategy with offset = " << outer_wall_offset << ".";
ret = std::make_unique<OuterWallInsetBeadingStrategy>(outer_wall_offset, std::move(ret)); ret = std::make_unique<OuterWallInsetBeadingStrategy>(outer_wall_offset, std::move(ret));
} }

View File

@@ -1298,15 +1298,27 @@ void PerimeterGenerator::process_arachne(
// extra perimeters for each one // extra perimeters for each one
// detect how many perimeters must be generated for this island // detect how many perimeters must be generated for this island
int loop_number = params.config.perimeters + surface.extra_perimeters - 1; // 0-indexed loops 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); Polygons last_p = to_polygons(last);
//w16 //w16
//w23 //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)) 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; loop_number = 0;
//w39
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); 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<Arachne::VariableWidthLines> perimeters = wallToolPaths.getToolPaths(); std::vector<Arachne::VariableWidthLines> perimeters = wallToolPaths.getToolPaths();
loop_number = int(perimeters.size()) - 1; loop_number = int(perimeters.size()) - 1;
@@ -1583,7 +1595,20 @@ void PerimeterGenerator::process_with_one_wall_arachne(
//w23 //w23
if (params.object_config.only_one_wall_first_layer && layer_id == 0) if (params.object_config.only_one_wall_first_layer && layer_id == 0)
loop_number = 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); Polygons last_p = to_polygons(last);
int remain_loops = -1; int remain_loops = -1;
@@ -1593,8 +1618,8 @@ void PerimeterGenerator::process_with_one_wall_arachne(
loop_number = 0; loop_number = 0;
} }
//w39
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); 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<Arachne::VariableWidthLines> perimeters = wallToolPaths.getToolPaths(); std::vector<Arachne::VariableWidthLines> perimeters = wallToolPaths.getToolPaths();
loop_number = int(perimeters.size()) - 1; loop_number = int(perimeters.size()) - 1;
@@ -1952,7 +1977,13 @@ void PerimeterGenerator::process_classic(
// external perimeters // external perimeters
coord_t ext_perimeter_width = params.ext_perimeter_flow.scaled_width(); 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_spacing = params.ext_perimeter_flow.scaled_spacing();
coord_t ext_perimeter_spacing2 = scaled<coord_t>(0.5f * (params.ext_perimeter_flow.spacing() + params.perimeter_flow.spacing())); coord_t ext_perimeter_spacing2; //= scaled<coord_t>(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<coord_t>(0.5f * (params.ext_perimeter_flow.width() + params.perimeter_flow.width()));
else
ext_perimeter_spacing2 = scaled<coord_t>(0.5f * (params.ext_perimeter_flow.spacing() + params.perimeter_flow.spacing()));
// solid infill // solid infill
coord_t solid_infill_spacing = params.solid_infill_flow.scaled_spacing(); coord_t solid_infill_spacing = params.solid_infill_flow.scaled_spacing();

View File

@@ -496,7 +496,9 @@ static std::vector<std::string> s_Preset_print_options {
//w33 //w33
,"ironing_pattern" ,"ironing_pattern"
//w38 //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<std::string> s_Preset_filament_options { static std::vector<std::string> s_Preset_filament_options {
"filament_colour", "filament_diameter", "filament_type", "filament_soluble", "filament_notes", "filament_max_volumetric_speed", "filament_colour", "filament_diameter", "filament_type", "filament_soluble", "filament_notes", "filament_max_volumetric_speed",

View File

@@ -332,6 +332,13 @@ void PrintConfigDef::init_common_params()
def->mode = comAdvanced; def->mode = comAdvanced;
def->set_default_value(new ConfigOptionBool(0)); 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 = this->add("thumbnails", coString);
def->label = L("G-code thumbnails"); 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" 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"

View File

@@ -680,7 +680,8 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionBool, overhang_reverse)) ((ConfigOptionBool, overhang_reverse))
((ConfigOptionBool, overhang_reverse_internal_only)) ((ConfigOptionBool, overhang_reverse_internal_only))
((ConfigOptionFloatOrPercent, overhang_reverse_threshold)) ((ConfigOptionFloatOrPercent, overhang_reverse_threshold))
) //w39
((ConfigOptionBool, precise_outer_wall)))
PRINT_CONFIG_CLASS_DEFINE( PRINT_CONFIG_CLASS_DEFINE(
MachineEnvelopeConfig, MachineEnvelopeConfig,

View File

@@ -852,7 +852,9 @@ bool PrintObject::invalidate_state_by_config_options(
|| opt_key == "fuzzy_skin_point_dist" || opt_key == "fuzzy_skin_point_dist"
|| opt_key == "overhangs" || opt_key == "overhangs"
|| opt_key == "thin_walls" || 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(posPerimeters);
steps.emplace_back(posSupportMaterial); steps.emplace_back(posSupportMaterial);
} else if (opt_key == "bridge_flow_ratio") { } else if (opt_key == "bridge_flow_ratio") {

View File

@@ -1708,6 +1708,7 @@ void TabPrint::build()
optgroup->append_single_option_line("elefant_foot_compensation_layers"); optgroup->append_single_option_line("elefant_foot_compensation_layers");
//w27 //w27
optgroup->append_single_option_line("precise_z_height"); 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 = page->new_optgroup(L("Arachne perimeter generator"));
optgroup->append_single_option_line("wall_transition_angle"); 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"); optgroup->append_single_option_line("elefant_foot_min_width");
//w27 //w27
optgroup->append_single_option_line("precise_z_height"); 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"); optgroup->append_single_option_line("gamma_correction");