From bb919a717110487e50815f25901272c2985e7c22 Mon Sep 17 00:00:00 2001 From: ExPikaPaka Date: Thu, 9 Jul 2026 08:38:08 +0200 Subject: [PATCH] fix(protobuf): close config migration gaps (orphaned settings, startup crash) The proto extraction had dropped several settings that still had struct members and were used by the engine, and had resurrected two commented-out ones. This closes those gaps so the generated config matches main. Fixes startup crash `UnknownOptionException: outer_wall_filament_id`: - Add proto defs (ported from main) for the 6 struct-backed per-region filament-id keys the engine reads and handle_legacy resolves into: outer_wall/inner_wall/internal_solid/sparse_infill/top_surface/ bottom_surface_filament_id. Registered + serialized, but intentionally no tab UI (the coarse wall_filament/sparse_infill_filament/solid_infill_filament settings provide the UI). Without a def these threw at profile load. Restore user settings dropped from the proto (def + preset + UI, from main): - bridge_line_width, relative_bridge_angle, lightning_overhang_angle, lightning_prune_angle, lightning_straightening_angle (print.proto) - initial_layer_fan_speed (filament.proto) Remove settings the bootstrap resurrected from commented-out code (absent in main; commented-out struct members): filament_extruder_id (coInts), spaghetti_detector. The separate custom-gcode filament_extruder_id placeholder var is untouched. Add missing printer virtual_preset_keys so vendor machine profiles are not stripped on load: use_3mf, support_parallel_printheads, parallel_printheads_count, parallel_printheads_bed_exclude_areas. Verified: run_codegen validate PASSED (653 fields); libslic3r builds; OrcaSlicer_profile_validator over all bundled profiles now exits 0 with zero errors (previously crashed / stripped keys). Co-Authored-By: Claude Opus 4.8 --- src/PrintConfigs/filament.proto | 17 ++++ src/PrintConfigs/layout.yaml | 6 ++ src/PrintConfigs/print.proto | 170 +++++++++++++++++++++++++++++--- src/PrintConfigs/printer.proto | 7 ++ 4 files changed, 188 insertions(+), 12 deletions(-) diff --git a/src/PrintConfigs/filament.proto b/src/PrintConfigs/filament.proto index b77fbb4d1a..8cdf4ce118 100644 --- a/src/PrintConfigs/filament.proto +++ b/src/PrintConfigs/filament.proto @@ -240,6 +240,23 @@ message FilamentSettings { ]; + repeated int32 initial_layer_fan_speed = 120 [ + (label) = "First layer fan speed", + (tooltip) = "Sets an exact fan speed for the first layer, overriding all other cooling settings. Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from a hot bed. A small amount of airflow cools the ducts down, without using full cooling that may in certain conditions hurt first-layer adhesion.\\nFrom the second layer onwards, normal cooling resumes.\\nIf \\\"Full fan speed at layer\\\" is also set, the fan ramps smoothly from this value on the first layer up to your target by the chosen layer.\\nOnly available when \\\"No cooling for the first\\\" is 0.\\nSet to -1 to disable it.", + (category) = "Filament/Cooling", + (sidetext) = "%", + (tab_type) = "Filament", + (tab_page) = "Cooling", + (tab_optgroup) = "Cooling for specific layer", + (min_value) = -1, + (max_value) = 100, + (preset) = PRESET_FILAMENT, + (has_default) = true, + (default_value) = "-1", + (invalidates) = STEP_GCODE_EXPORT + ]; + + repeated bool reduce_fan_stop_start_freq = 14 [ (label) = "Keep fan always on", (tooltip) = "Enabling this setting means that the part cooling fan will never stop completely and will run at least at minimum speed to reduce the frequency of starting and stopping.", diff --git a/src/PrintConfigs/layout.yaml b/src/PrintConfigs/layout.yaml index b193a06e0e..55444ef196 100644 --- a/src/PrintConfigs/layout.yaml +++ b/src/PrintConfigs/layout.yaml @@ -17,6 +17,7 @@ tabs: - top_surface_line_width - sparse_infill_line_width - internal_solid_infill_line_width + - bridge_line_width: quality_settings_line_width#bridge - support_line_width - name: "Seam" fields: @@ -169,12 +170,16 @@ tabs: - gap_fill_target - filter_out_gap_fill - infill_wall_overlap + - lightning_overhang_angle: strength_settings_patterns#lightning + - lightning_prune_angle: strength_settings_patterns#lightning + - lightning_straightening_angle: strength_settings_patterns#lightning - name: "Advanced" fields: - align_infill_direction_to_model - extra_solid_infills - bridge_angle - internal_bridge_angle + - relative_bridge_angle: strength_settings_advanced#relative-bridge-angle - minimum_sparse_infill_area - infill_combination - infill_combination_max_layer_height @@ -483,6 +488,7 @@ tabs: fields: - close_fan_the_first_x_layers - full_fan_speed_layer + - initial_layer_fan_speed: material_cooling#first-layer-fan-speed - name: "Part cooling fan" fields: - [fan_min_speed, fan_cooling_layer_time] diff --git a/src/PrintConfigs/print.proto b/src/PrintConfigs/print.proto index b14abf7fa7..1bcccafe0d 100644 --- a/src/PrintConfigs/print.proto +++ b/src/PrintConfigs/print.proto @@ -1375,6 +1375,85 @@ message PrintSettings { ]; + // Granular per-region filament (extruder) assignment. These are the canonical, + // struct-backed keys the slicing engine reads (LayerRegion, PerimeterGenerator, + // ToolOrdering, …) and that PrintApply/handle_legacy resolve into. The coarse + // "Filament for Features" UI settings above (wall_filament, sparse_infill_filament, + // solid_infill_filament) map onto these. Registered (so they serialize and don't + // throw UnknownOptionException) but intentionally not given tab_* UI to avoid + // duplicating the coarse settings' UI. + int32 outer_wall_filament_id = 488 [ + (label) = "Outer walls", + (tooltip) = "Filament to print outer walls.\n\\\"Default\\\" uses the active object/part filament.", + (category) = "Print/Multimaterial", + (gui_type) = i_enum_open, + (min_value) = 0, + (mode) = MODE_ADVANCED, + (has_default) = true, + (default_value) = "0" + ]; + + + int32 inner_wall_filament_id = 489 [ + (label) = "Inner walls", + (tooltip) = "Filament to print inner walls.\n\\\"Default\\\" uses the active object/part filament.", + (category) = "Print/Multimaterial", + (gui_type) = i_enum_open, + (min_value) = 0, + (mode) = MODE_ADVANCED, + (has_default) = true, + (default_value) = "0" + ]; + + + int32 internal_solid_filament_id = 490 [ + (label) = "Internal solid infill", + (tooltip) = "Filament to print internal solid infill.\n\\\"Default\\\" uses the active object/part filament.", + (category) = "Print/Multimaterial", + (gui_type) = i_enum_open, + (min_value) = 0, + (mode) = MODE_ADVANCED, + (has_default) = true, + (default_value) = "0" + ]; + + + int32 sparse_infill_filament_id = 491 [ + (label) = "Infill", + (tooltip) = "Filament to print internal sparse infill.\n\\\"Default\\\" uses the active object/part filament.", + (category) = "Print/Multimaterial", + (gui_type) = i_enum_open, + (min_value) = 0, + (mode) = MODE_ADVANCED, + (has_default) = true, + (default_value) = "0" + ]; + + + int32 top_surface_filament_id = 492 [ + (label) = "Top surface", + (tooltip) = "Filament to print top surface.\n\\\"Default\\\" uses the active object/part filament.", + (category) = "Print/Multimaterial", + (gui_type) = i_enum_open, + (min_value) = 0, + (mode) = MODE_ADVANCED, + (has_default) = true, + (default_value) = "0" + ]; + + + int32 bottom_surface_filament_id = 493 [ + (label) = "Bottom surface", + (tooltip) = "Filament to print bottom surface.\n\\\"Default\\\" uses the active object/part filament.", + (category) = "Print/Multimaterial", + (gui_type) = i_enum_open, + (min_value) = 0, + (mode) = MODE_ADVANCED, + (has_default) = true, + (default_value) = "0" + ]; + + int32 standby_temperature_delta = 92 [ (label) = "Temperature variation", (tooltip) = "Temperature difference to be applied when an extruder is not active. The value is not used when 'idle_temperature' in filament settings is set to non-zero value.", @@ -3092,6 +3171,24 @@ message PrintSettings { ]; + FloatOrPercent bridge_line_width = 483 [ + (label) = "Bridge", + (tooltip) = "Line width of the Bridge. If expressed as a %, it will be computed over the nozzle diameter.\\nRecommended to use with a higher Bridge density or Bridge flow ratio.\\n\\nThe maximum value is 100% or the nozzle diameter.\\nIf set to 0, the line width will match the Internal solid infill width.", + (category) = "Print/Quality", + (sidetext) = "mm or %", + (ratio_over) = "nozzle_diameter", + (tab_type) = "Print", + (tab_page) = "Quality", + (tab_optgroup) = "Line width", + (min_value) = 0, + (max_value) = 100, + (max_literal) = 10, + (mode) = MODE_ADVANCED, + (has_default) = true, + (default_value) = "100., true" + ]; + + float slice_closing_radius = 200 [ (label) = "Slice gap closing radius", (tooltip) = "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low.", @@ -5134,6 +5231,19 @@ message PrintSettings { ]; + bool relative_bridge_angle = 484 [ + (label) = "Relative bridge angle", + (tooltip) = "When enabled, the bridge angle values are added to the automatically calculated bridge direction instead of overriding it.", + (category) = "Print/Strength", + (tab_type) = "Print", + (tab_page) = "Strength", + (tab_optgroup) = "Advanced", + (mode) = MODE_ADVANCED, + (has_default) = true, + (default_value) = "false" + ]; + + int32 ensure_vertical_shell_thickness = 323 [ (label) = "Ensure vertical shell thickness", (tooltip) = "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)\\nNone: No solid infill will be added anywhere. Caution: Use this option carefully if your model has sloped surfaces\\nCritical Only: Avoid adding solid infill for walls\\nModerate: Add solid infill for heavily sloping surfaces only\\nAll: Add solid infill for all suitable sloping surfaces\\nDefault value is All.", @@ -5327,6 +5437,54 @@ message PrintSettings { ]; + float lightning_overhang_angle = 485 [ + (label) = "Lightning overhang angle", + (tooltip) = "Maximum overhang angle for Lightning infill support propagation.", + (category) = "Print/Strength", + (sidetext) = "°", + (tab_type) = "Print", + (tab_page) = "Strength", + (tab_optgroup) = "Infill", + (min_value) = 5, + (max_value) = 85, + (mode) = MODE_EXPERT, + (has_default) = true, + (default_value) = "45" + ]; + + + float lightning_prune_angle = 486 [ + (label) = "Prune angle", + (tooltip) = "Controls how aggressively short or unsupported Lightning branches are pruned.\\nThis angle is converted internally to a per-layer distance.", + (category) = "Print/Strength", + (sidetext) = "°", + (tab_type) = "Print", + (tab_page) = "Strength", + (tab_optgroup) = "Infill", + (min_value) = 5, + (max_value) = 85, + (mode) = MODE_EXPERT, + (has_default) = true, + (default_value) = "45" + ]; + + + float lightning_straightening_angle = 487 [ + (label) = "Straightening angle", + (tooltip) = "Maximum straightening angle used to simplify Lightning branches.", + (category) = "Print/Strength", + (sidetext) = "°", + (tab_type) = "Print", + (tab_page) = "Strength", + (tab_optgroup) = "Infill", + (min_value) = 5, + (max_value) = 85, + (mode) = MODE_EXPERT, + (has_default) = true, + (default_value) = "45" + ]; + + bool align_infill_direction_to_model = 330 [ (label) = "Align infill direction to model", (tooltip) = "Aligns infill and surface fill directions to follow the model's orientation on the build plate. When enabled, fill directions rotate with the model to maintain optimal strength characteristics.", @@ -6332,9 +6490,6 @@ message PrintSettings { bool adaptive_layer_height = 406; - bool spaghetti_detector = 407; - - int32 wrapping_detection_layers = 408 [ (label) = "Clumping detection layers", (tooltip) = "Clumping detection layers.", @@ -6887,15 +7042,6 @@ message PrintSettings { ]; - repeated int32 filament_extruder_id = 453 [ - (label) = "Filament extruder id", - (tooltip) = "Filament extruder id.", - (no_cli) = true, - (has_default) = true, - (default_value) = "1" - ]; - - repeated int32 filament_self_index = 454 [ (label) = "Filament self index", (tooltip) = "Filament self index.", diff --git a/src/PrintConfigs/printer.proto b/src/PrintConfigs/printer.proto index 7a2ca7a8bb..e5c9e931a4 100644 --- a/src/PrintConfigs/printer.proto +++ b/src/PrintConfigs/printer.proto @@ -79,6 +79,13 @@ message PrinterSettings { option (virtual_preset_keys) = "wrapping_detection_layers"; option (virtual_preset_keys) = "wrapping_exclude_area"; option (virtual_preset_keys) = "z_hop_types"; + // Printer keys with hand-written defs in init_common_params (not proto fields); + // declared here so they land in s_Preset_printer_options and vendor machine + // profiles that set them are not stripped on load. + option (virtual_preset_keys) = "use_3mf"; + option (virtual_preset_keys) = "support_parallel_printheads"; + option (virtual_preset_keys) = "parallel_printheads_count"; + option (virtual_preset_keys) = "parallel_printheads_bed_exclude_areas"; float extruder_clearance_height_to_rod = 1 [ (label) = "Height to rod",