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 <noreply@anthropic.com>
This commit is contained in:
ExPikaPaka
2026-07-09 08:38:08 +02:00
parent b1d1fb7dfc
commit bb919a7171
4 changed files with 188 additions and 12 deletions

View File

@@ -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.",

View File

@@ -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]

View File

@@ -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.",

View File

@@ -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",