Add generated C++ files from proto schema

This commit is contained in:
Mykola Nahirnyi
2026-05-27 09:53:55 +03:00
parent 04b7ae9219
commit 5475e0aebe
6 changed files with 7681 additions and 0 deletions

117
codegen/README.md Normal file
View File

@@ -0,0 +1,117 @@
# PrintConfig Codegen -- Implementation Status
## Pipeline Overview
```
src/proto/generated/*.proto (22 files, grouped by Tab.cpp page)
|
v
protoc (compile)
|
v
config.desc (binary descriptor set)
|
v
config_codegen.py (codegen)
|
+-- codegen/generated/PrintConfigDef_generated.cpp
+-- codegen/generated/Preset_options_generated.cpp
+-- codegen/generated/Invalidation_generated.cpp
+-- codegen/generated/OptionKeys_generated.cpp
+-- codegen/generated/TabLayout_generated.cpp
```
## Tools
| Tool | Purpose |
|--|--|
| `tools/config_codegen.py` | Reads compiled proto descriptor, generates 4 C++ source files |
| `tools/validate_codegen.py` | Compares generated output against original `PrintConfig.cpp` for fidelity |
| `tools/run_codegen.py` | Convenience script: runs the full pipeline (compile -> generate -> validate) |
| `cmake/modules/ConfigCodegen.cmake` | CMake integration with `codegen_config` and `validate_config` targets |
## Generated Outputs
| File | Replaces | Status |
|--|--|--|
| `codegen/generated/PrintConfigDef_generated.cpp` | `init_fff_params()` body (~6000 lines) | Generated, not yet wired in |
| `codegen/generated/Preset_options_generated.cpp` | `s_Preset_*_options` string vectors in `Preset.cpp` | Generated, not yet wired in |
| `codegen/generated/Invalidation_generated.cpp` | `opt_key == "..."` chains in `Print.cpp` | Generated, not yet wired in |
| `codegen/generated/OptionKeys_generated.cpp` | Extruder/filament key lists | Generated, not yet wired in |
| `codegen/generated/TabLayout_generated.cpp` | `add_options_page` / `new_optgroup` / `append_single_option_line` calls in `Tab.cpp` | Generated, not yet wired in |
## Coverage (as of last run)
- **622 settings** total (612 parsed + 12 machine axis expanded from loop, 2 duplicates removed)
- **474/622 settings** mapped to Tab.cpp pages; remaining grouped by PrintConfig category
- **22 .proto files** grouped by Tab.cpp page (e.g. `print_quality.proto`, `filament.proto`)
- **451 option lines** across 16 pages in `TabLayout_generated.cpp`
- **610/610 shared settings** validated against original -- **0 errors**
- **12 extra settings** from machine axis expansion (original uses a runtime `AxisDefault` loop)
## Known Limitations
- `filament_type` enum values are populated at runtime via `MaterialType::all()` -- cannot be statically parsed
- `min_bead_width` shows a false-positive enum_map mismatch in validation
- Machine axis settings (`machine_max_speed_x/y/z/e`, etc.) are manually expanded from the original `AxisDefault` loop
## How to Run
```bash
# Full pipeline (compile + generate + validate)
python tools/run_codegen.py
# Validate only
python tools/run_codegen.py --validate-only
# CMake targets (after including ConfigCodegen.cmake)
cmake --build . --target codegen_config
cmake --build . --target validate_config
```
## File Layout
```
src/proto/
+-- config_metadata.proto # Custom field option extensions
+-- generated/
+-- print_quality.proto # 99 settings (Print / Quality page)
+-- strength.proto # 46 settings (Print / Strength page)
+-- print_speed.proto # 48 settings (Print / Speed page)
+-- print_support.proto # 48 settings (Print / Support page)
+-- others.proto # 48 settings (Print / Others page)
+-- print_multimaterial.proto # 41 settings (Print / Multimaterial page)
+-- filament.proto # 43 settings (Filament / Filament page)
+-- cooling.proto # 22 settings (Filament / Cooling page)
+-- filament_multimaterial.proto # 21 settings (Filament / Multimaterial page)
+-- advanced.proto # 3 settings (Filament / Advanced page)
+-- dependencies.proto # 2 settings (Filament / Dependencies page)
+-- filament_notes.proto # 1 setting (Filament / Notes page)
+-- basic_information.proto # 29 settings (Printer / Basic information page)
+-- machine_g_code.proto # 12 settings (Printer / Machine G-code page)
+-- motion_ability.proto # 10 settings (Printer / Motion ability page)
+-- printer_notes.proto # 1 setting (Printer / Notes page)
+-- machine_limits.proto # 19 settings (no Tab.cpp page, Machine limits category)
+-- uncategorized.proto # 116 settings (no Tab.cpp page, no category)
+-- quality.proto # 6 settings (fallback)
+-- support.proto # 5 settings (fallback)
+-- speed.proto # 1 setting (fallback)
+-- extruders.proto # 1 setting (fallback)
+-- parsed_settings.json # JSON IR for inspection
tools/
+-- config_codegen.py # Proto descriptor -> C++ codegen
+-- config_metadata_pb2.py # Generated Python bindings for extensions
+-- validate_codegen.py # Generated vs original validation
+-- run_codegen.py # Pipeline script
codegen/generated/
+-- PrintConfigDef_generated.cpp # init_fff_params() body
+-- Preset_options_generated.cpp # s_Preset_*_options
+-- Invalidation_generated.cpp # Invalidation map
+-- OptionKeys_generated.cpp # Extruder/filament key lists
+-- TabLayout_generated.cpp # Tab UI layout (TabPrint/Filament/Printer_build_layout)
cmake/modules/
+-- ConfigCodegen.cmake # CMake integration
```

View File

