Set Ironing angle setting to be a relative degree offset from top surface infill direction (#10841)

* Change ironing angle setting to be an offset angle from the top surface angle rather offset from the layer 0 angle that changes on each layer.

* Change Ironing angle offset range from [-1,359] to [0,359].
-1 is redundant because it is the same behavior as 0 offset.

* Change ironing_angle new default value to 0.

* Update existing print profiles' hardcoded ironing_angles from -1 to 0 to reflect new default value.

* Add migration for old -1 ironing_angle settings. Remove logic for -1 ironing_angle.

* Add u8 prefix for degree symbol string

* Use solid_infill_direction instead of infill_direction for top surface infill direction. Use calculate_infill_rotation_angle to add offset to solid_infill_rotate_template if used.

* Update quality settings wiki for Ironing

* Set f->is_using_template_angle when making ironing filler objects

* Update quality_settings_ironing link from #angle to #angle-offset

---------

Co-authored-by: Noisyfox <timemanager.rick@gmail.com>
This commit is contained in:
Anson Liu 2025-10-19 18:01:53 -07:00 committed by GitHub
parent d786aec255
commit fcb640bee1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
47 changed files with 76 additions and 83 deletions

View file

@ -33,7 +33,9 @@ The pattern that will be used when ironing. Usually, the best pattern is the one
## Flow
The amount of material to extrude during ironing.
This % is a percentage of the normal flow rate. A lower value will result in a smoother finish but may not cover the surface completely. A higher value may cover the surface better but can lead to over extrusion or rougher finish.
This % is a percentage of the normal flow rate. A lower value will result in a smoother finish but may not cover the surface completely. A higher value may cover the surface better but can lead to over extrusion or rougher finish.
A lower layer height may require higher flow due to less volumetric extrusion per distance.
## Line spacing
@ -48,10 +50,9 @@ The distance to keep from the edges, which can help prevent over-extrusion at th
If this value is set to 0, the ironing toolpath will start directly at the perimeter edges without any inward offset. This means the [ironing pattern](#pattern) will extend all the way to the outer boundaries of the top surface being ironed.
## Angle
## Angle Offset
The angle ironing is done at.
A negative number disables this function and uses the [sparse infill direction](strength_settings_infill#direction).
The angle of ironing lines offset relative to the top surface solid infill direction. Commonly used ironing angle offsets are 0°, 45°, and 90° each producing a [different surface finish](https://github.com/SoftFever/OrcaSlicer/issues/10834#issuecomment-3322628589) which will depend on your printer nozzle.
## Speed

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "200",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.22",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "120",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "200",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "240",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "150",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "130",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "100",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "130",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "130",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "130",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -90,7 +90,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "250",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.45",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "200",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "120",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "180",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.62",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "150",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -91,7 +91,7 @@
"internal_solid_infill_line_width": "0.82",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "150",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -101,7 +101,7 @@
"internal_solid_infill_acceleration": "100%",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "300",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -93,7 +93,7 @@
"internal_solid_infill_line_width": "0.22",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "150",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -98,7 +98,7 @@
"internal_bridge_speed": "150%",
"internal_solid_infill_acceleration": "100%",
"internal_solid_infill_pattern": "monotonic",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -99,7 +99,7 @@
"internal_solid_infill_acceleration": "100%",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "300",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -99,7 +99,7 @@
"internal_bridge_speed": "150%",
"internal_solid_infill_acceleration": "100%",
"internal_solid_infill_pattern": "monotonic",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -100,7 +100,7 @@
"internal_bridge_speed": "150%",
"internal_solid_infill_acceleration": "100%",
"internal_solid_infill_pattern": "monotonic",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -102,7 +102,7 @@
"internal_bridge_speed": "150%",
"internal_solid_infill_acceleration": "100%",
"internal_solid_infill_pattern": "monotonic",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -103,7 +103,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "250",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -87,7 +87,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "150",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -87,7 +87,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "150",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -87,7 +87,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "300",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -87,7 +87,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "300",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -98,7 +98,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "300",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -96,7 +96,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "300",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -93,7 +93,7 @@
"internal_solid_infill_line_width": "0.62",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "150",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -93,7 +93,7 @@
"internal_solid_infill_line_width": "0.82",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "150",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -99,7 +99,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "300",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -87,7 +87,7 @@
"internal_solid_infill_line_width": "0.4",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "250",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -94,7 +94,7 @@
"internal_solid_infill_line_width": "0.4",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "90",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -76,7 +76,7 @@
"internal_solid_infill_line_width": "0",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "200",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.25",

View file

@ -89,7 +89,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "500",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -89,7 +89,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "500",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -104,7 +104,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "zig-zag",
"internal_solid_infill_speed": "250",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_inset": "0",
"ironing_pattern": "zig-zag",

View file

@ -80,7 +80,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "250",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -83,7 +83,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "250",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "15%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -84,7 +84,7 @@
"internal_solid_infill_line_width": "3",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "100",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.1",

View file

@ -90,7 +90,7 @@
"internal_solid_infill_line_width": "0.42",
"internal_solid_infill_pattern": "monotonic",
"internal_solid_infill_speed": "250",
"ironing_angle": "-1",
"ironing_angle": "0",
"ironing_flow": "10%",
"ironing_pattern": "zig-zag",
"ironing_spacing": "0.15",

View file

@ -1461,43 +1461,31 @@ void Layer::make_ironing()
double height;
double speed;
double angle;
bool is_using_template_angle;
double inset;
bool operator<(const IroningParams &rhs) const {
if (this->extruder < rhs.extruder)
return true;
if (this->extruder > rhs.extruder)
return false;
if (int(this->just_infill) < int(rhs.just_infill))
return true;
if (int(this->just_infill) > int(rhs.just_infill))
return false;
if (this->line_spacing < rhs.line_spacing)
return true;
if (this->line_spacing > rhs.line_spacing)
return false;
if (this->height < rhs.height)
return true;
if (this->height > rhs.height)
return false;
if (this->speed < rhs.speed)
return true;
if (this->speed > rhs.speed)
return false;
if (this->angle < rhs.angle)
return true;
if (this->angle > rhs.angle)
return false;
if (this->inset < rhs.inset)
return true;
if (this->inset > rhs.inset)
return false;
RETURN_COMPARE_NON_EQUAL(extruder);
RETURN_COMPARE_NON_EQUAL(just_infill);
RETURN_COMPARE_NON_EQUAL(line_spacing);
RETURN_COMPARE_NON_EQUAL(height);
RETURN_COMPARE_NON_EQUAL(speed);
RETURN_COMPARE_NON_EQUAL(angle);
RETURN_COMPARE_NON_EQUAL(is_using_template_angle);
RETURN_COMPARE_NON_EQUAL(inset);
return false;
}
bool operator==(const IroningParams &rhs) const {
return this->extruder == rhs.extruder && this->just_infill == rhs.just_infill &&
this->line_spacing == rhs.line_spacing && this->height == rhs.height && this->speed == rhs.speed && this->angle == rhs.angle && this->pattern == rhs.pattern && this->inset == rhs.inset;
return this->extruder == rhs.extruder &&
this->just_infill == rhs.just_infill &&
this->line_spacing == rhs.line_spacing &&
this->height == rhs.height &&
this->speed == rhs.speed &&
this->angle == rhs.angle &&
this->is_using_template_angle == rhs.is_using_template_angle &&
this->pattern == rhs.pattern &&
this->inset == rhs.inset;
}
LayerRegion *layerm = nullptr;
@ -1544,7 +1532,8 @@ void Layer::make_ironing()
ironing_params.inset = config.ironing_inset;
ironing_params.height = default_layer_height * 0.01 * config.ironing_flow;
ironing_params.speed = config.ironing_speed;
ironing_params.angle = (config.ironing_angle >= 0 ? config.ironing_angle : config.infill_direction) * M_PI / 180.;
ironing_params.angle = calculate_infill_rotation_angle(this->object(), this->id(), config.solid_infill_direction.value, config.solid_infill_rotate_template.value) + config.ironing_angle * M_PI / 180.;
ironing_params.is_using_template_angle = !config.solid_infill_rotate_template.value.empty();
ironing_params.pattern = config.ironing_pattern;
ironing_params.layerm = layerm;
by_extruder.emplace_back(ironing_params);
@ -1640,6 +1629,7 @@ void Layer::make_ironing()
// Create the filler object.
f->spacing = ironing_params.line_spacing;
f->angle = float(ironing_params.angle);
f->is_using_template_angle = ironing_params.is_using_template_angle;
f->link_max_length = (coord_t) scale_(3. * f->spacing);
double extrusion_height = ironing_params.height * f->spacing / nozzle_dmr;
float extrusion_width = Flow::rounded_rectangle_extrusion_width_from_spacing(float(nozzle_dmr), float(extrusion_height));

View file

@ -3497,14 +3497,14 @@ void PrintConfigDef::init_fff_params()
def->set_default_value(new ConfigOptionFloat(20));
def = this->add("ironing_angle", coFloat);
def->label = L("Ironing angle");
def->label = L("Ironing angle offset");
def->category = L("Quality");
def->tooltip = L("The angle ironing is done at. A negative number disables this function and uses the default method.");
def->tooltip = L("The angle of ironing lines offset from the top surface.");
def->sidetext = u8"°"; // degrees, don't need translation
def->min = -1;
def->min = 0;
def->max = 359;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(-1));
def->set_default_value(new ConfigOptionFloat(0));
def = this->add("layer_change_gcode", coString);
def->label = L("Layer change G-code");
@ -6863,6 +6863,8 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
opt_key = "bottom_solid_infill_flow_ratio";
} else if (opt_key == "ironing_direction") {
opt_key = "ironing_angle";
} else if (opt_key == "ironing_angle" && boost::starts_with(value, "-")) {
value = "0";
} else if (opt_key == "counterbole_hole_bridging") {
opt_key = "counterbore_hole_bridging";
} else if (opt_key == "draft_shield" && value == "limited") {

View file

@ -2163,7 +2163,7 @@ void TabPrint::build()
optgroup->append_single_option_line("ironing_flow", "quality_settings_ironing#flow");
optgroup->append_single_option_line("ironing_spacing", "quality_settings_ironing#line-spacing");
optgroup->append_single_option_line("ironing_inset", "quality_settings_ironing#inset");
optgroup->append_single_option_line("ironing_angle", "quality_settings_ironing#angle");
optgroup->append_single_option_line("ironing_angle", "quality_settings_ironing#angle-offset");
optgroup = page->new_optgroup(L("Wall generator"), L"param_wall_generator");
optgroup->append_single_option_line("wall_generator", "quality_settings_wall_generator");