mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Fix of 2.3 rc1 can't load its own 3mf files (if they contain custom gcode) #5550
The issue was handling of the special "default_filament_profile" vector, which is not being normalized in length to the number of extruders, as this vector is being shown to the user at the Printer dependencies page, and we don't want to present empty fields there, if the default filament profile was not defined in the system preset.
This commit is contained in:
		
							parent
							
								
									ad2adad434
								
							
						
					
					
						commit
						2d428198b1
					
				
					 3 changed files with 20 additions and 15 deletions
				
			
		|  | @ -1152,18 +1152,22 @@ inline t_config_option_keys deep_diff(const ConfigBase &config_this, const Confi | |||
|         if (this_opt != nullptr && other_opt != nullptr && *this_opt != *other_opt) | ||||
|         { | ||||
|             if (opt_key == "bed_shape" || opt_key == "thumbnails" || opt_key == "compatible_prints" || opt_key == "compatible_printers") { | ||||
|                 // Scalar variable, or a vector variable, which is independent from number of extruders,
 | ||||
|                 // thus the vector is presented to the user as a single input.
 | ||||
|                 diff.emplace_back(opt_key); | ||||
|                 continue; | ||||
|             } | ||||
|             switch (other_opt->type()) | ||||
|             { | ||||
|             case coInts:    add_correct_opts_to_diff<ConfigOptionInts       >(opt_key, diff, config_other, config_this);  break; | ||||
|             case coBools:   add_correct_opts_to_diff<ConfigOptionBools      >(opt_key, diff, config_other, config_this);  break; | ||||
|             case coFloats:  add_correct_opts_to_diff<ConfigOptionFloats     >(opt_key, diff, config_other, config_this);  break; | ||||
|             case coStrings: add_correct_opts_to_diff<ConfigOptionStrings    >(opt_key, diff, config_other, config_this);  break; | ||||
|             case coPercents:add_correct_opts_to_diff<ConfigOptionPercents   >(opt_key, diff, config_other, config_this);  break; | ||||
|             case coPoints:  add_correct_opts_to_diff<ConfigOptionPoints     >(opt_key, diff, config_other, config_this);  break; | ||||
|             default:        diff.emplace_back(opt_key);     break; | ||||
|             } else if (opt_key == "default_filament_profile") { | ||||
|                 // Ignore this field, it is not presented to the user, therefore showing a "modified" flag for this parameter does not help.
 | ||||
|                 // Also the length of this field may differ, which may lead to a crash if the block below is used.
 | ||||
|             } else { | ||||
|                 switch (other_opt->type()) { | ||||
|                 case coInts:    add_correct_opts_to_diff<ConfigOptionInts       >(opt_key, diff, config_other, config_this);  break; | ||||
|                 case coBools:   add_correct_opts_to_diff<ConfigOptionBools      >(opt_key, diff, config_other, config_this);  break; | ||||
|                 case coFloats:  add_correct_opts_to_diff<ConfigOptionFloats     >(opt_key, diff, config_other, config_this);  break; | ||||
|                 case coStrings: add_correct_opts_to_diff<ConfigOptionStrings    >(opt_key, diff, config_other, config_this);  break; | ||||
|                 case coPercents:add_correct_opts_to_diff<ConfigOptionPercents   >(opt_key, diff, config_other, config_this);  break; | ||||
|                 case coPoints:  add_correct_opts_to_diff<ConfigOptionPoints     >(opt_key, diff, config_other, config_this);  break; | ||||
|                 default:        diff.emplace_back(opt_key);     break; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  |  | |||
|  | @ -86,9 +86,8 @@ PresetBundle::PresetBundle() : | |||
|             preset.config.optptr(key, true); | ||||
|         if (i == 0) { | ||||
|             preset.config.optptr("default_print_profile", true); | ||||
|             preset.config.option<ConfigOptionStrings>("default_filament_profile", true)->values = { "" }; | ||||
|         } | ||||
|         else { | ||||
|             preset.config.option<ConfigOptionStrings>("default_filament_profile", true); | ||||
|         } else { | ||||
|             preset.config.optptr("default_sla_print_profile", true); | ||||
|             preset.config.optptr("default_sla_material_profile", true); | ||||
|         } | ||||
|  | @ -752,7 +751,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool | |||
| 	switch (printer_technology) { | ||||
| 	case ptFFF: | ||||
| 		config.option<ConfigOptionString>("default_print_profile", true); | ||||
| 		config.option<ConfigOptionStrings>("default_filament_profile", true)->values.resize(num_extruders, std::string()); | ||||
|         config.option<ConfigOptionStrings>("default_filament_profile", true); | ||||
| 		break; | ||||
| 	case ptSLA: | ||||
| 		config.option<ConfigOptionString>("default_sla_print_profile", true); | ||||
|  |  | |||
|  | @ -3378,6 +3378,8 @@ void DynamicPrintConfig::set_num_extruders(unsigned int num_extruders) | |||
|     const auto &defaults = FullPrintConfig::defaults(); | ||||
|     for (const std::string &key : print_config_def.extruder_option_keys()) { | ||||
|         if (key == "default_filament_profile") | ||||
|             // Don't resize this field, as it is presented to the user at the "Dependencies" page of the Printer profile and we don't want to present
 | ||||
|             // empty fields there, if not defined by the system profile.
 | ||||
|             continue; | ||||
|         auto *opt = this->option(key, false); | ||||
|         assert(opt != nullptr); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vojtech Bubnik
						Vojtech Bubnik