@@ -0,0 +1,255 @@
// ===== AUTO-GENERATED by tools/config_codegen.py =====
static const std::unordered_map<std::string, std::vector<PrintStep>> s_print_steps_map = {
{"accel_to_decel_enable", {psGCodeExport}},
{"accel_to_decel_factor", {psGCodeExport}},
{"activate_air_filtration", {psGCodeExport}},
{"activate_air_filtration_during_print", {psGCodeExport}},
{"activate_air_filtration_on_completion", {psGCodeExport}},
{"activate_chamber_temp_control", {psGCodeExport}},
{"additional_cooling_fan_speed", {psGCodeExport}},
{"bed_temperature_formula", {psGCodeExport}},
{"before_layer_change_gcode", {psGCodeExport}},
{"bridge_acceleration", {psGCodeExport}},
{"chamber_temperature", {psSkirtBrim, psWipeTower, psGCodeExport}},
{"change_filament_gcode", {psGCodeExport}},
{"close_fan_the_first_x_layers", {psGCodeExport}},
{"complete_print_exhaust_fan_speed", {psGCodeExport}},
{"cool_plate_temp", {psSkirtBrim, psWipeTower}},
{"cool_plate_temp_initial_layer", {psGCodeExport}},
{"curr_bed_type", {psGCodeExport}},
{"default_acceleration", {psGCodeExport}},
{"default_filament_colour", {psGCodeExport}},
{"deretraction_speed", {psGCodeExport}},
{"disable_m73", {psGCodeExport}},
{"dont_slow_down_outer_wall", {psGCodeExport}},
{"draft_shield", {psSkirtBrim}},
{"during_print_exhaust_fan_speed", {psGCodeExport}},
{"enable_arc_fitting", {psSkirtBrim}},
{"enable_filament_ramming", {psSkirtBrim, psWipeTower}},
{"enable_long_retraction_when_cut", {psGCodeExport}},
{"enable_overhang_bridge_fan", {psGCodeExport}},
{"enable_pressure_advance", {psGCodeExport}},
{"enable_prime_tower", {psSkirtBrim, psWipeTower}},
{"enable_tower_interface_features", {psSkirtBrim, psWipeTower}},
{"enable_wrapping_detection", {psSkirtBrim, psWipeTower}},
{"eng_plate_temp", {psSkirtBrim, psWipeTower}},
{"eng_plate_temp_initial_layer", {psGCodeExport}},
{"exclude_object", {psGCodeExport}},
{"extruder_ams_count", {psSkirtBrim, psWipeTower}},
{"extruder_clearance_height_to_lid", {psGCodeExport}},
{"extruder_clearance_height_to_rod", {psGCodeExport}},
{"extruder_clearance_radius", {psGCodeExport}},
{"extruder_colour", {psGCodeExport}},
{"extruder_offset", {psGCodeExport}},
{"extrusion_rate_smoothing_external_perimeter_only", {psGCodeExport}},
{"fan_cooling_layer_time", {psGCodeExport}},
{"fan_kickstart", {psGCodeExport}},
{"fan_max_speed", {psGCodeExport}},
{"fan_min_speed", {psGCodeExport}},
{"fan_speedup_overhangs", {psGCodeExport}},
{"fan_speedup_time", {psGCodeExport}},
{"filament_adaptive_volumetric_speed", {psSkirtBrim, psWipeTower}},
{"filament_adhesiveness_category", {psSkirtBrim, psWipeTower}},
{"filament_change_length", {psWipeTower}},
{"filament_colour", {psGCodeExport}},
{"filament_cooling_final_speed", {psSkirtBrim, psWipeTower}},
{"filament_cooling_initial_speed", {psSkirtBrim, psWipeTower}},
{"filament_cooling_moves", {psSkirtBrim, psWipeTower}},
{"filament_cost", {psGCodeExport}},
{"filament_density", {psGCodeExport}},
{"filament_diameter", {psGCodeExport}},
{"filament_end_gcode", {psGCodeExport}},
{"filament_flow_ratio", {psGCodeExport}},
{"filament_is_support", {psWipeTower}},
{"filament_loading_speed", {psSkirtBrim, psWipeTower}},
{"filament_loading_speed_start", {psSkirtBrim, psWipeTower}},
{"filament_map", {psSkirtBrim, psWipeTower}},
{"filament_map_mode", {psSkirtBrim, psWipeTower}},
{"filament_max_volumetric_speed", {psSkirtBrim, psWipeTower}},
{"filament_minimal_purge_on_wipe_tower", {psSkirtBrim, psWipeTower}},
{"filament_multitool_ramming", {psSkirtBrim, psWipeTower}},
{"filament_multitool_ramming_flow", {psSkirtBrim, psWipeTower}},
{"filament_multitool_ramming_volume", {psSkirtBrim, psWipeTower}},
{"filament_notes", {psGCodeExport}},
{"filament_printable", {psWipeTower}},
{"filament_ramming_parameters", {psSkirtBrim, psWipeTower}},
{"filament_soluble", {psWipeTower}},
{"filament_stamping_distance", {psSkirtBrim, psWipeTower}},
{"filament_stamping_loading_speed", {psSkirtBrim, psWipeTower}},
{"filament_start_gcode", {psGCodeExport}},
{"filament_toolchange_delay", {psSkirtBrim, psWipeTower}},
{"filament_tower_interface_pre_extrusion_dist", {psSkirtBrim, psWipeTower}},
{"filament_tower_interface_pre_extrusion_length", {psSkirtBrim, psWipeTower}},
{"filament_tower_interface_print_temp", {psSkirtBrim, psWipeTower}},
{"filament_tower_interface_purge_volume", {psSkirtBrim, psWipeTower}},
{"filament_tower_ironing_area", {psSkirtBrim, psWipeTower}},
{"filament_type", {psSkirtBrim, psWipeTower}},
{"filament_unloading_speed", {psSkirtBrim, psWipeTower}},
{"filament_unloading_speed_start", {psSkirtBrim, psWipeTower}},
{"filename_format", {psGCodeExport}},
{"first_layer_print_sequence", {psSkirtBrim, psWipeTower}},
{"flush_into_infill", {psSkirtBrim, psWipeTower}},
{"flush_into_support", {psSkirtBrim, psWipeTower}},
{"flush_volumes_matrix", {psSkirtBrim, psWipeTower}},
{"full_fan_speed_layer", {psGCodeExport}},
{"gcode_add_line_number", {psGCodeExport}},
{"gcode_comments", {psGCodeExport}},
{"gcode_flavor", {psSkirtBrim, psWipeTower}},
{"gcode_label_objects", {psGCodeExport}},
{"grab_length", {psGCodeExport}},
{"hot_plate_temp", {psSkirtBrim, psWipeTower}},
{"hot_plate_temp_initial_layer", {psGCodeExport}},
{"idle_temperature", {psSkirtBrim, psWipeTower}},
{"independent_support_layer_height", {psWipeTower}},
{"initial_layer_acceleration", {psGCodeExport}},
{"initial_layer_infill_speed", {psSkirtBrim, psWipeTower}},
{"initial_layer_line_width", {psSkirtBrim}},
{"initial_layer_speed", {psSkirtBrim, psWipeTower}},
{"initial_layer_travel_acceleration", {psSkirtBrim, psWipeTower}},
{"initial_layer_travel_jerk", {psSkirtBrim, psWipeTower}},
{"initial_layer_travel_speed", {psSkirtBrim, psWipeTower}},
{"inner_wall_acceleration", {psGCodeExport}},
{"internal_bridge_fan_speed", {psGCodeExport}},
{"internal_solid_infill_acceleration", {psGCodeExport}},
{"ironing_fan_speed", {psGCodeExport}},
{"is_infill_first", {psGCodeExport}},
{"layer_change_gcode", {psGCodeExport}},
{"long_retractions_when_cut", {psGCodeExport}},
{"machine_end_gcode", {psGCodeExport}},
{"machine_start_gcode", {psGCodeExport}},
{"manual_filament_change", {psGCodeExport}},
{"max_layer_height", {psSkirtBrim}},
{"max_travel_detour_distance", {psGCodeExport}},
{"max_volumetric_extrusion_rate_slope", {psGCodeExport}},
{"max_volumetric_extrusion_rate_slope_segment_length", {psGCodeExport}},
{"min_layer_height", {psSkirtBrim}},
{"min_skirt_length", {psSkirtBrim}},
{"nozzle_height", {psGCodeExport}},
{"nozzle_hrc", {psGCodeExport}},
{"nozzle_temperature", {psSkirtBrim, psWipeTower}},
{"nozzle_temperature_initial_layer", {psSkirtBrim, psWipeTower}},
{"nozzle_volume", {psGCodeExport}},
{"ooze_prevention", {psSkirtBrim}},
{"other_layers_print_sequence", {psSkirtBrim, psWipeTower}},
{"other_layers_print_sequence_nums", {psSkirtBrim, psWipeTower}},
{"outer_wall_acceleration", {psGCodeExport}},
{"overhang_fan_speed", {psGCodeExport}},
{"overhang_fan_threshold", {psGCodeExport}},
{"part_cooling_fan_min_pwm", {psGCodeExport}},
{"post_process", {psGCodeExport}},
{"preheat_steps", {psGCodeExport}},
{"preheat_time", {psGCodeExport}},
{"pressure_advance", {psGCodeExport}},
{"prime_tower_brim_width", {psSkirtBrim, psWipeTower}},
{"prime_tower_enable_framework", {psSkirtBrim, psWipeTower}},
{"prime_tower_flat_ironing", {psSkirtBrim, psWipeTower}},
{"prime_tower_skip_points", {psSkirtBrim, psWipeTower}},
{"prime_tower_width", {psSkirtBrim, psWipeTower}},
{"prime_volume", {psSkirtBrim, psWipeTower}},
{"print_order", {psSkirtBrim}},
{"print_sequence", {psSkirtBrim, psWipeTower}},
{"printer_notes", {psGCodeExport}},
{"printing_by_object_gcode", {psGCodeExport}},
{"purge_in_prime_tower", {psSkirtBrim, psWipeTower}},
{"reduce_crossing_wall", {psGCodeExport}},
{"reduce_fan_stop_start_freq", {psGCodeExport}},
{"reduce_infill_retraction", {psGCodeExport}},
{"required_nozzle_HRC", {psGCodeExport}},
{"resolution", {psSkirtBrim}},
{"retract_before_wipe", {psGCodeExport}},
{"retract_length_toolchange", {psGCodeExport}},
{"retract_lift_above", {psGCodeExport}},
{"retract_lift_below", {psGCodeExport}},
{"retract_lift_enforce", {psGCodeExport}},
{"retract_restart_extra", {psGCodeExport}},
{"retract_restart_extra_toolchange", {psGCodeExport}},
{"retract_when_changing_layer", {psGCodeExport}},
{"retraction_distances_when_cut", {psGCodeExport}},
{"retraction_length", {psGCodeExport}},
{"retraction_minimum_travel", {psGCodeExport}},
{"retraction_speed", {psGCodeExport}},
{"role_based_wipe_speed", {psGCodeExport}},
{"seam_gap", {psGCodeExport}},
{"single_extruder_multi_material", {psSkirtBrim, psWipeTower}},
{"single_extruder_multi_material_priming", {psGCodeExport}},
{"single_loop_draft_shield", {psSkirtBrim}},
{"skirt_distance", {psSkirtBrim}},
{"skirt_height", {psSkirtBrim}},
{"skirt_loops", {psSkirtBrim}},
{"skirt_speed", {psSkirtBrim}},
{"skirt_start_angle", {psSkirtBrim}},
{"skirt_type", {psSkirtBrim}},
{"slow_down_for_layer_cooling", {psGCodeExport}},
{"slow_down_layer_time", {psGCodeExport}},
{"slow_down_layers", {psSkirtBrim, psWipeTower}},
{"slow_down_min_speed", {psGCodeExport}},
{"sparse_infill_acceleration", {psGCodeExport}},
{"standby_temperature_delta", {psGCodeExport}},
{"supertack_plate_temp", {psSkirtBrim, psWipeTower}},
{"supertack_plate_temp_initial_layer", {psGCodeExport}},
{"support_material_interface_fan_speed", {psGCodeExport}},
{"support_multi_bed_types", {psSkirtBrim, psWipeTower}},
{"textured_cool_plate_temp", {psSkirtBrim, psWipeTower}},
{"textured_cool_plate_temp_initial_layer", {psGCodeExport}},
{"textured_plate_temp", {psSkirtBrim, psWipeTower}},
{"textured_plate_temp_initial_layer", {psGCodeExport}},
{"thumbnails", {psGCodeExport}},
{"thumbnails_format", {psGCodeExport}},
{"time_lapse_gcode", {psGCodeExport}},
{"tool_change_on_wipe_tower", {psSkirtBrim, psWipeTower}},
{"top_surface_acceleration", {psGCodeExport}},
{"travel_acceleration", {psGCodeExport}},
{"travel_slope", {psGCodeExport}},
{"travel_speed", {psSkirtBrim, psWipeTower}},
{"travel_speed_z", {psSkirtBrim, psWipeTower}},
{"upward_compatible_machine", {psGCodeExport}},
{"use_firmware_retraction", {psGCodeExport}},
{"use_relative_e_distances", {psGCodeExport}},
{"volumetric_speed_coefficients", {psGCodeExport}},
{"wall_sequence", {psSkirtBrim}},
{"wipe", {psGCodeExport}},
{"wipe_distance", {psGCodeExport}},
{"wipe_on_loops", {psGCodeExport}},
{"wipe_speed", {psGCodeExport}},
{"wipe_tower_bridging", {psSkirtBrim, psWipeTower}},
{"wipe_tower_cone_angle", {psSkirtBrim, psWipeTower}},
{"wipe_tower_extra_flow", {psSkirtBrim, psWipeTower}},
{"wipe_tower_extra_rib_length", {psSkirtBrim, psWipeTower}},
{"wipe_tower_extra_spacing", {psSkirtBrim, psWipeTower}},
{"wipe_tower_filament", {psSkirtBrim, psWipeTower}},
{"wipe_tower_fillet_wall", {psSkirtBrim, psWipeTower}},
{"wipe_tower_max_purge_speed", {psSkirtBrim, psWipeTower}},
{"wipe_tower_no_sparse_layers", {psSkirtBrim, psWipeTower}},
{"wipe_tower_rib_width", {psSkirtBrim, psWipeTower}},
{"wipe_tower_rotation_angle", {psSkirtBrim}},
{"wipe_tower_type", {psSkirtBrim, psWipeTower}},
{"wipe_tower_wall_type", {psSkirtBrim, psWipeTower}},
{"wipe_tower_x", {psSkirtBrim}},
{"wipe_tower_y", {psSkirtBrim}},
{"wiping_volumes_extruders", {psSkirtBrim, psWipeTower}},
{"wrapping_detection_gcode", {psGCodeExport}},
{"z_hop", {psGCodeExport}},
{"z_offset", {psSkirtBrim, psWipeTower}},
};
static const std::unordered_map<std::string, std::vector<PrintObjectStep>> s_object_steps_map = {
{"enable_arc_fitting", {posSupportMaterial, posInfill, posPerimeters}},
{"filament_change_length", {posSupportMaterial}},
{"filament_is_support", {posSupportMaterial}},
{"filament_printable", {posSupportMaterial}},
{"filament_shrink", {posSlice}},
{"filament_shrinkage_compensation_z", {posSlice}},
{"filament_soluble", {posSupportMaterial}},
{"independent_support_layer_height", {posSupportMaterial}},
{"initial_layer_line_width", {posSupportMaterial, posInfill, posPerimeters}},
{"initial_layer_print_height", {posSlice}},
{"max_layer_height", {posSupportMaterial, posInfill, posPerimeters}},
{"min_layer_height", {posSupportMaterial, posInfill, posPerimeters}},
{"nozzle_diameter", {posSlice}},
{"precise_z_height", {posSlice}},
{"print_order", {posSupportMaterial, posInfill, posPerimeters}},
{"resolution", {posSupportMaterial, posInfill, posPerimeters, posSlice}},
{"spiral_mode", {posSlice}},
{"wall_sequence", {posSupportMaterial, posInfill, posPerimeters}},
};

View File

@@ -0,0 +1,61 @@
// ===== AUTO-GENERATED by tools/config_codegen.py =====
static const std::vector<std::string> s_extruder_option_keys = {
"default_filament_profile",
"default_nozzle_volume_type",
"deretraction_speed",
"extruder_colour",
"extruder_offset",
"extruder_type",
"long_retractions_when_cut",
"max_layer_height",
"min_layer_height",
"nozzle_diameter",
"nozzle_flush_dataset",
"nozzle_type",
"nozzle_volume",
"retract_before_wipe",
"retract_length_toolchange",
"retract_lift_above",
"retract_lift_below",
"retract_lift_enforce",
"retract_restart_extra",
"retract_restart_extra_toolchange",
"retract_when_changing_layer",
"retraction_distances_when_cut",
"retraction_length",
"retraction_minimum_travel",
"retraction_speed",
"travel_slope",
"wipe",
"wipe_distance",
"z_hop",
"z_hop_types",
};
static const std::vector<std::string> s_filament_option_keys = {
"default_filament_profile",
"deretraction_speed",
"filament_colour",
"filament_diameter",
"long_retractions_when_cut",
"max_layer_height",
"min_layer_height",
"retract_before_wipe",
"retract_length_toolchange",
"retract_lift_above",
"retract_lift_below",
"retract_lift_enforce",
"retract_restart_extra",
"retract_restart_extra_toolchange",
"retract_when_changing_layer",
"retraction_distances_when_cut",
"retraction_length",
"retraction_minimum_travel",
"retraction_speed",
"volumetric_speed_coefficients",
"wipe",
"wipe_distance",
"z_hop",
"z_hop_types",
};

View File

