Adjust ZAA configuration

This commit is contained in:
Aleksandr Dobkin
2026-03-26 04:21:36 -07:00
parent a5e12529f8
commit 39ef7a5b7a
9 changed files with 482 additions and 243 deletions

View File

@@ -32,11 +32,7 @@ static double slope_from_normal(const Eigen::Vector3d& normal)
static bool contour_extrusion_path(LayerRegion *region, const sla::IndexedMesh &mesh, ExtrusionPath &path) static bool contour_extrusion_path(LayerRegion *region, const sla::IndexedMesh &mesh, ExtrusionPath &path)
{ {
if (region->region().config().zaa_region_disable) { if (path.role() != erTopSolidInfill && path.role() != erIroning && path.role() != erExternalPerimeter && path.role() != erPerimeter) {
return false;
}
if (path.role() != erTopSolidInfill && path.role() != erIroning && path.role() != erExternalPerimeter && path.role() != erPerimeter) {
return false; return false;
} }
@@ -227,6 +223,9 @@ static void handle_extrusion_collection(LayerRegion *region, const sla::IndexedM
void Layer::make_contour_z(const sla::IndexedMesh &mesh) void Layer::make_contour_z(const sla::IndexedMesh &mesh)
{ {
for (LayerRegion *region : this->regions()) { for (LayerRegion *region : this->regions()) {
if (!region->region().config().zaa_enabled)
continue;
handle_extrusion_collection(region, mesh, region->fills, {erTopSolidInfill, erIroning, erPerimeter, erExternalPerimeter, erMixed}); handle_extrusion_collection(region, mesh, region->fills, {erTopSolidInfill, erIroning, erPerimeter, erExternalPerimeter, erMixed});
handle_extrusion_collection(region, mesh, region->perimeters, {erPerimeter, erExternalPerimeter, erMixed}); handle_extrusion_collection(region, mesh, region->perimeters, {erPerimeter, erExternalPerimeter, erMixed});
} }

View File

@@ -887,76 +887,344 @@ bool Preset::has_cali_lines(PresetBundle* preset_bundle)
return false; return false;
} }
static std::vector<std::string> s_Preset_print_options { static std::vector<std::string> s_Preset_print_options{
"layer_height", "initial_layer_print_height", "wall_loops", "alternate_extra_wall", "slice_closing_radius", "spiral_mode", "spiral_mode_smooth", "spiral_mode_max_xy_smoothing", "spiral_starting_flow_ratio", "spiral_finishing_flow_ratio", "slicing_mode", "layer_height",
"top_shell_layers", "top_shell_thickness", "top_surface_density", "bottom_surface_density", "bottom_shell_layers", "bottom_shell_thickness", "initial_layer_print_height",
"extra_perimeters_on_overhangs", "ensure_vertical_shell_thickness", "reduce_crossing_wall", "detect_thin_wall", "detect_overhang_wall", "overhang_reverse", "overhang_reverse_threshold","overhang_reverse_internal_only", "wall_direction", "wall_loops",
"seam_position", "staggered_inner_seams", "wall_sequence", "is_infill_first", "sparse_infill_density","fill_multiline", "sparse_infill_pattern", "lateral_lattice_angle_1", "lateral_lattice_angle_2", "infill_overhang_angle", "top_surface_pattern", "bottom_surface_pattern", "alternate_extra_wall",
"infill_direction", "solid_infill_direction", "counterbore_hole_bridging","infill_shift_step", "sparse_infill_rotate_template", "solid_infill_rotate_template", "symmetric_infill_y_axis","skeleton_infill_density", "infill_lock_depth", "skin_infill_depth", "skin_infill_density", "slice_closing_radius",
"align_infill_direction_to_model", "extra_solid_infills", "spiral_mode",
"minimum_sparse_infill_area", "reduce_infill_retraction","internal_solid_infill_pattern","gap_fill_target", "spiral_mode_smooth",
"ironing_type", "ironing_pattern", "ironing_flow", "ironing_speed", "ironing_spacing", "ironing_angle", "ironing_angle_fixed", "ironing_inset", "spiral_mode_max_xy_smoothing",
"support_ironing", "support_ironing_pattern", "support_ironing_flow", "support_ironing_spacing", "spiral_starting_flow_ratio",
"spiral_finishing_flow_ratio",
"slicing_mode",
"top_shell_layers",
"top_shell_thickness",
"top_surface_density",
"bottom_surface_density",
"bottom_shell_layers",
"bottom_shell_thickness",
"extra_perimeters_on_overhangs",
"ensure_vertical_shell_thickness",
"reduce_crossing_wall",
"detect_thin_wall",
"detect_overhang_wall",
"overhang_reverse",
"overhang_reverse_threshold",
"overhang_reverse_internal_only",
"wall_direction",
"seam_position",
"staggered_inner_seams",
"wall_sequence",
"is_infill_first",
"sparse_infill_density",
"fill_multiline",
"sparse_infill_pattern",
"lateral_lattice_angle_1",
"lateral_lattice_angle_2",
"infill_overhang_angle",
"top_surface_pattern",
"bottom_surface_pattern",
"infill_direction",
"solid_infill_direction",
"counterbore_hole_bridging",
"infill_shift_step",
"sparse_infill_rotate_template",
"solid_infill_rotate_template",
"symmetric_infill_y_axis",
"skeleton_infill_density",
"infill_lock_depth",
"skin_infill_depth",
"skin_infill_density",
"align_infill_direction_to_model",
"extra_solid_infills",
"minimum_sparse_infill_area",
"reduce_infill_retraction",
"internal_solid_infill_pattern",
"gap_fill_target",
"ironing_type",
"ironing_pattern",
"ironing_flow",
"ironing_speed",
"ironing_spacing",
"ironing_angle",
"ironing_angle_fixed",
"ironing_inset",
"support_ironing",
"support_ironing_pattern",
"support_ironing_flow",
"support_ironing_spacing",
"max_travel_detour_distance", "max_travel_detour_distance",
"fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_distance", "fuzzy_skin_first_layer", "fuzzy_skin_noise_type", "fuzzy_skin_mode", "fuzzy_skin_scale", "fuzzy_skin_octaves", "fuzzy_skin_persistence", "fuzzy_skin",
"max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length","extrusion_rate_smoothing_external_perimeter_only", "fuzzy_skin_thickness",
"inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed", "fuzzy_skin_point_distance",
"top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap", "support_interface_speed", "fuzzy_skin_first_layer",
"bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed", "fuzzy_skin_noise_type",
"outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "skirt_height","single_loop_draft_shield", "draft_shield", "fuzzy_skin_mode",
"brim_width", "brim_object_gap", "brim_use_efc_outline", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers", "fuzzy_skin_scale",
"raft_layers", "raft_first_layer_density", "raft_first_layer_expansion", "raft_contact_distance", "raft_expansion", "fuzzy_skin_octaves",
"support_base_pattern", "support_base_pattern_spacing", "support_expansion", "support_style", "fuzzy_skin_persistence",
"max_volumetric_extrusion_rate_slope",
"max_volumetric_extrusion_rate_slope_segment_length",
"extrusion_rate_smoothing_external_perimeter_only",
"inner_wall_speed",
"outer_wall_speed",
"sparse_infill_speed",
"internal_solid_infill_speed",
"top_surface_speed",
"support_speed",
"support_object_xy_distance",
"support_object_first_layer_gap",
"support_interface_speed",
"bridge_speed",
"internal_bridge_speed",
"gap_infill_speed",
"travel_speed",
"travel_speed_z",
"initial_layer_speed",
"outer_wall_acceleration",
"initial_layer_acceleration",
"top_surface_acceleration",
"default_acceleration",
"skirt_type",
"skirt_loops",
"skirt_speed",
"min_skirt_length",
"skirt_distance",
"skirt_start_angle",
"skirt_height",
"single_loop_draft_shield",
"draft_shield",
"brim_width",
"brim_object_gap",
"brim_use_efc_outline",
"brim_type",
"brim_ears_max_angle",
"brim_ears_detection_length",
"enable_support",
"support_type",
"support_threshold_angle",
"support_threshold_overlap",
"enforce_support_layers",
"raft_layers",
"raft_first_layer_density",
"raft_first_layer_expansion",
"raft_contact_distance",
"raft_expansion",
"support_base_pattern",
"support_base_pattern_spacing",
"support_expansion",
"support_style",
// BBS // BBS
"print_extruder_id", "print_extruder_variant", "print_extruder_id",
"print_extruder_variant",
"independent_support_layer_height", "independent_support_layer_height",
"support_angle", "support_interface_top_layers", "support_interface_bottom_layers", "support_angle",
"support_interface_pattern", "support_interface_spacing", "support_interface_loop_pattern", "support_interface_top_layers",
"support_top_z_distance", "support_on_build_plate_only","support_critical_regions_only", "bridge_no_support", "thick_bridges", "thick_internal_bridges","dont_filter_internal_bridges","enable_extra_bridge_layer", "max_bridge_length", "print_sequence", "print_order", "support_remove_small_overhang", "support_interface_bottom_layers",
"filename_format", "wall_filament", "support_bottom_z_distance", "support_interface_pattern",
"sparse_infill_filament", "solid_infill_filament", "support_filament", "support_interface_filament","support_interface_not_for_body", "support_interface_spacing",
"ooze_prevention", "standby_temperature_delta", "preheat_time","preheat_steps", "interface_shells", "line_width", "initial_layer_line_width", "inner_wall_line_width", "support_interface_loop_pattern",
"outer_wall_line_width", "sparse_infill_line_width", "internal_solid_infill_line_width", "support_top_z_distance",
"skin_infill_line_width","skeleton_infill_line_width", "support_on_build_plate_only",
"top_surface_line_width", "support_line_width", "infill_wall_overlap","top_bottom_infill_wall_overlap", "bridge_flow", "internal_bridge_flow", "support_critical_regions_only",
"elefant_foot_compensation", "elefant_foot_compensation_layers", "xy_contour_compensation", "xy_hole_compensation", "resolution", "enable_prime_tower", "prime_tower_enable_framework", "bridge_no_support",
"prime_tower_width", "prime_tower_brim_width", "prime_tower_skip_points", "prime_volume", "thick_bridges",
"thick_internal_bridges",
"dont_filter_internal_bridges",
"enable_extra_bridge_layer",
"max_bridge_length",
"print_sequence",
"print_order",
"support_remove_small_overhang",
"filename_format",
"wall_filament",
"support_bottom_z_distance",
"sparse_infill_filament",
"solid_infill_filament",
"support_filament",
"support_interface_filament",
"support_interface_not_for_body",
"ooze_prevention",
"standby_temperature_delta",
"preheat_time",
"preheat_steps",
"interface_shells",
"line_width",
"initial_layer_line_width",
"inner_wall_line_width",
"outer_wall_line_width",
"sparse_infill_line_width",
"internal_solid_infill_line_width",
"skin_infill_line_width",
"skeleton_infill_line_width",
"top_surface_line_width",
"support_line_width",
"infill_wall_overlap",
"top_bottom_infill_wall_overlap",
"bridge_flow",
"internal_bridge_flow",
"elefant_foot_compensation",
"elefant_foot_compensation_layers",
"xy_contour_compensation",
"xy_hole_compensation",
"resolution",
"enable_prime_tower",
"prime_tower_enable_framework",
"prime_tower_width",
"prime_tower_brim_width",
"prime_tower_skip_points",
"prime_volume",
"prime_tower_infill_gap", "prime_tower_infill_gap",
"prime_tower_flat_ironing", "prime_tower_flat_ironing",
"enable_tower_interface_features", "enable_tower_interface_features",
"enable_tower_interface_cooldown_during_tower", "enable_tower_interface_cooldown_during_tower",
"wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits", "wipe_tower_no_sparse_layers",
"flush_into_infill", "flush_into_objects", "flush_into_support", "compatible_printers",
"tree_support_branch_angle", "tree_support_angle_slow", "tree_support_wall_count", "tree_support_top_rate", "tree_support_branch_distance", "tree_support_tip_diameter", "compatible_printers_condition",
"tree_support_branch_diameter", "tree_support_branch_diameter_angle", "inherits",
"detect_narrow_internal_solid_infill", "flush_into_infill",
"gcode_add_line_number", "enable_arc_fitting", "precise_z_height", "infill_combination","infill_combination_max_layer_height", /*"adaptive_layer_height",*/ "flush_into_objects",
"support_bottom_interface_spacing", "enable_overhang_speed", "slowdown_for_curled_perimeters", "overhang_1_4_speed", "overhang_2_4_speed", "overhang_3_4_speed", "overhang_4_4_speed", "flush_into_support",
"initial_layer_infill_speed", "only_one_wall_top", "tree_support_branch_angle",
"timelapse_type", "tree_support_angle_slow",
"wall_generator", "wall_transition_length", "wall_transition_filter_deviation", "wall_transition_angle", "tree_support_wall_count",
"wall_distribution_count", "min_feature_size", "min_bead_width", "post_process", "min_length_factor", "tree_support_top_rate",
"small_perimeter_speed", "small_perimeter_threshold","bridge_angle","internal_bridge_angle", "filter_out_gap_fill", "travel_acceleration","inner_wall_acceleration", "min_width_top_surface", "tree_support_branch_distance",
"default_jerk", "outer_wall_jerk", "inner_wall_jerk", "infill_jerk", "top_surface_jerk", "initial_layer_jerk","travel_jerk","default_junction_deviation", "tree_support_tip_diameter",
"top_solid_infill_flow_ratio","bottom_solid_infill_flow_ratio","only_one_wall_first_layer", "print_flow_ratio", "seam_gap", "tree_support_branch_diameter",
"set_other_flow_ratios", "first_layer_flow_ratio", "outer_wall_flow_ratio", "inner_wall_flow_ratio", "overhang_flow_ratio", "sparse_infill_flow_ratio", "internal_solid_infill_flow_ratio", "gap_fill_flow_ratio", "support_flow_ratio", "support_interface_flow_ratio", "tree_support_branch_diameter_angle",
"role_based_wipe_speed", "wipe_speed", "accel_to_decel_enable", "accel_to_decel_factor", "wipe_on_loops", "wipe_before_external_loop", "detect_narrow_internal_solid_infill",
"bridge_density","internal_bridge_density", "precise_outer_wall", "bridge_acceleration", "gcode_add_line_number",
"sparse_infill_acceleration", "internal_solid_infill_acceleration", "tree_support_auto_brim", "enable_arc_fitting",
"tree_support_brim_width", "gcode_comments", "gcode_label_objects", "precise_z_height",
"initial_layer_travel_speed", "exclude_object", "slow_down_layers", "infill_anchor", "infill_anchor_max","initial_layer_min_bead_width", "infill_combination",
"make_overhang_printable", "make_overhang_printable_angle", "make_overhang_printable_hole_size" ,"notes", "infill_combination_max_layer_height", /*"adaptive_layer_height",*/
"wipe_tower_cone_angle", "wipe_tower_extra_spacing","wipe_tower_max_purge_speed", "support_bottom_interface_spacing",
"wipe_tower_wall_type", "wipe_tower_extra_rib_length", "wipe_tower_rib_width", "wipe_tower_fillet_wall", "enable_overhang_speed",
"wipe_tower_filament", "wiping_volumes_extruders","wipe_tower_bridging", "wipe_tower_extra_flow","single_extruder_multi_material_priming", "slowdown_for_curled_perimeters",
"wipe_tower_rotation_angle", "tree_support_branch_distance_organic", "tree_support_branch_diameter_organic", "tree_support_branch_angle_organic", "overhang_1_4_speed",
"hole_to_polyhole", "hole_to_polyhole_threshold", "hole_to_polyhole_twisted", "mmu_segmented_region_max_width", "mmu_segmented_region_interlocking_depth", "overhang_2_4_speed",
"small_area_infill_flow_compensation", "small_area_infill_flow_compensation_model", "overhang_3_4_speed",
"enable_wrapping_detection", "overhang_4_4_speed",
"seam_slope_type", "seam_slope_conditional", "scarf_angle_threshold", "scarf_joint_speed", "scarf_joint_flow_ratio", "seam_slope_start_height", "seam_slope_entire_loop", "seam_slope_min_length", "seam_slope_steps", "seam_slope_inner_walls", "scarf_overhang_threshold", "initial_layer_infill_speed",
"interlocking_beam", "interlocking_orientation", "interlocking_beam_layer_count", "interlocking_depth", "interlocking_boundary_avoidance", "interlocking_beam_width","calib_flowrate_topinfill_special_order", "only_one_wall_top",
// Z Anti-Aliasing (ZAA) "timelapse_type",
"zaa_enabled", "zaa_minimize_perimeter_height", "zaa_dont_alternate_fill_direction", "zaa_min_z", "zaa_region_disable", "ironing_expansion", "wall_generator",
"wall_transition_length",
"wall_transition_filter_deviation",
"wall_transition_angle",
"wall_distribution_count",
"min_feature_size",
"min_bead_width",
"post_process",
"min_length_factor",
"small_perimeter_speed",
"small_perimeter_threshold",
"bridge_angle",
"internal_bridge_angle",
"filter_out_gap_fill",
"travel_acceleration",
"inner_wall_acceleration",
"min_width_top_surface",
"default_jerk",
"outer_wall_jerk",
"inner_wall_jerk",
"infill_jerk",
"top_surface_jerk",
"initial_layer_jerk",
"travel_jerk",
"default_junction_deviation",
"top_solid_infill_flow_ratio",
"bottom_solid_infill_flow_ratio",
"only_one_wall_first_layer",
"print_flow_ratio",
"seam_gap",
"set_other_flow_ratios",
"first_layer_flow_ratio",
"outer_wall_flow_ratio",
"inner_wall_flow_ratio",
"overhang_flow_ratio",
"sparse_infill_flow_ratio",
"internal_solid_infill_flow_ratio",
"gap_fill_flow_ratio",
"support_flow_ratio",
"support_interface_flow_ratio",
"role_based_wipe_speed",
"wipe_speed",
"accel_to_decel_enable",
"accel_to_decel_factor",
"wipe_on_loops",
"wipe_before_external_loop",
"bridge_density",
"internal_bridge_density",
"precise_outer_wall",
"bridge_acceleration",
"sparse_infill_acceleration",
"internal_solid_infill_acceleration",
"tree_support_auto_brim",
"tree_support_brim_width",
"gcode_comments",
"gcode_label_objects",
"initial_layer_travel_speed",
"exclude_object",
"slow_down_layers",
"infill_anchor",
"infill_anchor_max",
"initial_layer_min_bead_width",
"make_overhang_printable",
"make_overhang_printable_angle",
"make_overhang_printable_hole_size",
"notes",
"wipe_tower_cone_angle",
"wipe_tower_extra_spacing",
"wipe_tower_max_purge_speed",
"wipe_tower_wall_type",
"wipe_tower_extra_rib_length",
"wipe_tower_rib_width",
"wipe_tower_fillet_wall",
"wipe_tower_filament",
"wiping_volumes_extruders",
"wipe_tower_bridging",
"wipe_tower_extra_flow",
"single_extruder_multi_material_priming",
"wipe_tower_rotation_angle",
"tree_support_branch_distance_organic",
"tree_support_branch_diameter_organic",
"tree_support_branch_angle_organic",
"hole_to_polyhole",
"hole_to_polyhole_threshold",
"hole_to_polyhole_twisted",
"mmu_segmented_region_max_width",
"mmu_segmented_region_interlocking_depth",
"small_area_infill_flow_compensation",
"small_area_infill_flow_compensation_model",
"enable_wrapping_detection",
"seam_slope_type",
"seam_slope_conditional",
"scarf_angle_threshold",
"scarf_joint_speed",
"scarf_joint_flow_ratio",
"seam_slope_start_height",
"seam_slope_entire_loop",
"seam_slope_min_length",
"seam_slope_steps",
"seam_slope_inner_walls",
"scarf_overhang_threshold",
"interlocking_beam",
"interlocking_orientation",
"interlocking_beam_layer_count",
"interlocking_depth",
"interlocking_boundary_avoidance",
"interlocking_beam_width",
"calib_flowrate_topinfill_special_order",
// Z Anti-Aliasing (ZAA)
"zaa_enabled",
"zaa_minimize_perimeter_height",
"zaa_dont_alternate_fill_direction",
"zaa_min_z",
"ironing_expansion",
}; };
static std::vector<std::string> s_Preset_filament_options {/*"filament_colour", */ "default_filament_colour", "required_nozzle_HRC", "filament_diameter", "pellet_flow_coefficient", "volumetric_speed_coefficients", "filament_type", static std::vector<std::string> s_Preset_filament_options {/*"filament_colour", */ "default_filament_colour", "required_nozzle_HRC", "filament_diameter", "pellet_flow_coefficient", "volumetric_speed_coefficients", "filament_type",

View File

@@ -2201,7 +2201,7 @@ void Print::process(long long *time_cost_with_cache, bool use_cache)
// Z-Contouring // Z-Contouring
for (PrintObject *obj : m_objects) { for (PrintObject *obj : m_objects) {
bool need_contouring = need_slicing_objects.count(obj) != 0 && obj->config().zaa_enabled; bool need_contouring = need_slicing_objects.count(obj) != 0 && obj->need_z_contouring();
if (need_contouring) { if (need_contouring) {
obj->contour_z(); obj->contour_z();
} else { } else {

View File

@@ -496,6 +496,7 @@ private:
void prepare_infill(); void prepare_infill();
void infill(); void infill();
void ironing(); void ironing();
bool need_z_contouring() const;
void contour_z(); void contour_z();
void generate_support_material(); void generate_support_material();
void estimate_curled_extrusions(); void estimate_curled_extrusions();

View File

@@ -4063,13 +4063,6 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced; def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(0)); def->set_default_value(new ConfigOptionFloat(0));
def = this->add("zaa_region_disable", coBool);
def->label = L("Disable Z contouring for region");
def->category = L("Quality");
def->tooltip = L("Disable Z contouring for this specific region");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionBool(false));
def = this->add("zaa_enabled", coBool); def = this->add("zaa_enabled", coBool);
def->label = L("Z contouring enabled"); def->label = L("Z contouring enabled");
def->category = L("Quality"); def->category = L("Quality");
@@ -4080,12 +4073,13 @@ void PrintConfigDef::init_fff_params()
def = this->add("zaa_minimize_perimeter_height", coFloat); def = this->add("zaa_minimize_perimeter_height", coFloat);
def->label = L("Minimize wall height angle"); def->label = L("Minimize wall height angle");
def->category = L("Quality"); def->category = L("Quality");
def->tooltip = L("Reduce top surface perimeter heights to match height of edge for perimeters less than this angle. Set 0 to disable."); def->tooltip = L("Reduce height of top surface perimeters to match height of model edge. "
"Effects perimeters whose slope is less than this angle in degrees. Reasonable value is 35. Set 0 to disable.");
def->sidetext = L("°"); def->sidetext = L("°");
def->min = 0; def->min = 0;
def->max = 90; def->max = 90;
def->mode = comAdvanced; def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(35)); def->set_default_value(new ConfigOptionFloat(0));
def = this->add("zaa_dont_alternate_fill_direction", coBool); def = this->add("zaa_dont_alternate_fill_direction", coBool);
def->label = L("Don't alternate fill direction"); def->label = L("Don't alternate fill direction");

View File

@@ -1046,166 +1046,90 @@ PRINT_CONFIG_CLASS_DEFINE(
PRINT_CONFIG_CLASS_DEFINE( PRINT_CONFIG_CLASS_DEFINE(
PrintRegionConfig, PrintRegionConfig,
((ConfigOptionInts, print_extruder_id)) ((ConfigOptionInts, print_extruder_id))((ConfigOptionStrings, print_extruder_variant))((ConfigOptionInt, bottom_shell_layers))(
((ConfigOptionStrings, print_extruder_variant)) (ConfigOptionFloat, bottom_shell_thickness))((ConfigOptionFloat, bridge_angle))(
((ConfigOptionInt, bottom_shell_layers)) (ConfigOptionFloat, internal_bridge_angle)) // ORCA: Internal bridge angle override
((ConfigOptionFloat, bottom_shell_thickness)) ((ConfigOptionFloat, bridge_flow))((ConfigOptionFloat, internal_bridge_flow))((ConfigOptionFloat, bridge_speed))(
((ConfigOptionFloat, bridge_angle)) (ConfigOptionFloatOrPercent, internal_bridge_speed))((ConfigOptionEnum<EnsureVerticalShellThickness>,
((ConfigOptionFloat, internal_bridge_angle)) // ORCA: Internal bridge angle override ensure_vertical_shell_thickness))((ConfigOptionPercent, top_surface_density))(
((ConfigOptionFloat, bridge_flow)) (ConfigOptionPercent, bottom_surface_density))((ConfigOptionEnum<InfillPattern>, top_surface_pattern))(
((ConfigOptionFloat, internal_bridge_flow)) (ConfigOptionEnum<InfillPattern>, bottom_surface_pattern))((ConfigOptionEnum<InfillPattern>, internal_solid_infill_pattern))(
((ConfigOptionFloat, bridge_speed)) (ConfigOptionFloatOrPercent, outer_wall_line_width))((ConfigOptionFloat, outer_wall_speed))((ConfigOptionFloat, infill_direction))(
((ConfigOptionFloatOrPercent, internal_bridge_speed)) (ConfigOptionFloat, solid_infill_direction))((ConfigOptionString, solid_infill_rotate_template))(
((ConfigOptionEnum<EnsureVerticalShellThickness>, ensure_vertical_shell_thickness)) (ConfigOptionBool, symmetric_infill_y_axis))((ConfigOptionFloat, infill_shift_step))(
((ConfigOptionPercent, top_surface_density)) (ConfigOptionString, sparse_infill_rotate_template))((ConfigOptionPercent, sparse_infill_density))(
((ConfigOptionPercent, bottom_surface_density)) (ConfigOptionEnum<InfillPattern>, sparse_infill_pattern))((ConfigOptionFloat, lateral_lattice_angle_1))(
((ConfigOptionEnum<InfillPattern>, top_surface_pattern)) (ConfigOptionFloat, lateral_lattice_angle_2))((ConfigOptionFloat, infill_overhang_angle))((ConfigOptionBool,
((ConfigOptionEnum<InfillPattern>, bottom_surface_pattern)) align_infill_direction_to_model))((
((ConfigOptionEnum<InfillPattern>, internal_solid_infill_pattern)) ConfigOptionString, extra_solid_infills))((ConfigOptionEnum<FuzzySkinType>, fuzzy_skin))((ConfigOptionFloat, fuzzy_skin_thickness))(
((ConfigOptionFloatOrPercent, outer_wall_line_width)) (ConfigOptionFloat, fuzzy_skin_point_distance))((ConfigOptionBool, fuzzy_skin_first_layer))((ConfigOptionEnum<NoiseType>,
((ConfigOptionFloat, outer_wall_speed)) fuzzy_skin_noise_type))(
((ConfigOptionFloat, infill_direction)) (ConfigOptionEnum<FuzzySkinMode>, fuzzy_skin_mode))((ConfigOptionFloat, fuzzy_skin_scale))((ConfigOptionInt, fuzzy_skin_octaves))(
((ConfigOptionFloat, solid_infill_direction)) (ConfigOptionFloat, fuzzy_skin_persistence))((ConfigOptionFloat, gap_infill_speed))((ConfigOptionInt, sparse_infill_filament))(
((ConfigOptionString, solid_infill_rotate_template)) (ConfigOptionFloatOrPercent, sparse_infill_line_width))((ConfigOptionPercent, infill_wall_overlap))(
((ConfigOptionBool, symmetric_infill_y_axis)) (ConfigOptionPercent, top_bottom_infill_wall_overlap))((ConfigOptionFloat, sparse_infill_speed))(
((ConfigOptionFloat, infill_shift_step)) (ConfigOptionPercent, skeleton_infill_density))((ConfigOptionPercent, skin_infill_density))((ConfigOptionFloat, infill_lock_depth))(
((ConfigOptionString, sparse_infill_rotate_template)) (ConfigOptionFloat, skin_infill_depth))((ConfigOptionFloatOrPercent, skin_infill_line_width))(
((ConfigOptionPercent, sparse_infill_density)) (ConfigOptionFloatOrPercent, skeleton_infill_line_width))((ConfigOptionBool, infill_combination))
((ConfigOptionEnum<InfillPattern>, sparse_infill_pattern))
((ConfigOptionFloat, lateral_lattice_angle_1))
((ConfigOptionFloat, lateral_lattice_angle_2))
((ConfigOptionFloat, infill_overhang_angle))
((ConfigOptionBool, align_infill_direction_to_model))
((ConfigOptionString, extra_solid_infills))
((ConfigOptionEnum<FuzzySkinType>, fuzzy_skin))
((ConfigOptionFloat, fuzzy_skin_thickness))
((ConfigOptionFloat, fuzzy_skin_point_distance))
((ConfigOptionBool, fuzzy_skin_first_layer))
((ConfigOptionEnum<NoiseType>, fuzzy_skin_noise_type))
((ConfigOptionEnum<FuzzySkinMode>, fuzzy_skin_mode))
((ConfigOptionFloat, fuzzy_skin_scale))
((ConfigOptionInt, fuzzy_skin_octaves))
((ConfigOptionFloat, fuzzy_skin_persistence))
((ConfigOptionFloat, gap_infill_speed))
((ConfigOptionInt, sparse_infill_filament))
((ConfigOptionFloatOrPercent, sparse_infill_line_width))
((ConfigOptionPercent, infill_wall_overlap))
((ConfigOptionPercent, top_bottom_infill_wall_overlap))
((ConfigOptionFloat, sparse_infill_speed))
((ConfigOptionPercent, skeleton_infill_density))
((ConfigOptionPercent, skin_infill_density))
((ConfigOptionFloat, infill_lock_depth))
((ConfigOptionFloat, skin_infill_depth))
((ConfigOptionFloatOrPercent, skin_infill_line_width))
((ConfigOptionFloatOrPercent, skeleton_infill_line_width))
((ConfigOptionBool, infill_combination))
// Orca: // Orca:
((ConfigOptionFloatOrPercent, infill_combination_max_layer_height)) ((ConfigOptionFloatOrPercent, infill_combination_max_layer_height))((ConfigOptionInt, fill_multiline))
((ConfigOptionInt, fill_multiline))
// Ironing options // Ironing options
((ConfigOptionEnum<IroningType>, ironing_type)) ((ConfigOptionEnum<IroningType>, ironing_type))((ConfigOptionEnum<InfillPattern>, ironing_pattern))((ConfigOptionPercent, ironing_flow))(
((ConfigOptionEnum<InfillPattern>, ironing_pattern)) (ConfigOptionFloat, ironing_spacing))((ConfigOptionFloat, ironing_inset))((ConfigOptionFloat,
((ConfigOptionPercent, ironing_flow)) ironing_direction))((ConfigOptionFloat, ironing_speed))(
((ConfigOptionFloat, ironing_spacing)) (ConfigOptionFloat, ironing_angle))((ConfigOptionBool, ironing_angle_fixed))((ConfigOptionFloat, ironing_expansion))
((ConfigOptionFloat, ironing_inset))
((ConfigOptionFloat, ironing_direction))
((ConfigOptionFloat, ironing_speed))
((ConfigOptionFloat, ironing_angle))
((ConfigOptionBool, ironing_angle_fixed))
((ConfigOptionFloat, ironing_expansion))
// Filament Ironing // Filament Ironing
((ConfigOptionPercentsNullable, filament_ironing_flow)) ((ConfigOptionPercentsNullable, filament_ironing_flow))((ConfigOptionFloatsNullable, filament_ironing_spacing))(
((ConfigOptionFloatsNullable, filament_ironing_spacing)) (ConfigOptionFloatsNullable, filament_ironing_inset))((ConfigOptionFloatsNullable, filament_ironing_speed))
((ConfigOptionFloatsNullable, filament_ironing_inset))
((ConfigOptionFloatsNullable, filament_ironing_speed))
// Detect bridging perimeters // Detect bridging perimeters
((ConfigOptionBool, detect_overhang_wall)) ((ConfigOptionBool, detect_overhang_wall))((ConfigOptionInt, wall_filament))((ConfigOptionFloatOrPercent, inner_wall_line_width))(
((ConfigOptionInt, wall_filament)) (ConfigOptionFloat, inner_wall_speed))
((ConfigOptionFloatOrPercent, inner_wall_line_width))
((ConfigOptionFloat, inner_wall_speed))
// Total number of perimeters. // Total number of perimeters.
((ConfigOptionInt, wall_loops)) ((ConfigOptionInt, wall_loops))((ConfigOptionBool, alternate_extra_wall))((ConfigOptionFloat, minimum_sparse_infill_area))(
((ConfigOptionBool, alternate_extra_wall)) (ConfigOptionInt, solid_infill_filament))((ConfigOptionFloatOrPercent,
((ConfigOptionFloat, minimum_sparse_infill_area)) internal_solid_infill_line_width))((ConfigOptionFloat, internal_solid_infill_speed))
((ConfigOptionInt, solid_infill_filament))
((ConfigOptionFloatOrPercent, internal_solid_infill_line_width))
((ConfigOptionFloat, internal_solid_infill_speed))
// Detect thin walls. // Detect thin walls.
((ConfigOptionBool, detect_thin_wall)) ((ConfigOptionBool, detect_thin_wall))((ConfigOptionFloatOrPercent, top_surface_line_width))((ConfigOptionInt, top_shell_layers))(
((ConfigOptionFloatOrPercent, top_surface_line_width)) (ConfigOptionFloat, top_shell_thickness))((ConfigOptionFloat, top_surface_speed))
((ConfigOptionInt, top_shell_layers)) // BBS
((ConfigOptionFloat, top_shell_thickness)) ((ConfigOptionBool, enable_overhang_speed))((ConfigOptionFloatOrPercent, overhang_1_4_speed))(
((ConfigOptionFloat, top_surface_speed)) (ConfigOptionFloatOrPercent, overhang_2_4_speed))((ConfigOptionFloatOrPercent, overhang_3_4_speed))(
//BBS (ConfigOptionFloatOrPercent, overhang_4_4_speed))((ConfigOptionBool, only_one_wall_top))
((ConfigOptionBool, enable_overhang_speed))
((ConfigOptionFloatOrPercent, overhang_1_4_speed))
((ConfigOptionFloatOrPercent, overhang_2_4_speed))
((ConfigOptionFloatOrPercent, overhang_3_4_speed))
((ConfigOptionFloatOrPercent, overhang_4_4_speed))
((ConfigOptionBool, only_one_wall_top))
//SoftFever // SoftFever
((ConfigOptionFloatOrPercent, min_width_top_surface)) ((ConfigOptionFloatOrPercent, min_width_top_surface))((ConfigOptionBool, only_one_wall_first_layer))(
((ConfigOptionBool, only_one_wall_first_layer)) (ConfigOptionFloat, print_flow_ratio))((ConfigOptionFloatOrPercent, seam_gap))((ConfigOptionBool, role_based_wipe_speed))(
((ConfigOptionFloat, print_flow_ratio)) (ConfigOptionFloatOrPercent, wipe_speed))((ConfigOptionBool, wipe_on_loops))((ConfigOptionBool, wipe_before_external_loop))(
((ConfigOptionFloatOrPercent, seam_gap)) (ConfigOptionEnum<WallInfillOrder>, wall_infill_order))((ConfigOptionBool, precise_outer_wall))((
((ConfigOptionBool, role_based_wipe_speed)) ConfigOptionPercent, bridge_density))((ConfigOptionFloat, filter_out_gap_fill))((ConfigOptionFloatOrPercent, small_perimeter_speed))(
((ConfigOptionFloatOrPercent, wipe_speed)) (ConfigOptionFloat, small_perimeter_threshold))((ConfigOptionFloat, top_solid_infill_flow_ratio))(
((ConfigOptionBool, wipe_on_loops)) (ConfigOptionFloat, bottom_solid_infill_flow_ratio))((ConfigOptionFloatOrPercent, infill_anchor))((ConfigOptionFloatOrPercent,
((ConfigOptionBool, wipe_before_external_loop)) infill_anchor_max))
((ConfigOptionEnum<WallInfillOrder>, wall_infill_order))
((ConfigOptionBool, precise_outer_wall))
((ConfigOptionPercent, bridge_density))
((ConfigOptionFloat, filter_out_gap_fill))
((ConfigOptionFloatOrPercent, small_perimeter_speed))
((ConfigOptionFloat, small_perimeter_threshold))
((ConfigOptionFloat, top_solid_infill_flow_ratio))
((ConfigOptionFloat, bottom_solid_infill_flow_ratio))
((ConfigOptionFloatOrPercent, infill_anchor))
((ConfigOptionFloatOrPercent, infill_anchor_max))
// Orca // Orca
((ConfigOptionBool, make_overhang_printable)) ((ConfigOptionBool, make_overhang_printable))((ConfigOptionBool, extra_perimeters_on_overhangs))(
((ConfigOptionBool, extra_perimeters_on_overhangs)) (ConfigOptionBool, slowdown_for_curled_perimeters))((ConfigOptionBool, hole_to_polyhole))(
((ConfigOptionBool, slowdown_for_curled_perimeters)) (ConfigOptionFloatOrPercent, hole_to_polyhole_threshold))((ConfigOptionBool, hole_to_polyhole_twisted))(
((ConfigOptionBool, hole_to_polyhole)) (ConfigOptionBool, overhang_reverse))((ConfigOptionBool, overhang_reverse_internal_only))((ConfigOptionFloatOrPercent,
((ConfigOptionFloatOrPercent, hole_to_polyhole_threshold)) overhang_reverse_threshold))(
((ConfigOptionBool, hole_to_polyhole_twisted)) (ConfigOptionEnum<CounterboreHoleBridgingOption>, counterbore_hole_bridging))((ConfigOptionEnum<WallSequence>, wall_sequence))(
((ConfigOptionBool, overhang_reverse)) (ConfigOptionBool, is_infill_first))((ConfigOptionBool, small_area_infill_flow_compensation))((ConfigOptionEnum<WallDirection>,
((ConfigOptionBool, overhang_reverse_internal_only)) wall_direction))
((ConfigOptionFloatOrPercent, overhang_reverse_threshold))
((ConfigOptionEnum<CounterboreHoleBridgingOption>, counterbore_hole_bridging))
((ConfigOptionEnum<WallSequence>, wall_sequence))
((ConfigOptionBool, is_infill_first))
((ConfigOptionBool, small_area_infill_flow_compensation))
((ConfigOptionEnum<WallDirection>, wall_direction))
// Orca: other flow ratios (available for overriding, if set_other_flow_ratios is enabled) // Orca: other flow ratios (available for overriding, if set_other_flow_ratios is enabled)
((ConfigOptionFloat, first_layer_flow_ratio)) ((ConfigOptionFloat, first_layer_flow_ratio))((ConfigOptionFloat, outer_wall_flow_ratio))((ConfigOptionFloat, inner_wall_flow_ratio))(
((ConfigOptionFloat, outer_wall_flow_ratio)) (ConfigOptionFloat, overhang_flow_ratio))((ConfigOptionFloat, sparse_infill_flow_ratio))(
((ConfigOptionFloat, inner_wall_flow_ratio)) (ConfigOptionFloat, internal_solid_infill_flow_ratio))((ConfigOptionFloat, gap_fill_flow_ratio))
((ConfigOptionFloat, overhang_flow_ratio))
((ConfigOptionFloat, sparse_infill_flow_ratio))
((ConfigOptionFloat, internal_solid_infill_flow_ratio))
((ConfigOptionFloat, gap_fill_flow_ratio))
// Orca: seam slopes // Orca: seam slopes
((ConfigOptionEnum<SeamScarfType>, seam_slope_type)) ((ConfigOptionEnum<SeamScarfType>, seam_slope_type))((ConfigOptionBool, seam_slope_conditional))(
((ConfigOptionBool, seam_slope_conditional)) (ConfigOptionInt, scarf_angle_threshold))((ConfigOptionFloatOrPercent, seam_slope_start_height))(
((ConfigOptionInt, scarf_angle_threshold)) (ConfigOptionBool, seam_slope_entire_loop))((ConfigOptionFloat, seam_slope_min_length))((ConfigOptionInt, seam_slope_steps))(
((ConfigOptionFloatOrPercent, seam_slope_start_height)) (ConfigOptionBool, seam_slope_inner_walls))((ConfigOptionFloatOrPercent, scarf_joint_speed))(
((ConfigOptionBool, seam_slope_entire_loop)) (ConfigOptionFloat, scarf_joint_flow_ratio))((ConfigOptionPercent, scarf_overhang_threshold))
((ConfigOptionFloat, seam_slope_min_length))
((ConfigOptionInt, seam_slope_steps))
((ConfigOptionBool, seam_slope_inner_walls))
((ConfigOptionFloatOrPercent, scarf_joint_speed))
((ConfigOptionFloat, scarf_joint_flow_ratio))
((ConfigOptionPercent, scarf_overhang_threshold))
// Z Anti-Aliasing (aka Z Contouring) // Z Anti-Aliasing (aka Z Contouring)
((ConfigOptionBool, zaa_region_disable)) ((ConfigOptionBool, zaa_enabled))((ConfigOptionFloat, zaa_minimize_perimeter_height)))
((ConfigOptionFloat, zaa_minimize_perimeter_height))
)
PRINT_CONFIG_CLASS_DEFINE( PRINT_CONFIG_CLASS_DEFINE(
MachineEnvelopeConfig, MachineEnvelopeConfig,

View File

@@ -25,6 +25,7 @@
#include "format.hpp" #include "format.hpp"
#include "AABBTreeLines.hpp" #include "AABBTreeLines.hpp"
#include <cstddef>
#include <float.h> #include <float.h>
#include <iterator> #include <iterator>
#include <mutex> #include <mutex>
@@ -715,6 +716,21 @@ void PrintObject::ironing()
} }
} }
bool PrintObject::need_z_contouring() const
{
if (this->config().zaa_enabled) {
return true;
}
size_t num_regions = this->num_printing_regions();
for (size_t region_id = 0; region_id < num_regions; region_id++) {
if (this->printing_region(region_id).config().zaa_enabled)
return true;
}
return false;
}
void PrintObject::contour_z() void PrintObject::contour_z()
{ {
if (!this->set_started(posContouring)) { if (!this->set_started(posContouring)) {

View File

@@ -100,24 +100,63 @@ std::map<std::string, std::vector<SimpleSettingData>> SettingsFactory::OBJECT_C
}} }}
}; };
std::map<std::string, std::vector<SimpleSettingData>> SettingsFactory::PART_CATEGORY_SETTINGS= std::map<std::string, std::vector<SimpleSettingData>> SettingsFactory::PART_CATEGORY_SETTINGS =
{ {{L("Quality"),
{ L("Quality"), {{"ironing_type", "",8},{"ironing_flow", "",9},{"ironing_spacing", "",10},{"ironing_inset", "", 11},{"bridge_flow", "",11},{"make_overhang_printable", "",11},{"bridge_density", "", 1}, {{"ironing_type", "", 8},
{"ironing_expansion", "", 14}, {"ironing_flow", "", 9},
{"zaa_enabled", "", 1}, {"zaa_region_disable", "", 2}, {"zaa_minimize_perimeter_height", "", 3}, {"zaa_dont_alternate_fill_direction", "", 4}, {"zaa_min_z", "", 5} {"ironing_spacing", "", 10},
}}, {"ironing_inset", "", 11},
{ L("Strength"), {{"wall_loops", "",1},{"top_shell_layers", L("Top Solid Layers"),1},{"top_shell_thickness", L("Top Minimum Shell Thickness"),1},{"top_surface_density", L("Top Surface Density"),1}, {"bridge_flow", "", 11},
{"bottom_shell_layers", L("Bottom Solid Layers"),1}, {"bottom_shell_thickness", L("Bottom Minimum Shell Thickness"),1},{"bottom_surface_density", L("Bottom Surface Density"),1}, {"make_overhang_printable", "", 11},
{"sparse_infill_density", "",1},{"sparse_infill_pattern", "",1},{"lateral_lattice_angle_1", "",1},{"lateral_lattice_angle_2", "",1},{"infill_overhang_angle", "",1},{"infill_anchor", "",1},{"infill_anchor_max", "",1},{"top_surface_pattern", "",1},{"bottom_surface_pattern", "",1}, {"internal_solid_infill_pattern", "",1}, {"bridge_density", "", 1},
{"align_infill_direction_to_model", "", 1}, {"ironing_expansion", "", 14},
{"extra_solid_infills", "", 1}, {"zaa_enabled", "", 1},
{"infill_combination", "",1}, {"infill_combination_max_layer_height", "",1}, {"infill_wall_overlap", "",1},{"top_bottom_infill_wall_overlap", "",1}, {"solid_infill_direction", "",1}, {"infill_direction", "",1}, {"bridge_angle", "",1}, {"internal_bridge_angle", "",1}, {"minimum_sparse_infill_area", "",1} {"zaa_minimize_perimeter_height", "", 2},
}}, {"zaa_dont_alternate_fill_direction", "", 3},
{ L("Speed"), {{"outer_wall_speed", "",1},{"inner_wall_speed", "",2},{"sparse_infill_speed", "",3},{"top_surface_speed", "",4}, {"internal_solid_infill_speed", "",5}, {"zaa_min_z", "", 4}}},
{"enable_overhang_speed", "",6}, {"overhang_1_4_speed", "",7}, {"overhang_2_4_speed", "",8}, {"overhang_3_4_speed", "",9}, {"overhang_4_4_speed", "",10}, {L("Strength"),
{"bridge_speed", "",11}, {"gap_infill_speed", "",12}, {"internal_bridge_speed", "", 13} {{"wall_loops", "", 1},
}} {"top_shell_layers", L("Top Solid Layers"), 1},
}; {"top_shell_thickness", L("Top Minimum Shell Thickness"), 1},
{"top_surface_density", L("Top Surface Density"), 1},
{"bottom_shell_layers", L("Bottom Solid Layers"), 1},
{"bottom_shell_thickness", L("Bottom Minimum Shell Thickness"), 1},
{"bottom_surface_density", L("Bottom Surface Density"), 1},
{"sparse_infill_density", "", 1},
{"sparse_infill_pattern", "", 1},
{"lateral_lattice_angle_1", "", 1},
{"lateral_lattice_angle_2", "", 1},
{"infill_overhang_angle", "", 1},
{"infill_anchor", "", 1},
{"infill_anchor_max", "", 1},
{"top_surface_pattern", "", 1},
{"bottom_surface_pattern", "", 1},
{"internal_solid_infill_pattern", "", 1},
{"align_infill_direction_to_model", "", 1},
{"extra_solid_infills", "", 1},
{"infill_combination", "", 1},
{"infill_combination_max_layer_height", "", 1},
{"infill_wall_overlap", "", 1},
{"top_bottom_infill_wall_overlap", "", 1},
{"solid_infill_direction", "", 1},
{"infill_direction", "", 1},
{"bridge_angle", "", 1},
{"internal_bridge_angle", "", 1},
{"minimum_sparse_infill_area", "", 1}}},
{L("Speed"),
{{"outer_wall_speed", "", 1},
{"inner_wall_speed", "", 2},
{"sparse_infill_speed", "", 3},
{"top_surface_speed", "", 4},
{"internal_solid_infill_speed", "", 5},
{"enable_overhang_speed", "", 6},
{"overhang_1_4_speed", "", 7},
{"overhang_2_4_speed", "", 8},
{"overhang_3_4_speed", "", 9},
{"overhang_4_4_speed", "", 10},
{"bridge_speed", "", 11},
{"gap_infill_speed", "", 12},
{"internal_bridge_speed", "", 13}}}};
std::vector<std::string> SettingsFactory::get_options(const bool is_part) std::vector<std::string> SettingsFactory::get_options(const bool is_part)
{ {

View File

@@ -2342,9 +2342,7 @@ void TabPrint::build()
optgroup = page->new_optgroup("Z Contouring", L"param_advanced"); optgroup = page->new_optgroup("Z Contouring", L"param_advanced");
optgroup->append_single_option_line("zaa_enabled"); optgroup->append_single_option_line("zaa_enabled");
optgroup->append_single_option_line("zaa_region_disable");
optgroup->append_single_option_line("zaa_minimize_perimeter_height"); optgroup->append_single_option_line("zaa_minimize_perimeter_height");
optgroup->append_single_option_line("zaa_dont_alternate_fill_direction");
optgroup->append_single_option_line("zaa_min_z"); optgroup->append_single_option_line("zaa_min_z");
optgroup->append_single_option_line("ironing_expansion"); optgroup->append_single_option_line("ironing_expansion");