Evaluate to old defaults if setting is missing

If the setting is missing from the legacy profile, let it evaluate to the default in the legacy Cura.

Contributes to issue CURA-37.
This commit is contained in:
Ghostkeeper 2016-01-26 13:27:42 +01:00
parent 40bfd32f06
commit 5374d253e9
2 changed files with 97 additions and 10 deletions

View file

@ -71,5 +71,87 @@
"prime_tower_enable": "wipe_tower", "prime_tower_enable": "wipe_tower",
"prime_tower_size": "math.sqrt(float(wipe_tower_volume) / float(layer_height))", "prime_tower_size": "math.sqrt(float(wipe_tower_volume) / float(layer_height))",
"ooze_shield_enabled": "ooze_shield" "ooze_shield_enabled": "ooze_shield"
},
"defaults": {
"bottom_layer_speed": "20",
"bottom_thickness": "0.3",
"brim_line_count": "20",
"cool_head_lift": "False",
"cool_min_feedrate": "10",
"cool_min_layer_time": "5",
"fan_enabled": "True",
"fan_full_height": "0.5",
"fan_speed": "100",
"fan_speed_max": "100",
"filament_diameter": "2.85",
"filament_diameter2": "0",
"filament_diameter3": "0",
"filament_diameter4": "0",
"filament_diameter5": "0",
"filament_flow": "100.0",
"fill_density": "20",
"fill_overlap": "15",
"fix_horrible_extensive_stitching": "False",
"fix_horrible_union_all_type_a": "True",
"fix_horrible_union_all_type_b": "False",
"fix_horrible_use_open_bits": "False",
"infill_speed": "0.0",
"inset0_speed": "0.0",
"insetx_speed": "0.0",
"layer_height": "0.1",
"layer0_width_factor": "100",
"nozzle_size": "0.4",
"object_sink": "0.0",
"ooze_shield": "False",
"overlap_dual": "0.15",
"perimeter_before_infill": "False",
"platform_adhesion": "None",
"print_bed_temperature": "70",
"print_speed": "50",
"print_temperature": "210",
"print_temperature2": "0",
"print_temperature3": "0",
"print_temperature4": "0",
"print_temperature5": "0",
"raft_airgap": "0.22",
"raft_airgap_all": "0.0",
"raft_base_linewidth": "1.0",
"raft_base_thickness": "0.3",
"raft_interface_linewidth": "0.4",
"raft_interface_thickness": "0.27",
"raft_line_spacing": "3.0",
"raft_margin": "5.0",
"raft_surface_layers": "2",
"raft_surface_linewidth": "0.4",
"raft_surface_thickness": "0.27",
"retraction_amount": "4.5",
"retraction_combing": "All",
"retraction_dual_amount": "16.5",
"retraction_enable": "True",
"retraction_hop": "0.0",
"retraction_min_travel": "1.5",
"retraction_minimal_extrusion": "0.02",
"retraction_speed": "40.0",
"simple_mode": "False",
"skirt_gap": "3.0",
"skirt_line_count": "1",
"skirt_minimal_length": "150.0",
"solid_bottom": "True",
"solid_layer_thickness": "0.6",
"solid_top": "True",
"solidarea_speed": "0.0",
"spiralize": "False",
"support": "None",
"support_angle": "60",
"support_dual_extrusion": "Both",
"support_fill_rate": "15",
"support_type": "Lines",
"support_xy_distance": "0.7",
"support_z_distance": "0.15",
"travel_speed": "150.0",
"wall_thickness": "0.8",
"wipe_tower": "False",
"wipe_tower_volume": "15"
} }
} }

View file

@ -30,16 +30,21 @@ class LegacyProfileReader(ProfileReader):
# and their values, so that they can be used in evaluating the new setting # and their values, so that they can be used in evaluating the new setting
# values as Python code. # values as Python code.
# #
# \param parser The ConfigParser that finds the settings in the legacy # \param config_parser The ConfigParser that finds the settings in the
# profile. # legacy profile.
# \param section The section in the profile where the settings should be # \param config_section The section in the profile where the settings
# found. # should be found.
# \param json The JSON file to load the default setting values from. This
# should not be an URL but a pre-loaded JSON handle.
# \return A set of local variables, one for each setting in the legacy # \return A set of local variables, one for each setting in the legacy
# profile. # profile.
def prepareLocals(self, parser, section): def prepareLocals(self, config_parser, config_section, json):
locals = {} locals = {}
for option in parser.options(section): for key in json["defaults"]: #We have to copy over all defaults from the JSON handle to a normal dict.
locals[option] = parser.get(section, option) locals[key] = json["defaults"][key]
print("Setting " + key + " to " + json["defaults"][key])
for option in config_parser.options(config_section):
locals[option] = config_parser.get(config_section, option)
return locals return locals
## Reads a legacy Cura profile from a file and returns it. ## Reads a legacy Cura profile from a file and returns it.
@ -70,8 +75,6 @@ class LegacyProfileReader(ProfileReader):
if not section: #No section starting with "profile" was found. Probably not a proper INI file. if not section: #No section starting with "profile" was found. Probably not a proper INI file.
return None return None
legacy_settings = self.prepareLocals(parser, section) #Gets the settings from the legacy profile.
try: try:
with open(os.path.join(PluginRegistry.getInstance().getPluginPath("LegacyProfileReader"), "DictionaryOfDoom.json"), "r", -1, "utf-8") as f: with open(os.path.join(PluginRegistry.getInstance().getPluginPath("LegacyProfileReader"), "DictionaryOfDoom.json"), "r", -1, "utf-8") as f:
dict_of_doom = json.load(f) #Parse the Dictionary of Doom. dict_of_doom = json.load(f) #Parse the Dictionary of Doom.
@ -82,6 +85,8 @@ class LegacyProfileReader(ProfileReader):
Logger.log("e", "Could not parse DictionaryOfDoom.json: %s", str(e)) Logger.log("e", "Could not parse DictionaryOfDoom.json: %s", str(e))
return None return None
legacy_settings = self.prepareLocals(parser, section, dict_of_doom) #Gets the settings from the legacy profile.
#Check the target version in the Dictionary of Doom with this application version. #Check the target version in the Dictionary of Doom with this application version.
if "target_version" not in dict_of_doom: if "target_version" not in dict_of_doom:
Logger.log("e", "Dictionary of Doom has no target version. Is it the correct JSON file?") Logger.log("e", "Dictionary of Doom has no target version. Is it the correct JSON file?")
@ -99,7 +104,7 @@ class LegacyProfileReader(ProfileReader):
try: try:
new_value = eval(compiled, {"math": math}, legacy_settings) #Pass the legacy settings as local variables to allow access to in the evaluation. new_value = eval(compiled, {"math": math}, legacy_settings) #Pass the legacy settings as local variables to allow access to in the evaluation.
except Exception as e: #Probably some setting name that was missing or something else that went wrong in the ini file. except Exception as e: #Probably some setting name that was missing or something else that went wrong in the ini file.
Logger.log("w", "Setting " + new_setting + " could not be set because the evaluation failed. Something is probably missing from the imported legacy profile.") Logger.log("w", "Setting " + new_setting + " could not be set because the evaluation failed (" + old_setting_expression + "). Something is probably missing from the imported legacy profile.")
continue continue
if profile.getSettingValue(new_setting) != new_value: #Not equal to the default. if profile.getSettingValue(new_setting) != new_value: #Not equal to the default.
profile.setSettingValue(new_setting, new_value) #Store the setting in the profile! profile.setSettingValue(new_setting, new_value) #Store the setting in the profile!