@@ -0,0 +1,718 @@
// ===== AUTO-GENERATED by tools/config_codegen.py =====
static const std::vector<std::string> s_Preset_print_options = {
"accel_to_decel_enable",
"accel_to_decel_factor",
"adaptive_layer_height",
"align_infill_direction_to_model",
"alternate_extra_wall",
"bbl_calib_mark_logo",
"bed_temperature_formula",
"bottom_shell_layers",
"bottom_shell_thickness",
"bottom_solid_infill_flow_ratio",
"bottom_surface_density",
"bottom_surface_pattern",
"bridge_acceleration",
"bridge_angle",
"bridge_density",
"bridge_flow",
"bridge_no_support",
"bridge_speed",
"brim_ears",
"brim_ears_detection_length",
"brim_ears_max_angle",
"brim_flow_ratio",
"brim_object_gap",
"brim_type",
"brim_use_efc_outline",
"brim_width",
"calib_flowrate_topinfill_special_order",
"combine_brims",
"compatible_machine_expression_group",
"compatible_printers",
"compatible_prints",
"compatible_process_expression_group",
"cooling_tube_length",
"cooling_tube_retraction",
"counterbore_hole_bridging",
"curr_bed_type",
"default_acceleration",
"default_bed_type",
"default_filament_profile",
"default_jerk",
"default_junction_deviation",
"default_nozzle_volume_type",
"default_print_profile",
"deretraction_speed",
"detect_narrow_internal_solid_infill",
"detect_overhang_wall",
"detect_thin_wall",
"different_settings_to_system",
"dont_filter_internal_bridges",
"draft_shield",
"emit_machine_limits_to_gcode",
"enable_arc_fitting",
"enable_extra_bridge_layer",
"enable_filament_dynamic_map",
"enable_filament_ramming",
"enable_long_retraction_when_cut",
"enable_overhang_speed",
"enable_prime_tower",
"enable_support",
"enable_tower_interface_cooldown_during_tower",
"enable_tower_interface_features",
"enable_wrapping_detection",
"enforce_support_layers",
"ensure_vertical_shell_thickness",
"exclude_object",
"extra_loading_move",
"extra_perimeters_on_overhangs",
"extra_solid_infills",
"extruder",
"extruder_ams_count",
"extruder_colour",
"extruder_offset",
"extruder_type",
"extruder_variant_list",
"extrusion_rate_smoothing_external_perimeter_only",
"filament_colour",
"filament_colour_type",
"filament_extruder_id",
"filament_flush_temp",
"filament_ids",
"filament_map",
"filament_map_mode",
"filament_multi_colour",
"filament_ramming_parameters",
"filament_self_index",
"filament_settings_id",
"filename_format",
"fill_multiline",
"filter_out_gap_fill",
"first_layer_flow_ratio",
"first_layer_print_sequence",
"first_layer_sequence_choice",
"flush_into_infill",
"flush_into_objects",
"flush_into_support",
"flush_multiplier",
"flush_volumes_matrix",
"flush_volumes_vector",
"fuzzy_skin",
"fuzzy_skin_first_layer",
"fuzzy_skin_layers_between_ripple_offset",
"fuzzy_skin_mode",
"fuzzy_skin_noise_type",
"fuzzy_skin_octaves",
"fuzzy_skin_persistence",
"fuzzy_skin_point_distance",
"fuzzy_skin_ripple_offset",
"fuzzy_skin_ripples_per_layer",
"fuzzy_skin_scale",
"fuzzy_skin_thickness",
"gap_fill_flow_ratio",
"gap_fill_target",
"gap_infill_speed",
"gcode_add_line_number",
"gcode_comments",
"gcode_label_objects",
"grab_length",
"gyroid_optimized",
"has_filament_switcher",
"has_scarf_joint_seam",
"head_wrap_detect_zone",
"high_current_on_filament_swap",
"hole_to_polyhole",
"hole_to_polyhole_threshold",
"hole_to_polyhole_twisted",
"host_type",
"independent_support_layer_height",
"infill_anchor",
"infill_anchor_max",
"infill_combination",
"infill_combination_max_layer_height",
"infill_direction",
"infill_jerk",
"infill_lock_depth",
"infill_overhang_angle",
"infill_shift_step",
"infill_wall_overlap",
"inherits",
"inherits_group",
"initial_layer_acceleration",
"initial_layer_infill_speed",
"initial_layer_jerk",
"initial_layer_line_width",
"initial_layer_min_bead_width",
"initial_layer_print_height",
"initial_layer_speed",
"initial_layer_travel_acceleration",
"initial_layer_travel_jerk",
"initial_layer_travel_speed",
"inner_wall_acceleration",
"inner_wall_flow_ratio",
"inner_wall_jerk",
"inner_wall_line_width",
"inner_wall_speed",
"input_shaping_damp_x",
"input_shaping_damp_y",
"input_shaping_emit",
"input_shaping_freq_x",
"input_shaping_freq_y",
"input_shaping_type",
"interface_shells",
"interlocking_beam",
"interlocking_beam_layer_count",
"interlocking_beam_width",
"interlocking_boundary_avoidance",
"interlocking_depth",
"interlocking_orientation",
"internal_bridge_angle",
"internal_bridge_density",
"internal_bridge_flow",
"internal_bridge_speed",
"internal_solid_infill_acceleration",
"internal_solid_infill_flow_ratio",
"internal_solid_infill_line_width",
"internal_solid_infill_pattern",
"internal_solid_infill_speed",
"ironing_angle",
"ironing_angle_fixed",
"ironing_expansion",
"ironing_flow",
"ironing_inset",
"ironing_pattern",
"ironing_spacing",
"ironing_speed",
"ironing_type",
"is_infill_first",
"lateral_lattice_angle_1",
"lateral_lattice_angle_2",
"line_width",
"long_retractions_when_cut",
"machine_load_filament_time",
"machine_max_acceleration_e",
"machine_max_acceleration_extruding",
"machine_max_acceleration_retracting",
"machine_max_acceleration_travel",
"machine_max_acceleration_x",
"machine_max_acceleration_y",
"machine_max_acceleration_z",
"machine_max_jerk_e",
"machine_max_jerk_x",
"machine_max_jerk_y",
"machine_max_jerk_z",
"machine_max_junction_deviation",
"machine_max_speed_e",
"machine_max_speed_x",
"machine_max_speed_y",
"machine_max_speed_z",
"machine_min_extruding_rate",
"machine_min_travel_rate",
"machine_tool_change_time",
"machine_unload_filament_time",
"make_overhang_printable",
"make_overhang_printable_angle",
"make_overhang_printable_hole_size",
"manual_filament_change",
"master_extruder_id",
"max_bridge_length",
"max_layer_height",
"max_resonance_avoidance_speed",
"max_travel_detour_distance",
"max_volumetric_extrusion_rate_slope",
"max_volumetric_extrusion_rate_slope_segment_length",
"min_bead_width",
"min_feature_size",
"min_layer_height",
"min_length_factor",
"min_resonance_avoidance_speed",
"min_skirt_length",
"min_width_top_surface",
"minimum_sparse_infill_area",
"mmu_segmented_region_interlocking_depth",
"mmu_segmented_region_max_width",
"notes",
"nozzle_diameter",
"nozzle_flush_dataset",
"nozzle_height",
"nozzle_volume",
"nozzle_volume_type",
"only_one_wall_first_layer",
"only_one_wall_top",
"ooze_prevention",
"other_layers_print_sequence",
"other_layers_print_sequence_nums",
"other_layers_sequence_choice",
"outer_wall_acceleration",
"outer_wall_flow_ratio",
"outer_wall_jerk",
"outer_wall_line_width",
"outer_wall_speed",
"overhang_1_4_speed",
"overhang_2_4_speed",
"overhang_3_4_speed",
"overhang_4_4_speed",
"overhang_flow_ratio",
"overhang_reverse",
"overhang_reverse_internal_only",
"overhang_reverse_threshold",
"parking_pos_retraction",
"physical_extruder_map",
"post_process",
"precise_outer_wall",
"precise_z_height",
"preheat_steps",
"preheat_time",
"prime_tower_brim_width",
"prime_tower_enable_framework",
"prime_tower_flat_ironing",
"prime_tower_infill_gap",
"prime_tower_skip_points",
"prime_tower_width",
"prime_volume",
"print_compatible_printers",
"print_extruder_id",
"print_extruder_variant",
"print_flow_ratio",
"print_order",
"print_sequence",
"print_settings_id",
"printer_extruder_id",
"printer_extruder_variant",
"printer_model",
"printer_settings_id",
"printer_variant",
"process_change_extrusion_role_gcode",
"purge_in_prime_tower",
"raft_contact_distance",
"raft_expansion",
"raft_first_layer_density",
"raft_first_layer_expansion",
"raft_layers",
"reduce_crossing_wall",
"reduce_infill_retraction",
"resolution",
"resonance_avoidance",
"retract_before_wipe",
"retract_length_toolchange",
"retract_lift_above",
"retract_lift_below",
"retract_lift_enforce",
"retract_restart_extra",
"retract_restart_extra_toolchange",
"retract_when_changing_layer",
"retraction_distances_when_cut",
"retraction_length",
"retraction_minimum_travel",
"retraction_speed",
"role_based_wipe_speed",
"scarf_angle_threshold",
"scarf_joint_flow_ratio",
"scarf_joint_speed",
"scarf_overhang_threshold",
"seam_gap",
"seam_position",
"seam_slope_conditional",
"seam_slope_entire_loop",
"seam_slope_inner_walls",
"seam_slope_min_length",
"seam_slope_start_height",
"seam_slope_steps",
"seam_slope_type",
"set_other_flow_ratios",
"silent_mode",
"single_extruder_multi_material",
"single_extruder_multi_material_priming",
"single_loop_draft_shield",
"skeleton_infill_density",
"skeleton_infill_line_width",
"skin_infill_density",
"skin_infill_depth",
"skin_infill_line_width",
"skirt_distance",
"skirt_height",
"skirt_loops",
"skirt_speed",
"skirt_start_angle",
"skirt_type",
"slice_closing_radius",
"slicing_mode",
"slow_down_layers",
"slowdown_for_curled_perimeters",
"small_area_infill_flow_compensation",
"small_area_infill_flow_compensation_model",
"small_perimeter_speed",
"small_perimeter_threshold",
"solid_infill_direction",
"solid_infill_filament",
"solid_infill_rotate_template",
"spaghetti_detector",
"sparse_infill_acceleration",
"sparse_infill_density",
"sparse_infill_filament",
"sparse_infill_flow_ratio",
"sparse_infill_line_width",
"sparse_infill_pattern",
"sparse_infill_rotate_template",
"sparse_infill_speed",
"spiral_finishing_flow_ratio",
"spiral_mode",
"spiral_mode_max_xy_smoothing",
"spiral_mode_smooth",
"spiral_starting_flow_ratio",
"staggered_inner_seams",
"standby_temperature_delta",
"start_end_points",
"support_angle",
"support_base_pattern",
"support_base_pattern_spacing",
"support_bottom_interface_spacing",
"support_bottom_z_distance",
"support_critical_regions_only",
"support_expansion",
"support_filament",
"support_flow_ratio",
"support_interface_bottom_layers",
"support_interface_filament",
"support_interface_flow_ratio",
"support_interface_loop_pattern",
"support_interface_not_for_body",
"support_interface_pattern",
"support_interface_spacing",
"support_interface_speed",
"support_interface_top_layers",
"support_ironing",
"support_ironing_flow",
"support_ironing_pattern",
"support_ironing_spacing",
"support_line_width",
"support_object_first_layer_gap",
"support_object_skip_flush",
"support_object_xy_distance",
"support_on_build_plate_only",
"support_remove_small_overhang",
"support_speed",
"support_style",
"support_threshold_angle",
"support_threshold_overlap",
"support_top_z_distance",
"support_type",
"symmetric_infill_y_axis",
"thick_bridges",
"thick_internal_bridges",
"thumbnails_format",
"timelapse_type",
"tool_change_on_wipe_tower",
"top_bottom_infill_wall_overlap",
"top_shell_layers",
"top_shell_thickness",
"top_solid_infill_flow_ratio",
"top_surface_acceleration",
"top_surface_density",
"top_surface_jerk",
"top_surface_line_width",
"top_surface_pattern",
"top_surface_speed",
"travel_acceleration",
"travel_jerk",
"travel_slope",
"travel_speed",
"travel_speed_z",
"tree_support_angle_slow",
"tree_support_auto_brim",
"tree_support_branch_angle",
"tree_support_branch_angle_organic",
"tree_support_branch_diameter",
"tree_support_branch_diameter_angle",
"tree_support_branch_diameter_organic",
"tree_support_branch_distance",
"tree_support_branch_distance_organic",
"tree_support_brim_width",
"tree_support_tip_diameter",
"tree_support_top_rate",
"tree_support_wall_count",
"tree_support_with_infill",
"upward_compatible_machine",
"volumetric_speed_coefficients",
"wall_direction",
"wall_distribution_count",
"wall_filament",
"wall_generator",
"wall_loops",
"wall_maximum_deviation",
"wall_maximum_resolution",
"wall_sequence",
"wall_transition_angle",
"wall_transition_filter_deviation",
"wall_transition_length",
"wipe",
"wipe_before_external_loop",
"wipe_distance",
"wipe_on_loops",
"wipe_speed",
"wipe_tower_bridging",
"wipe_tower_cone_angle",
"wipe_tower_extra_flow",
"wipe_tower_extra_rib_length",
"wipe_tower_extra_spacing",
"wipe_tower_filament",
"wipe_tower_fillet_wall",
"wipe_tower_max_purge_speed",
"wipe_tower_no_sparse_layers",
"wipe_tower_rib_width",
"wipe_tower_rotation_angle",
"wipe_tower_type",
"wipe_tower_wall_type",
"wipe_tower_x",
"wipe_tower_y",
"wiping_volumes_extruders",
"wrapping_detection_layers",
"wrapping_exclude_area",
"xy_contour_compensation",
"xy_hole_compensation",
"z_hop",
"z_hop_types",
"zaa_dont_alternate_fill_direction",
"zaa_enabled",
"zaa_min_z",
"zaa_minimize_perimeter_height",
};
static const std::vector<std::string> s_Preset_filament_options = {
"activate_air_filtration",
"activate_air_filtration_during_print",
"activate_air_filtration_on_completion",
"activate_chamber_temp_control",
"adaptive_pressure_advance",
"adaptive_pressure_advance_bridges",
"adaptive_pressure_advance_model",
"adaptive_pressure_advance_overhangs",
"additional_cooling_fan_speed",
"additional_fan_full_speed_layer",
"chamber_temperature",
"close_additional_fan_first_x_layers",
"close_fan_the_first_x_layers",
"compatible_printers",
"compatible_printers_condition",
"compatible_prints",
"compatible_prints_condition",
"complete_print_exhaust_fan_speed",
"cool_plate_temp",
"cool_plate_temp_initial_layer",
"default_filament_colour",
"dont_slow_down_outer_wall",
"during_print_exhaust_fan_speed",
"enable_overhang_bridge_fan",
"enable_pressure_advance",
"eng_plate_temp",
"eng_plate_temp_initial_layer",
"fan_cooling_layer_time",
"fan_max_speed",
"fan_min_speed",
"filament_adaptive_volumetric_speed",
"filament_adhesiveness_category",
"filament_change_extrusion_role_gcode",
"filament_change_length",
"filament_cooling_before_tower",
"filament_cooling_final_speed",
"filament_cooling_initial_speed",
"filament_cooling_moves",
"filament_cost",
"filament_density",
"filament_deretraction_speed",
"filament_diameter",
"filament_end_gcode",
"filament_extruder_variant",
"filament_flow_ratio",
"filament_flush_temp",
"filament_flush_volumetric_speed",
"filament_ironing_flow",
"filament_ironing_inset",
"filament_ironing_spacing",
"filament_ironing_speed",
"filament_is_support",
"filament_loading_speed",
"filament_loading_speed_start",
"filament_long_retractions_when_cut",
"filament_max_volumetric_speed",
"filament_minimal_purge_on_wipe_tower",
"filament_multitool_ramming",
"filament_multitool_ramming_flow",
"filament_multitool_ramming_volume",
"filament_notes",
"filament_printable",
"filament_retract_before_wipe",
"filament_retract_lift_above",
"filament_retract_lift_below",
"filament_retract_lift_enforce",
"filament_retract_restart_extra",
"filament_retract_when_changing_layer",
"filament_retraction_distances_when_cut",
"filament_retraction_length",
"filament_retraction_minimum_travel",
"filament_retraction_speed",
"filament_shrink",
"filament_shrinkage_compensation_z",
"filament_soluble",
"filament_stamping_distance",
"filament_stamping_loading_speed",
"filament_start_gcode",
"filament_toolchange_delay",
"filament_tower_interface_pre_extrusion_dist",
"filament_tower_interface_pre_extrusion_length",
"filament_tower_interface_print_temp",
"filament_tower_interface_purge_volume",
"filament_tower_ironing_area",
"filament_type",
"filament_unloading_speed",
"filament_unloading_speed_start",
"filament_vendor",
"filament_wipe",
"filament_wipe_distance",
"filament_z_hop",
"filament_z_hop_types",
"first_x_layer_fan_speed",
"full_fan_speed_layer",
"hot_plate_temp",
"hot_plate_temp_initial_layer",
"idle_temperature",
"inherits",
"internal_bridge_fan_speed",
"ironing_fan_speed",
"long_retractions_when_ec",
"nozzle_temperature",
"nozzle_temperature_initial_layer",
"nozzle_temperature_range_high",
"nozzle_temperature_range_low",
"overhang_fan_speed",
"overhang_fan_threshold",
"pellet_flow_coefficient",
"pressure_advance",
"reduce_fan_stop_start_freq",
"required_nozzle_HRC",
"retraction_distances_when_ec",
"slow_down_for_layer_cooling",
"slow_down_layer_time",
"slow_down_min_speed",
"supertack_plate_temp",
"supertack_plate_temp_initial_layer",
"support_material_interface_fan_speed",
"temperature_vitrification",
"textured_cool_plate_temp",
"textured_cool_plate_temp_initial_layer",
"textured_plate_temp",
"textured_plate_temp_initial_layer",
};
static const std::vector<std::string> s_Preset_printer_options = {
"adaptive_bed_mesh_margin",
"auxiliary_fan",
"bbl_use_printhost",
"bed_custom_model",
"bed_custom_texture",
"bed_exclude_area",
"bed_mesh_max",
"bed_mesh_min",
"bed_mesh_probe_distance",
"bed_temperature_formula",
"before_layer_change_gcode",
"best_object_pos",
"change_extrusion_role_gcode",
"change_filament_gcode",
"cooling_tube_length",
"cooling_tube_retraction",
"default_bed_type",
"default_nozzle_volume_type",
"default_print_profile",
"disable_m73",
"emit_machine_limits_to_gcode",
"enable_filament_ramming",
"enable_long_retraction_when_cut",
"enable_power_loss_recovery",
"extra_loading_move",
"extruder_clearance_height_to_lid",
"extruder_clearance_height_to_rod",
"extruder_clearance_radius",
"extruder_printable_area",
"extruder_printable_height",
"extruder_type",
"extruder_variant_list",
"fan_kickstart",
"fan_speedup_overhangs",
"fan_speedup_time",
"file_start_gcode",
"gcode_flavor",
"grab_length",
"head_wrap_detect_zone",
"high_current_on_filament_swap",
"host_type",
"inherits",
"layer_change_gcode",
"long_retractions_when_cut",
"machine_end_gcode",
"machine_load_filament_time",
"machine_pause_gcode",
"machine_start_gcode",
"machine_tool_change_time",
"machine_unload_filament_time",
"manual_filament_change",
"master_extruder_id",
"nozzle_flush_dataset",
"nozzle_height",
"nozzle_hrc",
"nozzle_type",
"nozzle_volume",
"parking_pos_retraction",
"part_cooling_fan_min_pwm",
"pellet_modded_printer",
"physical_extruder_map",
"preferred_orientation",
"print_host",
"print_host_webui",
"printable_area",
"printable_height",
"printer_agent",
"printer_extruder_id",
"printer_extruder_variant",
"printer_model",
"printer_notes",
"printer_structure",
"printer_technology",
"printer_variant",
"printhost_apikey",
"printhost_authorization_type",
"printhost_cafile",
"printhost_password",
"printhost_port",
"printhost_ssl_ignore_revoke",
"printhost_user",
"printing_by_object_gcode",
"purge_in_prime_tower",
"retract_lift_enforce",
"retraction_distances_when_cut",
"scan_first_layer",
"silent_mode",
"single_extruder_multi_material",
"support_air_filtration",
"support_chamber_temp_control",
"support_multi_bed_types",
"support_object_skip_flush",
"template_custom_gcode",
"thumbnails",
"thumbnails_format",
"time_cost",
"time_lapse_gcode",
"tool_change_on_wipe_tower",
"travel_slope",
"upward_compatible_machine",
"use_firmware_retraction",
"use_relative_e_distances",
"wipe_tower_type",
"wrapping_detection_gcode",
"wrapping_detection_layers",
"wrapping_exclude_area",
"z_hop_types",
"z_offset",
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,999 @@
// ===== AUTO-GENERATED by tools/parse_printconfig.py =====
// DO NOT EDIT MANUALLY. Re-run tools/run_codegen.py to regenerate.
//
// Provides the basic UI layout (add_options_page / new_optgroup /
// append_single_option_line) for each settings tab.
// Include from the corresponding Tab::build() after dynamic toggle logic.
// Constants mirroring local variables from the original build functions.
namespace { constexpr int gcode_field_height = 15; }
namespace { constexpr int notes_field_height = 25; }
inline void TabPrint_build_layout(TabPrint& tab)
{
auto page = tab.add_options_page(L("Quality"), "custom-gcode_quality");
{
auto optgroup = page->new_optgroup(L("Layer height"), L"param_layer_height");
optgroup->append_single_option_line("layer_height", "quality_settings_layer_height");
optgroup->append_single_option_line("initial_layer_print_height", "quality_settings_layer_height");
}
{
auto optgroup = page->new_optgroup(L("Line width"), L"param_line_width");
optgroup->append_single_option_line("line_width", "quality_settings_line_width");
optgroup->append_single_option_line("initial_layer_line_width", "quality_settings_line_width");
optgroup->append_single_option_line("outer_wall_line_width", "quality_settings_line_width");
optgroup->append_single_option_line("inner_wall_line_width", "quality_settings_line_width");
optgroup->append_single_option_line("top_surface_line_width", "quality_settings_line_width");
optgroup->append_single_option_line("sparse_infill_line_width", "quality_settings_line_width");
optgroup->append_single_option_line("internal_solid_infill_line_width", "quality_settings_line_width");
optgroup->append_single_option_line("support_line_width", "quality_settings_line_width");
}
{
auto optgroup = page->new_optgroup(L("Seam"), L"param_seam");
optgroup->append_single_option_line("seam_position", "quality_settings_seam#seam-position");
optgroup->append_single_option_line("staggered_inner_seams", "quality_settings_seam#staggered-inner-seams");
optgroup->append_single_option_line("seam_gap", "quality_settings_seam#seam-gap");
optgroup->append_single_option_line("seam_slope_type", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("seam_slope_conditional", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("scarf_angle_threshold", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("scarf_overhang_threshold", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("scarf_joint_speed", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("seam_slope_start_height", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("seam_slope_entire_loop", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("seam_slope_min_length", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("seam_slope_steps", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("scarf_joint_flow_ratio", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("seam_slope_inner_walls", "quality_settings_seam#scarf-joint-seam");
optgroup->append_single_option_line("role_based_wipe_speed", "quality_settings_seam#role-based-wipe-speed");
optgroup->append_single_option_line("wipe_speed", "quality_settings_seam#wipe-speed");
optgroup->append_single_option_line("wipe_on_loops", "quality_settings_seam#wipe-on-loop-inward-movement");
optgroup->append_single_option_line("wipe_before_external_loop", "quality_settings_seam#wipe-before-external");
}
{
auto optgroup = page->new_optgroup(L("Precision"), L"param_precision");
optgroup->append_single_option_line("slice_closing_radius", "quality_settings_precision#slice-gap-closing-radius");
optgroup->append_single_option_line("resolution", "quality_settings_precision#resolution");
optgroup->append_single_option_line("enable_arc_fitting", "quality_settings_precision#arc-fitting");
optgroup->append_single_option_line("xy_hole_compensation", "quality_settings_precision#x-y-compensation");
optgroup->append_single_option_line("xy_contour_compensation", "quality_settings_precision#x-y-compensation");
optgroup->append_single_option_line("elefant_foot_compensation", "quality_settings_precision#elephant-foot-compensation");
optgroup->append_single_option_line("elefant_foot_layers_density", "quality_settings_precision#elephant-foot-compensation-density");
optgroup->append_single_option_line("elefant_foot_compensation_layers", "quality_settings_precision#elephant-foot-compensation");
optgroup->append_single_option_line("precise_outer_wall", "quality_settings_precision#precise-wall");
optgroup->append_single_option_line("precise_z_height", "quality_settings_precision#precise-z-height");
optgroup->append_single_option_line("hole_to_polyhole", "quality_settings_precision#polyholes");
optgroup->append_single_option_line("hole_to_polyhole_threshold", "quality_settings_precision#polyholes");
optgroup->append_single_option_line("hole_to_polyhole_twisted", "quality_settings_precision#polyholes");
}
{
auto optgroup = page->new_optgroup(L("Ironing"), L"param_ironing");
optgroup->append_single_option_line("ironing_type", "quality_settings_ironing#type");
optgroup->append_single_option_line("ironing_pattern", "quality_settings_ironing#pattern");
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-offset");
optgroup->append_single_option_line("ironing_angle_fixed", "quality_settings_ironing#fixed-angle");
optgroup->append_single_option_line("zaa_enabled", "quality_settings_z_contouring");
optgroup->append_single_option_line("zaa_minimize_perimeter_height", "quality_settings_z_contouring#minimize-wall-height-angle");
optgroup->append_single_option_line("zaa_min_z", "quality_settings_z_contouring#minimum-z-height");
optgroup->append_single_option_line("zaa_dont_alternate_fill_direction", "quality_settings_z_contouring#dont-alternate-fill-direction");
}
{
auto optgroup = page->new_optgroup(L("Wall generator"), L"param_wall_generator");
optgroup->append_single_option_line("wall_generator", "quality_settings_wall_generator");
optgroup->append_single_option_line("wall_transition_angle", "quality_settings_wall_generator#wall-transitioning-threshhold-angle");
optgroup->append_single_option_line("wall_transition_filter_deviation", "quality_settings_wall_generator#wall-transitioning-filter-margin");
optgroup->append_single_option_line("wall_transition_length", "quality_settings_wall_generator#wall-transitioning-length");
optgroup->append_single_option_line("wall_distribution_count", "quality_settings_wall_generator#wall-distribution-count");
optgroup->append_single_option_line("initial_layer_min_bead_width", "quality_settings_wall_generator#first-layer-minimum-wall-width");
optgroup->append_single_option_line("min_bead_width", "quality_settings_wall_generator#minimum-wall-width");
optgroup->append_single_option_line("min_feature_size", "quality_settings_wall_generator#minimum-feature-size");
optgroup->append_single_option_line("min_length_factor", "quality_settings_wall_generator#minimum-wall-length");
optgroup->append_single_option_line("wall_maximum_resolution", "quality_settings_wall_generator#maximum-wall-resolution");
optgroup->append_single_option_line("wall_maximum_deviation", "quality_settings_wall_generator#maximum-wall-deviation");
}
{
auto optgroup = page->new_optgroup(L("Walls and surfaces"), L"param_wall_surface");
optgroup->append_single_option_line("wall_sequence", "quality_settings_wall_and_surfaces#walls-printing-order");
optgroup->append_single_option_line("is_infill_first", "quality_settings_wall_and_surfaces#print-infill-first");
optgroup->append_single_option_line("wall_direction", "quality_settings_wall_and_surfaces#wall-loop-direction");
optgroup->append_single_option_line("print_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("top_solid_infill_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("bottom_solid_infill_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("set_other_flow_ratios", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("first_layer_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("outer_wall_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("inner_wall_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("overhang_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("sparse_infill_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("internal_solid_infill_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("gap_fill_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("support_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("support_interface_flow_ratio", "quality_settings_wall_and_surfaces#surface-flow-ratio");
optgroup->append_single_option_line("only_one_wall_first_layer", "quality_settings_wall_and_surfaces#only-one-wall");
optgroup->append_single_option_line("only_one_wall_top", "quality_settings_wall_and_surfaces#only-one-wall");
optgroup->append_single_option_line("min_width_top_surface", "quality_settings_wall_and_surfaces#threshold");
optgroup->append_single_option_line("reduce_crossing_wall", "quality_settings_wall_and_surfaces#avoid-crossing-walls");
optgroup->append_single_option_line("max_travel_detour_distance", "quality_settings_wall_and_surfaces#max-detour-length");
optgroup->append_single_option_line("small_area_infill_flow_compensation", "quality_settings_wall_and_surfaces#small-area-flow-compensation");
{
Option option = optgroup->get_option("small_area_infill_flow_compensation_model");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = 15;
optgroup->append_single_option_line(option, "quality_settings_wall_and_surfaces#small-area-flow-compensation");
}
}
{
auto optgroup = page->new_optgroup(L("Bridging"), L"param_bridge");
optgroup->append_single_option_line("bridge_flow", "quality_settings_bridging#flow-ratio");
optgroup->append_single_option_line("internal_bridge_flow", "quality_settings_bridging#flow-ratio");
optgroup->append_single_option_line("bridge_density", "quality_settings_bridging#bridge-density");
optgroup->append_single_option_line("internal_bridge_density", "quality_settings_bridging#bridge-density");
optgroup->append_single_option_line("thick_bridges", "quality_settings_bridging#thick-bridges");
optgroup->append_single_option_line("thick_internal_bridges", "quality_settings_bridging#thick-bridges");
optgroup->append_single_option_line("enable_extra_bridge_layer", "quality_settings_bridging#extra-bridge-layers");
optgroup->append_single_option_line("dont_filter_internal_bridges", "quality_settings_bridging#filter-out-small-internal-bridges");
optgroup->append_single_option_line("counterbore_hole_bridging", "quality_settings_bridging#bridge-counterbore-hole");
}
{
auto optgroup = page->new_optgroup(L("Overhangs"), L"param_overhang");
optgroup->append_single_option_line("detect_overhang_wall", "quality_settings_overhangs#detect-overhang-wall");
optgroup->append_single_option_line("make_overhang_printable", "quality_settings_overhangs#make-overhang-printable");
optgroup->append_single_option_line("make_overhang_printable_angle", "quality_settings_overhangs#maximum-angle");
optgroup->append_single_option_line("make_overhang_printable_hole_size", "quality_settings_overhangs#hole-area");
optgroup->append_single_option_line("extra_perimeters_on_overhangs", "quality_settings_overhangs#extra-perimeters-on-overhangs");
optgroup->append_single_option_line("overhang_reverse", "quality_settings_overhangs#reverse-on-even");
optgroup->append_single_option_line("overhang_reverse_internal_only", "quality_settings_overhangs#reverse-internal-only");
optgroup->append_single_option_line("overhang_reverse_threshold", "quality_settings_overhangs#reverse-threshold");
}
auto page = tab.add_options_page(L("Strength"), "custom-gcode_strength");
{
auto optgroup = page->new_optgroup(L("Walls"), L"param_wall");
optgroup->append_single_option_line("wall_loops", "strength_settings_walls#wall-loops");
optgroup->append_single_option_line("alternate_extra_wall", "strength_settings_walls#alternate-extra-wall");
optgroup->append_single_option_line("detect_thin_wall", "strength_settings_walls#detect-thin-wall");
}
{
auto optgroup = page->new_optgroup(L("Top/bottom shells"), L"param_shell");
optgroup->append_single_option_line("top_shell_layers", "strength_settings_top_bottom_shells#shell-layers");
optgroup->append_single_option_line("top_shell_thickness", "strength_settings_top_bottom_shells#shell-thickness");
optgroup->append_single_option_line("top_surface_density", "strength_settings_top_bottom_shells#surface-density");
optgroup->append_single_option_line("top_surface_pattern", "strength_settings_top_bottom_shells#surface-pattern");
optgroup->append_single_option_line("bottom_shell_layers", "strength_settings_top_bottom_shells#shell-layers");
optgroup->append_single_option_line("bottom_shell_thickness", "strength_settings_top_bottom_shells#shell-thickness");
optgroup->append_single_option_line("bottom_surface_density", "strength_settings_top_bottom_shells#surface-density");
optgroup->append_single_option_line("bottom_surface_pattern", "strength_settings_top_bottom_shells#surface-pattern");
optgroup->append_single_option_line("top_bottom_infill_wall_overlap", "strength_settings_top_bottom_shells#infillwall-overlap");
}
{
auto optgroup = page->new_optgroup(L("Infill"), L"param_infill");
optgroup->append_single_option_line("sparse_infill_density", "strength_settings_infill#sparse-infill-density");
optgroup->append_single_option_line("fill_multiline", "strength_settings_infill#fill-multiline");
optgroup->append_single_option_line("sparse_infill_pattern", "strength_settings_infill#sparse-infill-pattern");
optgroup->append_single_option_line("gyroid_optimized", "strength_settings_patterns#gyroid-optimized");
optgroup->append_single_option_line("infill_direction", "strength_settings_infill#direction");
optgroup->append_single_option_line("sparse_infill_rotate_template", "strength_settings_infill_rotation_template_metalanguage");
optgroup->append_single_option_line("skin_infill_density", "strength_settings_patterns#locked-zag");
optgroup->append_single_option_line("skeleton_infill_density", "strength_settings_patterns#locked-zag");
optgroup->append_single_option_line("infill_lock_depth", "strength_settings_patterns#locked-zag");
optgroup->append_single_option_line("skin_infill_depth", "strength_settings_patterns#locked-zag");
optgroup->append_single_option_line("skin_infill_line_width", "strength_settings_patterns#locked-zag");
optgroup->append_single_option_line("skeleton_infill_line_width", "strength_settings_patterns#locked-zag");
optgroup->append_single_option_line("symmetric_infill_y_axis", "strength_settings_infill#symmetric-infill-y-axis");
optgroup->append_single_option_line("infill_shift_step", "strength_settings_patterns#cross-hatch");
optgroup->append_single_option_line("lateral_lattice_angle_1", "strength_settings_patterns#lateral-lattice");
optgroup->append_single_option_line("lateral_lattice_angle_2", "strength_settings_patterns#lateral-lattice");
optgroup->append_single_option_line("infill_overhang_angle", "strength_settings_patterns#lateral-honeycomb");
optgroup->append_single_option_line("infill_anchor_max", "strength_settings_infill#anchor");
optgroup->append_single_option_line("infill_anchor", "strength_settings_infill#anchor");
optgroup->append_single_option_line("internal_solid_infill_pattern", "strength_settings_infill#internal-solid-infill");
optgroup->append_single_option_line("solid_infill_direction", "strength_settings_infill#direction");
optgroup->append_single_option_line("solid_infill_rotate_template", "strength_settings_infill_rotation_template_metalanguage");
optgroup->append_single_option_line("gap_fill_target", "strength_settings_infill#apply-gap-fill");
optgroup->append_single_option_line("filter_out_gap_fill", "strength_settings_infill#filter-out-tiny-gaps");
optgroup->append_single_option_line("infill_wall_overlap", "strength_settings_infill#infill-wall-overlap");
}
{
auto optgroup = page->new_optgroup(L("Advanced"), L"param_advanced");
optgroup->append_single_option_line("align_infill_direction_to_model", "strength_settings_advanced#align-infill-direction-to-model");
optgroup->append_single_option_line("extra_solid_infills", "strength_settings_infill#extra-solid-infill");
optgroup->append_single_option_line("bridge_angle", "strength_settings_advanced#bridge-infill-direction");
optgroup->append_single_option_line("internal_bridge_angle", "strength_settings_advanced#bridge-infill-direction");
optgroup->append_single_option_line("minimum_sparse_infill_area", "strength_settings_advanced#minimum-sparse-infill-threshold");
optgroup->append_single_option_line("infill_combination", "strength_settings_advanced#infill-combination");
optgroup->append_single_option_line("infill_combination_max_layer_height", "strength_settings_advanced#max-layer-height");
optgroup->append_single_option_line("detect_narrow_internal_solid_infill", "strength_settings_advanced#detect-narrow-internal-solid-infill");
optgroup->append_single_option_line("ensure_vertical_shell_thickness", "strength_settings_advanced#ensure-vertical-shell-thickness");
}
auto page = tab.add_options_page(L("Speed"), "custom-gcode_speed");
{
auto optgroup = page->new_optgroup(L("First layer speed"), L"param_speed_first", 15);
optgroup->append_single_option_line("initial_layer_speed", "speed_settings_initial_layer_speed#initial-layer");
optgroup->append_single_option_line("initial_layer_infill_speed", "speed_settings_initial_layer_speed#initial-layer-infill");
optgroup->append_single_option_line("initial_layer_travel_speed", "speed_settings_initial_layer_speed#initial-layer-travel-speed");
optgroup->append_single_option_line("slow_down_layers", "speed_settings_initial_layer_speed#number-of-slow-layers");
}
{
auto optgroup = page->new_optgroup(L("Other layers speed"), L"param_speed", 15);
optgroup->append_single_option_line("outer_wall_speed", "speed_settings_other_layers_speed#outer-wall");
optgroup->append_single_option_line("inner_wall_speed", "speed_settings_other_layers_speed#inner-wall");
optgroup->append_single_option_line("small_perimeter_speed", "speed_settings_other_layers_speed#small-perimeters");
optgroup->append_single_option_line("small_perimeter_threshold", "speed_settings_other_layers_speed#small-perimeters-threshold");
optgroup->append_single_option_line("sparse_infill_speed", "speed_settings_other_layers_speed#sparse-infill");
optgroup->append_single_option_line("internal_solid_infill_speed", "speed_settings_other_layers_speed#internal-solid-infill");
optgroup->append_single_option_line("top_surface_speed", "speed_settings_other_layers_speed#top-surface");
optgroup->append_single_option_line("gap_infill_speed", "speed_settings_other_layers_speed#gap-infill");
optgroup->append_single_option_line("ironing_speed", "speed_settings_other_layers_speed#ironing-speed");
optgroup->append_single_option_line("support_speed", "speed_settings_other_layers_speed#support");
optgroup->append_single_option_line("support_interface_speed", "speed_settings_other_layers_speed#support-interface");
}
{
auto optgroup = page->new_optgroup(L("Overhang speed"), L"param_overhang_speed", 15);
optgroup->append_single_option_line("enable_overhang_speed", "speed_settings_overhang_speed#slow-down-for-overhang");
optgroup->append_single_option_line("slowdown_for_curled_perimeters", "speed_settings_overhang_speed#slow-down-for-curled-perimeters");
{
Line line = {L("Overhang speed"), L("This is the speed for various overhang degrees. Overhang degrees are expressed as a percentage of line width. 0 speed means no slowing down for the overhang degree range and wall speed is used")};
line.label_path = "speed_settings_overhang_speed#speed";
line.append_option(optgroup->get_option("overhang_1_4_speed"));
line.append_option(optgroup->get_option("overhang_2_4_speed"));
line.append_option(optgroup->get_option("overhang_3_4_speed"));
line.append_option(optgroup->get_option("overhang_4_4_speed"));
optgroup->append_line(line);
}
optgroup->append_separator();
{
Line line = {L("Bridge"), L("Set speed for external and internal bridges")};
line.append_option(optgroup->get_option("bridge_speed"));
line.append_option(optgroup->get_option("internal_bridge_speed"));
optgroup->append_line(line);
}
}
{
auto optgroup = page->new_optgroup(L("Travel speed"), L"param_travel_speed", 15);
optgroup->append_single_option_line("travel_speed", "speed_settings_travel");
}
{
auto optgroup = page->new_optgroup(L("Acceleration"), L"param_acceleration", 15);
optgroup->append_single_option_line("default_acceleration", "speed_settings_acceleration#normal-printing");
optgroup->append_single_option_line("outer_wall_acceleration", "speed_settings_acceleration#outer-wall");
optgroup->append_single_option_line("inner_wall_acceleration", "speed_settings_acceleration#inner-wall");
optgroup->append_single_option_line("bridge_acceleration", "speed_settings_acceleration#bridge");
optgroup->append_single_option_line("sparse_infill_acceleration", "speed_settings_acceleration#sparse-infill");
optgroup->append_single_option_line("internal_solid_infill_acceleration", "speed_settings_acceleration#internal-solid-infill");
optgroup->append_single_option_line("initial_layer_acceleration", "speed_settings_acceleration#initial-layer");
optgroup->append_single_option_line("initial_layer_travel_acceleration", "speed_settings_acceleration#initial-layer-travel");
optgroup->append_single_option_line("top_surface_acceleration", "speed_settings_acceleration#top-surface");
optgroup->append_single_option_line("travel_acceleration", "speed_settings_acceleration#travel");
optgroup->append_single_option_line("accel_to_decel_enable", "speed_settings_acceleration");
optgroup->append_single_option_line("accel_to_decel_factor", "speed_settings_acceleration");
}
{
auto optgroup = page->new_optgroup(L("Jerk(XY)"), L"param_jerk", 15);
optgroup->append_single_option_line("default_junction_deviation", "speed_settings_jerk_xy#junction-deviation");
optgroup->append_single_option_line("default_jerk", "speed_settings_jerk_xy#default");
optgroup->append_single_option_line("outer_wall_jerk", "speed_settings_jerk_xy#outer-wall");
optgroup->append_single_option_line("inner_wall_jerk", "speed_settings_jerk_xy#inner-wall");
optgroup->append_single_option_line("infill_jerk", "speed_settings_jerk_xy#infill");
optgroup->append_single_option_line("top_surface_jerk", "speed_settings_jerk_xy#top-surface");
optgroup->append_single_option_line("initial_layer_jerk", "speed_settings_jerk_xy#initial-layer");
optgroup->append_single_option_line("initial_layer_travel_jerk", "speed_settings_jerk_xy#initial-layer-travel");
optgroup->append_single_option_line("travel_jerk", "speed_settings_jerk_xy#travel");
}
{
auto optgroup = page->new_optgroup(L("Advanced"), L"param_advanced", 15);
optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope", "speed_settings_advanced");
optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_segment_length", "speed_settings_advanced");
optgroup->append_single_option_line("extrusion_rate_smoothing_external_perimeter_only", "speed_settings_advanced");
}
auto page = tab.add_options_page(L("Support"), "custom-gcode_support");
{
auto optgroup = page->new_optgroup(L("Support"), L"param_support");
optgroup->append_single_option_line("enable_support", "support_settings_support");
optgroup->append_single_option_line("support_type", "support_settings_support#type");
optgroup->append_single_option_line("support_style", "support_settings_support#style");
optgroup->append_single_option_line("support_threshold_angle", "support_settings_support#threshold-angle");
optgroup->append_single_option_line("support_threshold_overlap", "support_settings_support#threshold-overlap");
optgroup->append_single_option_line("raft_first_layer_density", "support_settings_support#initial-layer-density");
optgroup->append_single_option_line("raft_first_layer_expansion", "support_settings_support#initial-layer-expansion");
optgroup->append_single_option_line("support_on_build_plate_only", "support_settings_support#on-build-plate-only");
optgroup->append_single_option_line("support_critical_regions_only", "support_settings_support#support-critical-regions-only");
optgroup->append_single_option_line("support_remove_small_overhang", "support_settings_support#ignore-small-overhangs");
}
{
auto optgroup = page->new_optgroup(L("Raft"), L"param_raft");
optgroup->append_single_option_line("raft_layers", "support_settings_raft");
optgroup->append_single_option_line("raft_contact_distance", "support_settings_raft");
}
{
auto optgroup = page->new_optgroup(L("Support filament"), L"param_support_filament");
optgroup->append_single_option_line("support_filament", "support_settings_filament#base");
optgroup->append_single_option_line("support_interface_filament", "support_settings_filament#interface");
optgroup->append_single_option_line("support_interface_not_for_body", "support_settings_filament#avoid-interface-filament-for-base");
}
{
auto optgroup = page->new_optgroup(L("Support ironing"), L"param_ironing");
optgroup->append_single_option_line("support_ironing", "support_settings_ironing");
optgroup->append_single_option_line("support_ironing_pattern", "support_settings_ironing#pattern");
optgroup->append_single_option_line("support_ironing_flow", "support_settings_ironing#flow");
optgroup->append_single_option_line("support_ironing_spacing", "support_settings_ironing#line-spacing");
}
{
auto optgroup = page->new_optgroup(L("Advanced"), L"param_advanced");
optgroup->append_single_option_line("support_top_z_distance", "support_settings_advanced#z-distance");
optgroup->append_single_option_line("support_bottom_z_distance", "support_settings_advanced#z-distance");
optgroup->append_single_option_line("tree_support_wall_count", "support_settings_advanced#support-wall-loops");
optgroup->append_single_option_line("support_base_pattern", "support_settings_advanced#base-pattern");
optgroup->append_single_option_line("support_base_pattern_spacing", "support_settings_advanced#base-pattern-spacing");
optgroup->append_single_option_line("support_angle", "support_settings_advanced#pattern-angle");
optgroup->append_single_option_line("support_interface_top_layers", "support_settings_advanced#interface-layers");
optgroup->append_single_option_line("support_interface_bottom_layers", "support_settings_advanced#interface-layers");
optgroup->append_single_option_line("support_interface_pattern", "support_settings_advanced#interface-pattern");
optgroup->append_single_option_line("support_interface_spacing", "support_settings_advanced#interface-spacing");
optgroup->append_single_option_line("support_bottom_interface_spacing", "support_settings_advanced#interface-spacing");
optgroup->append_single_option_line("support_expansion", "support_settings_advanced#normal-support-expansion");
optgroup->append_single_option_line("support_object_xy_distance", "support_settings_advanced#supportobject-xy-distance");
optgroup->append_single_option_line("support_object_first_layer_gap", "support_settings_advanced#supportobject-first-layer-gap");
optgroup->append_single_option_line("bridge_no_support", "support_settings_advanced#dont-support-bridges");
optgroup->append_single_option_line("max_bridge_length", "support_settings_advanced");
optgroup->append_single_option_line("independent_support_layer_height", "support_settings_advanced#independent-support-layer-height");
}
{
auto optgroup = page->new_optgroup(L("Tree supports"), L"param_support_tree");
optgroup->append_single_option_line("tree_support_tip_diameter", "support_settings_tree#tip-diameter");
optgroup->append_single_option_line("tree_support_branch_distance", "support_settings_tree#branch-distance");
optgroup->append_single_option_line("tree_support_branch_distance_organic", "support_settings_tree#branch-distance");
optgroup->append_single_option_line("tree_support_top_rate", "support_settings_tree#branch-density");
optgroup->append_single_option_line("tree_support_branch_diameter", "support_settings_tree#branch-diameter");
optgroup->append_single_option_line("tree_support_branch_diameter_organic", "support_settings_tree#branch-diameter");
optgroup->append_single_option_line("tree_support_branch_diameter_angle", "support_settings_tree#branch-diameter-angle");
optgroup->append_single_option_line("tree_support_branch_angle", "support_settings_tree#branch-angle");
optgroup->append_single_option_line("tree_support_branch_angle_organic", "support_settings_tree#branch-angle");
optgroup->append_single_option_line("tree_support_angle_slow", "support_settings_tree#preferred-branch-angle");
optgroup->append_single_option_line("tree_support_auto_brim", "support_settings_tree");
optgroup->append_single_option_line("tree_support_brim_width", "support_settings_tree");
}
auto page = tab.add_options_page(L("Multimaterial"), "custom-gcode_multi_material");
{
auto optgroup = page->new_optgroup(L("Prime tower"), L"param_tower");
optgroup->append_single_option_line("enable_prime_tower", "multimaterial_settings_prime_tower");
optgroup->append_single_option_line("prime_tower_skip_points", "multimaterial_settings_prime_tower");
optgroup->append_single_option_line("enable_tower_interface_features", "multimaterial_settings_prime_tower");
optgroup->append_single_option_line("enable_tower_interface_cooldown_during_tower", "multimaterial_settings_prime_tower");
optgroup->append_single_option_line("prime_tower_enable_framework", "multimaterial_settings_prime_tower");
optgroup->append_single_option_line("prime_tower_width", "multimaterial_settings_prime_tower#width");
optgroup->append_single_option_line("prime_volume", "multimaterial_settings_prime_tower");
optgroup->append_single_option_line("prime_tower_brim_width", "multimaterial_settings_prime_tower#brim-width");
optgroup->append_single_option_line("prime_tower_infill_gap", "multimaterial_settings_prime_tower");
optgroup->append_single_option_line("wipe_tower_rotation_angle", "multimaterial_settings_prime_tower#wipe-tower-rotation-angle");
optgroup->append_single_option_line("wipe_tower_bridging", "multimaterial_settings_prime_tower#maximal-bridging-distance");
optgroup->append_single_option_line("wipe_tower_extra_spacing", "multimaterial_settings_prime_tower#wipe-tower-purge-lines-spacing");
optgroup->append_single_option_line("wipe_tower_extra_flow", "multimaterial_settings_prime_tower#extra-flow-for-purge");
optgroup->append_single_option_line("wipe_tower_max_purge_speed", "multimaterial_settings_prime_tower#maximum-wipe-tower-print-speed");
optgroup->append_single_option_line("wipe_tower_wall_type", "multimaterial_settings_prime_tower#wall-type");
optgroup->append_single_option_line("wipe_tower_cone_angle", "multimaterial_settings_prime_tower#stabilization-cone-apex-angle");
optgroup->append_single_option_line("wipe_tower_extra_rib_length", "multimaterial_settings_prime_tower#extra-rib-length");
optgroup->append_single_option_line("wipe_tower_rib_width", "multimaterial_settings_prime_tower#rib-width");
optgroup->append_single_option_line("wipe_tower_fillet_wall", "multimaterial_settings_prime_tower#fillet-wall");
optgroup->append_single_option_line("wipe_tower_no_sparse_layers", "multimaterial_settings_prime_tower#no-sparse-layers");
optgroup->append_single_option_line("single_extruder_multi_material_priming", "multimaterial_settings_prime_tower");
}
{
auto optgroup = page->new_optgroup(L("Filament for Features"), L"param_filament_for_features");
optgroup->append_single_option_line("wall_filament", "multimaterial_settings_filament_for_features#walls");
optgroup->append_single_option_line("sparse_infill_filament", "multimaterial_settings_filament_for_features#infill");
optgroup->append_single_option_line("solid_infill_filament", "multimaterial_settings_filament_for_features#solid-infill");
optgroup->append_single_option_line("wipe_tower_filament", "multimaterial_settings_filament_for_features#wipe-tower");
}
{
auto optgroup = page->new_optgroup(L("Ooze prevention"), L"param_ooze_prevention");
optgroup->append_single_option_line("ooze_prevention", "multimaterial_settings_ooze_prevention");
optgroup->append_single_option_line("standby_temperature_delta", "multimaterial_settings_ooze_prevention#temperature-variation");
optgroup->append_single_option_line("preheat_time", "multimaterial_settings_ooze_prevention#preheat-time");
optgroup->append_single_option_line("preheat_steps", "multimaterial_settings_ooze_prevention#preheat-steps");
}
{
auto optgroup = page->new_optgroup(L("Flush options"), L"param_flush");
optgroup->append_single_option_line("flush_into_infill", "multimaterial_settings_flush_options#flush-into-objects-infill");
optgroup->append_single_option_line("flush_into_objects", "multimaterial_settings_flush_options");
optgroup->append_single_option_line("flush_into_support", "multimaterial_settings_flush_options#flush-into-objects-support");
}
{
auto optgroup = page->new_optgroup(L("Advanced"), L"advanced");
optgroup->append_single_option_line("interlocking_beam", "multimaterial_settings_advanced#interlocking-beam");
optgroup->append_single_option_line("interface_shells", "multimaterial_settings_advanced#interface-shells");
optgroup->append_single_option_line("mmu_segmented_region_max_width", "multimaterial_settings_advanced#maximum-width-of-segmented-region");
optgroup->append_single_option_line("mmu_segmented_region_interlocking_depth", "multimaterial_settings_advanced#interlocking-depth-of-segmented-region");
optgroup->append_single_option_line("interlocking_beam_width", "multimaterial_settings_advanced#interlocking-beam-width");
optgroup->append_single_option_line("interlocking_orientation", "multimaterial_settings_advanced#interlocking-direction");
optgroup->append_single_option_line("interlocking_beam_layer_count", "multimaterial_settings_advanced#interlocking-beam-layers");
optgroup->append_single_option_line("interlocking_depth", "multimaterial_settings_advanced#interlocking-depth");
optgroup->append_single_option_line("interlocking_boundary_avoidance", "multimaterial_settings_advanced#interlocking-boundary-avoidance");
}
auto page = tab.add_options_page(L("Others"), "custom-gcode_other");
{
auto optgroup = page->new_optgroup(L("Skirt"), L"param_skirt");
optgroup->append_single_option_line("skirt_loops", "others_settings_skirt#loops");
optgroup->append_single_option_line("skirt_type", "others_settings_skirt#type");
optgroup->append_single_option_line("min_skirt_length", "others_settings_skirt#minimum-extrusion-length");
optgroup->append_single_option_line("skirt_distance", "others_settings_skirt#distance");
optgroup->append_single_option_line("skirt_start_angle", "others_settings_skirt#start-point");
optgroup->append_single_option_line("skirt_speed", "others_settings_skirt#speed");
optgroup->append_single_option_line("skirt_height", "others_settings_skirt#height");
optgroup->append_single_option_line("draft_shield", "others_settings_skirt#shield");
optgroup->append_single_option_line("single_loop_draft_shield", "others_settings_skirt#single-loop-after-first-layer");
}
{
auto optgroup = page->new_optgroup(L("Brim"), L"param_adhension");
optgroup->append_single_option_line("brim_type", "others_settings_brim#type");
optgroup->append_single_option_line("brim_width", "others_settings_brim#width");
optgroup->append_single_option_line("brim_object_gap", "others_settings_brim#brim-object-gap");
optgroup->append_single_option_line("brim_flow_ratio", "others_settings_brim#brim-flow-ratio");
optgroup->append_single_option_line("brim_use_efc_outline", "others_settings_brim#brim-use-efc-outline");
optgroup->append_single_option_line("combine_brims", "others_settings_brim#combine-brims");
optgroup->append_single_option_line("brim_ears_max_angle", "others_settings_brim#ear-max-angle");
optgroup->append_single_option_line("brim_ears_detection_length", "others_settings_brim#ear-detection-radius");
}
{
auto optgroup = page->new_optgroup(L("Special mode"), L"param_special");
optgroup->append_single_option_line("slicing_mode", "others_settings_special_mode#slicing-mode");
optgroup->append_single_option_line("print_sequence", "others_settings_special_mode#print-sequence");
optgroup->append_single_option_line("print_order", "others_settings_special_mode#intra-layer-order");
optgroup->append_single_option_line("spiral_mode", "others_settings_special_mode#spiral-vase");
optgroup->append_single_option_line("spiral_mode_smooth", "others_settings_special_mode#smooth-spiral");
optgroup->append_single_option_line("spiral_mode_max_xy_smoothing", "others_settings_special_mode#max-xy-smoothing");
optgroup->append_single_option_line("spiral_starting_flow_ratio", "others_settings_special_mode#spiral-starting-flow-ratio");
optgroup->append_single_option_line("spiral_finishing_flow_ratio", "others_settings_special_mode#spiral-finishing-flow-ratio");
optgroup->append_single_option_line("timelapse_type", "others_settings_special_mode#timelapse");
optgroup->append_single_option_line("enable_wrapping_detection");
}
{
auto optgroup = page->new_optgroup(L("Fuzzy Skin"), L"fuzzy_skin");
optgroup->append_single_option_line("fuzzy_skin", "others_settings_fuzzy_skin");
optgroup->append_single_option_line("fuzzy_skin_mode", "others_settings_fuzzy_skin#fuzzy-skin-mode");
optgroup->append_single_option_line("fuzzy_skin_noise_type", "others_settings_fuzzy_skin#noise-type");
optgroup->append_single_option_line("fuzzy_skin_point_distance", "others_settings_fuzzy_skin#point-distance");
optgroup->append_single_option_line("fuzzy_skin_thickness", "others_settings_fuzzy_skin#skin-thickness");
optgroup->append_single_option_line("fuzzy_skin_scale", "others_settings_fuzzy_skin#skin-feature-size");
optgroup->append_single_option_line("fuzzy_skin_octaves", "others_settings_fuzzy_skin#skin-noise-octaves");
optgroup->append_single_option_line("fuzzy_skin_persistence", "others_settings_fuzzy_skin#skin-noise-persistence");
optgroup->append_single_option_line("fuzzy_skin_ripples_per_layer", "others_settings_fuzzy_skin#ripples-per-layer");
optgroup->append_single_option_line("fuzzy_skin_ripple_offset", "others_settings_fuzzy_skin#ripple-offset");
optgroup->append_single_option_line("fuzzy_skin_layers_between_ripple_offset", "others_settings_fuzzy_skin#layers-between-ripple-offset");
optgroup->append_single_option_line("fuzzy_skin_first_layer", "others_settings_fuzzy_skin#apply-fuzzy-skin-to-first-layer");
}
{
auto optgroup = page->new_optgroup(L("G-code output"), L"param_gcode");
optgroup->append_single_option_line("reduce_infill_retraction", "others_settings_g_code_output#reduce-infill-retraction");
optgroup->append_single_option_line("gcode_add_line_number", "others_settings_g_code_output#add-line-number");
optgroup->append_single_option_line("gcode_comments", "others_settings_g_code_output#verbose-g-code");
optgroup->append_single_option_line("gcode_label_objects", "others_settings_g_code_output#label-objects");
optgroup->append_single_option_line("exclude_object", "others_settings_g_code_output#exclude-objects");
{
Option option = optgroup->get_option("filename_format");
option.opt.is_code = true;
option.opt.multiline = true;
optgroup->append_single_option_line(option, "others_settings_g_code_output#filename-format");
}
}
{
auto optgroup = page->new_optgroup(L("Change extrusion role G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("process_change_extrusion_role_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = 15;
optgroup->append_single_option_line(option);
}
}
{
auto optgroup = page->new_optgroup(L("Post-processing Scripts"), L"param_gcode", 0);
{
Option option = optgroup->get_option("post_process");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = 15;
optgroup->append_single_option_line(option, "others_settings_post_processing_scripts");
}
}
{
auto optgroup = page->new_optgroup(L("Notes"), L"note", 0);
{
Option option = optgroup->get_option("notes");
option.opt.full_width = true;
option.opt.height = 25;
optgroup->append_single_option_line(option, "others_settings_notes");
}
}
}
inline void TabFilament_build_layout(TabFilament& tab)
{
auto page = tab.add_options_page(L("Filament"), "custom-gcode_filament");
{
auto optgroup = page->new_optgroup(L("Basic information"), L"param_information");
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->append_single_option_line("filament_type", "material_basic_information#type");
optgroup->append_single_option_line("filament_vendor", "material_basic_information#vendor");
optgroup->append_single_option_line("filament_soluble", "material_basic_information#soluble-material");
optgroup->append_single_option_line("filament_is_support", "material_basic_information#support-material");
optgroup->append_single_option_line("filament_change_length", "material_basic_information#filament-ramming-length");
optgroup->append_single_option_line("required_nozzle_HRC", "material_basic_information#required-nozzle-hrc");
optgroup->append_single_option_line("default_filament_colour", "material_basic_information#default-color");
optgroup->append_single_option_line("filament_diameter", "material_basic_information#diameter");
optgroup->append_single_option_line("filament_adhesiveness_category", "material_basic_information#adhesiveness-category");
optgroup->append_single_option_line("filament_density", "material_basic_information#density");
optgroup->append_single_option_line("filament_shrink", "material_basic_information#shrinkage-xy");
optgroup->append_single_option_line("filament_shrinkage_compensation_z", "material_basic_information#shrinkage-z");
optgroup->append_single_option_line("filament_cost", "material_basic_information#price");
optgroup->append_single_option_line("temperature_vitrification", "material_basic_information#softening-temperature");
optgroup->append_single_option_line("idle_temperature", "material_basic_information#idle-temperature");
{
Line line = {L("Recommended nozzle temperature"), L("Recommended nozzle temperature range of this filament. 0 means no set")};
line.append_option(optgroup->get_option("nozzle_temperature_range_low"));
line.append_option(optgroup->get_option("nozzle_temperature_range_high"));
optgroup->append_line(line);
}
}
{
auto optgroup = page->new_optgroup(L("Flow ratio and Pressure Advance"), L"param_flow_ratio_and_pressure_advance");
optgroup->append_single_option_line("pellet_flow_coefficient", "printer_basic_information_advanced#pellet-modded-printer");
optgroup->append_single_option_line("filament_flow_ratio", "material_flow_ratio_and_pressure_advance#flow-ratio");
optgroup->append_single_option_line("enable_pressure_advance", "material_flow_ratio_and_pressure_advance#pressure-advance");
optgroup->append_single_option_line("pressure_advance", "material_flow_ratio_and_pressure_advance#pressure-advance");
optgroup->append_single_option_line("adaptive_pressure_advance", "material_flow_ratio_and_pressure_advance#enable-adaptive-pressure-advance-beta");
optgroup->append_single_option_line("adaptive_pressure_advance_overhangs", "material_flow_ratio_and_pressure_advance#enable-adaptive-pressure-advance-for-overhangs-beta");
optgroup->append_single_option_line("adaptive_pressure_advance_bridges", "material_flow_ratio_and_pressure_advance#pressure-advance-for-bridges");
{
Option option = optgroup->get_option("adaptive_pressure_advance_model");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = 15;
optgroup->append_single_option_line(option);
}
}
{
auto optgroup = page->new_optgroup(L("Print chamber temperature"), L"param_chamber_temp");
optgroup->append_single_option_line("activate_chamber_temp_control", "material_temperatures#print-chamber-temperature");
optgroup->append_single_option_line("chamber_temperature", "material_temperatures#print-chamber-temperature");
}
{
auto optgroup = page->new_optgroup(L("Print temperature"), L"param_extruder_temp");
{
Line line = {L("Nozzle"), L("Nozzle temperature when printing")};
line.label_path = "material_temperatures#nozzle";
line.append_option(optgroup->get_option("nozzle_temperature_initial_layer"));
line.append_option(optgroup->get_option("nozzle_temperature"));
optgroup->append_line(line);
}
}
{
auto optgroup = page->new_optgroup(L("Bed temperature"), L"param_bed_temp");
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
}
{
auto optgroup = page->new_optgroup(L("Volumetric speed limitation"), L"param_volumetric_speed");
optgroup->append_single_option_line("filament_adaptive_volumetric_speed", "material_volumetric_speed_limitation#adaptive-volumetric-speed");
optgroup->append_single_option_line("filament_max_volumetric_speed", "material_volumetric_speed_limitation#max-volumetric-speed");
}
auto page = tab.add_options_page(L("Cooling"), "custom-gcode_cooling_fan");
{
auto optgroup = page->new_optgroup(L("Cooling for specific layer"), L"param_cooling_specific_layer");
optgroup->append_single_option_line("close_fan_the_first_x_layers", "material_cooling#no-cooling-for-the-first");
optgroup->append_single_option_line("full_fan_speed_layer", "material_cooling#full-fan-speed-at-layer");
}
{
auto optgroup = page->new_optgroup(L("Part cooling fan"), L"param_cooling_part_fan");
{
Line line = {L("Min fan speed threshold"), L("Part cooling fan speed will start to run at min speed when the estimated layer time is no longer than the layer time in setting. When layer time is shorter than threshold, fan speed is interpolated between the minimum and maximum fan speed according to layer printing time")};
line.label_path = "material_cooling#material-part-cooling-fan";
line.append_option(optgroup->get_option("fan_min_speed"));
line.append_option(optgroup->get_option("fan_cooling_layer_time"));
optgroup->append_line(line);
}
{
Line line = {L("Max fan speed threshold"), L("Part cooling fan speed will be max when the estimated layer time is shorter than the setting value")};
line.label_path = "material_cooling#material-part-cooling-fan";
line.append_option(optgroup->get_option("fan_max_speed"));
line.append_option(optgroup->get_option("slow_down_layer_time"));
optgroup->append_line(line);
}
optgroup->append_single_option_line("reduce_fan_stop_start_freq", "material_cooling#keep-fan-always-on");
optgroup->append_single_option_line("slow_down_for_layer_cooling", "material_cooling#slow-printing-down-for-better-layer-cooling");
optgroup->append_single_option_line("dont_slow_down_outer_wall", "material_cooling#dont-slow-down-outer-walls");
optgroup->append_single_option_line("slow_down_min_speed", "material_cooling#min-print-speed");
optgroup->append_single_option_line("enable_overhang_bridge_fan", "material_cooling#force-cooling-for-overhangs-and-bridges");
optgroup->append_single_option_line("overhang_fan_threshold", "material_cooling#overhang-cooling-activation-threshold");
optgroup->append_single_option_line("overhang_fan_speed", "material_cooling#overhangs-and-external-bridges-fan-speed");
optgroup->append_single_option_line("internal_bridge_fan_speed", "material_cooling#internal-bridges-fan-speed");
optgroup->append_single_option_line("support_material_interface_fan_speed", "material_cooling#support-interface-fan-speed");
optgroup->append_single_option_line("ironing_fan_speed", "material_cooling#ironing-fan-speed");
}
{
auto optgroup = page->new_optgroup(L("Auxiliary part cooling fan"), L"param_cooling_aux_fan");
optgroup->append_single_option_line("additional_cooling_fan_speed", "material_cooling#auxiliary-part-cooling-fan");
}
{
auto optgroup = page->new_optgroup(L("Exhaust fan"), L"param_cooling_exhaust");
optgroup->append_single_option_line("activate_air_filtration", "material_cooling#activate-air-filtration");
}
auto page = tab.add_options_page(L("Advanced"), "custom-gcode_advanced");
{
auto optgroup = page->new_optgroup(L("Filament start G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("filament_start_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option);
}
}
{
auto optgroup = page->new_optgroup(L("Change extrusion role G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("filament_change_extrusion_role_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option);
}
}
{
auto optgroup = page->new_optgroup(L("Filament end G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("filament_end_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option);
}
}
auto page = tab.add_options_page(L("Multimaterial"), "custom-gcode_multi_material");
{
auto optgroup = page->new_optgroup(L("Wipe tower parameters"), L"param_tower");
optgroup->append_single_option_line("filament_minimal_purge_on_wipe_tower", "material_multimaterial#multimaterial-wipe-tower-parameters");
optgroup->append_single_option_line("filament_tower_interface_pre_extrusion_dist", "material_multimaterial#multimaterial-wipe-tower-parameters");
optgroup->append_single_option_line("filament_tower_interface_pre_extrusion_length", "material_multimaterial#multimaterial-wipe-tower-parameters");
optgroup->append_single_option_line("filament_tower_ironing_area", "material_multimaterial#multimaterial-wipe-tower-parameters");
optgroup->append_single_option_line("filament_tower_interface_purge_volume", "material_multimaterial#multimaterial-wipe-tower-parameters");
optgroup->append_single_option_line("filament_tower_interface_print_temp", "material_multimaterial#multimaterial-wipe-tower-parameters");
}
{
auto optgroup = page->new_optgroup(L("Multi Filament"));
optgroup->append_single_option_line("long_retractions_when_ec", "material_multimaterial#multi-filament");
optgroup->append_single_option_line("retraction_distances_when_ec", "material_multimaterial#multi-filament");
}
{
auto optgroup = page->new_optgroup(L("Tool change parameters with single extruder MM printers"), L"param_toolchange");
optgroup->append_single_option_line("filament_loading_speed_start", "material_multimaterial#loading-speed-at-the-start");
optgroup->append_single_option_line("filament_loading_speed", "material_multimaterial#loading-speed");
optgroup->append_single_option_line("filament_unloading_speed_start", "material_multimaterial#unloading-speed-at-the-start");
optgroup->append_single_option_line("filament_unloading_speed", "material_multimaterial#unloading-speed");
optgroup->append_single_option_line("filament_toolchange_delay", "material_multimaterial#delay-after-unloading");
optgroup->append_single_option_line("filament_cooling_moves", "material_multimaterial#number-of-cooling-moves");
optgroup->append_single_option_line("filament_cooling_initial_speed", "material_multimaterial#speed-of-the-first-cooling-move");
optgroup->append_single_option_line("filament_cooling_final_speed", "material_multimaterial#speed-of-the-last-cooling-move");
optgroup->append_single_option_line("filament_stamping_loading_speed", "material_multimaterial#stamping-loading-speed");
optgroup->append_single_option_line("filament_stamping_distance", "material_multimaterial#stamping-distance");
}
{
auto optgroup = page->new_optgroup(L("Tool change parameters with multi extruder MM printers"), L"param_toolchange_multi_extruder");
optgroup->append_single_option_line("filament_multitool_ramming", "material_multimaterial#tool-change-parameters-with-multi-extruder");
optgroup->append_single_option_line("filament_multitool_ramming_volume", "material_multimaterial#multi-tool-ramming-volume");
optgroup->append_single_option_line("filament_multitool_ramming_flow", "material_multimaterial#multi-tool-ramming-flow");
}
auto page = tab.add_options_page(L("Dependencies"), "advanced");
{
auto optgroup = page->new_optgroup(L("Compatible printers"), L"param_dependencies_printers");
{
Option option = optgroup->get_option("compatible_printers_condition");
option.opt.full_width = true;
optgroup->append_single_option_line(option, "material_dependencies#compatible-printers");
}
}
{
auto optgroup = page->new_optgroup(L("Compatible process profiles"), L"param_dependencies_presets");
{
Option option = optgroup->get_option("compatible_prints_condition");
option.opt.full_width = true;
optgroup->append_single_option_line(option, "material_dependencies#compatible-process-profiles");
}
}
auto page = tab.add_options_page(L("Notes"), "custom-gcode_note");
{
auto optgroup = page->new_optgroup(L("Notes"), L"note", 0);
{
Option option = optgroup->get_option("filament_notes");
option.opt.full_width = true;
option.opt.height = notes_field_height;
optgroup->append_single_option_line(option);
}
}
}
inline void TabPrinter_build_fff_layout(TabPrinter& tab)
{
auto page = tab.add_options_page(L("Basic information"), "custom-gcode_object-info");
{
auto optgroup = page->new_optgroup(L("Printable space"), L"param_printable_space");
{
Option option = optgroup->get_option("bed_exclude_area");
option.opt.full_width = true;
optgroup->append_single_option_line(option, "printer_basic_information_printable_space#excluded-bed-area");
}
optgroup->append_single_option_line("printable_height", "printer_basic_information_printable_space#printable-height");
optgroup->append_single_option_line("support_multi_bed_types", "printer_basic_information_printable_space#support-multi-bed-types");
optgroup->append_single_option_line("best_object_pos", "printer_basic_information_printable_space#best-object-position");
optgroup->append_single_option_line("z_offset", "printer_basic_information_printable_space#z-offset");
optgroup->append_single_option_line("preferred_orientation", "printer_basic_information_printable_space#preferred-orientation");
}
{
auto optgroup = page->new_optgroup(L("Advanced"), L"param_advanced");
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->append_single_option_line("printer_structure", "printer_basic_information_advanced#printer-structure");
optgroup->append_single_option_line("gcode_flavor", "printer_basic_information_advanced#g-code-flavor");
optgroup->append_single_option_line("pellet_modded_printer", "printer_basic_information_advanced#pellet-modded-printer");
optgroup->append_single_option_line("bbl_use_printhost", "printer_basic_information_advanced#use-3rd-party-print-host");
optgroup->append_single_option_line("scan_first_layer", "printer_basic_information_advanced#scan-first-layer");
optgroup->append_single_option_line("enable_power_loss_recovery", "printer_basic_information_advanced#power-loss-recovery");
optgroup->append_single_option_line("disable_m73", "printer_basic_information_advanced#disable-set-remaining-print-time");
{
Option option = optgroup->get_option("thumbnails");
option.opt.full_width = true;
optgroup->append_single_option_line(option, "printer_basic_information_advanced#g-code-thumbnails");
}
optgroup->append_single_option_line("use_relative_e_distances", "printer_basic_information_advanced#use-relative-e-distances");
optgroup->append_single_option_line("use_firmware_retraction", "printer_basic_information_advanced#use-firmware-retraction");
optgroup->append_single_option_line("time_cost", "printer_basic_information_advanced#time-cost");
}
{
auto optgroup = page->new_optgroup(L("Cooling Fan"), L"param_cooling_fan");
optgroup->append_single_option_line("fan_kickstart", "printer_basic_information_cooling_fan#fan-kick-start-time");
optgroup->append_single_option_line("part_cooling_fan_min_pwm", "printer_basic_information_cooling_fan#minimum-non-zero-part-cooling-fan-speed");
}
{
auto optgroup = page->new_optgroup(L("Extruder Clearance"), L"param_extruder_clearance");
optgroup->append_single_option_line("extruder_clearance_radius", "printer_basic_information_extruder_clearance#radius");
optgroup->append_single_option_line("extruder_clearance_height_to_rod", "printer_basic_information_extruder_clearance#height-to-rod");
optgroup->append_single_option_line("extruder_clearance_height_to_lid", "printer_basic_information_extruder_clearance#height-to-lid");
}
{
auto optgroup = page->new_optgroup(L("Adaptive bed mesh"), L"param_adaptive_mesh");
optgroup->append_single_option_line("bed_mesh_min", "printer_basic_information_adaptive_bed_mesh#bed-mesh");
optgroup->append_single_option_line("bed_mesh_max", "printer_basic_information_adaptive_bed_mesh#bed-mesh");
optgroup->append_single_option_line("bed_mesh_probe_distance", "printer_basic_information_adaptive_bed_mesh#probe-point-distance");
optgroup->append_single_option_line("adaptive_bed_mesh_margin", "printer_basic_information_adaptive_bed_mesh#mesh-margin");
}
{
auto optgroup = page->new_optgroup(L("Accessory"), L"param_accessory");
optgroup->append_single_option_line("nozzle_type", "printer_basic_information_accessory#nozzle-type");
optgroup->append_single_option_line("nozzle_hrc", "printer_basic_information_accessory#nozzle-hrc");
optgroup->append_single_option_line("auxiliary_fan", "printer_basic_information_accessory#auxiliary-part-cooling-fan");
optgroup->append_single_option_line("support_chamber_temp_control", "printer_basic_information_accessory#support-controlling-chamber-temperature");
optgroup->append_single_option_line("support_air_filtration", "printer_basic_information_accessory#support-air-filtration");
}
auto page = tab.add_options_page(L("Machine G-code"), "custom-gcode_gcode");
{
auto optgroup = page->new_optgroup(L("File header G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("file_start_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = 8;
optgroup->append_single_option_line(option);
}
}
{
auto optgroup = page->new_optgroup(L("Machine start G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("machine_start_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#machine-start-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Machine end G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("machine_end_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#machine-end-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Printing by object G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("printing_by_object_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#printing-by-object-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Before layer change G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("before_layer_change_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#before-layer-change-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Layer change G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("layer_change_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#layer-change-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Timelapse G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("time_lapse_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#timelapse-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Clumping Detection G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("wrapping_detection_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#clumping-detection-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Change filament G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("change_filament_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#change-filament-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Change extrusion role G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("change_extrusion_role_gcode");
option.opt.full_width = true;
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#change-extrusion-role-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Pause G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("machine_pause_gcode");
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#pause-g-code");
}
}
{
auto optgroup = page->new_optgroup(L("Template Custom G-code"), L"param_gcode", 0);
optgroup->m_on_change = [&tab, &optgroup_title = optgroup->title](const t_config_option_key& opt_key, const boost::any& value) {
validate_custom_gcode_cb(&tab, optgroup_title, opt_key, value);
};
optgroup->edit_custom_gcode = [&tab](const t_config_option_key& opt_key) { tab.edit_custom_gcode(opt_key); };
{
Option option = optgroup->get_option("template_custom_gcode");
option.opt.is_code = true;
option.opt.height = gcode_field_height;
optgroup->append_single_option_line(option, "printer_machine_gcode#template-custom-g-code");
}
}
auto page = tab.add_options_page(L("Notes"), "custom-gcode_note");
{
auto optgroup = page->new_optgroup(L("Notes"), L"note", 0);
{
Option option = optgroup->get_option("printer_notes");
option.opt.full_width = true;
option.opt.height = notes_field_height;
optgroup->append_single_option_line(option);
}
}
}
inline void TabPrinter_build_kinematics_layout(TabPrinter& tab)
{
auto page = tab.add_options_page(L("Motion ability"), "custom-gcode_motion");
{
auto optgroup = page->new_optgroup(L("Advanced"), L"param_advanced");
optgroup->append_single_option_line("emit_machine_limits_to_gcode", "printer_motion_ability#emit-limits-to-g-code");
}
{
auto optgroup = page->new_optgroup(L("Resonance Compensation"), L"param_resonance_avoidance");
optgroup->append_single_option_line("resonance_avoidance", "printer_motion_ability#resonance-avoidance");
optgroup->append_single_option_line("input_shaping_emit", "printer_motion_ability#input-shaping");
optgroup->append_single_option_line("input_shaping_type", "printer_motion_ability#input-shaping-type");
}
{
auto optgroup = page->new_optgroup(L("Speed limitation"), L"param_speed");
}
{
auto optgroup = page->new_optgroup(L("Acceleration limitation"), L"param_acceleration");
}
{
auto optgroup = page->new_optgroup(L("Jerk limitation"), L"param_jerk");
}
}